Open source · MIT · v0.1.2for oh-my-pi
Make every model play its part.
One command to bring your coding-agent setup together. Curated skills, three model ensembles, intelligent routing, and fallbacks — built on oh-my-pi.
npx omp-maestroClaude thinks. GPT codes. Jev decides. — that's the default mix ensemble. See how it works
Tap a seat.Hover or tab through the seats. Inner row: the worker classes Jev routes delegated tasks to. Outer row: the other roles the ensemble fills.
01The problem
Your models are powerful. Your setup should be too.
omp already gives you model roles, fallback chains, subagents, plugins and skills. The hard part is deciding how to fill them in — and keeping that decision reproducible. Maestro is one opinionated answer, packaged.
- 01
By handChoose a model for each of omp's roles — 17 of them in a full setup — and keep the choices consistent.
With Maestro3 complete ensembles in profiles.json. Every role filled, switchable with one command.
- 02
By handWrite a fallback chain for every role, so one provider's usage limit doesn't stop the session.
With MaestroEvery role ships with a chain. Single-provider ensembles fall back within the provider; the mix falls back across them.
- 03
By handFind good skill libraries, vet them, and install them one repository at a time.
With Maestro6 curated libraries, 52 skills, picked from an arrow-key checklist and installed from the authors' repos.
- 04
By handDecide, turn after turn, whether a small model is good enough — or just pay for the big one every time.
With MaestroThe Jev Router downgrades a turn only when every conservative gate passes, and sizes each subagent to its task.
- 05
By handDo it all again on the next machine.
With MaestroRe-run the installer. Re-running is safe: it updates everything and re-applies the ensemble you name.
02Install
One command, fully equipped.
The installer checks what you already have, asks one question — which skill libraries you want — and runs the rest unattended. Try the checklist below: the commands it prints are the ones the installer would run.
Runner
Ensemble
Claude Opus orchestrates and plans, GPT Sol/Luna do the coding, Claude Sonnet does design and vision.
$ npx omp-maestro
Needs omp, git and Node.js (npx) or Bun (bunx). Missing omp or git? The installer offers to install them — nothing without a yes.
03Ensembles
Three ensembles. One workflow.
An ensemble is a complete set of omp model roles plus a fallback chain for each. Claude thinks, GPT codes, Jev decides describes the default mix; the other two keep everything with one provider. Switch any time — the live session moves to the new lead immediately.
You
“Add OAuth login”
Lead · @defaultmedium
Claude Opus 5.5
Understands, plans, splits the work, reviews what comes back.
Jev Router
picks a worker class per task
@jev-mechanicalGPT-6 Lunalow@jev-boundedGPT-6 Lunamedium@jev-reasoningGPT-6.1 Solmedium@jev-architectureGPT-6.1 Solhigh
Plans
Claude Opus 5.5
@plan · high
Writes the code
GPT-6.1 Sol
@task · medium
Design & vision
Claude Sonnet 5.5
@designer · medium
Small parts
GPT-6 Luna
@smol · low
Claude Opus orchestrates and plans, GPT Sol/Luna do the coding, Claude Sonnet does design and vision. Log in to: Anthropic + OpenAI Codex.
Every role, every ensemblefrom profiles.json
Anthropic OpenAI Codex TypeSafe Jev Web search / another role
| Role | mix | anthropic | openai |
|---|---|---|---|
defaultThe main agent you talk to. Reads, plans, delegates and reviews. | Claude Opus 5.5· medium | Claude Opus 5.5· medium | GPT-6.1 Sol· medium |
planomp's plan mode: read-only exploration before execution. | Claude Opus 5.5· high | Claude Opus 5.5· high | GPT-6.1 Sol· high |
slowThe heavyweight slot in omp's model cycle, for hard turns. | Claude Opus 5.5· high | Claude Opus 5.5· high | GPT-6.1 Sol· high |
taskThe default subagent — this is who writes most of the code. | GPT-6.1 Sol· medium | Claude Sonnet 5.5· medium | GPT-6.1 Sol· medium |
designerDesign-focused subagent work. | Claude Sonnet 5.5· medium | Claude Sonnet 5.5· medium | GPT-6.1 Sol· medium |
visionReads images and describes them for text-only models. | Claude Sonnet 5.5· medium | Claude Sonnet 5.5· medium | GPT-6.1 Sol· medium |
smolFast, cheap model. Jev's main-turn downgrade target; /vibe's fast workers. | GPT-6 Luna· low | Claude Haiku 5.5· low | GPT-6 Luna· low |
tinyVery small background jobs such as titles. | GPT-6 Luna· low | Claude Haiku 5.5· low | GPT-6 Luna· low |
memoryMemory summarisation pipelines. | GPT-6 Luna· low | Claude Haiku 5.5· low | GPT-6 Luna· low |
commitCommit work — the smart-commit agent runs on @commit. | GPT-6 Luna· low | Claude Haiku 5.5· low | GPT-6 Luna· low |
jev-mechanicalInventory, grep, enumerate, extract. | GPT-6 Luna· low | Claude Haiku 5.5· low | GPT-6 Luna· low |
jev-boundedFocused work inside one well-defined subsystem. | GPT-6 Luna· medium | Claude Haiku 5.5· medium | GPT-6 Luna· medium |
jev-reasoningTracing behaviour across components; the safe middle tier. | GPT-6.1 Sol· medium | Claude Sonnet 5.5· medium | GPT-6.1 Sol· medium |
jev-architectureCross-cutting design, migrations, security boundaries. | GPT-6.1 Sol· high | Claude Opus 5.5· high | GPT-6.1 Sol· high |
judgeJudging and classification inside omp — TypeSafe Jev. | TypeSafe Jev | TypeSafe Jev | TypeSafe Jev |
webWeb search provider. | Exa | Exa | Exa |
advisoromp's optional second model that reviews turns, when enabled. | GPT-5.6 Sol· medium | Claude Opus 5.5· medium | GPT-6 Sol· medium |
04Jev Router · the part Maestro wrote
The right model for the right job.
An omp extension that asks TypeSafe Jev how much model each piece of work needs — before any tokens are spent on it. It is deliberately conservative: it only ever routes down when every check agrees, and when anything goes wrong it steps aside.
Main turns
before_agent_start01
Your prompt
Before the turn starts. A model you picked by hand is left alone.
02
Layer 0 guards
Image attached · longer than 12,000 chars · high-impact keyword → @default, no Jev call.
03
Jev judges
Tier, complexity, safe-to-downgrade, blast radius.
04
Six gates
All must pass. One miss keeps the lead.
@smolEvery gate passed. This turn only; the session returns to @default after.
@defaultAnything else — including a Jev error or timeout.
Subagents
tool_call → before_subagent_spawn01
task(…) call
The lead proposes work for subagents, single or batched.
02
Jev classifies
Worker class, and whether the task should be delegated at all.
03
Floors & minimums
Risky changes → architecture. Confidence < 0.65 → reasoning. P(delegate) < 0.3 → parent keeps it.
04
Spawn
On the @jev-* role, with that role's fallback chain.
@jev-mechanical · bounded · reasoning · architectureThe smallest class that can reliably do this task.
parentWork that depends on the lead's unfinished reasoning stays with the lead.
Routing playground
illustrativeLayer 0, the gates, the architecture floor and every threshold run the router's actual logic in your browser. Jev's scores for the examples are made up for illustration — this page never calls TypeSafe.
- 1
Layer 0 guardsrouter logic
No image, under the length limit, no high-impact keyword. On to Jev.
- 2
Jev judges · six gatesillustrative scores
- Tiereconomy = economy
- Tier confidence0.94 ≥ 0.88
- Complexity (0–4)0.40 ≤ 1.25
- Complexity confidence0.90 ≥ 0.65
- Safe to downgrade0.95 ≥ 0.9
- Blast radius0.04 ≤ 0.15
- 3
Route
@smolGPT-6 LunaEvery gate passed. This turn only — the session returns to @default afterwards.
No key? No problem.
Without TYPESAFE_API_KEY the router stays out of the way and omp uses your model roles as normal. The status line says jev: NO KEY.
Fails open after 1.8 s
Jev gets 1,800 ms and no retries. A timeout or any error means plain omp behaviour — never a weaker model because the router hiccuped.
Your choice wins
Pick a model by hand and the router leaves that turn alone. /jev-route off disables it for the session.
05Skills
Your agent deserves better tools.
6 libraries, 52 skills, chosen by hand and installed straight from their authors' repositories with the skills CLI — so you always get the current versions. Tick the ones you want in the installer's checklist; a library that fails to install is skipped with a warning.
6 libraries · 52 skills
- 2skills
- autofix
- code-review
- 1skill
vercel-labs/skillsfind-skills: search and install more skills when you need a new capability
by Vercel Labs
- find-skills
- 25skills
expo/skillsExpo / React Native apps: routing, native UI, modules, EAS builds, updates and store releases
by Expo
- eas-app-stores
- eas-hosting
- eas-observe
- eas-simulator
- eas-update
- eas-update-insights
- eas-workflows
- expo-animation
- expo-app-clip
- expo-brownfield
- expo-data-fetching
- expo-design-system
- expo-dev-client
- expo-dom
- expo-examples
- expo-migrate-module
- expo-module
- expo-native-ui
- expo-overview
- expo-project-structure
- expo-router
- expo-skill-eval
- expo-ui
- expo-upgrade
- expo-web-to-native
- 7skills
heygen-com/hyperframesHyperFrames: make videos, slideshows and motion graphics from HTML, plus Figma import
by HeyGen
- figma
- hyperframes
- hyperframes-cli
- hyperframes-registry
- media-use
- remotion-to-hyperframes
- slideshow
- 2skills
sanity-io/agent-toolkitSanity CMS: schema/GROQ best practices and migrating content into Sanity
by Sanity
- sanity-best-practices
- sanity-migration
- 15skills
emilkowalski/skillsEmil Kowalski's design engineering: UI polish, web/Expo animation, Apple-style design, Swift
by Emil Kowalski
- animate
- animate-expo
- animation-performance
- animation-vocabulary
- apple-design
- ask-sonner
- break-ui
- emil-design-eng
- find-animation-opportunities
- improve-animations
- mobile-native
- pick-ui-library
- prototype
- review-animations
- write-swift
Want a different set? Edit skills.json in your fork — each entry is a repo, a one-line description and the skills to install.
06Fallbacks & control
Built for flexibility. Not lock-in.
Every role comes with a fallback chain, written into omp's own retry.fallbackChains. Single-provider ensembles fall back within that provider; the mix falls back across providers, so one plan's usage limit doesn't have to stop the session.
@task — The default subagent — this is who writes most of the code.
- 1stGPT-6.1 Solopenai-codex/gpt-6.1-sol:mediumprimary
- if unavailable2ndGPT-6 Solopenai-codex/gpt-6-sol:medium
- if unavailablecrosses to Anthropic3rdClaude Sonnet 5.5anthropic/claude-sonnet-5-5:medium
{ "modelRoles": { "task": "openai-codex/gpt-6.1-sol:medium" }, "retry.fallbackChains": { "task": [ "openai-codex/gpt-6-sol:medium", "anthropic/claude-sonnet-5-5:medium" ] }}// Merge: only the roles this setup defines are replaced, the user's other roles stay.run("omp", ["config", "set", key, JSON.stringify({ ...current, ...profiles[setup][field] })]);When a provider fails
That's omp's retry logic at work: when a request fails, omp can move to the next model in the role's chain, following its own retry settings. Maestro only supplies the chains.
When the router fails
A missing key, a 1,800 ms timeout or any Jev error makes the Jev Router step aside. Turns run on @default, tasks on omp's normal roles. Nothing else in Maestro depends on it.
When you change your mind
It's your omp config. Change any role with /model, fork profiles.json to ship your own ensemble, or switch back with /maestro. Configuration guide
07Day to day
After installing, you just work.
A handful of commands cover everything Maestro adds. Click one to see what omp prints — switching ensembles moves the session's lead, and turning the router off updates the status line.
Router counters and the last decision.
enabled=true | verbose=false | key=yes | smol=3 | default=11 | skip=1 | judgeErrors=0 | child[mech=5,bounded=7,reasoning=4,arch=2,parent=1,errors=0] | last=route=default tier=standard/0.84 complexity=2.10/0.81 downgrade=0.22 impact=0.09 web=0.12 690ms — @default safety gates: tier=standard, tierConfidence=0.84, complexity=2.10, safeDowngrade=0.22
Output format from the source; the counters and scores are examples.
Every flag and subcommand is in the command reference.
08How it fits together
A thin layer, clearly labelled.
omp does the work. Maestro configures it and adds one extension. Everything else is installed from its authors. Here is who owns what.
You
Developer at the terminal
- omp
- /maestro
- /jev-route
- /vibe
oh-my-pi (native)
The harness: sessions, tools, subagents, settings
- modelRoles
- retry.fallbackChains
- task tool
- /model
- /login
- /vibe
- plugins
- skills loader
Maestro · MIT
omp-maestro plugin + installer
- extensions/jev-router.ts
- extensions/maestro.ts
- agents/smart-commit.md
- profiles.json
- skills.json
- bin/omp-maestro.mjs
Community
Installed from the original sources
- ponytail
- skills CLI
- 6 skill libraries → ~/.agents/skills
TypeSafe
Judges routing decisions
- Jev (jev-latest)
- @typesafe-ai/sdk
- TYPESAFE_API_KEY
Model & search providers
Do the actual work
- Anthropic
- OpenAI Codex
- Exa → DuckDuckGo
- Native omp
- Roles, chains, subagents and commands like /vibe exist without Maestro.
- Maestro
- Fills them in, adds the router and /maestro, and installs the rest.
- TypeSafe
- Answers the router's questions. Optional: no key, no routing.
- Community
- ponytail and every skill library — each with its own license.
09Why Maestro
Less setup. More building.
Everything Maestro does, you could do by hand in omp. That's the point: it's a reproducible starting point, not a black box. Here's the honest comparison.
| Aspect | omp by hand | omp + Maestro |
|---|---|---|
| Model roles | Pick a model for each of 17 roles | 3 ready-made ensembles, one command to switch |
| Fallback chains | Write one per role | Every role has one; the mix crosses providers |
| Skills | Find and install each repository | 6 curated libraries, 52 skills, one checklist |
| Small models | Switch by hand, or never | Jev Router — only when every gate passes |
| New machine | Repeat the above | Re-run npx omp-maestro |
| Control | Total | Total — Maestro only writes the roles it defines |
No benchmarks here, on purpose: how much a router saves depends entirely on your prompts. /jev-route status shows you how your own turns were routed.
10Open source & credits
Maestro is the conductor. The community is the orchestra.
Most of what Maestro installs is other people's work. Every plugin and skill comes from its original source, and nothing is copied. Go star their repositories.
The stage
The skill libraries
Maestro's own code is MIT-licensed
The Jev Router, /maestro, the installer and the ensembles. Each third-party project keeps its own license.
11FAQ
Questions, answered.
Can't find yours? Troubleshooting has more.
Do I need both a Claude and a ChatGPT subscription?
Only for mix. The anthropic ensemble needs just Claude; openai needs just ChatGPT / Codex. Log in inside omp with /login.
Can I use only one provider?
Yes. Install with npx omp-maestro anthropic or npx omp-maestro openai, or switch later with /maestro anthropic / /maestro openai. Single-provider ensembles also keep their fallback chains within that provider.
Does the Jev Router need a TypeSafe API key?
Yes — set TYPESAFE_API_KEY in your environment or in ~/.omp/agent/.env. Without it everything else still works: the router stays out of the way, omp uses your model roles as normal, and the status line shows jev: NO KEY.
What happens if Jev is unavailable?
The router fails open. A missing key, a 1,800 ms timeout or any Jev error means plain omp behaviour: the turn runs on @default, and subagents use omp's normal roles. You never get a weaker model because the router hiccuped.
Will Maestro overwrite my existing omp configuration?
Only the model roles and fallback chains an ensemble defines. The installer reads your current modelRoles and retry.fallbackChains and merges into them; your other roles, theme, keybindings and settings are left alone.
Can I switch ensembles later?
Any time, with /maestro mix, /maestro anthropic or /maestro openai. The live session moves to the new lead model immediately. Re-running the installer with a different ensemble name works too.
How do I customise roles?
Use omp's /model (Roles view) to change any single role; /maestro then shows custom. To ship your own ensembles, fork the repository and edit profiles.json — the command, the installer and the router all read it.
How do I uninstall it?
Run omp plugin uninstall omp-maestro, optionally omp plugin uninstall @dietrichgebert/ponytail, and npx skills remove -g to pick skills to remove. Your model roles stay as they are — change them with /model.
Does it work in CI or other non-interactive environments?
Yes. Without an interactive terminal the skills checklist is skipped and every skill library is installed. The installer also won't offer to install missing tools — omp has to be present already.
What is Maestro's relationship to oh-my-pi?
Maestro is an omp plugin plus an installer, made by an omp user — not part of the omp project and not a replacement for it. omp, by Can Bölük and contributors, does all the actual work; Maestro configures it and adds the Jev Router and /maestro.