We just open-sourced a research agent that cites every claim it makes. Ask a question, get an answer with numbered sources you can check. Runs in Docker or on Vercel. #opensource #AI
Free · MIT · Open source
Open-source AI agent starters
Four complete Next.js agent apps that ask before they act, and run a labelled demo with no keys.
Sample data Close-ups of each app on its built-in demo data.
Open Research
Ask a question. Get an answer you can check.
It plans searches, reads the most relevant pages and cites every claim with a numbered source.


How do AI research agents use tools?
Ask a follow-up…01
Ask a question
Type it the way you would ask a colleague.
Web search: How do AI research agents use tools?
- 1Large language modelen.wikipedia.org
- 2Model Context Protocolmodelcontextprotocol.io
02
It searches and reads
It plans focused searches and reads the most relevant pages.
Large language models generate the text 1, and tools such as search are exposed to them through protocols like MCP 2.
- 1Large language modelen.wikipedia.org
- 2Model Context Protocolmodelcontextprotocol.io
03
You get a cited answer
Every [n] points at a source a tool actually returned.
Sample data Scenes use the starter's built-in demo data.
One ask to start with
“What changed in the EU AI Act obligations that apply in 2026?”
One ask to start with
“Compare the open-source agent frameworks released this year, with sources.”
Open Research: technical details
Lite and Hermes, capability by capability
| Capability | Lite | Hermes |
|---|---|---|
| Web search with numbered citations | Yes | Yes |
| Read web pages (SSRF-guarded) | Yes | Yes |
| Approval before side effects | Yes | Yes |
| Audit row before every tool call | Yes | Yes |
| Save reports | Yes | Yes |
| Memory across threadsHermes memory toolset | No | Yes |
| Files and terminal in a sandboxEnable the file / terminal toolsets in hermes/config.yaml | No | Off by default |
| Browser for JavaScript-heavy pagesHermes browser_exec; needs the terminal toolset | No | Off by default |
| Scheduled research (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 |
Environment variables
| Variable | Default | What it is |
|---|---|---|
| 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. |
What is proven
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).
- implemented-untestedSearch through Parallel (keyless tier)
- implemented-untestedSearch through Exa
- implemented-untestedLive research eval (10 questions, citation checks)
- implemented-untestedA Hermes turn with a real model
- not yetCompanyFabric search: not released yet
- not yetManaging scheduled research from the UI
Not affiliated with any company whose AI products offer similar research features.
Open Coworkers
A researcher and a writer that hand work to each other.
Specialist AI coworkers with their own permissions, a shared workspace with versions, and explicit hand-offs.


R To Ria, Researcher
Research the Model Context Protocol, save notes, then have Wes write a short newsletter summary.
Ask a follow-up…01
Give Ria a task
Ask the Researcher in plain words, and say who writes it up.
R Ria saved to the workspace
Research notes (DEMO)
- MCP standardizes how apps give tools to models 1.
- Language models are trained on large text corpora 2.
RW Handed off to Wes, Writer
Write a three-sentence summary of the research notes for a newsletter, keeping the citations.
02
She researches and hands off
Ria saves cited notes to the workspace and passes the write-up to Wes.
- Saved to the workspace
- Title
- Newsletter summary (DEMO)
- By
- Wes, Writer
MCP gives models a standard way to use tools 1. The models themselves are trained on large amounts of text 2. Together they make agents that can act, not just answer.
03
Wes writes, you approve
Wes works only from the workspace, and his save waits for you.
Sample data Scenes use the starter's built-in demo data.
One ask to start with
“Research what changed in the EU AI Act for 2026, save notes, then have Wes write a one-page brief.”
One ask to start with
“Find three credible sources on the four-day work week and save them to the workspace.”
Open Coworkers: technical details
Lite and Hermes, capability by capability
| Capability | Lite | Hermes |
|---|---|---|
| Specialist coworkers with their own tool permissions | Yes | Yes |
| Shared workspace documents, with versions | Yes | Yes |
| Hand-offs between coworkersQueued: the next coworker starts when the current one finishes | Yes | Yes |
| Approval before side effects | Yes | Yes |
| Audit row before every tool call | Yes | Yes |
| Web search with numbered citations | Yes | Yes |
| Memory across threadsHermes memory is shared by the whole team (one Hermes profile) | No | Yes |
| Files, terminal, browser in a sandboxEnable toolsets in hermes/config.yaml | No | Off by default |
| Recurring responsibilities (cron)Hermes cron works; this UI does not manage schedules yet | No | Not in the UI yet |
| Runs on serverless hosting (Vercel) | Yes | No |
Environment variables
| Variable | Default | What it is |
|---|---|---|
| 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. |
What is proven
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: permissions per coworker, approvals, workspace versions, hand-offs.
- implemented-untestedA live Ria to Wes hand-off with a real model
- implemented-untestedSearch through Parallel or Exa
- implemented-untestedA Hermes turn with a real model
- not yetManaging recurring responsibilities from the UI
Not affiliated with any company whose products offer AI coworkers.
Open Exec
Your inbox triaged. Replies drafted. Nothing sent.
It reads the threads that matter, finds free time and saves replies as Gmail drafts after you approve. You press Send.


