Developer tooling
A CLI the whole team ships through
One command that makes a deploy safe, and puts the same standards in every repository while it is at it.
- Role
- Author and maintainer
my own initiative - Built with
- Node.js, TypeScript
git internals, platform APIs - Used by
- The engineering team
on every client project - Status
- Actively maintained
versioned and documented
Why it exists
Two problems, both worth solving once rather than every week.
Neither looked like a problem from outside. Nothing was broken, nothing was on fire, and both had a workaround a careful person could hold in their head. That is what made them expensive: the cost was spread thin across every week and every person, so it never arrived as something to fix, only as something to be careful about.
The first is that a project can have two owners writing into one file tree. Developers own the code, while someone else, a client or a QA reviewer, owns the configuration they edit through a live editor, and git only ever had a copy of one of those. Deploy a branch over the top and the half you do not own is gone, silently. Everyone knew the rule. It was written down. It still went wrong, because knowing a rule and remembering it at 6pm on a Friday are different things. So syncing needed a senior developer watching, which meant waiting for one.
The second is consistency. Across a lot of client projects, conventions drift: different folder structures, different patterns, different AI rules, different output depending on who picked the job up. Code review catches that eventually, which is a slow and expensive place to catch it.
I started building this on my own initiative to fix both, because they turned out to be the same problem: things the team is supposed to remember should be things the tool already does.
Most of the work was not the code. It was watching where the time actually went, separating the part that was genuinely different per client from the part we were rebuilding every time, and deciding what the tool should refuse to do rather than only what it should make easy. Writing the commands afterwards was the short part.
None of it is specific to one platform. The shape of it, two owners writing into one tree and conventions drifting apart across projects, turns up anywhere a team runs more than a handful of repositories.
$oma sync-preview
Fetching themes...
Sync changes to "OMA | Northbeam | Preview"? yes
Checking git status...
Git repository is clean
Creating preview theme backup...
Committed all theme changes
Tagged qa-preview-backup/2026-09-21T14-53-02
Full theme state preserved in git history
Committing JSON changes...
Committed JSON changes
Comparing local files with preview theme...
Compared with preview theme
$oma sync-preview -t 124906102
Fetching theme info...
Live theme: Northbeam Production
Type the theme ID to continue:
Aborted. Live theme left untouched.
$oma rules sync
CLAUDE.md managed block updated
skills/oma-shopify-theme synced
skills/oma-nextjs synced
agents 4 definitions
Project notes left untouched
One source of truth, shipped with
the tool instead of remembered.
What it guarantees
Nothing overwrites what it does not own
Whatever someone else edited moves one way, code moves the other. The tool will not perform the write that crosses that line, whatever you ask it for.There is always a way back
The remote state is committed and tagged before anything is written, so the version that existed before a sync stays in git history and can be pushed back in one command.Conventions arrive with the tool
Every client is its own thing, so no two builds are identical. What does not need reinventing each time is the shared groundwork: patterns, structure and scaffolding are installed rather than copied out of whichever repository someone last had open.The AI rules travel with it
Our coding standards and agent definitions are distributed into every repository from one source of truth, so everyone’s AI assistance follows the same conventions and the output stays consistent across the team.
Why this matters on a team
Nobody asked me to build this. I noticed the same problem happening repeatedly, and that the cost of it was being paid by whoever was most senior and least available.
That is the part worth knowing about me. I will notice the thing the team keeps working around, and I will go and fix it properly rather than getting better at avoiding it. It means a junior developer can deploy without supervision, a new project is consistent on day one, and the senior people get their afternoons back.
It also means I am comfortable owning something end to end and then continuing to own it: designing it, building it, versioning it, documenting it, and keeping it working while other people depend on it every day. Building it took weeks. Maintaining it is ongoing, and that is the part that decides whether a tool like this survives contact with a real team.