A two-sided trucking marketplace for the Djibouti–Ethiopia corridor, with escrow
My product
- Role
- Founder & Full-stack Developer
- Year
- 2026
- Status
- In development
- Links
- Private
- Expo apps
- Next.js web · admin
- NestJS API
- Escrow ledger
- PostgreSQL · Prisma
- MinIO
PK-12
Cargo owners post loads, transport companies bid to carry them, and the platform matches the two sides, holds payment in escrow until delivery is proven, takes a commission and referees disputes. It owns no trucks and dispatches nothing: it is a matchmaker, an escrow agent and a referee.
The problem
Cargo owners on the Djibouti–Ethiopia corridor need carriers they can trust, and carriers need to be paid once a delivery is proven. A marketplace that matches the two and holds payment in escrow addresses both.
Approach
I wrote the full specification first: the job lifecycle as a state machine, the money rules (ledger, escrow and the commission gate) and the actors on each surface. Then I built a skeleton where only the API touches the database and every surface shares one contract package.
Architecture
A NestJS API, Next.js apps for cargo owners and transporters and for operations, and two Expo apps (marketplace and driver). Zod contracts are the single source of truth for the wire; CI runs lint, typecheck, test and build on a self-hosted runner.
Features
- Job lifecycle designed as an explicit state machine
- Escrow ledger with a commission gate, specified before any money code
- Separate surfaces for shippers, carriers, drivers and operations
- One shared Zod contract package for every app
Stack
NestJS, Next.js, Expo, TypeScript, PostgreSQL, Prisma, MinIO, Zod, Turborepo, Docker
Results
- Phase 0 complete: infrastructure, build, CI and documentation
“For a product that holds other people's money, the spec is the product.”