Backend performance
The sync job that took half a day
AssetSonar's device sync was taking 12 to 15 hours. I rebuilt the pipeline around batched writes and removed the redundant lookups.
- Before
- 12–15 hours
- After
- Under 1 hour
Senior Backend Engineer · Principal Engineer at EZO
At EZO, I lead our workflow automation work. Before that, I took the CMDB from an idea to production. I also build small tools for the parts of engineering work that are still too manual.
Five years, four things
Selected work
Backend performance
AssetSonar's device sync was taking 12 to 15 hours. I rebuilt the pipeline around batched writes and removed the redundant lookups.
Product and platform
I led the replacement of a one-step rules engine with a production node canvas supporting branching, iteration, API execution, and readable run histories.
Architecture and technical leadership
I led the architecture and delivery of a relationship model that can answer what touches a configuration item several hops away.
Also built
Both halves are mine: the Rails API that saves a layout's racks and devices in one transaction, and the React editor on top of it.
Drop a device on a rack and it lands in the nearest free slot tall enough to hold it, or the editor says there's no room. Drag one onto occupied units and it goes back where it was.
By the numbers
rmine, a CLI I wrote, pulled the history and did the counting.
170
features deployed
Built by me and deployed, across AssetSonar and the EZOfficeInventory line, 2021 to mid-2026.
20
major launches
7
months to production
170 deployed features across five years, counted by the year most of the work was logged in rather than the year the ticket was filed. 2026 is hollow because the export stops at the end of July.
Feature tickets I worked on as a developer, exported with -o json, keeping only the ones that were deployed, then grouped by the product's own feature flag. The tool is open source and the tickets are private, so you can read the method but you can't rerun it. Where a number is a range or an estimate, it's written as one.
Career
Aug 2021 – Jan 2023
Backend engineering
Rebuilt the device sync from 12–15 hours to under one hour and built the audit-trail engine.
Jan 2023 – Jul 2024
Feature ownership
Took features from spec refinement with product through to launch, including the service catalog, duplicate-device matching and the AWS Marketplace sign-up.
Jul 2024 – Jul 2026
Technical lead
Led delivery across workflow automation, the CMDB relationship graph and AWS cloud integration, and introduced the team's RFC process.
Jul 2026 – now
Architecture and leverage
Pull-request reviews for 40+ engineers since 2022, candidate interviews, production escalation, technical direction, and tooling that changes how the wider team ships.
Publication
Open research knowledge graph for structuring scholarly contributions using transformers. With Abdullah Malik and Maryam Bashir. IEEE ICACS, 2023.
Certification
What stayed behind
The job moved from building features to changing how features get built. These are three changes the team still carries into new work.
12 rules · 3 skills · merged June 2026
Rails and React rules now travel with every branch, so engineers don't have to reconstruct the same conventions from memory.
3 hooks · 4 products · automatic updates
Setup installs checks for debugger statements, conflict markers, lockfile drift, and Ruby syntax. Ticket references are added automatically.
Bullet · Slack · staging
N+1 warnings reach Slack with the request, suggested fix, stack frames, and the exact GitHub line before the regression reaches production.
Open source
Redmine CLI with JSON output and a Claude Code skill built in. Used by the team at EZO.
It started as a way to inspect five years of ticket history. The team now uses the same binary day to day, and the delivery numbers above came straight out of it.
rmine --helpA command-line client for Redmine Available Commands: issue Work with Redmine issues skill Manage the rmine Claude Code skill time Log and manage time entries
Six Claude Code skills built on rmine, used by the team at EZO. They estimate tickets, draft time logs from git, and check sprint capacity.
Its /estimate skill hands a ticket to three subagents, and none of them can write a file. Most of the design went into what each one isn't allowed to see.
Packs boolean flag attributes into a single ActiveRecord integer column. Started as an internal pattern I used for two years before publishing it.
Job discovery for Codex. The finder and judge agents can't write; one deterministic script owns every tracker change, and it never submits an application.
Writing
I write down the messy part first. Once the uncertainty is visible, splitting the work gets much easier.
The spec auditor →I don't disappear after release. I stay close to the logs, support questions, and awkward edge cases.
N+1 warnings routed to Slack →If I have to explain the same manual fix twice, I start looking for the tool that removes it.
Why rmine exists →Resume
Senior Backend Engineer (Ruby on Rails)
Full-stack (Rails + React)