Agendex indexes and explores plans and sessions produced by coding agents across your local machine, with optional cloud sync and collaboration features.
Agendex is a Bun workspaces monorepo:
packages/shared- shared domain logic, types, config, scanning, watcher, setup helpers, and daemon status helperspackages/app- OSS local app (@agendex/app) with the Hono API and OSS Vite clientpackages/web- shared React/web UI package consumed by the OSS and EE appspackages/ee- cloud/pro package (@agendex/ee) with Convex auth, subscriptions, sharing, comments, and EE dashboard flowspackages/cli- CLI (agendex-cli) for login, sync, daemon, and status workflowspackages/desktop- Electron app with an embedded local API and app-owned cloud sync worker
- Local plan indexing, full-text search, and automatic low-value plan hiding (empty files, code dumps, logs, prompt-only artifacts, and other non-plans)
- Live file watching, polling fallback, and WebSocket updates
- Offline-aware client that surfaces a backend-unreachable state and recovers automatically
- Agent and workspace filtering with read-only plan viewing
- Local API with token-based auth
- Adapter selection, rescanning, and custom plan source directories
- No Convex or Stripe required for local-only usage
- Convex-backed auth and cloud dashboard flows
- Cloud sync via CLI or daemon, with hash-based skip for unchanged plans, real-time upload queue with retries, and automatic low-value pruning on the cloud side
- Shareable plan links, comment threads, tags, collections, and plan history
- Workspace members, daemon status/cleanup, and collaboration features
- Dashboard plan creation, uploads, and editing
- Pro Plannotator sync and daemon-mediated request-changes write-back
- Trial and subscription flows
The Electron app starts its cloud sync worker automatically after desktop sign-in when no CLI daemon is already running. The worker uses the encrypted desktop session, requires no separate CLI login, and stops with the Electron application. Existing CLI daemons remain independently owned and are never stopped by desktop logout or shutdown.
Agendex currently has 20 implemented adapters. Nineteen use durable plan artifacts or explicit Plan-mode session state; Continue is retained as an experimental session adapter:
antigravityclaude-codecodebuddycodexcursordroidgemini-cligithub-copilotgrokjuniekilokimi-clikiro-climuxopencodeoh-my-opencodeplannotatorqwen-codewindsurfcontinue(experimental; requires explicit Plan-mode evidence)
plannotator is implemented but not default-enabled in the OSS local app. CLI sync and daemon workflows auto-enable it when a cloud login target is configured; set AGENDEX_PLANNOTATOR_SYNC=0 to opt out or AGENDEX_PLANNOTATOR_SYNC=1 to force it on.
Unsupported catalog entries are retained for ecosystem tracking but are hidden from adapter selection and cannot be enabled. Stock OpenCode session plans and Oh My OpenCode Markdown plans are separate adapters.
File adapters honor the agents' documented roots and these optional path-list overrides (use the
platform path delimiter): AGENDEX_ANTIGRAVITY_PLAN_DIRS, AGENDEX_CODEBUDDY_PLAN_DIRS,
AGENDEX_DROID_PLAN_DIRS, AGENDEX_GEMINI_CLI_PLAN_DIRS,
AGENDEX_GITHUB_COPILOT_PLAN_DIRS, AGENDEX_JUNIE_PLAN_DIRS, AGENDEX_KILO_PLAN_DIRS,
AGENDEX_KIMI_CODE_PLAN_DIRS, AGENDEX_KIRO_PLAN_DIRS, AGENDEX_MUX_PLAN_DIRS,
AGENDEX_QWEN_CODE_PLAN_DIRS, and AGENDEX_WINDSURF_PLAN_DIRS.
Agents with transient or hook-only plans can send their hook JSON payload to the durable local spool:
agendex capture-plan --agent antigravity < hook-payload.jsonThe capture command accepts antigravity, augment, command-code, gemini-cli, and iflow-cli.
It copies only explicit plan fields or known plan paths into ~/.agendex/plans/hooks/; it never imports
the transcript path from a hook payload.
Install the published CLI with the one-line installer:
# macOS / Linux
curl -fsSL https://agendex.dev/install.sh | bash# Windows (PowerShell)
irm https://agendex.dev/install.ps1 | iexThen authenticate, choose which agents to index, and start syncing:
agendex login
agendex configure
agendex startYou can also install directly with npm install -g agendex-cli, pnpm add -g agendex-cli, yarn global add agendex-cli, or bun install -g agendex-cli. Installer flags are documented in packages/cli/README.md.
bun installRun these in separate terminals:
# OSS API server (http://localhost:4890)
bun run dev
# OSS Vite client (http://localhost:5173)
bun run dev:client:ossOn server startup, Agendex prints a local auth token. Paste that token into the login modal in the web app.
On first server startup, Agendex prompts for enabled adapters and stores the result in the shared config file (see Configuration and Environment for prod vs dev paths).
In non-interactive environments, Agendex auto-enables default adapters.
Re-open adapter selection:
bun run dev -- --configure-adapters
bun run --cwd ./packages/app start -- --configure-adaptersAgendex also scans:
- User-created fallback plans in
<config-dir>/plans/ - Project-local plan directories discovered as
.sisyphus/plansand@plans - User-configured custom plan directories
Manage custom directories from the local app's plan sources dialog, the local API, or the CLI:
bun run cli -- add-dir ~/path/to/plans
bun run cli -- add-dir ~/path/to/plans --live
bun run cli -- list-dirs
bun run cli -- remove-dir ~/path/to/plans--live notifies a running local server so it scans and watches the new directory immediately.
From repo root:
bun run dev # run OSS API server (@agendex/app) on :4890
bun run dev:client:oss # run OSS client on :5173
bun run dev:client:ee # run EE client on :5174
bun run build # build OSS client bundle
bun run build:cloud # build EE client bundle
bun run desktop:dev # run Electron with renderer HMR
bun run desktop:build # build the EE client and Electron bundles
bun run desktop:dist:win # build an unsigned Windows package
bun run cli:start # start cloud sync daemon
bun run cli:login # browser login using https://app.agendex.dev
bun run cli:login --url https://example.com
bun run cli:login --dev # login using dev config dir (~/.agendex-dev) + dev default site URL
bun run cli:open # open the Agendex web app in your default browser
bun run cli:open --url https://example.com
bun run cli:view https://app.agendex.dev/shared/<token>
bun run cli:logout # clear stored cloud token
bun run cli:configure # select which agents/adapters to index
bun run cli:hooks -- status # show Claude Code, Codex, and Pi hook status
bun run cli:hooks -- install <agent|all> # install hook integration (claude-code requires --preview)
bun run cli:hooks -- uninstall <agent|all> # remove managed Agendex hook entries
bun run cli:review-plan --hook --agent <agent> # hook-native plan review entrypoint
bun run cli:sync # one-shot cloud sync
bun run cli:sync --force # re-sync all plans, ignoring cache
bun run cli:upload ~/path/to/plan.md # upload a single Markdown plan to the cloud
bun run cli:upload ~/path/to/plan.md --agent codex # override the plan's agent label
bun run cli:upload ~/path/to/plan.md --open # upload and open the plan in the browser
bun run cli:stop # stop daemon
bun run cli:cleanup # interactively remove cloud daemon records
bun run cli:cleanup --stale
bun run cli:status # print current local/cloud config state
bun run cli:upgrade # upgrade the globally installed CLI
# Append `--dev` to any `cli:*` script to use ~/.agendex-dev (see packages/cli README)
bun run changeset # create a release note for agendex-cli
bun run version-packages # apply pending Changesets versions
bun run build:cli:release # generate packages/cli/.release
bun run pack:cli:dry-run # inspect the generated npm tarball
bun run smoke:cli:release # smoke-test the packed CLI under Node
bun run fmt # oxfmt
bun run fmt:check
bun run lint
bun run lint:fix
bun run check
bun run check:fixThe published CLI is Node-compatible and can be installed with curl -fsSL https://agendex.dev/install.sh | bash or directly with npm, pnpm, yarn, or bun. The default agendex login target is https://app.agendex.dev. For self-hosted logins, use agendex login --url <site> or bun run cli:login -- --url <site>. For a separate dev config directory and dev default login URL, use agendex --dev ... or AGENDEX_DEV=1 (documented in packages/cli/README.md).
Server routes are under /api/v1 and require Authorization: Bearer <token>.
Key endpoints:
GET /api/v1/healthGET /api/v1/plansGET /api/v1/plans/:idGET /api/v1/plans/:id/rawGET /api/v1/agentsPOST /api/v1/rescanGET /api/v1/plan-sourcesPOST /api/v1/plan-sourceswith{ "path": "/path/to/plans" }DELETE /api/v1/plan-sourceswith{ "path": "/path/to/plans" }PUT /api/v1/plans/:id-> returns403in OSS (Cloud Pro only)POST /api/v1/plans-> returns403in OSS (Cloud Pro only)
WebSocket updates:
GET /api/v1/ws?token=<token>
Local config (from @agendex/shared, used by the OSS API and the CLI):
- Prod (default):
~/.agendex/config.json - Dev:
~/.agendex-dev/config.jsonwhenAGENDEX_DEV=1is set in the process environment (the CLI also accepts a--devflag; seepackages/cli/README.md) - Override:
AGENDEX_CONFIG_DIR=/custom/path
The same config directory also contains CLI/runtime files such as daemon.pid, sync-cache.json, plannotator-writebacks-delivered.json, and the plans/ fallback directory.
Config fields:
token(local API auth token)cloudTokenandconvexUrl(after CLI login)deviceId(cloud daemon identity)enabledAdapterscustomPlanDirs
Common environment variables:
- OSS app:
PORT(default4890)AGENDEX_TOKEN(override generated local token)AGENDEX_DEV=1(use~/.agendex-dev/for shared config; align withagendex --devwhen running both server and CLI)AGENDEX_CONFIG_DIR(override the config directory)VITE_ALLOWED_HOSTS(comma-separated extra Vite allowed hosts)
- CLI (see
packages/cli/README.mdfor full list):AGENDEX_DEV=1oragendex --dev- dev config directory and dev default login URLAGENDEX_CONFIG_DIR- override the config directoryAGENDEX_SITE_URL- override login andagendex opensite URLAGENDEX_DISABLE_BROWSER=1- skip launching the browser forloginandopen(URL is still printed)AGENDEX_TOKEN- override local token read from configAGENDEX_PLANNOTATOR_SYNC=0|1- disable or force Plannotator sync/write-back pollingAGENDEX_LIVE_SESSION_POLL_MS- Plannotator live-session poll interval (daemon;0disables)AGENDEX_SYNC_RESCAN_INTERVAL_MS- safety-net rescan interval (daemon;0disables)AGENDEX_WATCHER_REFRESH_INTERVAL_MS- watch-path rediscovery interval (daemon;0disables)AGENDEX_DISABLE_LOCAL_IP=1- omit local IP from sync provenance metadata
- EE client:
VITE_CONVEX_URLVITE_CONVEX_SITE_URL- optional
VITE_APP_URL
- EE backend/auth:
SITE_URLCONVEX_SITE_URLGITHUB_CLIENT_IDGITHUB_CLIENT_SECRETBETTER_AUTH_SECRET
- EE billing:
STRIPE_SECRET_KEYSTRIPE_WEBHOOK_SECRETSTRIPE_MONTHLY_PRICE_IDSTRIPE_YEARLY_PRICE_ID
The local EE stack uses three processes:
# terminal 1 (from packages/ee)
npx convex dev
# terminal 2 (from repo root)
bun run dev
# terminal 3 (from repo root)
bun run dev:client:eeThis gives you:
- OSS API on
http://localhost:4890 - EE Vite client on
http://localhost:5174 /apirequests from the EE client proxied to the OSS API on:4890
For self-hosting, auth setup, and maintainer-level EE billing notes, see docs/self-hosting.md.
- All code except
packages/ee/is licensed under AGPL-3.0. - Code in
packages/ee/is licensed under the Agendex Enterprise License (source-available for evaluation and development; production use requires Cloud Pro).