Synaplan
开源 AI 软件平台,面向企业:自托管 AI 代理,符合 GDPR 的聊天机器人小部件,RAG 知识库,WhatsApp 与 Outlook AI,MCP,多模型路由。支持 Docker、Kubernetes 或在 Germ 托管。
AI 翻译
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Omilo is an open-source platform for Indonesian small and medium businesses. You can “hire” AI employees for customer service, admin or operations, and they connect directly to the tools you already use, like your POS, ERP or project management.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗Run your company with a team of AI staff you actually manage.
Omilo is an open-source office for a founder and their AI staff. Helpers do the work, you approve what leaves the company, and the gateway enforces that in code, not in prompts.
Website · Spec & roadmap · Connector catalog
A business owner describes their company once, in plain language. Omilo turns that into a team of AI helpers (Marketing, Sales, Support, Finance, and more), each with a job, a schedule, and permissions. Helpers research, draft, and plan on their own; anything that sends, spends, posts, merges, or deploys waits for the owner's approval in an Inbox. Every recurring job is a loop that learns from the owner's decisions and gets better over time.
The thinking runs on Claude Code (with your own Claude API key or a pool of subscriptions) or a multi-vendor engine. The owner never sees a prompt, a token, or the word "MCP": they see helpers, jobs, and approvals.
off / ask / do_and_tell / auto, with a strict mode (default) that caps every outward action at ask. Helpers cannot send, spend, merge, deploy, or publish on their own.For the full behavior of each area, read docs/SPEC.md.
Owners connect the apps their business already uses from a marketplace: a grid of apps (Gmail, Google Calendar, Google Sheets, WhatsApp, Instagram, Facebook, with more added over time) that they connect in a few taps. No URLs, keys, or server config.
The catalog is data, not code. Omilo fetches a GitHub repo of connector "pieces" (dedekrnwan/omilo-pieces), validates each manifest, and builds a local index. Adding a connector is a pull request with one piece.yaml (metadata, OAuth config, and HTTP actions) plus a logo. A piece is declarative data the runtime interprets, never a program Omilo runs; every action's request host is restricted to the provider's own domains.
How a piece reaches a helper: fetch the repo (local checkout, git clone, or tarball) → index each pieces/*/piece.yaml into ~/.omilo/pieces/index.json → read it in the marketplace and expose each app's actions to helpers as tools. The catalog refreshes on startup and from a Refresh button.
PIECES_REPO=owner/name, or PIECES_SOURCE=/path/to/checkout for local development.A hosted sign-in service that holds each provider's OAuth app (so "Connect Gmail" is one tap on any self-hosted instance) is in progress; event triggers ("when a DM arrives, draft a reply") are planned for a later version.
The default Docker image runs everything in one container with no sibling services:
docker run -p 7700:7700 -v omilo-data:/data ghcr.io/dedekrnwan/omilo
SQLite is the database (/data/omilo.db), the worker runs in-process, and Redis is not required. This is the light tier: good for a single user, a laptop, or a low-traffic self-hosted instance.
To use Postgres + pgvector + Redis (the full tier), pass the URLs as environment variables:
docker run -p 7700:7700 -v omilo-data:/data \
-e OMILO_DATABASE_URL=postgresql+psycopg://user:pass@host:5432/omilo \
-e OMILO_REDIS_URL=redis://host:6379/0 \
ghcr.io/dedekrnwan/omilo
Or drop a /data/.env file with those variables and restart — the same image reads it on startup.
The three-service docker-compose.dev.yml is the full-tier reference for local development (Postgres + Redis running alongside the API). The laptop cli/compose.yml (used by omilo up) also wires up the full tier with sibling containers.
Three ways to run your own Omilo, smallest first. All three serve the same app on port 7700 — pick by how much you're running, and you can move up later without losing data. The omilo CLI (see Install the CLI below) drives all of them; Option A also works with plain docker run.
Everything in a single container on SQLite, no Postgres and no Redis:
docker run -p 7700:7700 -v omilo-data:/data ghcr.io/dedekrnwan/omilo
Your data lives in the omilo-data volume (/data/omilo.db). Good for one user or a small team on a single box. Open http://localhost:7700, create the owner account, and finish onboarding.
omilo start)For a VM or server where you'd rather not run Docker at all. Install the server app from a clone (needs Python 3.11+), and get the omilo CLI from Install the CLI (or build it from the clone with make cli → ./cli/omilo):
pip install ./apps/api # the server app — adds the omilo-api + omilo-migrate commands
omilo start # run Omilo here on SQLite (embedded worker), opens the browser
omilo start runs in the foreground — press Ctrl+C to stop it. Options: --data-dir DIR (default ~/.omilo), --port 7700, --no-open. No database or Redis to install; the knowledge base runs on SQLite with local embeddings. (omilo start needs the Python app above; the standalone CLI from npm/brew/curl is for omilo up, omilo login, and driving a running Omilo.)
For a team, higher traffic, or high availability. Omilo does not install these for you — you point it at your own services. Either pass the URLs to any of the above:
docker run -p 7700:7700 -v omilo-data:/data \
-e OMILO_DATABASE_URL=postgresql+psycopg://user:pass@host:5432/omilo \
-e OMILO_REDIS_URL=redis://host:6379/0 \
ghcr.io/dedekrnwan/omilo
…or use the production compose (Postgres with pgvector, Redis, a separate worker, Traefik) under deploy/:
cd deploy && cp .env.example .env # set OMILO_SECRET_KEY, POSTGRES_PASSWORD, OMILO_PUBLIC_URL, OMILO_HOST
docker compose up -d
Postgres must be 16+ with the vector (pgvector) extension available; Omilo creates the extension and one schema per company on first start.
Start on SQLite, move to Postgres when you outgrow it — one command, one way, all-or-nothing:
omilo migrate --to postgres \
--database-url postgresql+psycopg://user:pass@host:5432/omilo \
[--redis-url redis://host:6379/0]
It copies every company's data into Postgres, rebuilds the knowledge base, and only then writes the new URLs to <data_dir>/.env so the next start comes up on the full tier. If any company fails, nothing is flipped and you stay on SQLite. (There is no automated full→light migration.)
Everything a company owns lives under the data directory (/data in the container, ~/.omilo on the host): the SQLite database (omilo.db, plus companies/<id>/omilo.db for additional companies), uploaded files, the knowledge vault, and the generated secret.key. Back up that directory (stop Omilo first for a consistent SQLite copy). On the full tier the database lives in Postgres instead — back that up with your usual Postgres tooling — but files and keys still live in the data directory.
The omilo command drives Omilo from your terminal — start it, sign in, watch the inbox, run and approve work. Install it any of these ways:
# npm / bun — zero install (scoped package; the installed command is still `omilo`)
npx @dedekrnwan/omilo up # run it straight away (then: npx @dedekrnwan/omilo login)
bunx @dedekrnwan/omilo up # same, via bun
# …or install it once, globally, so the command is simply `omilo`
npm install -g @dedekrnwan/omilo
bun add -g @dedekrnwan/omilo # then: omilo up · omilo login · omilo status ...
# Homebrew (macOS / Linux)
brew install dedekrnwan/omilo/omilo
# curl | sh (macOS / Linux) — grabs the right binary from Releases
curl -fsSL https://raw.githubusercontent.com/dedekrnwan/omilo-os/main/packaging/install.sh | sh
Prebuilt binaries for every platform are attached to each release; on Windows use npx @dedekrnwan/omilo or download the .exe.
The CLI needs an Omilo to talk to. omilo up starts the full stack in Docker (the image bundles everything — no Python needed). omilo start runs the light tier directly on this machine, but that one also needs the Python app installed (see Option B above). To drive an Omilo that's already running somewhere, just omilo login.
Requirements: Python 3.11+, Node 20+, Docker (for Postgres and Redis), Go 1.24+ (for the CLI).
make dev # Postgres (pgvector) + Redis in Docker, builds the web app, installs the API, serves http://localhost:7700
make db # just Postgres + Redis; make db-stop stops them (data stays in Docker volumes)
make test # ruff + pytest (database omilo_test, Redis db 15), web lint, go vet
make cli # builds cli/omilo
Already running Postgres or Redis yourself? Skip Docker and set OMILO_DATABASE_URL (Postgres 16 with the vector extension) and OMILO_REDIS_URL.
Open the web app, create the owner account, and finish onboarding. Pick Demo engine to try every flow without any AI: it uses the real MCP endpoint and executes approvals deterministically.
One app with everything inside (database included), no Docker: download the .dmg from Releases, drag it to
Applications, open it. Build it yourself with make desktop on a Mac. See docs/desktop.md.
Laptop (Omilo, Postgres, and Redis containers; data in ~/.omilo):
omilo up # then: omilo login (install the CLI as above, or build it with `make cli` → ./cli/omilo)
Server (Postgres with pgvector, Redis, a separate worker, Traefik):
cd deploy && cp .env.example .env # set OMILO_SECRET_KEY, POSTGRES_PASSWORD, OMILO_PUBLIC_URL, OMILO_HOST
docker compose up -d
To serve under a path prefix (e.g. /os), set OMILO_BASE_PATH=/os and build the web app with NEXT_PUBLIC_BASE_PATH=/os.
--resume, so no work is lost.| Path | What |
|---|---|
apps/api | FastAPI gateway, worker, MCP server, engines (claude_code, claude, litellm, fake), connector pieces, loops and memory, tests |
apps/web | Next.js (static export) web app |
cli | Go CLI omilo (stdlib only) |
deploy | Server compose: Postgres + API + worker + Traefik labels |
docs | Spec, diagrams, design and implementation plans |
legacy/prototype | v0 prototype, kept for reference and import |
Postgres holds everything (one schema per company), pgvector holds the knowledge base, and Redis carries what several processes share (live office events, worker locks, the Claude Code pool's leases, connector health). Helpers reach Omilo through a per-agent MCP server at /mcp; every tool call is checked against that helper's permissions and logged.
Settings are environment variables with the OMILO_ prefix (see apps/api/omilo_api/config.py): DATA_DIR, DATABASE_URL, REDIS_URL, EMBED_PROVIDER (local | voyage | openai), SECRET_KEY, PUBLIC_URL, BASE_PATH, TIMEZONE, STRICT_MODE, MAX_CONCURRENT_TASKS, and others. Connector catalog: PIECES_REPO or PIECES_SOURCE.
make test
The API suite runs on Postgres 16 + pgvector and Redis 7 (knowledge base, policy, auth and CSRF, the propose → approve → execute path, the changes loop, MCP auth and tools, cross-company isolation, the connector marketplace and runtime, workflows, the retro's measured changes and rollback). The web build and the full UI flow are checked with Playwright on desktop and mobile. The Docker image and server compose are not yet built in CI.
See CONTRIBUTING.md for the full guide — setup, the dev loop, tests/CI, commit and PR conventions, and the safety rules. In short:
omilo-pieces with a new pieces/<slug>/piece.yaml and logo.svg. No Omilo release is needed to add an app.make test before opening a pull request. Keep outward-facing behavior behind the approval policy, and never log secrets.docs/.GNU AGPL-3.0-or-later. Copyright © 2026 Omilo contributors.
Omilo is network copyleft: if you run a modified version as a network service, you must offer its users the corresponding source. See the LICENSE for the full terms.