← All projects

Service Shop Tooling

live

Browser automation, label-printing services, and repair workflow tools for an API-less medical-device inventory system.

Browser ExtensionJavaScriptPythonDockerInternal Tools

Overview

The aging web apps a service shop runs on — a legacy inventory system (Tracmor), plus Gmail and CompanyCam — were never built to be extended, and waiting on vendors wasn’t an option. So I built the missing layer myself: bookmarklets and a browser extension that inject the capabilities people actually need into the pages they already use, backed by a small multi-service backend that does what the legacy systems can’t.

It was always a stopgap, and it earned its keep. While the legacy app was all anyone had, the bookmarklets and label printer were in heavy daily use across the shop, and the extension rolled out to supersede the bookmarklets. It now hands off to a proper internal replacement (Tracmor2, built by another engineer). What outlasts the stopgap is the data work underneath — reverse-engineering Tracmor’s data, asset deduplication, a parts-compatibility store, and a vision-LLM part identifier — which has its own writeup: Parts Intelligence.

How it started

It began as a much bigger effort: a set of custom Odoo modules to modernize the shop’s inventory and job workflows. When that project got cut for scope and time, I pivoted to meet the legacy systems where they already were rather than replace them. The label printer started life as the Odoo print integration from that work, and once the Odoo project was shelved, I extracted it into a standalone service that quietly grew into its own little multi-service Docker Compose stack.

What it does now

  • Bookmarklets that augment Tracmor in place: one-click “print this asset’s label,” and a jump from a model page to a new-asset form with category, manufacturer, status, location, and serial pre-filled from per-user preferences (working around the fact that Tracmor’s two internal ID systems disagree).
  • A Manifest V3 browser extension (Chrome + Firefox) that supersedes the bookmarklets: content scripts for Tracmor and Gmail, an options page, and a build/live-mirror flow so non-developers can edit the deployed copy safely.
  • A label-printing service: a Flask app (behind nginx, in Docker) that rasters labels with Pillow and sends them to a Brother QL-820NWBc over WiFi. Three layouts (a standard asset tag, a portrait “system” label with a full-width QR code, and a legacy layout parsed from the original Brother P-touch .lbx template), plus Odoo print-queue polling: the surviving piece of the original Odoo integration.
  • A shared backend for the front-end tooling: a small proxy/data layer that gives the API-less legacy systems a usable surface for the bookmarklets and extension to call, including an Odoo client. The nightly Tracmor data pulls and the reconciliation built on them are covered in Parts Intelligence.

Status

The front-end stopgap (bookmarklets, extension, label printer) saw heavy daily use while the legacy app was the only option, and it’s being handed off to the internal Tracmor replacement. The data work underneath it carries forward on its own in Parts Intelligence: the reverse- engineering, deduplication, parts-compatibility, and part identification.