Stockroom Barcode Physical Tracking Design

Part of the Simple Agility stack. Canonical copy: ~/source/stockroom/docs/superpowers/specs/2026-10-05-stockroom-barcode-inventory-design.md. This page mirrors the decisions for retrieval. It follows StockroomIntakeInventoryPricingDesign and the phase 3 build (StockroomPhase3ListingPreparationPlan). Status: draft for operator review, 2026-10-05.

Why

Stockroom takes books into stock by scanning their ISBN, and records where items are (room, shelf, bin). It has no physical layer that scanning can drive. That means no barcodes of its own, no containers that move, no scanning into places, no finding by scan, no picking and no counting. The operator reopened this deferred scope because inventory across several sales channels (FBA, eBay, Craigslist, possibly Facebook Marketplace) is about to become critical.

The work is split in two:

  1. Physical tracking (this design).
  2. Channels and sales: where each item is listed, recording a sale, and removing a sold item from the other channels within minutes. That is a later design.

Key decisions

TopicDecision
CratesA movable location kind. Items point at their crate, so moving the crate moves its contents. A crate sits in a room or on a shelf, never in a bin or another crate. Bulky items can sit directly on a shelf or floor spot.
Printed labelsCode 128, encoding I-<SKU> for items and L-<code> for places and crates. The codes are derived from the thing itself, so no table is needed and any label can be reprinted.
Pre-printed stickersA registry binds an opaque sticker code to an item or a location on first scan. Codes in Stockroom's own format are refused, and so are codes already bound to something else.
Item labelsOptional. Unlabeled identical copies are interchangeable. A copy whose condition differs gets its own label, and its listing describes that copy.
Scan resolutionChecked in this order: Stockroom's own codes, then bound stickers, then product barcodes (ISBN, UPC, EAN), then a typed SKU, then unknown, which offers to bind the code as a sticker. A product barcode means a copy in the crate or place currently being worked in; otherwise a chooser lists the copies.
Scanning devicesOne scan bar for both. The handheld scanner types into it. A camera button decodes through the browser's barcode detector, or a ZXing WebAssembly polyfill on iPhone. The camera needs HTTPS, which comes from a Cloudflare proxy.
JobsIntake straight into a crate; place (put-away); move a crate; find; pick (from FBA, buyback, lot or ad hoc sources); count. Counts and picks are sessions stored on the server.
Missing itemsA finished count marks unfound items as missing and lists them in a Missing queue. Nothing is deleted, and an item scanned later is no longer missing.
PrintingPrinter-agnostic PDF, one label per page, rendered on the server with PDFBox and ZXing. Bar widths land on whole printer dots (203 or 300 dpi). Default sizes: item 2.25 x 1.25 in, crate 4 x 6 in, shelf or bin 2.25 x 1.25 in.

Out of scope

Rollout

One implementation plan, which becomes rollout phase 4 ahead of photo-first identification. It needs HTTPS through the Cloudflare proxy before the camera can be used.