Logo Lanfrica

tsotsoobi/gyema-app

Domaine:

digital infrastructure

Type de record:

software
Créateur:
tso
Hôte:
Peer-to-peer delivery on Pi Network, built in Ghana for the world # Gyema **Peer-to-peer delivery on Pi Network, built in Ghana for the world.** Gyema connects two sides of every delivery: Senders with packages to move, and Travellers already making the trip. Pi is the payment rail. The platform runs on Pi Testnet today and is built to migrate to Mainnet once the Pi Core Team enables Soroban deployment for third-party apps. - Production: gyema-app.vercel.app - V2 escrow contracts: tsotsoobi/gyema-contracts - Company: Pi Logistics Ltd. --- ## What Gyema does A Sender posts a package with a route and a fee in Pi. A Traveller already heading that way claims it. The two are connected, settle a connection fee in Pi, then coordinate the handoff over WhatsApp. Because the trip was happening anyway, the delivery avoids a dedicated vehicle run, which Gyema also tracks as avoided carbon. Two roles, toggled in the app header: - **Sender** posts a delivery (package, route, fee in Pi). - **Traveller** posts a trip and accepts matching deliveries. Listings persist server-side in Supabase. Tracking IDs are issued as `GYM-XXXXXX`. ### Listing lifecycle ```mermaid stateDiagram-v2 [*] --> open: Pioneer posts a package or trip open --> matched: Another Pioneer claims it (accept) open --> expired: deliver_by date passes (daily cron) matched --> open: Connection fee cancelled or fails (release) matched --> completed: Handoff confirmed completed --> [*] expired --> [*] ``` The claim is atomic and server-side. Only an `open` listing can be claimed, and a Pioneer cannot accept their own listing. If the connection-fee payment is cancelled or fails after a claim, the listing is released back to `open` so it is never left matched but unpaid. --- ## Features - **Role-based listings.** One Pioneer can act as both Sender and Traveller, switching in the header. - **Server-side atomic claim.** `/api/listings/accept` verifies the accepter from their Supabase session token (never a client-supplied id) and claims the row only if it is open and not th …