ALL WORK

CASE STUDY · IDENTIUM TECH SOLUTIONS

Identium Inventory Management

Scan a crate tag, see everything inside it

ROLE
Full-Stack · Designer
CLIENT
Identium Tech Solutions
YEAR
2026
STACK
Electron 31Node.jsVanilla JavaScriptHTML / CSSelectron-builder (NSIS)Electron IPC with contextIsolation preloadJSON file storage.NET ModuleBridge.exe helper over stdio

OVERVIEW

The store room inventory lived in an Excel sheet that nobody could use on the floor. This app takes that sheet, converts it into a tag indexed JSON store, and wraps it in an Electron desktop app with seven views: live scan, session history, a searchable inventory table, a row grouped view, tag registration, audit, and reader setup. It talks to fixed Identium network readers through a .NET helper process and accepts handheld HID scanners as plain keyboard input. Everything is editable in place, and the whole inventory or the scan history can be exported to CSV, Excel, or PDF.

THE CHALLENGE

The source of truth was a hand kept Excel sheet, not a database. A blank crate cell meant "same crate as the row above", row headers were sometimes typed as RAW instead of ROW, and a few EPC strings had stray non hex characters, so the converter had to carry state down the sheet and normalise as it went. The real data also has the same EPC printed on more than one crate, so lookup could not assume one tag maps to one box and had to return every grouped match and mark it ambiguous instead of silently picking the first. On top of that the fixed reader is only reachable through a vendor .NET SDK, so the Electron app drives it through a child process over stdio rather than a native module.

WHAT I BUILT

  • 01

    A JSON line protocol bridge (app-main/bridge.js) that spawns the .NET ModuleBridge.exe as a child process, matches replies to commands by seqId with per call timeouts, recovers when the process exits, and forwards tag read events (antenna, RSSI, frequency, read count) up to the renderer

  • 02

    An EPC index in the main process that groups matches by row plus crate number, so one scan can return several crate cards at once and the UI flags a tag that has been stuck on more than one crate

  • 03

    A spreadsheet converter (scripts/convert-sheet2.js) that walks the raw sheet rows, carries the current row label, crate number, weight, and crate EPC forward across blank cells, and repairs source typos such as RAW K meaning ROW K

  • 04

    An audit view that takes a crate as target and updates expected, verified, missing, and unexpected counts live as tags arrive from either reader type

  • 05

    Export in three formats from the same row builders: CSV, an .xls written as Excel 2003 SpreadsheetML, and a PDF rendered by loading generated HTML into an offscreen BrowserWindow and calling printToPDF

  • 06

    A working copy of the inventory in userData with full CRUD (add, edit, delete items, rename rows and crates, reset to original) plus a dataVersion stamp that re-seeds the copy when the bundled sheet is replaced

OUTCOME

Packaged into a Windows installer and used against the real store room data: 105 items across 76 crates and 12 rows, 101 of them tagged. Finding what is in a crate went from opening a spreadsheet and reading down a column to pointing a reader at the box.

NEXT TRANSMISSIONComponent Counter