← All work

Sole developer, end to end

Express Ops

Operations platform that turns manifest photos into driver lists, double-booking checks and customer documents.

Status: In daily use by the operations team

The problem

Tour-transfer teams were rebuilding daily driver lists and customer documents by hand from photographed manifests, against a departure clock. A miscount or a double booking has to be caught before a vehicle leaves, not after.

What I built

I built a role-based web app that reads the photographed manifests, reconciles each one against the totals printed on the page, flags double bookings, and produces the finished driver lists and customer documents.

OutcomeIn daily use by the operations team. I estimate it saves them roughly 3–5 hours a day.

What it does

Try it

A working replica of the real interface, running on made-up sample data.

Architecture

How the pieces connect, drawn from the project's own documentation.

Express Ops architectureFour rows. First, the manifest pipeline: manifest photos are read by Mistral OCR, each result is reconciled against the footer totals printed on the image, failures and mismatches go to an editable review queue, and the output is exported as an XLSX driver list or DOCX lists. Second, the browser path: the browser talks to the public Convex URL through Cloudflare. Third, the server path: the Next.js server talks to Convex over the internal Docker network, which avoids the Cloudflare managed challenge. Fourth, the release path: a push or pull request runs dependency audit, lint, tests, typecheck and build; a push to main deploys over SSH to Docker Compose, and the sign-in endpoint is checked afterwards.Manifest pipelineManifest photosgrouped into a sessionMistral OCReach image is readFooter-total checkrows vs totals printed in the imageReview queuefailures and mismatches; edit inplace, undoExportsXLSX driver list, DOCX listsBrowser path · public URLsBrowserNEXT_PUBLIC_CONVEX_URLCloudflarepublic hostnameConvexself-hosted backendServer path · internal networkNext.js serverauth, queries, preloads, uploadsDocker networkbackend:3230 and backend:3231 noCloudflare challengeConvexsame backend, internal URLRelease · GitHub ActionsPush or PRevery push and every pull requestChecksaudit, lint, test, tsc, buildSSH deploypush to main only; same commitDocker ComposeConvex functions, stack rebuiltSign-in checkendpoint verified after release
Mechanism: every extracted manifest is checked against its own printed totals before it can become a document. Server-to-server traffic stays on the Docker network because the public hostname sits behind a Cloudflare challenge.

Engineering decisions

How it's secured and shipped

Stack

Want this kind of work on your team?