Free · MIT · Open source
Open Exec
An open-source executive assistant for your Gmail and Google Calendar. It triages the inbox, reads the threads that matter, finds free time, drafts replies and puts events on your calendar.
Features
What it does
Inbox triage
Gmail search with Gmail query syntax, and whole threads read when they matter.
Drafts, never sends
Replies land in Gmail as drafts after your approval, and you press Send. The app has no send tool.
Free time and events
Finds free windows on weekdays in working hours in your time zone, and creates events after approval with no invitation emails.
Policies decide the Google scopes
Deny a tool in assistant.config.ts and Connect Google stops asking for its scope.
Your own OAuth client
Each deployment uses its own Google OAuth client, so mail goes from Google to your server and nowhere else. Tokens are sealed with AES-256-GCM.
Try it without Google
The DEMO runs on a built-in sample mailbox of fictional people, including a prompt injection the assistant reports instead of obeying.
One key, every model
Use with your CompanyFabric key
- 1
Create an account and make a key on the keys page. New accounts get starter credit.
- 2
Put it in the template's
.env.companyfabric/autopicks a suitable model per request, and the exact charge of each turn comes back with the answer. - 3
Run it:
pnpm devfor lite (Vercel works), ordocker compose upfor Hermes. With no key it runs a clearly labelled demo.
OPENAI_BASE_URL=https://api.companyfabric.com/v1
OPENAI_API_KEY=sk-cf-…
MODEL=companyfabric/autoOpenAI directly, or a local server such as Ollama, LM Studio or vLLM, works too: any OpenAI-compatible endpoint with tool calling.
Runtimes
Lite or Hermes
Lite runs the agent loop in the Next.js server. Hermes runs each turn in a Hermes Agent container (v0.22.5, pinned by digest), which calls the app's tools back over MCP, so policies, approvals and the audit log are the same.
| Capability | Lite | Hermes |
|---|---|---|
| Inbox triage (Gmail search and read) | Yes | Yes |
| Reply drafts, saved to Gmail after approvalNever sent; you send from Gmail | Yes | Yes |
| Free-time search and events after approval | Yes | Yes |
| Web search for context | Yes | Yes |
| Audit row before every tool call | Yes | Yes |
| Memory across threads (preferences, people)Hermes memory toolset | No | Yes |
| Morning brief on a schedule (cron)Hermes cron works; this UI does not manage schedules yet | No | Not in the UI yet |
| Runs on serverless hosting (Vercel)Hermes needs a long-running container | Yes | No |
What is proven
Status
Early. Checked in CI on every change: Install, typecheck, unit tests and production build; Hermes starts with the app's tools loaded (no model is called in CI); Contract tests: OAuth state and PKCE, sealed tokens, token refresh and revocation, draft headers, free-time search across time zones, approvals.
- implemented-untestedGmail search, read and drafts against live Google
- implemented-untestedCalendar list, free time and events against live Google
- implemented-untestedSearch through Parallel or Exa
- implemented-untestedA Hermes turn with a real model
- not yetManaging a scheduled morning brief from the UI
Configuration
Environment
| Variable | Default | What it is |
|---|---|---|
GOOGLE_CLIENT_ID | none | Your own Google OAuth client (Web application). |
GOOGLE_CLIENT_SECRET | none | Its secret. |
APP_URL | http://localhost:3000 | The redirect URI is APP_URL + /api/google/callback. |
TOKEN_KEY | none | Seals Google tokens at rest. Generate with: openssl rand -hex 32 |
DEMO_DATA | false | true runs a live model on the built-in sample data. |
APP_PASSWORD | none | Set it whenever the app is reachable from anywhere but your own machine. There is no login by default. |
OPENAI_BASE_URL | https://api.companyfabric.com/v1 | Any OpenAI-compatible chat.completions endpoint with tool calling. |
OPENAI_API_KEY | none | The model key. With none set, the app runs a labelled DEMO. |
MODEL | companyfabric/auto | The model id. companyfabric/auto picks a suitable model per request. |
SEARCH_PROVIDER | parallel | parallel (free, rate-limited, no key) or exa. companyfabric is not released yet. |
PARALLEL_API_KEY | none | Lifts Parallel's free-tier limits. |
EXA_API_KEY | none | Needed when SEARCH_PROVIDER=exa. |
COMPANYFABRIC_SEARCH_ENABLED | false | CompanyFabric search is not released yet; leave it off. |
RUNTIME | none | lite or hermes. Empty: hermes when HERMES_URL is set, lite otherwise. |
HERMES_URL | none | Set for you by docker-compose.yml. |
HERMES_API_KEY | none | Hermes only. Generate with: openssl rand -hex 32 |
TOOL_TOKEN | none | Hermes only: lets Hermes call the app's tools at /api/mcp. Generate with: openssl rand -hex 32 |
DATA_DIR | ./data | Where the SQLite database lives. |
MIT
License
Open Exec is MIT-licensed, © 2026 Creative Tim. Its UI is adapted from AI Elements (Apache-2.0) and shadcn/ui (MIT).
Not affiliated with Google, or with any company whose products offer AI assistants.