Route planning and delivery management for independent couriers
Import your parcels, get the best stop order, deliver with proof, and close the day with a PDF report β all from one app.
Note
Routify is under active development. Branding, naming and visuals are still being finalised with the client and may change.
Design previews β the full set lives in design_pref/.
For riders (mobile app)
- π₯ Add stops your way β import a PDF / Excel / Word manifest, type an address, drop a pin, speak it, or scan an Eircode / barcode with the camera (on-device OCR)
- π§ Optimised routes β best stop order for hundreds of stops, with map preview and live navigation
- β Proof of delivery β photo capture, delivered / failed outcomes with reasons, duplicate-stop detection
- πΆ Works offline β actions queue in a local SQLite outbox and sync automatically when the signal comes back
- π Daily PDF reports and full route history
- π³ Subscriptions β in-app plans through the App Store and Google Play (RevenueCat)
- π Over-the-air updates with EAS Update
For platform staff (admin console)
- Overview dashboard, riders, deliveries, reports, plans, subscriptions and payments
- Audit logs and platform settings
Under the hood
- Background job worker for heavy route optimisation (never blocks the API)
- Geocoding cache, idempotency keys, rate limiting and token rotation
Server-Timingheaders, Sentry error reporting and performance benchmarks (perf.md)- Self-hosted OSRM + VROOM road-routing proof of concept for Ireland (
infra/routing)
flowchart LR
R["π± Rider app<br/>Expo Β· React Native"] -->|REST /api/v1 Β· /v2| API
A["π₯οΈ Admin console<br/>React Β· Vite"] -->|REST /api/v1| API
subgraph Backend
API["β‘ FastAPI"] --> DB[("PostgreSQL<br/>Prisma")]
API --> Q["Job queue"] --> W["βοΈ Worker<br/>route optimisation"]
W --> DB
API -.optional.-> RD[("Redis")]
end
API --> G["πΊοΈ Maps & geocoding"]
API --> S["π§Ύ App Store Β· Google Play<br/>RevenueCat"]
| Path | What it is |
|---|---|
rider-app/ |
Rider mobile app β Expo + React Native + TypeScript |
admin-web/ |
Platform admin console β React + TypeScript + Vite |
backend-py/ |
REST API β Python + FastAPI + Prisma + PostgreSQL, with a background worker |
infra/routing/ |
OSRM + VROOM self-hosted routing benchmark (Ireland) |
infra/loadtest/ |
k6 and Locust load-test scenarios |
design_pref/ |
UI design references for every rider screen |
render.yaml |
Render blueprint for deploying the API |
Prerequisites: Python 3.13, Node.js 24, and a PostgreSQL database (a hosted Neon database works, no Docker needed).
Backend β backend-py/
cd backend-py
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements-dev.txt
cp .env.example .env # set DATABASE_URL and the JWT / refresh / file-signing secrets
prisma migrate deploy # create the tables
python -m scripts.seed_admin # needs ADMIN_EMAIL + ADMIN_PASSWORD (10+ chars) in .env
python -m app # API on http://localhost:4000
python -m app.worker # route-optimisation worker (separate terminal)
pytest # tests run against a real PostgreSQLAdmin console β admin-web/
cd admin-web
cp .env.example .env # VITE_API_URL=http://localhost:4000
npm install
npm run devRider app β rider-app/
cd rider-app
cp .env.example .env # EXPO_PUBLIC_API_URL=http://<your-machine-ip>:4000
npm install
npx expo startShipping a JS-only fix without a store release (EAS Update):
npx eas-cli@latest update --channel production --environment production --message "<what changed>"The runtime version is a fingerprint of the native code, so an update never reaches a build with different native modules. After a native change (new module or app.json plugin), make a new build instead.
Every push and pull request runs CI:
| App | Checks |
|---|---|
| Backend | ruff lint + pytest against a throwaway PostgreSQL container |
| Rider app | tsc type-check + expo lint + unit tests |
| Admin console | tsc type-check + lint |
| Layer | Technology |
|---|---|
| Mobile | React Native 0.86, Expo SDK 57, React Navigation, TanStack Query, Expo SQLite, Vision Camera + OCR, React Native Maps |
| Admin | React 19, TypeScript, Vite |
| API | Python, FastAPI, Pydantic, Prisma (prisma-client-py), PostgreSQL |
| Auth | JWT access tokens + rotating refresh tokens, bcrypt |
| Payments | App Store Server API, Google Play Developer API, RevenueCat |
| Ops | Render, Neon, Redis (optional), Sentry, GitHub Actions, EAS Build & Update |
Built by Ali Sulman β Full-Stack AI Developer.
Β© Routify. All rights reserved. This is a private client project; the source is shared for portfolio purposes.




