UniDeX is an agent-driven development harness: Claude Code, Codex and local models work on your projects together throughout the development lifecycle. One model plans and the other reviews the plan, one builds and the other inspects the diff, and a model on your Mac handles the routine background work (session summaries, memory, insights) at no cost. You work through your Chief of Staff, a named agent you interview once that answers in every Claude Code or Codex session, briefs you on where your work stands, and improves itself as it goes: repeated corrections become rules, changes to its own duties arrive as proposals you approve, and it earns autonomy one kind of change at a time. Run it with Claude Code, Codex or both: they share one memory, so every session starts with what the last ones learned, and your data goes nowhere but your Mac and your own Claude Code or Codex login.
What you get
Screenshots
The full gallery, with Files, To-Do, Notifications, Routines and the rest of Brain, is in docs/screenshots.md. The pictures come from a made-up demo vault.
Quick start
- Download UniDeX from the latest release (
AgenticOS-Workbench-<version>-arm64.dmg), open it and drag the app to Applications. - Open the app. Its setup wizard installs what UniDeX needs (Node, uv, Ollama and its model; Claude Code and Codex if you want them) with nothing on the Mac beforehand: no Homebrew, no terminal. It asks which hosts and which vault folder, asks your Chief of Staff's questions, installs, offers to bring in your Claude Code and Codex history, and opens on a guided tour.
- Start a
claudeorcodexsession: the first prompt already carries your memory and your Chief of Staff. In Codex, run/hooksonce first and trust the agenticos entries, as the wizard's last step reminds you. Installed without a host? Add one later under Settings ▸ Hosts, or withaos hosts add claude(orcodex).
Prerequisites
The app's wizard installs all of these itself; each download is pinned, checksummed and checked against its maker's code signature. From a terminal, you bring them.
Installation
With the app. The app is signed and notarized and carries the runtime inside it. Its wizard runs in six steps (Check, Choose, Your agent, Install, Your history, Finish) and nothing is written until you choose Install. Afterwards it keeps itself current from GitHub Releases and offers to update the runtime in your vault when it carries a newer one.
From a terminal. The same install from a clone of this repository, which is also how CI tests it:
git clone https://github.com/zzoretich/UniDeX-Agent-Harness.git
cd UniDeX-Agent-Harness
npm ci --ignore-scripts
npm run setup # the interactive installer (= node cli/aos.js init)
export PATH="$HOME/.local/bin:$PATH" # add the same line to ~/.zprofile
aos doctor # exits 0 when every check passes
aos local pull # with Ollama: download this Mac's model and the embedder
Then wire your host: for Claude Code, add the one line the installer prints (@/path/to/your/vault/AGENTICOS.md) to ~/.claude/CLAUDE.md; for Codex there is nothing to paste, so open codex, run /hooks and trust the agenticos entries once. Then open the app.
Every wizard step, every installer step and flag, hosts, providers and spend caps are in docs/install.md. Updating from 1.x? docs/migrating-to-2.0.md says what the update asks and how to undo it.
Uninstall
aos uninstall --keep-vault # remove both plugins (or the direct Codex wiring), schedules, symlink, the graphify tool dir and agenticos.json; keep the vault
aos uninstall # additionally delete the vault, after you type its path back
aos uninstall --host codex # unwire only the Codex host; keep everything else
To remove the app too, quit it and drag UniDeX from Applications to the Trash; its own settings are in ~/Library/Application Support/AgenticOS Workbench. ~/.claude and ~/.codex are left as they were, and no form of aos uninstall edits your CLAUDE.md: remove the @<vault>/AGENTICOS.md line yourself.
Your first session
Run claude or codex in any folder and ask what do you know about me? The first prompt arrives with your memory (<brain-context>) and your agent (<persona>). When you are done, /wrap saves what the session learned into the vault. In a later session, use the agenticos recall tool to search for … answers from your own notes.
Then say sitrep for a one-action briefing on where your work stands, and review persona flags to walk through anything your Chief of Staff has flagged or proposed.
Everyday commands
The ones you will use most. Every command, with every flag, is in docs/commands.md.
Inside a session (Claude Code: /name · Codex: $agenticos:name)
On the command line
Staying up to date. The app updates itself and installs the new version when you quit, or at once from Restart to Update, then offers to update the runtime in your vault (aos upgrade does the same from a terminal). What each version changed is in CHANGELOG.md and on its release page.
The agent you work through: a named agent with one job description, a memory of its own decisions, and a contract about what it may change without asking. You interview it once during the install (its name, how it addresses you, its voice, what to watch, its model and schedule). After that it rides along on every prompt on either host and works on a schedule whether or not you are at the keyboard. Its identity, state and proposals are generated in your vault and never ship in this repository.
What it does on its own
Duties run headless on its model for each host (claude-opus-5-5, or gpt-6-sol on Codex), each under its own cap and a daily cap across both hosts, and a duty never runs git commit.
How it improves itself
flowchart LR
T["tick · hourly<br/>notices what changed"] --> Q[("queue.jsonl")]
Q --> R["reflect · nightly<br/>files at most 2 proposals"]
R --> P[("proposals/")]
P --> Y["you · review persona flags<br/>approve · reject · accept · dismiss"]
Y --> L[("ledger.jsonl")]
L --> W["heartbeat · daily<br/>verified, or regressed"]
W -. "a regression is a new signal" .-> T
Its identity, its duties and anything outside its own folder are guarded: it changes them only by filing a proposal with a recheck, a command that keeps passing for as long as the finding is still true. Every outcome lands in a ledger, so a rejected idea is never filed twice and a regression counts against the fix that caused it. Once one kind of change has three verified approvals with no regression and no rejection, it may propose applying that kind on its own, a proposal you approve like any other. aos persona off is the kill switch.
Talking to it: sitrep for the morning page, review persona flags to decide everything pending in one pass, and aos persona to re-run the interview, rename <name> it or turn it off and on. The full reference is docs/chief-of-staff.md.
flowchart LR
CC["Claude Code session"] -- "hooks, via aos" --> RT["vault/brain/scripts"]
CX["Codex CLI session"] -- "hooks, via aos" --> RT
RT --> V[("Your vault<br/>memory · daily notes · _index")]
V -- "agenticos MCP server" --> CC
V -- "agenticos MCP server" --> CX
V --> HUD["UniDeX app"]
RT -. "provider: local" .-> OL["local model (Ollama)"]
RT -. "provider: auto" .-> HC["headless Claude, capped"]
RT -. "provider: auto" .-> HX["headless Codex, capped"]
- Hosts. Claude Code loads
plugin/and Codex loadscodex-plugin/, which is generated from it, so the hooks, the MCP server and the commands match on both. Claude Code only, Codex only, or both on one vault work the same. - Hooks. Session start, every prompt, every tool use, stop and session end each run
aos <script>inside your vault: inject context, update working memory, stream telemetry, cost the session and wrap it. - The vault. An ordinary folder of Markdown: the memory both hosts share, daily notes, a
workspaces/folder for your projects, your Chief of Staff's files, and the caches the app reads. - Providers. Under
local, a new install's default, background work runs on the local model and spends nothing. Hosted calls (the Chief of Staff's duties, cross-review, and anything you send to a host) go through your own Claude Code or Codex login, each under a daily cap. - The graph. Every scan rebuilds a structural graph of the vault with no model; at most once a day a second pass adds concepts and inferred links, on the local model under
local. - The app reads the same files: what ran, live agent runs, the memory graph, provider state, spend, and your agent's identity and flags.
Every hook, runner, provider rule and the graph pipeline in full: docs/how-it-works.md.
Privacy
- Your vault stays on your machine. Background calls go to the local model on your Mac or to your own Claude Code or Codex login; the cost analyzer runs with
--no-api. - Telemetry redaction is on by default.
- The graph's structural pass calls no model. Its daily semantic pass reads new or changed notes on the local model under provider
local, or on your own login under its own $1/day cap otherwise; it is off under providernone, andaos graph semantic offturns it off anywhere. - This repository ships machinery, not content: the Chief of Staff's identity, state and playbook are generated for you at install. A privacy gate runs in CI against a public list of generic terms plus the maintainer's private list, and gitleaks checks every pushed commit, so nothing personal can land here.
Repository layout
brain/scripts the runtime that gets vendored into your vault (hooks, collectors, recall, MCP server, persona)
cli the installer and the aos subcommands (persona, schedule, routines, cost, the Codex host) + two install rehearsals
plugin the Claude Code plugin: hooks.json, .mcp.json, bin/aos, 21 commands, 9 skills (also the source of codex-plugin)
codex-plugin the Codex plugin, generated from plugin/ by npm run build:codex-plugin: hooks.json, .mcp.json, bin/aos, 28 skills
hud the UniDeX app's interface (TypeScript), which the app compiles into its window
app the UniDeX macOS app: that interface in an Electron window (its own lockfile; see app/README.md)
vault-template the seed vault (AGENTICOS.md, MEMORY.md, brain/ incl. the duty routines, persona templates incl. the heartbeat watchdog, hourly tick and nightly reflect routines)
extras the launchd schedule template, the cost analyzer, optional Ollama helpers
tools export-from-vault, the privacy gate, and the brand-asset generator behind docs/assets
docs install, commands, how it works, screenshots, chief of staff, cost, migrating to 2.0 and to 1.0,
the app's smoke checklist, the release acceptance runbook, and design/ — the spec and plan behind each feature
Working on UniDeX itself? CONTRIBUTING.md has the checkout, the checks, and how to open a pull request.
Credits
Created by Zach Zoretich — @zzoretich.
Built with Claude Code. The brand assets under docs/assets/ are
generated, not hand-drawn: node tools/brand-assets.js rebuilds all 24 from one palette in
tools/brand-assets.js, and tools/brand-assets.test.js holds them to being
inert, on-palette and byte-stable.
cross-review and handoff are adapted from claudex-loop by Chase AI, and
the glossary and ADR formats inside cross-review from Matt Pocock's skills,
both under the MIT License; each skill's THIRD-PARTY-NOTICES.md carries the notice and what changed.
License
MIT — AgenticOS Workbench contributors. Issues and pull requests are welcome.