Omnigent is an open-source AI agent framework and meta-harness: orchestrate Claude Code, Codex, Cursor, Pi, and custom agents — swap harnesses without rewriting, enforce policies and sandboxing, and collaborate in real time from any device.
$ npx -y skills add omnigent-ai/omnigent --agent claude-code
Run the curl in your terminal, the rest in Claude Code.
Repo: omnigent-ai/omnigent
What's inside
Omnigent is an open-source meta-harness that gives you a common orchestration layer over Claude Code, Codex, Cursor, OpenCode, Hermes, Pi, and the agents you write yourself: swap or combine harnesses without rewriting, enforce policies and sandboxing, and collaborate in real time from any device — terminal, browser, phone, or the native desktop app.
omnigent.ai · ⬇️ Download the macOS desktop app
Omnigent lets you:
📱 Work with agents from any device, including your phone. Sessions follow you: start in your terminal, continue in the browser, pick it up on your phone. Messages, sub-agents, terminals, and files stay in sync.
🤖 Supervise multiple agents. Mix Claude Code, Codex, Cursor, OpenCode, Hermes, Pi, and custom agents (defined in YAML) together in the same session. Ask one agent to review another's work, or split a task across agents that are each good at different things.
🔌 Use any model. A first-party API key, a Claude/ChatGPT subscription, or any compatible gateway. All first-class.
🤝 Collaborate. Share a session so teammates can chat with your agent and watch it work live, co-drive it on your machine, or fork the conversation to continue on their own.
☁️ Run agents in cloud sandboxes. No laptop required: run sessions in disposable Modal, Daytona, Islo, E2B, CoreWeave, Kubernetes, OpenShell, Boxlite, or Databricks sandboxes, launched from the CLI or provisioned by the server per session (managed hosts).
🛡️ Govern your agents. Create policies to pause for your approval before risky actions, cap spend, or limit which tools an agent reaches. They apply to the whole server, one agent, or a single chat.
One command installs Omnigent and everything it needs:
curl -fsSL https://raw.githubusercontent.com/omnigent-ai/omnigent/main/scripts/install_oss.sh | sh
Need an optional integration? Pass one or more extras to the installer:
curl -fsSL https://raw.githubusercontent.com/omnigent-ai/omnigent/main/scripts/install_oss.sh | sh -s -- --extra databricks
curl -fsSL https://raw.githubusercontent.com/omnigent-ai/omnigent/main/scripts/install_oss.sh | sh -s -- --extra modal,e2b
Available user-facing extras include:
databricks, bedrock, vertexmodal, daytona, boxlite, cwsandbox, e2b,
openshell, kubernetesantigravity, copilot, cursor, agents-sdks3, hindsightOmnigent needs Python 3.12+. Install the omnigent package:
uv tool install omnigent # or: pip install "omnigent"
Manual installs use the same extras syntax, for example:
uv tool install "omnigent[databricks,modal]"
Or with Homebrew:
brew install omnigent-ai/tap/omnigent
Or install straight from the repo:
uv tool install -q --python 3.12 git+https://github.com/omnigent-ai/omnigent.git
uv (required). https://docs.astral.sh/uv/getting-started/installation/
The installer offers to set this up for you.git (required).npm (for the coding-harness CLIs
installed by omnigent run) and pnpm (for the web UI). You can get
both from a single Node install; pnpm is available via
corepack enable or npm install -g pnpm.omnigent kiro: install with
curl -fsSL https://cli.kiro.dev/install | bash, then sign in with Kiro.
Kiro tool approvals stay answerable in the embedded Terminal; supported
one-time approvals also appear as Chat cards. See
docs/kiro-native-elicitation.md.tmux, required by the native omnigent <harness> terminal wrappers
(claude, codex, cursor, hermes, kiro, pi)
(brew install tmux / apt install tmux; the installer offers
to install it for you).bubblewrap (bwrap), Linux only. The native omnigent <harness>
terminal wrappers and the pi harness wrap each agent
terminal in a bwrap OS-sandbox; on Linux that isolation is mandatory, so a
missing bwrap binary makes those terminals fail to start
(apt install bubblewrap; the installer offers to install it for you). macOS
uses the built-in seatbelt sandbox and needs nothing extra.databricks extra:
uv tool install "omnigent[databricks]" — or pass it to the bootstrap
installer with ... | sh -s -- --extra databricks. Signing in to the
workspace also uses the Databricks CLI.Omnigent runs natively on Windows in a degraded mode. The install_oss.sh
bootstrap is POSIX-only, so install with uv directly:
uv tool install --python 3.12 omnigent
# or from the repo:
uv tool install --python 3.12 git+https://github.com/omnigent-ai/omnigent.git
What works on Windows: omnigent server, the web UI, and the SDK-based
harnesses (omnigent run <agent.yaml> with the claude-sdk / cursor / codex
harnesses). Agents run under a Windows Job Object for process-tree
containment.
What is not available on Windows (use Linux/macOS, or WSL, for these):
omnigent claude / omnigent codex / omnigent cursor
tmux/PTY terminal wrappers (run an SDK harness or the web UI instead);bwrap/seatbelt filesystem & network sandboxing and the L7 egress proxy
— the Job Object backend contains the process tree and enforces resource
limits but does not isolate the filesystem or network.When a newer release is on PyPI, Omnigent shows a one-line notice (once per release) pointing here. To update:
omni upgrade # detects how you installed, drains & stops the local
# server, then runs the matching upgrade command
omni upgrade --check # just report whether a newer release is available
omni upgrade waits for in-flight agent sessions to finish before stopping the
local server (pass --force to stop them immediately); the next omni command
brings the server back up on the new version. Source checkouts update with
git pull instead. Silence the notice with OMNIGENT_NO_UPDATE_CHECK=1.
The check queries your configured package index — honoring UV_INDEX_URL /
PIP_INDEX_URL and your uv.toml / pip.conf (default PyPI), so private
mirrors work out of the box; override with OMNIGENT_INDEX_URL if needed.
Preview the CLI/profile cleanup that would run by default:
omnigent uninstall
Remove the CLI and installer-managed PATH entries while keeping your local history, credentials, and projects:
omnigent uninstall --yes
To also remove Omnigent state under ~/.omnigent, pass --purge; Omnigent
backs it up outside the target before deletion. Your ~/omnigent workspace is
kept unless you explicitly add --purge-workspace.
omnigent uninstall --purge --yes
If the installed wheel is broken or omnigent is not on PATH, run the
standalone script instead:
curl -fsSL https://raw.githubusercontent.com/omnigent-ai/omnigent/main/scripts/uninstall_oss.sh | sh
Add --yes to the standalone script to perform the previewed CLI cleanup.
omnigent picks a model with you and starts a session in your terminal. It
also launches a local web UI at http://localhost:6767 that shows the same
session in the browser, or on a phone on your network (step 4). The
desktop app wraps that same UI
in a native window and adds OS notifications (with a configurable sound) and a dock badge —
download it for macOS.
[!NOTE] The install puts two names for the same CLI on your PATH:
omnigentand the shorteromni. They're interchangeable.
[!TIP] On first run, Omnigent picks up model credentials already in your environment (an
ANTHROPIC_API_KEY/OPENAI_API_KEY, or aclaude/codexCLI you're logged into) and offers one as the default.
omnigent
Or launch a specific agent runtime:
omnigent claude # Claude Code, in a session your team can join
omnigent codex # Codex
omnigent cursor # Cursor
omnigent opencode # OpenCode
omnigent hermes # Hermes Agent (Nous Research)
omnigent pi # Pi
Using OpenClaw? See the OpenClaw integration guide to import its coding agents or drive a live OpenClaw Gateway session over ACP.
Two example agents ship with the repo, and they make good first sessions:
omnigent run examples/polly/
omnigent run examples/debby/
omnigent run examples/deep-research/
# ...or on a different harness (sub-agents keep their own):
omnigent run examples/polly/ --harness <harness>
omnigent run examples/debby/ --harness <harness>
🐙 Polly is a multi-agent coding orchestrator who writes no code herself. She's the tech lead: she plans, delegates the work to coding sub-agents (Claude Code, Codex, or Pi) in parallel git worktrees, then routes each diff to a reviewer from a different vendor than the one that wrote it. You merge.
🟠🔵 Debby is a brainstorming partner with two heads, one Claude and one GPT.
Every question you ask goes to both heads, and she lays the two answers out
side by side. Type /debate and the heads critique each other for a few
rounds before converging. (She needs both a Claude and an OpenAI credential;
see step 3.)
🔎 Deep Research is a single agent that answers a question with a cited,
cross-checked report. It plans sub-queries, searches the live web and reads
full pages through an MCP search server, and verifies each claim across
independent sources. It's also the simplest example to copy from: one agent
plus one tools/mcp/*.yaml server, no sub-agents.
Prefer the browser? One command starts the local server and registers this machine as a host:
omnigent start # starts the local server and registers this machine as a host
Open the server URL it prints, hit New Chat, pick your machine, and go.
Check status with omnigent server status; stop everything with
omnigent stop.
omnigent setup
Add a credential, set a default, or remove one, grouped by agent. Omnigent works with four kinds of credentials:
| Kind | What it is | |
|---|---|---|
| 🔑 | API key | A first-party vendor key for Anthropic, OpenAI, and similar providers |
| 🎟️ | Subscription | A Claude Pro/Max or ChatGPT plan, via the official claude / codex CLIs |
| 🌐 | Gateway | Any OpenAI- or Anthropic-compatible base_url and key (OpenRouter, LiteLLM, Ollama, vLLM, Azure) |
| 🧱 | Databricks | A Databricks workspace profile (requires the databricks extra) |
Defaults are per agent, so a Claude default and a Codex default coexist. You
can also switch models in the middle of a session with the /model command.
When you add a Gateway credential, omnigent setup asks for a base URL
and a key. The base URL depends on which agent you point it at:
| Provider | For | Base URL | Key |
|---|---|---|---|
| OpenRouter | Claude Code | https://openrouter.ai/api | your OpenRouter key (sk-or-…) |
| OpenRouter | Codex / OpenAI agents | https://openrouter.ai/api/v1 | your OpenRouter key (sk-or-…) |
| Ollama (local) | Codex / OpenAI agents | http://localhost:11434/v1 | any value (Ollama ignores it) |
For Claude Code, point at OpenRouter's Anthropic-compatible endpoint
(…/api, not …/api/v1). For Codex and the OpenAI-agents harness, use
the OpenAI-compatible …/api/v1.
Run Omnigent on a server with a stable URL
(deploy/README.md is the full guide) and your sessions
become reachable from anywhere, including your phone. The web UI is built for
mobile, so you get the same chat, sub-agents, terminals, and files, in sync
with your laptop.
One docker compose up runs the server on any host you have (a VPS, a home
server); Render and Railway deploy with one click; Fly.io, Hugging
Face Spaces, Modal, Cloudflare (serverless, scale-to-zero), and
Databricks Apps (backed by Lakebase Postgres and Unity Catalog Volumes) are
covered too — and a Cloudflare quick tunnel (public) or Tailscale
(private) reaches a server running on your own laptop without a deploy. The
server can also provision a cloud sandbox per session (managed hosts), so no
laptop has to stay online. The full menu of targets, the database options, and
the sandbox setup live in
deploy/README.md.
Once the server is up, sign in and register your laptop as a host:
omnigent login https://your-host # sign in once; run / attach / host reuse the token
omnigent host https://your-host # new sessions can now run on this machine
[!TIP] On your own network you don't need a deploy. Open your machine's LAN address on your phone (e.g.
http://192.168.x.x:6767).
Omnigent supports multi-user accounts, controlled by one environment variable:
OMNIGENT_AUTH_ENABLED=1 omnigent server --background
The Docker deploy in step 4
turns it on for you (OMNIGENT_AUTH_ENABLED defaults to 1 there).
Open the web UI (http://localhost:6767 locally, or your host's URL) and
sign in as admin; first run prints the password and saves it locally. Then
open Admin → Members → Invite to create a single-use invite link, no
email server needed. Send it over; your teammate opens it, sets a password,
and they're in. Signup is invite-only.
[!NOTE] Teammates need to be able to reach the server. A local server is only reachable on your network; for anyone off it, deploy an always-on host (see step 4).
Share a live session. Hit Share in the web UI and send the link; teammates watch your agent work and chat with it in real time.
Co-drive. A teammate co-attaches to your running session; their messages execute on your machine. Great for pairing or handing the keyboard to a domain expert mid-investigation.
omnigent attach <session_id>
Fork. Clone a conversation onto your own machine and continue independently from the fork point.
omnigent run --fork <session_id>
[!TIP] Want your team to sign in with the logins they already have (Google, GitHub, Okta, Microsoft)? Set
OMNIGENT_OIDC_ISSUERplus a client ID and secret on your deployed server and restart. The full walkthrough, domain allowlists, and the proxy-onlyheaderauth mode are covered indeploy/README.md#auth.
Policies decide what an agent may do: run shell commands, edit files, spend tokens. They check every action and either allow it, block it, or pause to ask you first.
Want defaults that apply to everyone, or to a specific agent? Define them in your server config or an agent's YAML:
policies:
approve_shell:
type: function
handler: omnigent.policies.builtins.safety.ask_on_os_tools # ask before shell / file writes
cap_calls:
type: function
handler: omnigent.policies.builtins.safety.max_tool_calls_per_session
factory_params:
limit: 50 # cap how many tools one session can call
budget:
type: function
handler: omnigent.policies.builtins.cost.cost_budget
factory_params:
max_cost_usd: 5.00 # hard spend cap...
ask_thresholds_usd: [3.00] # ...with a soft warning on the way
Policies stack across three levels, server-wide (admin), per-agent (developer), and per-session (you), with the stricter session rules checked first. Spend caps and access limits ship as builtins.
See the policy guide for the full catalog and trust model.
An agent is a short YAML file: your prompt, your tools — local Python functions, MCP servers, and sub-agents a supervisor can delegate to. You don't have to write it by hand: agents can build agents, so describe the agent you want in any Omnigent chat and it authors the file for you.
name: my_agent
prompt: You are a helpful data analyst.
executor:
harness: claude-sdk # or: claude-native, codex, codex-native, cursor,
# cursor-native, hermes, hermes-native, opencode,
# pi, pi-native, openai-agents
tools:
# A local Python function (schema auto-generated from the signature)
word_count:
type: function
callable: mypackage.mymodule.word_count
# Tools from an MCP server (a local command, or a remote URL)
docs:
type: mcp
url: https://example.com/mcp
# A sub-agent the supervisor can delegate to
researcher:
type: agent
prompt: Search for relevant information and summarize it.
tools:
word_count: inherit
Run it with:
omnigent run path/to/my_agent.yaml
The same file can declare sub-agents and reviewers. For a fuller example, see
Polly at examples/polly/, and the
Agent YAML spec for the full schema.
Omnigent collects anonymized usage data (telemetry) by default. This data contains no sensitive or personally identifiable information. If you're using Omnigent through a managed service or distribution, please consult your managed service agreement to determine any data collection that may impact your use of the service. To opt out, follow our instructions in Usage Telemetry.
Contributions are welcome. See CONTRIBUTING.md for how to set up your environment, run the checks, and open a pull request.
Adding or changing support for a harness (Claude, Codex, Cursor, OpenCode, Hermes, Pi, ...)? Run the harness test bench to check its capability matrix against observed behavior.
Thanks to all of our amazing contributors!
.claude/
skills/
antigravity-native-e2e-dev/
SKILL.md
antigravity-sdk-e2e-dev/
SKILL.md
cli-setup-verify/
SKILL.md
verify_cli.py
copilot-sdk-e2e-dev/
SKILL.md
cursor-sdk-e2e-dev/
SKILL.md
harness-integration-guide/
SKILL.md
pi-native-e2e-dev/
SKILL.md
polly-e2e-dev/
polly_cuj.py
SKILL.md
run-load-test/
SKILL.md
.coverage
.gitattributes
.github/
actions/
e2e-run/
action.yml
integration-run/
action.yml
run-omnigent-agent/
action.yml
setup-pnpm/
action.yml
agents/
doc-classifier/
config.yaml
doc-drafter/
config.yaml
feature-blog-drafter/
config.yaml
feature-blog-scout/
config.yaml
release-notes-drafter/
config.yaml
release-post-formatter/
config.yaml
areas.json
ci-deps/
package.json
copilot-instructions.md
dependabot.yml
ISSUE_TEMPLATE/
bug_report.yml
config.yml
feature_request.yml
issue-prioritization-labels.json
MAINTAINER
pull_request_template.md
scripts/
changelog/
generate.py
release_to_mdx.py
ci/
backcompat-pairwise-matrix.sh
e2e-shard-matrix.sh
integration-matrix.sh
e2e-ui-required/
check.sh
homebrew/
generate_formula.py
omnigent.rb.template
issue_duplicates_test.py
issue_duplicates.py
merge-ready/
authorize-merge-comment.sh
compute-gate.sh
enable-automerge-comment.sh
enable-automerge-label.sh
evaluate-checks.sh
load-maintainers.sh
required.sh
oss-publish-images/
maxver.py
reconcile_targets.py
pr-size/
compute_label.py
pr-template/
_md.py
format_body.py
validate.py
rotation_maintain.py
rotation_roster.json
rotation_schedule.json
rotation.py
security-scan/
exfil-scan.py
lint-workflow-misuse.py
secret-scan.py
sensitive-paths.sh
should-scan.sh
sync_pr_priority_test.py
sync_pr_priority.py
waiting_on_author_test.py
waiting_on_author.py
security/
semgrep-rules.yml
TRIAGE.md
triage/
triage_v2/
AGENTS.md
CLAUDE.md
databricks.yml
pyproject.toml
README.md
resources/
issue_prioritization.job.yml
issue_priority_artifacts.volume.yml
src/
issue_prioritization/
__init__.py
areas.py
artifacts.py
bronze.py
classification_prompt.txt
classification.py
cli.py
comments.py
config.py
dashboard.py
databricks_io.py
default_scoring.json
domain.py
event.py
github_auth.py
github.py
job.py
labels.py
model_serving.py
mutations.py
pipeline.py
scoring.py
tests/
test_artifacts.py
test_bronze.py
test_bundle_configuration.py
test_classification.py
test_comments.py
test_dashboard.py
test_databricks_io.py
test_event.py
test_github_auth.py
test_github.py
test_job.py
test_mutations.py
test_pipeline.py
test_scoring.py
test_spark_io.py
config.yaml
security/
config.yaml
ui-preview/
app.py
app.yaml
README.md
workflows/
android-bundle.yml
areas.test.js
auto-assign-reviewer-test.yml
auto-assign-reviewer.fixture.json
auto-assign-reviewer.js
auto-assign-reviewer.test.js
auto-assign-reviewer.yml
autoformat-pr.yml
benchmark-pr.yml
benchmark.yml
bump-version.yml
ci.yml
code-coverage.yml
demo-check.js
demo-check.yml
discord-watch-rotation-maintain.yml
discord-watch-rotation.yml
doc-sync.yml
docker-build.yml
draft-release-notes.yml
duplicate-prs-test.yml
duplicate-prs.js
duplicate-prs.test.js
duplicate-prs.yml
e2e-ui-required.yml
e2e-ui.yml
e2e.yml
electron-build.yml
feature-blog.yml
finalize-release.yml
flake-stress-e2e.yml
flake-stress-ui.yml
flake-stress.yml
github-release.yml
homebrew-tap-pr.yml
integration.yml
issue-triage.yml
lint.yml
maintainer-approval-rerun-run.yml
maintainer-approval-rerun.yml
maintainer-approval.yml
merge-ready.yml
needs-info-response.yml
nightly-failure-monitor.yml
nightly-release.yml
oss-publish-images.yml
oss-regen-on-comment.yml
oss-regenerate-and-smoke.yml
oss-scorecard.yml
polly-review-approval-dispatch.yml
polly-review-on-approval.yml
polly-review.yml
pr-hygiene-live.yml
pr-issue-link-test.yml
pr-issue-link.js
pr-issue-link.test.js
pr-size.js
pr-size.yml
publish-changelog.yml
ready-for-review-test.yml
ready-for-review.js
ready-for-review.test.js
release-omnigent.yml
release.yml
reopen-notice-test.yml
reopen-notice.js
reopen-notice.test.js
reopen-notice.yml
reopen-pr-test.yml
reopen-pr.js
reopen-pr.test.js
reopen-pr.yml
rerun-ci.yml
rerun-security-gate-run.yml
rerun-security-gate.yml
review-sla-test.yml
review-sla.js
review-sla.test.js
review-sla.yml
security-gate.yml
security-scan.yml
security-triage.yml
server-compat.yml
stale.yml
sync-openapi-to-site.yml
sync-pr-priority.yml
ui-preview.yml
ui-snapshot-fail-comment.yml
ui-snapshot-update.yml
ui-snapshot.yml
vscode-extension-release.yml
vscode-release-pr.yml
waiting-on-author-test.yml
waiting-on-author.yml
web-tests.yml
windows.yml
.gitignore
.pre-commit-config.yaml
.python-version
AGENTS.md
CHANGELOG.md
CLAUDE.md
CONTRIBUTING.md
DCO
deploy/
boxlite/
README.md
cloudflare/
.dockerignore
Dockerfile
package.json
README.md
sitecustomize.py
src/
index.js
wrangler.jsonc
cwsandbox/
README.md
databricks/
build.sh
databricks.yml
deploy.py
grant_sp_perms.py
README.md
src/
app.py
app.yaml
daytona/
README.md
src/
index.js
wrangler.toml
docker/
.env.example
bootstrap.sh
Caddyfile
config.yaml.example
docker-compose.https.yaml
docker-compose.yaml
Dockerfile
Dockerfile.dockerignore
Dockerfile.prebuilt
Dockerfile.ubi
entrypoint.py
README.md
SKILL.md
e2b/
README.md
fly/
fly.toml
README.md
hf-spaces/
Dockerfile
README.md
islo/
README.md
kubernetes/
base/
configmap.yaml
deployment.yaml
ingress.yaml
kustomization.yaml
namespace.yaml
pvc.yaml
secret.yaml
service.yaml
overlays/
openshell/
configmap-patch.yaml
deployment-patch.yaml
gateway-networkpolicy.yaml
kustomization.yaml
sandbox-clusterrole.yaml
sandbox-clusterrolebinding.yaml
sandbox-rbac.yaml
secret-patch.yaml
server-config.yaml
openshift/
openshift-postgres/
deployment-patch.yaml
kustomization.yaml
postgres-deployment-patch.yaml
route.yaml
secret-patch.yaml
service.yaml
statefulset.yaml
deployment-patch.yaml
kustomization.yaml
route.yaml
postgres/
kustomization.yaml
secret-patch.yaml
service.yaml
statefulset.yaml
sandbox-runners/
deployment-patch.yaml
kustomization.yaml
namespace-sandboxes.yaml
README.md
role.yaml
rolebinding.yaml
sandbox-config.yaml
serviceaccount-runner.yaml
serviceaccount-server.yaml
README.md
modal/
modal_app.py
README.md
openshell/
README.md
start-local-docker-gateway.sh
railway/
README.md
README.md
render/
README.md
tailscale/
README.md
designs/
ci-external-contributors-proposal.md
CLI_CONTRACT.md
contributor-review-merge-proposal.md
CUJ-ANALYSIS.md
CUJ-MAP.md
DEVICE_AUTH.md
harness-capabilities-bench-seam.md
harness-modular-registry-proposal.md
harness-plugin-interface.md
issue-triage-proposal.md
OBSERVABILITY.md
opencode-native-gaps-qa.md
opencode-native-gaps.md
prioritization/
issue-prioritization-v2.md
... 1600 moreShowing a partial view of a very large repo.
FAQ
omnigent is a Claude Code plugin with 12 hand-picked skills for development work, indexed on Flowy. Install it with the command on its page. It includes antigravity-native-e2e-dev, antigravity-sdk-e2e-dev, cli-setup-verify. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.