An AI strategy that acts arsenic your company's virtual executive squad — a elder advisor pinch Harvard MBA-level knowledge, customized for your circumstantial business.
A walkthrough of Open Executive successful action — watch connected YouTube.
Developed by sentelabs.ai Open Executive provides a azygous coherent executive sound backed by 8 master AI agents:
- Chief Strategy Officer — competitory analysis, M&A, marketplace positioning, OKRs
- Chief Financial Officer — financial modeling, fundraising, portion economics, rate flow
- Chief HR/People Officer — hiring, compensation, performance, culture
- General Counsel — contracts, IP, employment rule basics, compliance
- Chief Operating Officer — process design, vendor management, operational scaling
- Chief Marketing Officer — GTM strategy, brand, communications, PR
- Chief Product Officer — roadmap, prioritization, merchandise strategy
- Board Communications Director — committee decks, investor relations, governance
All responses travel from 1 accordant executive voice. The soul supplier architecture is ne'er exposed to the user. Beyond Q&A, the strategy maintains episodic representation of past decisions and initiatives crossed sessions, and a built-in scheduler tin proactively aboveground follow-ups and time-sensitive actions.
Knowledge — Two retrieval layers per master call: (1) built-in MBA-level Markdown (knowledge/builtin/, git-tracked) seeded into ChromaDB astatine startup, and (2) your uploaded institution documents chunked and stored successful a abstracted company_docs collection. RAG discourse is injected into the personification turn, ne'er the cached strategy prompt.
Episodic memory — After each response, a inheritance claude-haiku-4-5 walk extracts cardinal decisions, initiatives, and proposal into SQLite. The adjacent convention opens pinch a <past_decisions> artifact truthful the Executive remembers what it recommended past month.
Scheduler — A built-in occupation runner claims owed actions via UPDATE … RETURNING to forestall double-firing. The API must tally arsenic a azygous instance; do not horizontally standard it without gating the scheduler first.
Prompt caching — The strategy punctual is system truthful the Executive persona, institution profile, and knowledge scale are cached separately (up to 85% cache deed complaint aft the first fewer turns). No move contented ever goes successful a cached block.
See docs/architecture.md for the afloat design.
| LLM backbone | Anthropic Claude API |
| Default model | claude-sonnet-4-6 (Executive + astir specialists) |
| Deep reasoning | claude-opus-4-7 (CSO, CFO, GC, Board — pinch extended thinking) |
| Backend | Python 3.11 + FastAPI |
| Package manager | uv |
| Vector store | ChromaDB (local, embedded) |
| Episodic memory | SQLite |
| Web UI | Next.js 15 (App Router) + Tailwind |
| License | Apache 2.0 |
Open http://localhost:3000 to commencement chatting pinch your executive. The API runs connected larboard 8000 and the UI connected 3000.
First run: requires Python 3.11+ and Node 22+. The first uv sync pulls heavy ML limitations (ChromaDB + sentence-transformers/PyTorch), and the first boot downloads a mini embedding exemplary (~90 MB) to build the section vector scale — truthful the first make dev takes a fewer minutes earlier the app is ready. Subsequent starts are fast.
For contributors not utilizing make:
- Create a Discord exertion astatine https://discord.com/developers/applications
- Enable the Message Content privileged intent (Bot → Privileged Gateway Intents)
- Invite the bot pinch bot + applications.commands scopes
- Set env vars successful .env: DISCORD_BOT_TOKEN, DISCORD_APP_ID, DISCORD_GUILD_IDS
- Run the API usually — the bot starts arsenic portion of the FastAPI lifespan erstwhile DISCORD_BOT_TOKEN is set:
The bot is embedded successful the API process (alongside the email poller, scheduler, and resumer) truthful it shares the aforesaid SQLite database and ChromaDB vector shop nether /data successful production. Skip the token to disable.
For iterating connected bot-only codification without restarting the API, make discord runs the bot arsenic a standalone process against the aforesaid section DB.
Users tin DM the bot, @mention it successful a transmission (replies successful a thread), aliases usage /ask and /today slash commands. Slash commands sync to DISCORD_GUILD_IDS instantly connected startup; time off blank for world registration (up to 1-hour propagation delay).
Just group the secrets connected the existing API app — nary caller Fly app required:
Discord personification entree is managed via the /people UI — adhd a Person statement pinch discord_user_id set.
The instrumentality restarts and the bot starts connected the adjacent lifespan boot. To disable successful prod: flyctl secrets unset -a openexec-api-dev DISCORD_BOT_TOKEN.
The first clip you sojourn the app, you'll beryllium guided done a wizard to group up your institution profile:
- Company basics (name, industry, stage, squad size)
- Business exemplary and revenue
- Competitive landscape
- Strategic priorities
- Culture and values
- Optional: financial position, archive upload
After onboarding, the Executive will reference your circumstantial institution discourse successful each response.
| Web UI | http://localhost:3000 |
| Slack | Mention @OpenExecutive aliases DM the app |
| CC aliases email the configured reside (IMAP/SMTP poller) | |
| Telegram | Message the configured bot |
| Google Chat | Mention the app successful a space |
| Discord | DM the bot, @mention it successful a channel, aliases usage /ask / /today slash commands |
| CLI | openexecutive chat |
Upload your transportation deck, financial model, strategy docs, aliases immoderate institution documents via the web UI aliases API. The Executive will reference them erstwhile relevant.
Two environments, each a abstracted group of Fly apps, driven by branch:
| dev | push/merge to main (continuous) | .github/workflows/deploy.yml | openexec-api-dev, openexec-ui-dev |
| qa | push/merge to qa (deliberate promotion) | .github/workflows/deploy-qa.yml | openexec-api-qa, openexec-ui-qa |
Both workflows usage dorny/paths-filter to deploy only the changed app (API, UI, aliases both). QA is simply a unchangeable copy of dev — aforesaid image and runtime, only the app sanction differs (fly.api.qa.toml / fly.ui.qa.toml) — truthful it lags main and stays vetted. An optional Honcho representation app (fly.honcho.toml) deploys independently.
| openexec-api-{dev,qa} | FastAPI + scheduler | Persistent measurement executive_data astatine /data |
| openexec-ui-{dev,qa} | Next.js 15 | Stateless |
| openexec-honcho-dev | Honcho per-person representation (optional) | Postgres-backed |
⚠️ Single-instance only: The scheduler claims rows via UPDATE … RETURNING. Running 2 API machines would double-fire scheduled actions. max_machines_running = 1 is group successful fly.api.toml / fly.api.qa.toml — do not override it.
Required GitHub Actions secrets
Deploys authenticate pinch per-app Fly deploy tokens stored arsenic repo (or org) Actions secrets. Generate each pinch flyctl tokens create deploy -a <app> -x 999999h:
| FLY_API_TOKEN_API | openexec-api-dev | dev |
| FLY_API_TOKEN_UI | openexec-ui-dev | dev |
| FLY_API_TOKEN_HONCHO | openexec-honcho-dev | dev (honcho job) |
| FLY_API_TOKEN_API_QA | openexec-api-qa | qa |
| FLY_API_TOKEN_UI_QA | openexec-ui-qa | qa |
Per-app runtime secrets (ANTHROPIC_API_KEY, BACKEND_SHARED_SECRET, the AUTH_* set, integration tokens) are group straight connected each Fly app — spot scripts/fly-secrets.sh.example.
QA bootstraps the aforesaid measurement against the -qa app names (push to the qa branch, aliases gh workflow tally "Deploy (qa)"). See docs/deployment.md for the afloat runbook (operations, rollback, communal nonaccomplishment modes, why .flycast isn't used).
The deployed UI is gated down Google sign-in pinch an email allow-list, and the nationalist API is protected by a shared-secret header betwixt the UI proxy and the FastAPI backend. See docs/auth.md for the afloat setup (Google Cloud Console steps, required Fly secrets, adding/removing users, rotating secrets, and a debugging table).
All settings via situation variables. Minimum required: ANTHROPIC_API_KEY — unless you configure a section aliases OpenRouter backend alternatively (see Running on Local Models). At slightest 1 supplier must beryllium group or the app refuses to start.
| ANTHROPIC_API_KEY | Yes¹ | — | Anthropic API key |
| DEFAULT_MODEL | No | claude-sonnet-4-6 | Executive + astir specialists |
| DEEP_REASONING_MODEL | No | claude-opus-4-7 | CSO, CFO, GC, Board |
| VECTOR_STORE_PATH | No | ./chroma_db | ChromaDB directory |
| EPISODIC_DB_PATH | No | ./episodic_memory.db | SQLite for episodic memory |
| COMPANY_PROFILE_PATH | No | ./company/profile.yaml | Company profile |
| ENABLE_CACHING | No | true | Anthropic punctual caching |
| ROUTING_MODEL | No | claude-haiku-4-5-20251001 | Model for intent routing |
| SLACK_BOT_TOKEN | No | — | Slack bot OAuth token |
| SLACK_APP_TOKEN | No | — | Slack socket mode token |
| EXEC_EMAIL_ADDRESS | No | — | Executive Gmail reside (Gmail MCP OAuth) |
| EMAIL_POLL_INTERVAL_SECONDS | No | 60 | How often to canvass for caller email |
| TELEGRAM_BOT_TOKEN | No | — | Telegram bot token (from @BotFather) |
| TELEGRAM_WEBHOOK_SECRET | No | — | Random drawstring for webhook validation |
| DISCORD_BOT_TOKEN | No | — | Discord bot token (Developer Portal → Bot tab) |
| DISCORD_APP_ID | No | — | Discord exertion ID (General Information tab) |
| DISCORD_GUILD_IDS | No | — | Comma-separated guild IDs for dev slash-command registration |
| DISCORD_NOTIFY_CHANNEL_ID | No | — | Default transmission ID for outbound notifications |
| GOOGLE_CHAT_PROJECT_NUMBER | No | — | GCP task number for Google Chat |
| GOOGLE_CHAT_SERVICE_ACCOUNT_FILE | No | — | Path to work relationship JSON key |
| GOOGLE_OAUTH_CLIENT_ID | No | — | Google OAuth customer ID (Gmail MCP) |
| GOOGLE_OAUTH_CLIENT_SECRET | No | — | Google OAuth customer concealed (Gmail MCP) |
| OPENROUTER_ENABLED | No | false | Route Claude calls done OpenRouter and unlock non-Anthropic models per-agent successful the Council UI |
| OPENROUTER_API_KEY | No | — | Required erstwhile OPENROUTER_ENABLED=true |
| LOCAL_MODELS_ENABLED | No | false | Route selected slugs to a section OpenAI-compatible server (Ollama, LM Studio, vLLM, llama.cpp) |
| LOCAL_BASE_URL | No | — | Local server URL incl. type path, e.g. http://localhost:11434/v1. Required erstwhile LOCAL_MODELS_ENABLED=true |
| LOCAL_API_KEY | No | — | Optional bearer token (vLLM / gateways); Ollama & LM Studio request none |
| LOCAL_MODELS | No | — | Comma-separated section exemplary slugs to aboveground successful the Council UI and way locally, e.g. llama3.3,qwen2.5 |
| LOCAL_TIMEOUT_S | No | 300 | Per-call timeout for section generation, successful seconds |
| HONCHO_ENABLED | No | false | Per-person representation furniture (honcho.dev) — a adjacent paper shared crossed each channels |
| HONCHO_API_KEY | No | — | Required erstwhile HONCHO_ENABLED=true |
| HONCHO_BASE_URL | No | — | Self-hosted Honcho endpoint |
See .env.example for the afloat list.
¹ ANTHROPIC_API_KEY is required only erstwhile you service Claude models directly. It tin beryllium omitted wholly if you tally connected section models (LOCAL_MODELS_ENABLED) or way done OpenRouter (OPENROUTER_ENABLED).
Open Executive tin tally against immoderate OpenAI-compatible section server — Ollama, LM Studio, vLLM, aliases llama.cpp — alternatively of (or alongside) the Anthropic API. Local exemplary slugs way to your server done the aforesaid supplier abstraction the hosted models use; nary supplier aliases orchestrator codification changes.
The listed slugs look successful the Council UI exemplary dropdown, truthful you tin besides run a hybrid setup — support the Executive connected Claude while flipping individual specialists to a section exemplary per-agent.
Caveats. Server-side web hunt (ENABLE_WEB_SEARCH) and Anthropic prompt caching / extended reasoning person nary section balanced and are automatically disabled for section models. Multi-agent routing leans heavy connected instrumentality use, so pick a exemplary that's beardown astatine it (e.g. Llama 3.3 70B, Qwen2.5) — mini models may way poorly. LOCAL_API_KEY is only needed if your server (vLLM, aliases a gateway) requires a bearer token; Ollama and LM Studio request none.
Adding a New Specialist Agent
- Create packages/core/openexecutive/agents/your_agent.py extending BaseAgent
- Add a strategy punctual changeless successful packages/core/openexecutive/prompts/domain_prompts.py
- Register successful packages/core/openexecutive/orchestrator/router.py — adhd to SPECIALIST_REGISTRY and the master enum successful SPECIALIST_TOOLS
- Add domain othername to DOMAIN_ALIASES successful packages/core/openexecutive/knowledge/retriever.py
- Add knowledge docs to knowledge/builtin/your_domain/
- Add astatine slightest 2 eval scenarios to evals/scenarios/
- Submit a PR — CI requires each of the above
evals/ contains 29 scenarios covering each 8 domains, scored by claude-opus-4-7 arsenic an LLM-as-judge. Each script defines a query, simulated institution context, expected topics, required master routing, and a domain-specific rubric. Five scoring dimensions (persona coherence, domain accuracy, institution discourse utilization, routing quality, actionability) are each rated 1–5. The CI gross requires ≥ 3.5/5 average; immoderate magnitude dropping > 10% vs main fails the PR.
Everything successful company/ is gitignored — the floor plan YAML, uploaded documents, and the ChromaDB vector store. None of this leaves your section instrumentality (or your ain Fly measurement successful unreality deployments) isolated from arsenic portion of prompts sent to the Anthropic API. Anthropic does not train connected API data.
See .github/CONTRIBUTING.md. All PRs must include:
- Working implementation (no stubs)
- Tests for caller behavior
- Eval scenarios for caller agents aliases punctual changes
Apache 2.0 — free to usage commercially, requires attribution.

English (US) ·
Indonesian (ID) ·