A packing-list generator that turns a stack of BOM PDFs into sealed, stamped DD Form 1750s with a commander-ready SITREP. Soldiers pick a unit profile, pack the connex on a 2D split screen, seal it, and download the paperwork instead of retyping it by hand.
Packing a connex means matching a bill of materials against boxes, hand-typing a master 1750 and a 1750 per box, then chasing signatures before anything can ship. Miss a line item and the whole stack gets redone. The paperwork is the bottleneck, not the packing.
An operator picks the unit from a searchable gallery of 715 brigade insignia, which pre-fills the header fields. They name the connex, set the box count, then work a 2D split screen: BOM cards on the left, box cards on the right, drag one onto the other. Individual items get added straight into a box, no separate step.
Seal data (SUN, CONNEX, SEAL numbers, packed-by, signed-by) comes next, then a per-box review checklist. "Apply Stamp & Seal" locks the connex and downloads a ZIP straight away: a master 1750, one 1750 per occupied box, done. Pack another connex under the same profile, or close out and generate the commander's SITREP across everything packed.
This isn't a prototype sitting in a repo. It's already replacing the hand-typed DD1750 process for soldiers packing real connexes. The legacy flat-file workflow stays available under a collapsible "Legacy" section, so units can switch over at their own pace instead of being forced into the new flow on day one.
Flask 3.0, Python 3.11, and gunicorn on the backend. JSON files on disk for persistence, no database to babysit. PDFs render with reportlab, pypdf, and pdfplumber. The frontend is vanilla JS ES modules: no framework, no build step. It deploys to Railway.
The core workflow runs a single gunicorn worker on purpose. It's a single-user tool, and that keeps the state model simple. Next up is wiring the NSN/LIN suggestion helper that's already stubbed into the packing step, so an operator can type a plain description and get the right line item back.