{"slug": "ceo-fired-developers-to-make-room-for-ai-developers-create-open-source-ai-ceo", "title": "CEO fired developers to make room for AI. Developers create open source AI CEO", "summary": "SenteLabs AI released Open Executive, an open-source AI system that simulates a virtual executive team with eight specialist agents, including a Chief Strategy Officer and Chief Financial Officer, built on Anthropic's Claude models. The system, available under Apache 2.0, provides a unified executive voice, episodic memory, and a scheduler, aiming to replace human executives in decision-making processes.", "body_md": "An AI system that acts as your company's virtual executive team — a senior advisor with Harvard MBA-level knowledge, customized for your specific business.\n\nA walkthrough of Open Executive in action — [watch on YouTube](https://youtu.be/O_g97xxVTMk).\n\nDeveloped by [sentelabs.ai](https://sentelabs.ai) Open Executive provides a single coherent executive voice backed by eight specialist AI agents:\n\n**Chief Strategy Officer**— competitive analysis, M&A, market positioning, OKRs** Chief Financial Officer**— financial modeling, fundraising, unit economics, cash flow** Chief HR/People Officer**— hiring, compensation, performance, culture** General Counsel**— contracts, IP, employment law basics, compliance** Chief Operating Officer**— process design, vendor management, operational scaling** Chief Marketing Officer**— GTM strategy, brand, communications, PR** Chief Product Officer**— roadmap, prioritization, product strategy** Board Communications Director**— board decks, investor relations, governance\n\nAll responses come from one consistent executive voice. The internal agent architecture is never exposed to the user. Beyond Q&A, the system maintains episodic memory of past decisions and initiatives across sessions, and a built-in scheduler can proactively surface follow-ups and time-sensitive actions.\n\n```\nUser message\n    ↓\nExecutive Orchestrator (claude-sonnet-4-6)\n    ↓ tool use → parallel specialist calls\nCSO / CFO / CHRO / GC / COO / CMO / CPO / Board\n    ↓ each specialist retrieves relevant context from ChromaDB\nBuilt-in MBA knowledge + Your company documents\n    ↓\nSynthesized executive response\n```\n\n**Knowledge** — Two retrieval layers per specialist call: (1) built-in MBA-level Markdown (`knowledge/builtin/`\n\n, git-tracked) seeded into ChromaDB at startup, and (2) your uploaded company documents chunked and stored in a separate `company_docs`\n\ncollection. RAG context is injected into the user turn, never the cached system prompt.\n\n**Episodic memory** — After every response, a background `claude-haiku-4-5`\n\npass extracts key decisions, initiatives, and advice into SQLite. The next session opens with a `<past_decisions>`\n\nblock so the Executive remembers what it recommended last month.\n\n**Scheduler** — A built-in job runner claims due actions via `UPDATE … RETURNING`\n\nto prevent double-firing. The API must run as a single instance; do not horizontally scale it without gating the scheduler first.\n\n**Prompt caching** — The system prompt is structured so the Executive persona, company profile, and knowledge index are cached separately (up to 85% cache hit rate after the first few turns). No dynamic content ever goes in a cached block.\n\nSee [docs/architecture.md](/SenteLabsAI/OpenExecutive/blob/main/docs/architecture.md) for the full design.\n\n| Layer | Choice |\n|---|---|\n| LLM backbone | Anthropic Claude API |\n| Default model | `claude-sonnet-4-6` (Executive + most specialists) |\n| Deep reasoning | `claude-opus-4-7` (CSO, CFO, GC, Board — with extended thinking) |\n| Backend | Python 3.11 + FastAPI |\n| Package manager | `uv` |\n| Vector store | ChromaDB (local, embedded) |\n| Episodic memory | SQLite |\n| Web UI | Next.js 15 (App Router) + Tailwind |\n| License | Apache 2.0 |\n\n```\nopenexecutive/\n├── packages/\n│   ├── core/\n│   │   └── openexecutive/\n│   │       ├── orchestrator/     # Executive persona + routing loop\n│   │       ├── agents/           # 8 specialist agents\n│   │       ├── knowledge/        # ChromaDB store + RAG pipeline\n│   │       ├── memory/           # Company profile + episodic memory\n│   │       ├── onboarding/       # Wizard state machine + profile builder\n│   │       ├── prompts/          # Persona + domain prompts + cache manager\n│   │       ├── api/              # FastAPI app + routes\n│   │       ├── integrations/     # Slack, Email, Telegram, Google Chat, Discord\n│   │       ├── scheduler/        # Background job runner (single-instance)\n│   │       ├── alerts/           # Proactive alert system\n│   │       ├── audit/            # Audit logging\n│   │       ├── architecture/     # Internal architecture utilities\n│   │       ├── workflows/        # Multi-step workflow definitions\n│   │       └── cli.py            # Click CLI\n│   └── ui/                       # Next.js 15 web UI\n├── evals/                        # Eval scenarios + LLM-as-judge runner\n├── fixtures/                     # Demo company fixtures (profiles, docs, rosters)\n├── scripts/                      # Operator scripts (Fly secrets, Google auth)\n├── docker/                       # Dockerfile(s) + docker-compose.yml\n├── fly.api.toml / fly.ui.toml    # Fly.io configs — dev API + UI apps\n├── fly.api.qa.toml / fly.ui.qa.toml  # Fly.io configs — QA API + UI apps\n├── fly.honcho.toml               # Fly.io config — Honcho memory app (optional)\n└── docs/                         # Architecture + deployment docs\n# Clone the repo\ngit clone https://github.com/SenteLabsAI/OpenExecutive.git\ncd OpenExecutive\n\n# Set your Anthropic API key\ncp .env.example .env\n# Edit .env and add ANTHROPIC_API_KEY=sk-ant-...\n\n# Start everything\nmake dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) to start chatting with your executive. The API runs on port 8000 and the UI on 3000.\n\nFirst run:requires Python 3.11+ and Node 22+. The initial`uv sync`\n\npulls heavy ML dependencies (ChromaDB + sentence-transformers/PyTorch), and the first boot downloads a small embedding model (~90 MB) to build the local vector index — so the first`make dev`\n\ntakes a few minutes before the app is ready. Subsequent starts are fast.\n\n**For contributors not using make:**\n\n```\ncd packages/core\nuv sync\nsource .venv/bin/activate\nuvicorn openexecutive.api.main:app --reload --port 8000\n\n# In a second terminal\ncd packages/ui && npm install && npm run dev\n```\n\n- Create a Discord application at\n[https://discord.com/developers/applications](https://discord.com/developers/applications) - Enable the\n**Message Content** privileged intent (Bot → Privileged Gateway Intents) - Invite the bot with\n`bot`\n\n+`applications.commands`\n\nscopes - Set env vars in\n`.env`\n\n:`DISCORD_BOT_TOKEN`\n\n,`DISCORD_APP_ID`\n\n,`DISCORD_GUILD_IDS`\n\n- Run the API normally — the bot starts as part of the FastAPI lifespan when\n`DISCORD_BOT_TOKEN`\n\nis set:\n\n```\nmake dev\n```\n\nThe bot is embedded in the API process (alongside the email poller, scheduler, and resumer) so it shares the same SQLite database and ChromaDB vector store under `/data`\n\nin production. Skip the token to disable.\n\nFor iterating on bot-only code without restarting the API, `make discord`\n\nruns the bot as a standalone process against the same local DB.\n\nUsers can DM the bot, `@mention`\n\nit in a channel (replies in a thread), or use `/ask`\n\nand `/today`\n\nslash commands. Slash commands sync to `DISCORD_GUILD_IDS`\n\ninstantly on startup; leave blank for global registration (up to 1-hour propagation delay).\n\nJust set the secrets on the existing API app — no new Fly app required:\n\n```\nflyctl secrets set -a openexec-api-dev \\\n  DISCORD_BOT_TOKEN=... \\\n  DISCORD_APP_ID=... \\\n  DISCORD_GUILD_IDS=...\n```\n\nDiscord user access is managed via the /people UI — add a Person row with `discord_user_id`\n\nset.\n\nThe machine restarts and the bot starts on the next lifespan boot. To disable in prod: `flyctl secrets unset -a openexec-api-dev DISCORD_BOT_TOKEN`\n\n.\n\nThe first time you visit the app, you'll be guided through a wizard to set up your company profile:\n\n- Company basics (name, industry, stage, team size)\n- Business model and revenue\n- Competitive landscape\n- Strategic priorities\n- Culture and values\n- Optional: financial position, document upload\n\nAfter onboarding, the Executive will reference your specific company context in every response.\n\n| Interface | How to Use |\n|---|---|\nWeb UI |\n`http://localhost:3000` |\nSlack |\nMention `@OpenExecutive` or DM the app |\nEmail |\nCC or email the configured address (IMAP/SMTP poller) |\nTelegram |\nMessage the configured bot |\nGoogle Chat |\nMention the app in a space |\nDiscord |\nDM the bot, `@mention` it in a channel, or use `/ask` / `/today` slash commands |\nCLI |\n`openexecutive chat` |\n\nUpload your pitch deck, financial model, strategy docs, or any company documents via the web UI or API. The Executive will reference them when relevant.\n\n```\n# Via CLI\nopenexecutive upload deck.pdf model.xlsx strategy.md\n\n# Via API\ncurl -X POST http://localhost:8000/documents \\\n  -F \"file=@deck.pdf\" \\\n  -F \"domain=strategy\"\n```\n\nTwo environments, each a separate set of Fly apps, driven by branch:\n\n| Environment | Trigger | Workflow | Apps |\n|---|---|---|---|\ndev |\npush/merge to `main` (continuous) |\n`.github/workflows/deploy.yml` |\n`openexec-api-dev` , `openexec-ui-dev` |\nqa |\npush/merge to `qa` (deliberate promotion) |\n`.github/workflows/deploy-qa.yml` |\n`openexec-api-qa` , `openexec-ui-qa` |\n\nBoth workflows use `dorny/paths-filter`\n\nto deploy only the changed app (API, UI, or both). QA is a stable twin of dev — same image and runtime, only the app name differs (`fly.api.qa.toml`\n\n/ `fly.ui.qa.toml`\n\n) — so it lags `main`\n\nand stays vetted. An optional Honcho memory app (`fly.honcho.toml`\n\n) deploys independently.\n\n| App | Purpose | State |\n|---|---|---|\n`openexec-api-{dev,qa}` |\nFastAPI + scheduler | Persistent volume `executive_data` at `/data` |\n`openexec-ui-{dev,qa}` |\nNext.js 15 | Stateless |\n`openexec-honcho-dev` |\nHoncho per-person memory (optional) | Postgres-backed |\n\n: The scheduler claims rows via⚠️ Single-instance only`UPDATE … RETURNING`\n\n. Running two API machines would double-fire scheduled actions.`max_machines_running = 1`\n\nis set in`fly.api.toml`\n\n/`fly.api.qa.toml`\n\n— do not override it.\n\nDeploys authenticate with per-app Fly deploy tokens stored as repo (or org) Actions secrets. Generate each with `flyctl tokens create deploy -a <app> -x 999999h`\n\n:\n\n| Secret | App | Used by |\n|---|---|---|\n`FLY_API_TOKEN_API` |\n`openexec-api-dev` |\ndev |\n`FLY_API_TOKEN_UI` |\n`openexec-ui-dev` |\ndev |\n`FLY_API_TOKEN_HONCHO` |\n`openexec-honcho-dev` |\ndev (honcho job) |\n`FLY_API_TOKEN_API_QA` |\n`openexec-api-qa` |\nqa |\n`FLY_API_TOKEN_UI_QA` |\n`openexec-ui-qa` |\nqa |\n\nPer-app runtime secrets (`ANTHROPIC_API_KEY`\n\n, `BACKEND_SHARED_SECRET`\n\n, the `AUTH_*`\n\nset, integration tokens) are set directly on each Fly app — see `scripts/fly-secrets.sh.example`\n\n.\n\n```\n# 1. Create apps and volume\nflyctl apps create openexec-api-dev\nflyctl apps create openexec-ui-dev\nflyctl volumes create executive_data --region iad --size 1 -a openexec-api-dev\n\n# 2. Set the required secret\nflyctl secrets set -a openexec-api-dev ANTHROPIC_API_KEY=sk-ant-...\n\n# 3. Create deploy tokens and add as GitHub secrets FLY_API_TOKEN_API and FLY_API_TOKEN_UI\nflyctl tokens create deploy -a openexec-api-dev -x 999999h\nflyctl tokens create deploy -a openexec-ui-dev  -x 999999h\n\n# 4. First deploy\ngh workflow run \"Deploy (dev)\" -f target=both\n```\n\nQA bootstraps the same way against the `-qa`\n\napp names (push to the `qa`\n\nbranch, or `gh workflow run \"Deploy (qa)\"`\n\n). See [docs/deployment.md](/SenteLabsAI/OpenExecutive/blob/main/docs/deployment.md) for the full runbook (operations, rollback, common failure modes, why `.flycast`\n\nisn't used).\n\nThe deployed UI is gated behind Google sign-in with an email allow-list, and the public API is protected by a shared-secret header between the UI proxy and the FastAPI backend. See [docs/auth.md](/SenteLabsAI/OpenExecutive/blob/main/docs/auth.md) for the full setup (Google Cloud Console steps, required Fly secrets, adding/removing users, rotating secrets, and a debugging table).\n\nAll settings via environment variables. Minimum required: `ANTHROPIC_API_KEY`\n\n—\n*unless* you configure a local or OpenRouter backend instead (see [Running on\nLocal Models](#running-on-local-models)). At least one provider must be set or\nthe app refuses to start.\n\n| Variable | Required | Default | Description |\n|---|---|---|---|\n`ANTHROPIC_API_KEY` |\nYes¹ | — | Anthropic API key |\n`DEFAULT_MODEL` |\nNo | `claude-sonnet-4-6` |\nExecutive + most specialists |\n`DEEP_REASONING_MODEL` |\nNo | `claude-opus-4-7` |\nCSO, CFO, GC, Board |\n`VECTOR_STORE_PATH` |\nNo | `./chroma_db` |\nChromaDB directory |\n`EPISODIC_DB_PATH` |\nNo | `./episodic_memory.db` |\nSQLite for episodic memory |\n`COMPANY_PROFILE_PATH` |\nNo | `./company/profile.yaml` |\nCompany profile |\n`ENABLE_CACHING` |\nNo | `true` |\nAnthropic prompt caching |\n`ROUTING_MODEL` |\nNo | `claude-haiku-4-5-20251001` |\nModel for intent routing |\n`SLACK_BOT_TOKEN` |\nNo | — | Slack bot OAuth token |\n`SLACK_APP_TOKEN` |\nNo | — | Slack socket mode token |\n`EXEC_EMAIL_ADDRESS` |\nNo | — | Executive Gmail address (Gmail MCP OAuth) |\n`EMAIL_POLL_INTERVAL_SECONDS` |\nNo | `60` |\nHow often to poll for new email |\n`TELEGRAM_BOT_TOKEN` |\nNo | — | Telegram bot token (from @BotFather) |\n`TELEGRAM_WEBHOOK_SECRET` |\nNo | — | Random string for webhook validation |\n`DISCORD_BOT_TOKEN` |\nNo | — | Discord bot token (Developer Portal → Bot tab) |\n`DISCORD_APP_ID` |\nNo | — | Discord application ID (General Information tab) |\n`DISCORD_GUILD_IDS` |\nNo | — | Comma-separated guild IDs for dev slash-command registration |\n`DISCORD_NOTIFY_CHANNEL_ID` |\nNo | — | Default channel ID for outbound notifications |\n`GOOGLE_CHAT_PROJECT_NUMBER` |\nNo | — | GCP project number for Google Chat |\n`GOOGLE_CHAT_SERVICE_ACCOUNT_FILE` |\nNo | — | Path to service account JSON key |\n`GOOGLE_OAUTH_CLIENT_ID` |\nNo | — | Google OAuth client ID (Gmail MCP) |\n`GOOGLE_OAUTH_CLIENT_SECRET` |\nNo | — | Google OAuth client secret (Gmail MCP) |\n`OPENROUTER_ENABLED` |\nNo | `false` |\nRoute Claude calls through OpenRouter and unlock non-Anthropic models per-agent in the Council UI |\n`OPENROUTER_API_KEY` |\nNo | — | Required when `OPENROUTER_ENABLED=true` |\n`LOCAL_MODELS_ENABLED` |\nNo | `false` |\nRoute selected slugs to a local OpenAI-compatible server (Ollama, LM Studio, vLLM, llama.cpp) |\n`LOCAL_BASE_URL` |\nNo | — | Local server URL incl. version path, e.g. `http://localhost:11434/v1` . Required when `LOCAL_MODELS_ENABLED=true` |\n`LOCAL_API_KEY` |\nNo | — | Optional bearer token (vLLM / gateways); Ollama & LM Studio need none |\n`LOCAL_MODELS` |\nNo | — | Comma-separated local model slugs to surface in the Council UI and route locally, e.g. `llama3.3,qwen2.5` |\n`LOCAL_TIMEOUT_S` |\nNo | `300` |\nPer-call timeout for local generation, in seconds |\n`HONCHO_ENABLED` |\nNo | `false` |\nPer-person memory layer (\n|\n\n`HONCHO_API_KEY`\n\n`HONCHO_ENABLED=true`\n\n`HONCHO_BASE_URL`\n\nSee [.env.example](/SenteLabsAI/OpenExecutive/blob/main/.env.example) for the full list.\n\n¹\n\n`ANTHROPIC_API_KEY`\n\nis required only when you serve Claude models directly. It can be omitted entirely if you run on local models (`LOCAL_MODELS_ENABLED`\n\n) or route through OpenRouter (`OPENROUTER_ENABLED`\n\n).\n\nOpen Executive can run against any **OpenAI-compatible** local server — Ollama,\nLM Studio, vLLM, or llama.cpp — instead of (or alongside) the Anthropic API.\nLocal model slugs route to your server through the same provider abstraction the\nhosted models use; no agent or orchestrator code changes.\n\n```\n# 1. Pull a capable, tool-use-friendly model (example: Ollama)\nollama pull llama3.3\n\n# 2. In .env — point at the local server and list the slugs to expose\nLOCAL_MODELS_ENABLED=true\nLOCAL_BASE_URL=http://localhost:11434/v1   # Ollama default\nLOCAL_MODELS=llama3.3\n\n# 3. (Optional) run with NO Anthropic key — make local the default everywhere\nDEFAULT_MODEL=llama3.3\nDEEP_REASONING_MODEL=llama3.3\nROUTING_MODEL=llama3.3\n# ...and leave ANTHROPIC_API_KEY unset\n```\n\nThe listed slugs appear in the **Council UI** model dropdown, so you can also run\na hybrid setup — keep the Executive on Claude while flipping individual\nspecialists to a local model per-agent.\n\n**Caveats.** Server-side web search (`ENABLE_WEB_SEARCH`\n\n) and Anthropic prompt\ncaching / extended thinking have no local equivalent and are automatically\ndisabled for local models. Multi-agent routing leans heavily on tool use, so\npick a model that's strong at it (e.g. Llama 3.3 70B, Qwen2.5) — small models\nmay route poorly. `LOCAL_API_KEY`\n\nis only needed if your server (vLLM, or a\ngateway) requires a bearer token; Ollama and LM Studio need none.\n\n- Create\n`packages/core/openexecutive/agents/your_agent.py`\n\nextending`BaseAgent`\n\n- Add a system prompt constant in\n`packages/core/openexecutive/prompts/domain_prompts.py`\n\n- Register in\n`packages/core/openexecutive/orchestrator/router.py`\n\n— add to`SPECIALIST_REGISTRY`\n\nand the`specialist`\n\nenum in`SPECIALIST_TOOLS`\n\n- Add domain alias to\n`DOMAIN_ALIASES`\n\nin`packages/core/openexecutive/knowledge/retriever.py`\n\n- Add knowledge docs to\n`knowledge/builtin/your_domain/`\n\n- Add at least 2 eval scenarios to\n`evals/scenarios/`\n\n- Submit a PR — CI requires all of the above\n\n```\nmake dev          # Start FastAPI + Next.js\nmake test         # Run Python tests\nmake eval         # Run eval suite\nmake lint         # Run ruff + mypy\nmake docker       # Build and run Docker stack\n\n# Unit tests only (no API calls required)\npytest packages/core/tests/unit/ -v\n```\n\n`evals/`\n\ncontains 29 scenarios covering all 8 domains, scored by `claude-opus-4-7`\n\nas an LLM-as-judge. Each scenario defines a query, simulated company context, expected topics, required specialist routing, and a domain-specific rubric. Five scoring dimensions (persona coherence, domain accuracy, company context utilization, routing quality, actionability) are each rated 1–5. The CI gate requires ≥ 3.5/5 average; any dimension dropping > 10% vs `main`\n\nfails the PR.\n\nEverything in `company/`\n\nis gitignored — the profile YAML, uploaded documents, and the ChromaDB vector store. None of this leaves your local machine (or your own Fly volume in cloud deployments) except as part of prompts sent to the Anthropic API. Anthropic does not train on API data.\n\nSee [.github/CONTRIBUTING.md](/SenteLabsAI/OpenExecutive/blob/main/.github/CONTRIBUTING.md). All PRs must include:\n\n- Working implementation (no stubs)\n- Tests for new behavior\n- Eval scenarios for new agents or prompt changes\n\nApache 2.0 — free to use commercially, requires attribution.", "url": "https://wpnews.pro/news/ceo-fired-developers-to-make-room-for-ai-developers-create-open-source-ai-ceo", "canonical_source": "https://github.com/SenteLabsAI/OpenExecutive", "published_at": "2026-08-27 01:46:22+00:00", "updated_at": "2026-08-27 02:18:41.459345+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-agents", "ai-products", "ai-tools"], "entities": ["SenteLabs AI", "Anthropic", "Claude", "Open Executive"], "alternates": {"html": "https://wpnews.pro/news/ceo-fired-developers-to-make-room-for-ai-developers-create-open-source-ai-ceo", "markdown": "https://wpnews.pro/news/ceo-fired-developers-to-make-room-for-ai-developers-create-open-source-ai-ceo.md", "text": "https://wpnews.pro/news/ceo-fired-developers-to-make-room-for-ai-developers-create-open-source-ai-ceo.txt", "jsonld": "https://wpnews.pro/news/ceo-fired-developers-to-make-room-for-ai-developers-create-open-source-ai-ceo.jsonld"}}