omadia is a self-hostable, multiplayer agentic OS that makes AI dependable enough for real work. A team of agents runs on infrastructure you own and works inside your team's shared channels, so several people collaborate with the same agents in one context, not a private one-on-one chatbot. The agents turn your data, software, and people into results you can steer, audit, and prove. Sensitive data stays in the house and never leaves in clear text. Every answer is checked before it ships. Every action carries a receipt. Bring your own LLM key and switch providers by config, not code.
omadia-pitch-2-B.mp4
The quickstart runs entirely in containers, so the host stays light:
- Docker 24+ with the Docker Compose v2 plugin (the
docker composesubcommand, not the legacydocker-composebinary) - Git, to clone the repository
That is the whole list for running omadia. A local Node toolchain is only needed when you build the services from source or develop plugins:
- Node 22.x for the middleware and admin UI outside Docker. The pinned
version lives in
.nvmrc, sonvm usepicks it up. The middleware blocks installation on a mismatched major version, because native modules are built against a specific ABI.
See CONTRIBUTING.md for the full from-source setup.
git clone https://github.com/byte5ai/omadia.git && cd omadia
# 1. Bring up the minimal core: postgres + middleware + admin UI.
# Images are pulled prebuilt from GHCR, so first boot is a download,
# not a source build. No config needed to start.
docker compose up -d
# 2. Open the admin UI and complete the first-admin wizard.
# The /setup wizard collects your LLM key and stores it encrypted in the vault.
open http://localhost:3333docker compose up -d pulls exactly three services and nothing else. Open the UI,
set your LLM key in the wizard, and run your first agent team. The next section is
the 90-second "wow moment". Diagrams, embeddings, and object storage are opt-in
(see Optional features).
Pin a specific release instead of the latest with the OMADIA_VERSION shell
variable (or a project-root .env file, not middleware/.env), or build the
images from source instead of pulling:
OMADIA_VERSION=v0.3.0 docker compose up -d # pin a release
docker compose -f docker-compose.yaml -f docker-compose.build.yaml up -d --build # build locallyPull fails with
manifest unknown? The GHCR images publish on each release, so a brand-new checkout can briefly predate the first published image. Build from source with the--buildline above until a release lands.
omadia clicks once you watch a team of agents do real work and hand you a receipt for it:
- Run
docker compose up -d. The minimal core (postgres, middleware, admin UI) comes up together. - Open
http://localhost:3333and finish the first-admin/setupwizard. - Start a demo agent team from a single prompt in the web chat.
- Watch it work. The orchestrator streams turns and dispatches tools across the agents in the team.
- Open the run's trace. The per-run call-stack viewer is your audit receipt: every step, every tool call, every decision, replayable.
omadia is built for the moment an agent system leaves the laptop and meets real work: ownership, auditability, and a clean fit into an existing stack. The first three rows are why teams choose it; the rest is the groundwork done properly.
| Capability | What you get |
|---|---|
| 🛡️ Privacy Shield | Raw tool results stay behind a data-plane boundary; the LLM sees only an identity-free digest. guarded by default, with bypass/per_tool opt-in and an org-wide clamp (OMADIA_PRIVACY_FORCE_GUARDED). Real data can run through omadia without running through the model. |
| ✅ Answer verification | A verifier checks each answer's claims against the run's own sources and records a verdict (approved / approved_with_disclaimer) before it reaches the channel. |
| 🧮 Computed, not guessed | Office and Excel output comes from a real spreadsheet engine, server-side, over real rows (datasetId). The figures are calculated by that engine rather than produced by the model. |
| 🧾 A receipt for every action | Every agent run carries a full per-run trace and call-stack viewer: every step, tool call, and decision, replayable. |
| 👥 Multiplayer by design | Agents run in your team's shared channels (Slack, Teams, Telegram, Discord), so several people work with them in one context, not a private one-on-one chatbot. |
| 🤖 Agent teams, not one chatbot | An orchestrator routes each turn to the right specialist plugin agent. Channels, integrations, tools, and capability providers sit behind one stable API. |
| 🔒 Self-hosted and yours | One docker compose up on a single machine. Your Postgres, your LLM key, all of the data on your own infrastructure. GDPR-aware and made in the EU. |
| 🧩 Signed plugin distribution | Plugins ship as verifiable signed packages. The platform never pulls arbitrary npm at runtime. |
| 🔌 Enterprise integrations | Microsoft 365, Odoo, Confluence, Teams, and Telegram, with the LLM provider a swappable plugin. |
- Privacy Shield: a data-plane boundary that interns raw tool results and
exposes only an identity-free digest to the LLM
(
harness-plugin-privacy-guard,privacyMode.ts) - Answer verifier: claim-checks each answer against its sources and returns
a verdict before it ships
(
harness-verifier,verifierService.ts) - Office compute:
create_xlsx/create_docxbuild real spreadsheets and documents server-side, resolving dataset rows without routing them through the model (harness-plugin-office) - Plugin runtime: channels, integrations, tools, sub-agents, and capability
providers; everything is a plugin behind a stable API surface
(
@omadia/plugin-api) - Builder: UI-driven plugin authoring with codegen, slot-typecheck, in-process ESLint auto-fix, and a runtime smoke harness
- Knowledge graph: pgvector-backed (Postgres) with an in-memory alternative for tests
- Channels: web-chat (admin UI) is in-tree; Teams and Telegram ship as separately-distributed plugin ZIPs
- Auth: multi-provider login (local password + OIDC), per-provider user table, admin UI for provider toggle and user management
- Routines: user-authored cron-triggered agent runs with a full per-run trace and call-stack viewer
The operator UI speaks Lume, omadia's own visual language. The idea is that light is the material: surfaces read as condensed out of light, and the agent's attention shows up as accent-tinted illumination, not as flat color. Four recipes carry it. Surfaces are gradient pairs, borders catch the light on their top edge, one accent slot glows to mark focus and selection, and corners stay soft.
Three accent palettes ship, Petrol, Atelier, and Lagoon as the default. The
operator picks one and switches between light and dark from the header. The
whole theme lives in a single token file (web-ui/app/_lib/theme.css), so
restyling stays a change at the token tier rather than a sweep through
components.
Lume is specified in byte5ai/omadia-ui
under docs/visual-spec.md, the same language omadia's canvas app is built on.
The operator UI and the canvas app share one identity.
┌────────────────────────────────────────────────────────────┐
│ Channels │
│ web-chat Teams Telegram … │
└────────────────────┬───────────────────────────────────────┘
│ ChannelSDK (SemanticAnswer)
▼
┌────────────────────────────────────────────────────────────┐
│ Orchestrator │
│ routes turns to agents, manages tool dispatch, streaming │
└────────────────────┬───────────────────────────────────────┘
│ ctx (PluginContext)
▼
┌────────────────────────────────────────────────────────────┐
│ Plugins │
│ agents · tools · capability providers · integrations│
└────────────────────┬───────────────────────────────────────┘
│
┌─────────────────────┴────────────────────────────┐
▼ ▼ ▼
Knowledge Graph Embeddings Vault (secrets)
(Postgres + pgvector) (Ollama / API) (AES-256-GCM file)
Start with the architecture overview for the component
map and request flow. The deeper walk-through of the plugin loading sequence,
capability registry, and multi-provider authentication layer lives under
docs/.
Three subsystems let omadia put real data in front of an LLM and stand behind the answer:
- Privacy Shield (data-plane boundary): raw tool results are interned behind
the boundary and the LLM sees only an identity-free digest.
guardedis the default;bypassandper_toolare explicit opt-ins, andOMADIA_PRIVACY_FORCE_GUARDEDclamps every plugin toguardedorg-wide. Pseudonyms resolve back to real values only at materialization, and each bypass lands in the receipt. Spec:specs/001-privacy-shield-v4/. - Answer verification: before a turn's answer is returned, the verifier checks
its claims against the run's sources and emits a verdict (
approved,approved_with_disclaimer, orblocked). A borderline verdict attaches a disclaimer instead of silently shipping an unsupported claim. - Office compute (computed, not guessed): numbers in
.xlsx/.docxoutput come from a real spreadsheet engine over real rows, rather than the model's token stream. When a specialist agent returns adatasetId, the rows are resolved server-side and never pass through the model.
The minimal core is postgres + middleware + admin UI. Diagrams, embeddings, and
object storage are off by default. Each is an overlay file you add with -f,
which starts the sidecar and switches on the matching plugin.
# Object storage (MinIO): chat attachment ingestion
docker compose -f docker-compose.yaml -f docker-compose.storage.yaml up -d
# Diagram rendering (Kroki). Needs object storage, so add both overlays:
docker compose -f docker-compose.yaml \
-f docker-compose.storage.yaml -f docker-compose.diagrams.yaml up -d
# In-tenant embeddings (Ollama). First boot pulls nomic-embed-text (~270 MB),
# so it needs network access the first time it starts.
docker compose -f docker-compose.yaml -f docker-compose.embeddings.yaml up -d
# Everything at once
docker compose -f docker-compose.yaml \
-f docker-compose.storage.yaml -f docker-compose.diagrams.yaml \
-f docker-compose.embeddings.yaml up -dDiagram rendering also needs a signing secret. Generate one and add it to
middleware/.envasDIAGRAM_URL_SECRETbefore starting the diagrams overlay:openssl rand -hex 32. The plugin stays inactive until it is set.
Start here: byte5ai/omadia-plugin-starter.
A ready-to-fork template for your own omadia plugin. Clone it, fill in your logic
against @omadia/plugin-api, and ship.
omadia plugins are self-contained ZIP files that the operator uploads through
the admin UI. The platform never trusts external npm registries at runtime;
plugins ship node_modules baked in, or use the platform's standard library
via @omadia/plugin-api. Two reference plugins are also shipped in-tree as
starting points:
agent-reference-maximum: exercises every capability in the plugin APIagent-seo-analyst: a smaller, focused tool-only example
The Builder UI walks operators through cloning either reference, slot-filling the differentiating logic, and verifying with the smoke runner before install.
- Local / single-tenant:
docker compose up, see Quickstart above - Bring-your-own: the runtime is a stock Node + Postgres app; any host that can run both works (Kubernetes, ECS, plain VM).
Required production secret. The shipped image runs with
NODE_ENV=production, which makesVAULT_KEYmandatory at boot; without it the middleware refuses to start (this is intentional; the dev fallback writes the master key into the data volume, which is not safe at rest). Generate one withopenssl rand -base64 32and wire it as a platform secret before the first deploy. The bundleddocker-compose.yamlpinsNODE_ENV=developmentso the dev fallback stays available for localdocker compose upwithout configuration; drop that override (and setVAULT_KEYin.env) when you re-use the compose file as a starting point for a non-local deploy.
Status: pre-1.0. Public preview. APIs and database schemas may break between minor versions until
1.0.0. Production use of the OSS distribution is supported but the upgrade path is hand-rolled today; an automated migration runner is on the v1.0 roadmap.
Stability promises are scoped to the documented plugin API only; everything
else (database schema, internal service surfaces, admin-UI routes) may evolve
without notice until 1.0.0.
Active development tracks:
- Conductor: multi-step composition with a human sign-off path. Landing from
branch
005-omadia-conductor; it graduates to a first-class feature once that merges tomain. - Plugin marketplace: discovery and signed-package distribution (post-1.0)
- Multi-tenant hosting: out of scope for v1; a separate fork is planned
- Web-IDE for plugin development: moves the Builder authoring loop into the management UI without round-tripping through ZIP uploads (post-1.0)
MIT. Copyright (c) 2026 byte5 GmbH.
Third-party dependency licenses and notices are documented in
THIRD_PARTY_NOTICES.md. The dependency tree is
free of GPL, AGPL, and SSPL packages; weak-copyleft components (LGPL via
sharp-libvips, MPL-2.0 via axe-core / lightningcss / dompurify) are
used as documented unmodified dependencies.
Port already in use. The core binds 3333 for the admin UI plus the
Postgres port. If another process holds one of them, the affected container
exits on start. Free the port, or remap it in your own compose override, then
re-run docker compose up -d.
VAULT_KEY missing at boot. A production image (NODE_ENV=production)
refuses to start without VAULT_KEY, on purpose. Generate one with openssl rand -base64 32 and set it in your project-root .env before deploying. The
bundled docker-compose.yaml pins NODE_ENV=development, so a local docker compose up keeps the dev fallback. Full context lives in
Deployment.
Optional overlay not found. Optional features are overlay files added with
repeated -f flags, not Compose profiles. Pass the full filename, for example
-f docker-compose.yaml -f docker-compose.storage.yaml. A bare --profile storage matches nothing here.
Node version mismatch from source. The middleware pins its Node major
version in .nvmrc and stops npm install on a different one, because
better-sqlite3 and other native modules are compiled against a specific ABI.
Run nvm use in the repository root before installing.
See CONTRIBUTING.md for the dev setup, commit-message
convention, and pull-request workflow. The
CODE_OF_CONDUCT.md (Contributor Covenant 2.1) applies
to all interactions in issues, pull requests, and discussions.
Found a vulnerability? Please do not open a public issue. See
SECURITY.md for the coordinated-disclosure process and the
private contact channel.
omadia is maintained by byte5 GmbH under the GitHub
organisation byte5ai. Outside contributions
are welcome; see CONTRIBUTING.md.

