Quest
Open source · Apache 2.0 · self-hosted

An AI agent workbench you can point at sensitive data.

Quest is a ChatGPT-style web app where people connect the services they already use and put LLM agents to work on them. It is designed so that doing this with private data is safe by default, and usable by people who are not engineers.

Python + ReactAny LLM providerRuns on one machine
$ git clone https://github.com/electric-capital/quest
$ cd quest && python3 run.py
  building frontend ............. done
  installing dependencies ....... done
  running migrations ............ done
  seeding dev accounts .......... done
  Quest listening on http://localhost:9000
What it is

One place to run agents against the tools your team already uses.

Quest runs agentic conversations against multiple LLM providers and gives the agent carefully fenced access to upstream services through per-user OAuth or API keys. Around that core it provides projects with shared workspaces, scheduled routines, a reusable skill library, agent memories, sub-agents, a sandboxed script runner, and admin tooling.

Models

Bring a plain API key from the vendor, go through Vertex AI, use open-weight models through a router, or point it at your own server.

ClaudeOpenAIGeminiVertex AIOpenRouterFireworksNEAR AIllama.cppvLLMOllama

Connected services

Each user connects their own accounts in Settings. The agent reads freely and proposes writes for you to approve.

GmailCalendarDriveDocsSheetsSlidesSlackTelegramGitHubXAirtableRampSEC EDGARFederal Register

Around the core

Projects with shared workspaces, routines on a schedule, a skill library, memories, sub-agents, and a script runner that executes in a no-egress container.

projectsroutinesskillsmemoriessub-agentsscript runnercost reportsfeature gates
Design principles

The guarantees come from the server, not from trusting the model.

Quest assumes the model can be confused or prompt-injected by content it reads. Every protection below is enforced in server-side design.

Private vs. public

Never both at once.

A private conversation can use your connected data but has no path to the open internet. A public project gets an internet-enabled sandbox and is cut off from every internal resource. No conversation holds sensitive data and an open channel at the same time.

Exfiltration routes

Closed by construction.

Outbound access goes only to registered upstream services through verb-scoped, read-only endpoint allow-lists. Scripts run in ephemeral Podman containers with no network egress; their only way out is a loopback bridge to an explicit list of tools.

Writes

A human confirms every one.

Reads are free; writes are not. Sending a message, creating an invite, editing a sheet or saving a memory goes through an action request: the agent proposes the exact operation, you see a preview with diffs, and it blocks until you approve, revise, or stop.

Audience

Built for less-technical users.

Everything happens in the web UI: OAuth connect buttons, approval cards instead of config files, cost warnings before expensive resumes, and admin panels for credentials, feature gates, model health, and per-user cost reports.

Plugins

Add an integration by dropping in a directory.

Integrations are self-contained plugins discovered from the filesystem at startup. No packaging, no entry points, no edits to core files, no frontend changes: configuration UI is rendered from the manifest's schema.

A manifest can declare an admin credential schema, a per-user connection, service entries with endpoint allow-lists, system skills, tools, and action-request handlers. Plugins inherit the security model; public projects always block them. The in-tree github and twitter plugins are the reference, and QUEST_PLUGIN_PATH loads external roots so a fork can keep proprietary integrations out of tree.

plugins/ ├── github/ │ ├── plugin.py # manifest: connection, services, tools │ ├── skills/ # system skills shipped with the plugin │ └── handlers.py # action-request handlers ├── twitter/ │ └── plugin.py └── README.md # external roots, kept out of tree QUEST_PLUGIN_PATH=/srv/our-plugins
Quick start

Local mode boots with zero credentials.

  1. 1

    Install prerequisites. Python 3.11+, Node.js 18+, uv, and Podman (optional in local mode; needed for the script sandbox).

  2. 2

    Run python3 run.py. Local mode builds the frontend, installs dependencies, runs migrations, seeds a throwaway data directory with canned accounts, and starts the server on port 9000.

  3. 3

    Sign in at http://localhost:9000/ with a canned dev account.

  4. 4

    Add one LLM key in the composer and start chatting. Everything else lives in Settings.

Deploying for real? run.py --prod includes a first-run bootstrap wizard. The installation guide covers a dedicated Debian host, Google OAuth and Vertex AI, and the security notes spell out what Quest assumes about the machine it runs on.