What needs my attention in my inbox today?
Ask a follow-up…01
Ask about your inbox
Ask what needs you, the way you would ask an assistant.
Needs you first
- 1Priya NatarajanBoard deck numbers, due Thursday noon.
- 2Lee KimStaff engineer loop: pick Tuesday or Thursday afternoon.
- 3Sam Ortega (vendor)Renewal quote: decide this month to keep last year's price.Asks to forward your mail. Ignored.
The Analytics Weekly newsletter can wait.
02
It triages
It searches unread mail, reads the threads that matter and puts them in order.
- Draft · not sent
- Subject
- Re: Board deck: numbers needed by Thursday
Hi Priya, Yes, I'll send the Q3 revenue and churn figures by Thursday noon, with the churn definition signed off. For the narrative, does Wednesday afternoon work for 30 minutes? Thanks
03
A reply waits as a draft
After you approve, it is saved as a Gmail draft, and you press Send.
Sample data Scenes use the starter's built-in demo data.
One ask to start with
“What needs my attention in my inbox today?”
One ask to start with
“Find 45 minutes with no meetings this week and propose two slots.”
Open Exec: technical details
Lite and Hermes, capability by capability
| 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 |
Environment variables
| 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. |
What is proven
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
Not affiliated with Google, or with any company whose products offer AI assistants.
Compared
Start from working code
Every starter
- ApprovalsOne tool layer asks you before every gated action, enforced on the server.
- Audit logAn audit row is written before every tool call.
- RuntimesLite on Vercel or Hermes in Docker, from the same app.
- ModelsAny OpenAI-compatible endpoint with tool calling. CompanyFabric by default.
Building it yourself
- ApprovalsApproval flows built into each tool, kept in step with the prompt.
- Audit logLogging added around every tool by hand.
- RuntimesOne agent loop; a second runtime is a second integration.
- ModelsProvider wiring and switching are yours to build.
One key for every model
The starters default to CompanyFabric: one key for every major model, billed per token from a prepaid balance. New accounts get starter credit.
Get a CompanyFabric key.env
OPENAI_BASE_URL=https://api.companyfabric.com/v1
OPENAI_API_KEY=sk-cf-…
MODEL=companyfabric/autoFAQ
Questions
Lite or Hermes: which should I run?
Every starter runs two ways from the same app. Lite runs the agent loop in the Next.js server (pnpm dev), and Vercel works. Hermes runs each turn in a Hermes Agent container (docker compose up) that calls the app's tools back over MCP, so policies, approvals and the audit log are the same. Hermes adds memory across threads, and needs a long-running container.
Which model key do I need?
Any OpenAI-compatible chat.completions endpoint with tool calling. The default is CompanyFabric: one key for every major model, billed per token from a prepaid balance, and companyfabric/auto picks a suitable model per request. OpenAI directly, or a local server such as Ollama, LM Studio or vLLM, works too.
OPENAI_BASE_URL=https://api.companyfabric.com/v1
OPENAI_API_KEY=sk-cf-…
MODEL=companyfabric/autoCan I try them without any keys?
Yes. With no model key, each starter runs a clearly labelled DEMO. Social Autopilot runs its demo on a sample studio and Open Exec on a sample mailbox, so nothing is posted and no real mailbox is touched.
Can I self-host them?
Yes. Each one is a Next.js app that keeps its data in one SQLite file: run it on your own machine or server, on Vercel (lite), or with Docker Compose (Hermes). There is no login by default, and the compose files bind the app to 127.0.0.1; put it behind your own authentication, or set APP_PASSWORD where the starter supports it, before exposing it.
Are they ready for production?
They are early. CI checks every change: install, typecheck, unit tests, production build, and Hermes starting with the app's tools loaded. Runs against live services and real models are implemented but not yet verified; each starter lists them under its technical details.
What is the licence?
MIT, © 2026 Creative Tim: read them, change them and ship them. The UI is adapted from AI Elements (Apache-2.0) and shadcn/ui (MIT).
Prefer a hosted agent?
Spawn one on Creative Tim, or run a starter on your own machine.
Every starter is MIT-licensed, © 2026 Creative Tim. The UI is adapted from AI Elements (Apache-2.0) and shadcn/ui (MIT).













