AKHIL SINGH
CTN3/5PACKEDVERIFIEDASSIGNEDPICKED UP

A dispatch control system for a warehouse floor: signed QR labels on every carton, scan-based verification, transporter pickup confirmation and a live control tower, so a missing carton has a record of where it went missing.

The problem

After an invoice is raised, the goods still have to be picked, packed and handed to a transporter. The client ran that stretch on paper and memory. When five cartons left and four arrived, nobody could say whether the shortage happened in the warehouse or in transit, or who was holding the cartons at the time.

What I built

A staff app and a web control tower.

  • Staff app. Role-based workspaces for the operator, the warehouse in-charge and the dispatch manager. Invoices come in, items are packed into cartons, each carton gets a printed QR label, and the dispatch manager scans cartons back to back to verify counts.
  • Transporter pickup. The transporter gets a link, with no install and no login. It lists cartons by destination and they confirm what they collected. Responsibility moves to them from that moment.
  • Control tower. A live view of every invoice, carton and transporter, plus master data and MIS reports such as the daily dispatch register and pending dispatches.
  • Android shell. The staff app is a PWA wrapped in Capacitor. The APK loads the deployed site, so a normal deploy updates every phone and a new APK is only needed for native changes.

How it works

The backend is a single Go binary on the standard library, pgx and Postgres. Each domain (invoices, cartons, dispatches, pickup, transporters) is one package holding its routes, rules and SQL.

Each carton moves through fixed stages: packed, verified, assigned, picked up. Every transition writes a row to an append-only activity log stamped with time and user. Postgres triggers block updates and deletes on that log whatever the application code asks for. That log is the audit trail.

A QR label carries the carton's UUID and an HMAC signature. Scanners can tell a forged or tampered label apart from a courier barcode that was scanned by mistake, and no per-label state is stored. The payload is short enough to keep the QR at a low version, which scans faster across a warehouse aisle.

Roles are re-read from the database on every request, so a deactivation takes effect on the next call. Migrations are hand-written SQL embedded in the binary. Deploys run the migrations and gate on a health check.

Outcome

Phase 1 is built through the packing, verification, pickup and control-tower flows. Invoices are entered by hand in this phase, and AI-assisted import of invoice files is planned for the next one.

Need something like this built? contact@akhilsingh.in

Next
FishBook →