Senior Backend Engineer · Principal Engineer at EZO

I build backend systems, then build the tools to understand them.

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.

Lahore, Pakistan · Open to remote or relocationmehboob@mehboob.dev

12–15h → <1h
device sync
8
team led
3
promotions

Five years, four things

A sync pipeline, a CMDB, the rmine CLI and a workflow engine, connected as one path. syncCMDBrmineworkflow

Selected work

Three projects I know inside out.

All three are part of AssetSonar, the IT asset management product I work on at EZO.

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.

Ruby on RailsDelayed JobMySQL
Open the case study →
Before
12–15 hours
After
Under 1 hour

Product and platform

Automation that could branch

I led the replacement of a one-step rules engine with a production node canvas supporting branching, iteration, API execution, and readable run histories.

Team
Approximately 8 engineers
Status
Running in production
A member offboarding trigger reaches an inactive-status condition, which branches to an Entra user update and to opening a ticket. TRIGGERmember.offboardedCONDITIONstatus = inactiveCONNECTOREntra: update userACTIONopen ticket
A server traverses to its installed software, that software's licence, and the vendor behind the licence. A ticket hangs off the server and a contract off the licence. ticketINC-4821contractCTR-77ASSETsrv-014LEVEL 1SQL ServerLEVEL 2LIC-2291LEVEL 3Microsoft
Level 1 is what the graph shows by default. Each card expands to the next level, so this path answers which vendor contract covers the software on one server. Before it, every one of those links was a separate lookup. Sanitized from the shipped feature; the record names are illustrative and no customer data is shown.

Architecture and technical leadership

A CMDB that actually models relationships

I led the architecture and delivery of a relationship model that can answer what touches a configuration item several hops away.

Team
5 engineers
Duration
7 months

Also built

A server rack layout editor

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.

Ruby on RailsReactTypeScriptReact Flow
A server rack layout editor. A 2U server dragged from the palette skips a 1U gap that is too short and lands in the next free 2U slot. PaletteRack, 12UServer2USwitch1UUPS2U1U free, too shortServer 2U

By the numbers

I checked five years of tickets. Here’s what I found.

rmine, a CLI I wrote, pulled the history and did the counting.

features deployed

170

features deployed

Built by me and deployed, across AssetSonar and the EZOfficeInventory line, 2021 to mid-2026.

major launches

20

major launches

months to production

7

months to production

Features deployed per year
Features deployed per year, 2021 to 202611 in 2021, 11 in 2022, 32 in 2023, 38 in 2024, 55 in 2025, and 23 in the first seven months of 2026. 170 in total.112021112022322023382024552025232026to Jul

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.

How I counted this

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.

Read the source on GitHub

Career

How the job changed.

  1. Software Engineer

    Aug 2021 – Jan 2023

    Backend engineering

    Rebuilt the device sync from 12–15 hours to under one hour and built the audit-trail engine.

  2. Software Engineer (L2)

    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.

  3. Senior Software Engineer

    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.

  4. Principal Software Engineer

    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

AWS Certified AI Practitioner (AIF-C01), 2026.

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.

  • Conventions that arrive with the branch

    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.

  • Guardrails built into setup

    3 hooks · 4 products · automatic updates

    Setup installs checks for debugger statements, conflict markers, lockfile drift, and Ruby syntax. Ticket references are added automatically.

  • Performance feedback at the source

    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

Things you can inspect.

rmine

Go

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.

Real output excerpt · rmine --help
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

rmine-skills

Claude Code plugin

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.

The three subagents behind /estimate
The auditor can't give hours. The estimator prices the work against the code. Below a wall, the validator never sees how the estimate was derived. auditorcan't give hoursestimatorprices it against the codevalidatornever sees the derivation

bitwise_attributes

Ruby gem

Packs boolean flag attributes into a single ActiveRecord integer column. Started as an internal pattern I used for two years before publishing it.

job-search-agent

Node.js

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.

How I work

  • 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 →

Open to remote or relocation. Email is the fastest way to reach me.

mehboob@mehboob.dev

Resume

Senior Backend Engineer (Ruby on Rails)

Full-stack variant

Full-stack (Rails + React)

PDF ↓