个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Internal delivery management system for parcels after they reach the office — rider assignment, delivery status, COD and fee collection, merchant settlements, and rider payouts.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Parcel delivery management for a small courier in Yangon: log parcels as they reach the office, assign riders, track every kyat of COD and delivery fees, and turn delivered parcels into merchant settlements and rider payouts.
Try the live demo → One click signs you in as an admin, a merchant, or a rider. No sign-up. The demo data resets every night at 00:00 Yangon time.
Parcel Flow was designed for a delivery business my sister was planning to start in Yangon. It is modelled on how small local couriers work: pickup arranged on Telegram, cash on delivery, township-based fees, and weekly settlements with merchants. The business plans changed, so it is now a source-available portfolio project.
Pickup still happens outside the app. Parcel Flow starts when parcels reach the office and covers the rest of the operational and money loop.
| Role | In the demo | What they do |
|---|---|---|
| Office admin | Try as Admin | Create, edit and assign parcels; review failed deliveries and decide retry or return; correct a status or rider with a recorded reason; confirm rider cash handovers; build settlements and rider payout drafts. |
| Merchant | Try as Merchant | Read-only view of their own parcels, settlement status, and paid settlement history. |
| Rider | Try as Rider | Mobile parcel cards: start delivery, mark delivered, report failures, complete merchant returns. |
| Super admin | Not in the demo | Everything above, plus user management, township pricing, paying settlements and payouts. |
| Area | Tool |
|---|---|
| App | Next.js 16 (App Router, Cache Components), TypeScript, Tailwind CSS, shadcn/ui |
| Auth | Better Auth (username + password, admin-created accounts) |
| Database | PostgreSQL on Supabase, Drizzle ORM |
| Realtime | Supabase Realtime, relayed to the browser over server-sent events |
| Storage | Cloudflare R2 |
| Validation | Zod |
| Hosting | Railway |
| Monitoring | Sentry |
| Tests | Bun (unit, component, integration) and Playwright (end to end) |
Setting NEXT_PUBLIC_DEMO_MODE=1 turns a deployment into the public demo:
/demo/[role] signs visitors in to shared demo accounts with one click (POST only, rate limited).POST /api/demo/reset (with Authorization: Bearer $DEMO_RESET_TOKEN) wipes everything except super admins and loads a small demo data set: 20 parcels covering every status, plus settlements and rider payouts spread over the last three weeks. The Demo Reset workflow calls it nightly. The reset refuses to run if it finds accounts the demo data did not create.The demo data is a committed snapshot (src/features/demo/data/snapshot.json). bun run demo:snapshot builds it by running the seed through the app's own data layer against the local test database, then saving the rows. The reset bulk-loads that file in one transaction and shifts every date so the newest records land on today. That takes a few dozen queries instead of thousands, so it stays fast when the database is in another region. Regenerate the snapshot after schema or seed changes.
Run the same reset from a shell with bun run db:reset:demo (add --force the first time on a database that has other accounts).
Requires Bun.
bun install
cp .env.example .env.development
# fill DATABASE_URL, BETTER_AUTH_*, Supabase, and R2 values
bun run db:migrate
bun run db:seed:super-admin
bun run dev
Quality checks:
bun run lint
bun run format:check
bun run typecheck
bun run test # unit + component
bun run test:integration
bun run test:e2e # Playwright against next build + next start
bun run test:all
See docs/testing.md for database safety rules, Playwright setup, and money-loop e2e and R2 requirements.
PolyForm Noncommercial 1.0.0. See LICENSE.
The source is available for noncommercial use under the license terms. Commercial use requires separate permission from the copyright holder.