Christoph Leide Christoph Leide
Project · Custom Software

Fiber Reel Inventory

A warehouse serving data center construction tracked thousands of fiber-optic cable reels in a spreadsheet. I built them a system that runs from a phone. Photograph a reel label and the reel is read, filed to a shelf position, and tracked until it ships.

3,600+
Reels tracked
617
Line items
1,032
Shelf positions
1
Person built it

The problem

A fiber trunk assembly is defined by its fiber count, its length, its connector configuration on each end, and the purchase order line it was bought against. Two reels can look identical on the rack and be different parts. The difference is printed on a label wrapped around the flange.

The warehouse held several thousand reels across two bays. The record of what was where lived in a spreadsheet that had been passed between people and typed from memory. Finding a specific reel meant walking the racks and reading labels. Confirming a shipment meant trusting a row nobody had checked.

When the wrong reel ships, a crew waits at a data center for the right cable.

What I built

One web application on a single server at the site, used from a phone browser. There is nothing to install and no per-seat licence. It covers the four things that happen to a reel in the building:

ReceivePhotograph the label
LocateFile it to a shelf position
InspectVerify and log condition
Pick & ShipPull, issue, confirm

Walkthrough

01 Photograph the label

The operator walks the rack with a phone. The camera runs in the browser. Frame the label and tap once. There is no form to fill in first, because at this point the reel has not been identified.

The Receive screen on a phone, showing a live camera preview framed on a reel label
Receive, on a phone. The shelf position carries over between shots, so a full row can be worked without retyping it.
02 The label reads itself

The photo goes to a vision model, which returns the label as structured fields: serial, part number, fiber count, length, connector configuration on each end, purchase order and line, shipment number, country of origin. Barcodes and QR codes in the frame are decoded separately and checked against what the model read.

One photograph produces a complete record. The photo stays attached to that record, so the source is one tap away if a number is questioned later.

A reel record: label photos on the left, extracted fields on the right, inspection log and activity history below
The reel record. Label photo on the left, the fields read from it on the right. Every field stays editable and the operator has the final say.
03 Find it on the shelf

Each row of racking is drawn as it stands in the building: five tiers, twelve slots per tier, with the uprights and beams in place. Green is verified and inspected. Amber came from the old spreadsheet and has not been physically confirmed. Red has an open issue.

Rows alternate direction, because that is how the warehouse numbers them. Odd rows run right to left, even rows run left to right. The grid matches the building.

The rack grid showing a row of racking with reels colour-coded by verification status
Bay 1, Row C. Empty slots show as empty. Reels stored off-rack on the floor are listed underneath.
04 Search the whole yard

One search box covers every field: part number, serial, purchase order, description, location, or a bare “640 465” for a 640-fiber reel at 465 metres. Results group by shelf position, and anything already committed to a shipment is flagged so it does not get promised twice.

The browse and search screen showing the inventory table with status badges
Browse. The counters at the top are live: reels on the shelf, unverified reels, failed inspections.
05 Pick, issue, ship

Reels are selected into a pick ticket that prints as a pull list ordered by shelf position, so the picker walks the rack once. A ticket moves through draft, issued, and shipped. Issued reels come off the available list straight away and are archived once logistics confirms the load left. Aborting a ticket returns everything to stock.

A pick ticket listing 240 reels grouped by shelf location
A 240-reel pick ticket, grouped by location. Shipping paperwork is attached to the ticket.
06 Reports for everyone else

Some of the people who need the inventory have no access to the system, and some want paper. There are printable summaries by part number and by location, per-row pick sheets, and a CSV export.

A printable summary report grouped by part number
Summary by part number: quantity, total length, and every location it sits in.
A printable per-row pick sheet
Per-row pick sheets, ordered the way the picker walks the rack.

Used on a phone

Every screen works at phone width. The warehouse opens a browser at the rack and the office opens the same address on a monitor.

The inventory list on a phone
Search
The rack grid on a phone
Rack grid
A reel record on a phone
Reel record
The barcode scanner on a phone
Barcode scan

Details that make it usable

Most of the effort went into matching how the crew already works.

Locations use the team’s names

The racks have tiers and slots internally. The team says “B-25”, so that is what the interface shows.

Re-photographing appends

Shooting a reel that already exists fills in its blank fields and marks it verified. There is no duplicate record and no dialog to answer while holding a phone at the rack.

Imported rows stay marked

Rows carried over from the old spreadsheet show as unverified until somebody stands in front of the reel.

Everything is logged

Every edit, move, inspection, and status change is recorded against the reel with a name and a timestamp.

Saving opens the next reel

Saving a reel opens the next one by shelf order, so a row can be worked end to end without going back to a list.

Extraction gets checked

Fields stay editable and the source photo stays attached. A person confirms the record.

Under the hood

One Python application, one database file, one server. There is no build step, no JavaScript framework and no container orchestration. It can be handed over without a specialist to keep it running.

Phone browser on the warehouse floor Desktop browser review and reporting Application server Python / FastAPI server-rendered HTML SQLite + photos one file, on disk Vision API label reading only Private network. The only traffic that leaves the building is a label photo.
ApplicationPython and FastAPI, serving rendered HTML.
DataSQLite in a single file. Backup is copying one folder.
Label readingVision model for the printed label, plus barcode and QR decoding.
HostingOne small on-site machine on a private network, with no public exposure.
AccessAny phone or laptop with a browser. Nothing to install.
HandoverDocumented, version controlled and portable to any host.

What this means for your project

Most warehouses, yards and jobsites run something on a spreadsheet like the one this replaced. When it fails, it shows up as a delay on site.

I built this having worked in the building. I know what a fiber trunk assembly is, and why an inspected reel and an imported row have to be told apart. The same approach works for inspection records, material tracking, quality documentation or a submittal log.

All data, part numbers, serials, purchase orders, vendor names, and label images shown on this page are anonymised substitutes generated for this case study. No client information appears in any screenshot.

Have a process that lives in a spreadsheet?

Tell me what it tracks and where it breaks down. I will tell you whether custom software is worth it, and what it would take.

See how this works for your business