CEO fired developers to make room for AI. Developers create open source AI CEO

Aug 27, 2026 08:46 AM - 2 hours ago 3

CI  Apache 2.0 Python 3.11+ Next.js 15

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.

Open Executive demo video

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.

User message ↓ Executive Orchestrator (claude-sonnet-4-6) ↓ instrumentality usage → parallel master calls CSO / CFO / CHRO / GC / COO / CMO / CPO / Board ↓ each master retrieves applicable discourse from ChromaDB Built-in MBA knowledge + Your institution documents ↓ Synthesized executive response

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.

Layer Choice
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
openexecutive/ ├── packages/ │ ├── core/ │ │ └── openexecutive/ │ │ ├── orchestrator/ # Executive persona + routing loop │ │ ├── agents/ # 8 master agents │ │ ├── knowledge/ # ChromaDB shop + RAG pipeline │ │ ├── memory/ # Company floor plan + episodic memory │ │ ├── onboarding/ # Wizard authorities instrumentality + floor plan builder │ │ ├── prompts/ # Persona + domain prompts + cache manager │ │ ├── api/ # FastAPI app + routes │ │ ├── integrations/ # Slack, Email, Telegram, Google Chat, Discord │ │ ├── scheduler/ # Background occupation runner (single-instance) │ │ ├── alerts/ # Proactive alert system │ │ ├── audit/ # Audit logging │ │ ├── architecture/ # Internal architecture utilities │ │ ├── workflows/ # Multi-step workflow definitions │ │ └── cli.py # Click CLI │ └── ui/ # Next.js 15 web UI ├── evals/ # Eval scenarios + LLM-as-judge runner ├── fixtures/ # Demo institution fixtures (profiles, docs, rosters) ├── scripts/ # Operator scripts (Fly secrets, Google auth) ├── docker/ # Dockerfile(s) + docker-compose.yml ├── fly.api.toml / fly.ui.toml # Fly.io configs — dev API + UI apps ├── fly.api.qa.toml / fly.ui.qa.toml # Fly.io configs — QA API + UI apps ├── fly.honcho.toml # Fly.io config — Honcho representation app (optional) └── docs/ # Architecture + deployment docs
# Clone the repo git clone https://github.com/SenteLabsAI/OpenExecutive.git cd OpenExecutive # Set your Anthropic API key cp .env.example .env # Edit .env and adhd ANTHROPIC_API_KEY=sk-ant-... # Start everything make dev

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:

cd packages/core uv sync source .venv/bin/activate uvicorn openexecutive.api.main:app --reload --port 8000 # In a 2nd terminal cd packages/ui && npm instal && npm tally dev
  1. Create a Discord exertion astatine https://discord.com/developers/applications
  2. Enable the Message Content privileged intent (Bot → Privileged Gateway Intents)
  3. Invite the bot pinch bot + applications.commands scopes
  4. Set env vars successful .env: DISCORD_BOT_TOKEN, DISCORD_APP_ID, DISCORD_GUILD_IDS
  5. 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:

flyctl secrets set -a openexec-api-dev \ DISCORD_BOT_TOKEN=... \ DISCORD_APP_ID=... \ DISCORD_GUILD_IDS=...

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.

Interface How to Use
Web UI http://localhost:3000
Slack Mention @OpenExecutive aliases DM the app
Email 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.

# Via CLI openexecutive upload deck.pdf model.xlsx strategy.md # Via API curl -X POST http://localhost:8000/documents \ -F "[email protected]" \ -F "domain=strategy"

Two environments, each a abstracted group of Fly apps, driven by branch:

Environment Trigger Workflow Apps
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.

App Purpose State
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:

Secret App Used by
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.

# 1. Create apps and volume flyctl apps create openexec-api-dev flyctl apps create openexec-ui-dev flyctl volumes create executive_data --region iad --size 1 -a openexec-api-dev # 2. Set the required secret flyctl secrets set -a openexec-api-dev ANTHROPIC_API_KEY=sk-ant-... # 3. Create deploy tokens and adhd arsenic GitHub secrets FLY_API_TOKEN_API and FLY_API_TOKEN_UI flyctl tokens create deploy -a openexec-api-dev -x 999999h flyctl tokens create deploy -a openexec-ui-dev -x 999999h # 4. First deploy gh workflow tally "Deploy (dev)" -f target=both

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.

Variable Required Default Description
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.

# 1. Pull a capable, tool-use-friendly exemplary (example: Ollama) ollama propulsion llama3.3 # 2. In .env — constituent astatine the section server and database the slugs to expose LOCAL_MODELS_ENABLED=true LOCAL_BASE_URL=http://localhost:11434/v1 # Ollama default LOCAL_MODELS=llama3.3 # 3. (Optional) tally pinch NO Anthropic cardinal — make section the default everywhere DEFAULT_MODEL=llama3.3 DEEP_REASONING_MODEL=llama3.3 ROUTING_MODEL=llama3.3 # ...and time off ANTHROPIC_API_KEY unset

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

  1. Create packages/core/openexecutive/agents/your_agent.py extending BaseAgent
  2. Add a strategy punctual changeless successful packages/core/openexecutive/prompts/domain_prompts.py
  3. Register successful packages/core/openexecutive/orchestrator/router.py — adhd to SPECIALIST_REGISTRY and the master enum successful SPECIALIST_TOOLS
  4. Add domain othername to DOMAIN_ALIASES successful packages/core/openexecutive/knowledge/retriever.py
  5. Add knowledge docs to knowledge/builtin/your_domain/
  6. Add astatine slightest 2 eval scenarios to evals/scenarios/
  7. Submit a PR — CI requires each of the above
make dev # Start FastAPI + Next.js make test # Run Python tests make eval # Run eval suite make lint # Run ruff + mypy make docker # Build and tally Docker stack # Unit tests only (no API calls required) pytest packages/core/tests/unit/ -v

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.

More