
Context
On Timocom, freight and client offers change quickly. Official API access can be expensive or unavailable for the needed scope, while manual copy-paste burns time and introduces errors. This plugin is a practical workaround: it listens to DOM changes, captures offer data, and stores it in a lightweight in-browser CRM.
Goal
I designed and delivered a Firefox extension that:
- captures freight / client offer data near real time,
- does not require a costly Timocom API,
- provides a local CRM (leads, history, statuses),
- runs as content script ↔ background ↔ storage.
My role
I owned design, solution design, implementation, and up to 30 days of post-launch care (fixes after platform UI changes, stabilisation).
Scope
Smart DOM monitoring
- MutationObserver instead of aggressive polling,
- reaction to listing appearance / changes,
- independence from a paid API.
Built-in CRM
- organise leads and interactions,
- persist data (LocalStorage / IndexedDB),
- track statuses from contact to completion.
Technical layer
- content script (DOM observation, parser, UI inject),
- background script (CRM logic, events),
- storage manager (preferences + larger datasets).
Approach
Event-driven architecture: the browser reacts to page changes instead of constantly hitting the network. The parser is adaptive — Timocom renders offers in different layouts depending on filters and views, so extraction needs fallbacks and graceful handling of missing fields.
Content Script ↔ Background Script ↔ Storage
(DOM + parser) (CRM + events) (LocalStorage / IndexedDB)
Challenges
- Dynamic platform frontend — classic scraping breaks on SPAs; MutationObserver + selective observation targets.
- Variable offer structure — different formats per view; adaptive parsing and normalisation.
- Browser performance — debounce, narrow observation targets, and efficient storage so monitoring does not grind tabs down.
Outcome
The result is a Firefox extension that collects Timocom offers without an API and organises them in a local CRM — a cheaper, faster operational path for freight work. I provided up to 30 days of post-launch care after go-live.


Stack
- JavaScript (ES6+)
- Firefox Extension API (content / background scripts)
- DOM MutationObserver, HTML5, CSS3
- LocalStorage + IndexedDB