Jewellery is small, valuable and counted often. With a UHF RFID tag on each piece, a reader can count a whole tray at once. This project was the desktop software around that reader.
It was my first freelance project, taken on after I left my first job.
The problem
The reader's vendor ships a capable Windows tool. It connects to the reader, sets antenna power, reads tags and updates firmware.
It knows nothing about a jewellery business. Branches. Staff who sign in. Stock that has to match the back office. Pieces moving between branches. An alarm when a tagged piece leaves the floor.
The client needed all of that on the same Windows PCs, talking to their existing back-office web services.
What I built
I kept the vendor's tool, 61 source files, as the base and added 57 files around it.
UHF reader (vendor SDK) │ tag reads ▼ reader interface ─► tag format: hex · ASCII · defined format │ ├─► output: type into the focused window, or a grid └─► business screens sign-in · branch · licence · PIN inventory · find · single-tag details tag write · secured tag write anti-theft · audit filters · real-time transfer │ ▼ back-office web services (login, branches, audits, transfers, anti-theft)
Decisions that mattered
Extend, don't rewrite. The vendor's tool already handled the hardware: connection, antennas, power, firmware. A rewrite would have meant relearning every edge case of the reader SDK. The business code sits beside it and touches the reader through one interface.
Interfaces at the seams. The reader, the tag data format and the output target each sit behind a small interface. A tag can be read as hex, as ASCII or as a defined format. Results can go to a grid, or be typed into whichever window has focus, the way a barcode scanner would. Adding a format or an output meant adding a class, not editing the screens.
Settings behind a PIN. Reader power, API endpoints and tag passwords live on separate configuration screens behind a password, away from the counter staff's daily screens. Stored settings are encrypted.
A licence per installation. A licence screen and service gate the app on each machine.
Transfers checked tag by tag. When stock moves between branches, the tags read at the counter are compared with what the back office says should be there. Unmatched tags are listed on screen, not lost in a total.
What was hard
The commit history has five commits called "Final". The client kept using the app, and every round of use produced a list of changes: the anti-theft screen grew multi-tag support, the audit filter needed multi-select, the typed output and tag-write behaviour were reworked on request.
That was the real work: turning a reader demo into something counter staff could run all day without seeing a firmware setting.
Where it stands
The last commit landed on 1 January 2025, after 34 commits over eleven weeks.
The source is private client work. This write-up stays at the architecture level and leaves out the client's name, documents and code.
