-
Notifications
You must be signed in to change notification settings - Fork 1
roadmap
Forward plan for eVi. Shipped work lives in CHANGELOG.md + project
memory; this file is what's next and why. Items carry a rough size
(S = an afternoon, M = a day, L = a phase) and a one-line rationale.
- Vendor-SDK feature parity ideas → SDK coverage + borrowable features
- Third-party app/service integrations → Future integrations — backlog
- Release mechanics → Releasing
Last rewritten 2026-06-06 (post-Phase-48). Supersedes the old v0.11.0-era backlog — most of those "next phase candidates" have since shipped.
The old roadmap's headline candidates are done: self-update (evi update,
P29), citations + local rerank (P30), evi review (P31), conversation grep
(P32), plus memory/MCP/skills/scheduler/multi-backend/hooks/worktrees/dream/
voice(STT+TTS)/vision/OCR/PDF/SQLite/calendar/routing/auth, the FastAPI+SSE web
UI, and the standalone Tauri desktop bundle (onedir sidecar + "no LLM backend"
UX, P48). CI is green; the desktop-release pipeline exists.
So the backlog below is genuinely forward-looking.
This is a proposed order, weighted toward finishing the distribution story (so new users have a smooth install → first-chat → stay-updated path) before expanding surface area.
Make dependency vulnerabilities visible and gated in CI.
-
pip-audit(OSV-backed) CI job for the Python deps. -
cargo-deny check advisories(RustSec) for the desktop crate. -
.github/dependabot.ymlfor pip + cargo + github-actions (weekly, grouped, Conventional-Commit prefixes). - Enable GitHub-native Dependabot alerts + security updates (free on
private repos). NOTE: CodeQL code-scanning and secret-scanning are not
free on private repos (need paid GitHub Advanced Security) — deferred; a
self-hosted
gitleaks/CodeQL-CLI step is a possible later add.
A fresh user has no LLM backend → today they hit the "no backend" banner. Decision (from research): do NOT bundle a runtime — the multi-GB model download is the real blocker, bundling balloons the installer 5–10×, and eVi is already built around Ollama. Instead:
- True one-click Ollama install in
/api/backend/start(winget / silent installer on Windows, cask/dmg on macOS, officialinstall.shon Linux) → existing auto-serve→ existingpull_modelSSE progress. -
First-run wizard: detect hardware via
recommend(hw), auto-pull a small sensible default (qwen2.5:3b-instruct-q4_K_M, ~1.9 GB — best local tool-calling at that size), "running on CPU (slow)" hint, "upgrade to 7B later" as a secondary action. Chat unblocks the moment the pull finishes. -
vLLM: excluded for first-run (GPU/CUDA/Linux server-grade; not a desktop
fit). It already works as a remote OpenAI endpoint via the generic
openai_compatbackend — no work needed. - (If we ever do bundle: ship llama.cpp's
llama-serverVulkan build — small, clean MIT, one binary for cross-vendor GPU + CPU; avoid the 373 MB CUDA pack and Ollama's redistribution notice debt.)
The CLI/pip path already self-updates (evi update → PyPI). The desktop
app (not pip-installed) needs its own updater pointed at the
desktop-release.yml GitHub releases we now build.
- Adopt Tauri 2's
@tauri-apps/plugin-updater+tauri-plugin-process: checks a release endpoint, downloads, verifies, relaunches. - Requires an updater signing keypair (Tauri minisign — free, separate
from OS code-signing).
desktop-release.ymlgains the signing step + alatest.jsonmanifest attached to releases. - Pairs with — but does not require — OS code-signing (Authenticode / Apple Developer ID) to silence SmartScreen/Gatekeeper. Code-signing needs paid certs → track separately; the updater works unsigned-by-OS today.
Opt-in, privacy-first telemetry so we learn about crashes.
-
sentry-sdkbehind a thinReporterabstraction (swappable backend via one DSN/config value), pointed at self-hosted GlitchTip (OSS, Sentry-API-compatible) — or hosted Sentry free tier for zero-infra start. - Hooks: CLI
sys.excepthook, FastAPI exception handler, Tauri Rust panic handler (+ communitytauri-plugin-sentry); the frozen sidecar reuses the CLI path. -
Opt-in (default OFF) config flag + env override; a shared scrubber
(
before_send) that strips home/user paths, env (allowlist only), API keys, hostnames, and — critically for an AI app — prompt/exception content + frame locals. - "Open a GitHub issue on crash" stays a documented Plan B behind the same interface — only viable via a token-holding serverless relay (no shippable token), and re-implements dedup/rate-limit/scrub that Sentry gives free.
A Claude-Desktop-style control surface (the "UI enhancements" detour).
-
Settings screen (⚙ / Ctrl+, / File→Settings) backed by
GET/POST /api/config(masked secrets; section-patch that hot-reloads live sessions). - Native menus (File/Edit/View/Help + accelerators, dev tools) and system tray with minimize-to-tray; force-update via Help→Check for Updates.
-
In-app docs (
/api/docs+ dependency-freemdlite.py, bundled offline) and diagnostics (/api/doctor); light theme toggle. - Public docs wiki mirror on
evi-assistant/evi-ai; Playwright e2e for the lot.
- ✅ MCP-server-publish — shipped (0.24.0, Phases 53–54):
evi mcp serveexposes eVi's tools (memory/index/calendar/git by default) + memory resources + command prompts as an MCP server for Claude Desktop / Cursor / Cline / Continue. Transports: stdio + streamable HTTP (--http, bearer--token); per-tool allow-list (--tools). Remaining nice-to-haves: an OAuth flow for HTTP (vs static token), and exposing index/calendar data as resources too. - ✅ Responses API — shipped as opt-in (0.24.0, Phase 55), NOT a
migration:
[llm] api = "responses"(default"chat") routes the agent loop through OpenAI's Responses API for endpoints that support it, via a stream adapter that keeps the loop unchanged. Local backends stay on Chat Completions. Remaining: verify against a live Responses endpoint; extend the compaction/variant helpers (still chat-only — fine for OpenAI cloud). - ✅ Cross-machine sync of
~/.evi/— shipped (0.26.0, Phase 57):evi sync init/push/pull/statusover a git remote. Syncs memory/skills/profiles/commands/routes/mcp/hooks; a managed.gitignorekeeps per-machine config, secrets, and large/rebuildable data local. - ✅
evi recipe— shipped (0.26.0, Phase 58): saved multi-turn workflows under~/.evi/recipes/*.toml, run through one shared conversation (evi recipe new/list/show/run,--yesfor unattended). - ✅ Memory tags — shipped (0.26.0, Phase 59): tags +
recall_by_tag(invisible marker, backward-compatible with untagged memories). - ✅ Background tool execution — shipped (0.26.0, Phase 60): ToolProgress
heartbeats for slow tools (CLI + web) instead of an apparent hang;
long=Truetools announce immediately. - ✅ Parallel multi-agent research — shipped (0.27.0, Phase 61):
parallel_research(tasks)fans out up to 6 read-only Explore subagents concurrently and combines their findings (run_subagents_parallel). - ✅ Claude-Code-style slash commands — shipped (0.27.0, Phase 62):
~/.evi/commands/*.mdnow support frontmatter (description/argument-hint/ model),$ARGUMENTS+ positional$1..$9,@filerefs, and subdir namespacing (/git:commit). See Slash commands. -
Plugin loader (
~/.evi/plugins/) — M; drop-in user tools.
- Fixed File→Settings (and all native-menu→webview actions): the Rust bridge now
evalswindow.eviUI.handleMenu(id)directly instead of emitting an event the remote page wasn't listening for. - Settings → Model & Backend: a System panel (OS, GPU, VRAM, RAM,
driver/CUDA cc, inference mode) via
/api/system, plus the hardware-recommended model with an Ollama Pull button + progress bar. - Help → Check for Updates shows clear states (checking / up to date / downloading).
A header segmented control (à la Claude Desktop) that gates a session's tool
set: Chat (memory + skills), Cowork (+ files/web/calendar/images/pdf),
Code (+ code/shell/git/subagents). Hot-swaps the live agent's tools; the
choice persists and follows tab switches. evi/modes.py + /api/modes +
/api/session/{id}/mode.
- Multi-user web mode — per-user auth/paths/permissions for small teams.
- Federation / inter-agent protocol — eVi-to-eVi delegation across machines (pairs with profiles + remote backend).
- Smaller: long-context model awareness in the registry;
/recentprompt history in the REPL.
A pass over the Claude Code docs surfaced these gaps; all eight shipped in 0.29.0 (see CHANGELOG for details). Each was a genuine net-new capability (eVi already had the agentic loop, subagents + parallel research, MCP client/publish, hooks, scheduler, skills, memory + tags, worktrees, routing, guardrails, vuln scanning, voice, computer-use, custom commands, recipes, and session modes).
-
Phase 64 — File checkpointing + rewind — M. Snapshot files before each
tool edit;
/rewind(CLI + web) restores files and/or the conversation to a prior point. eVi has conversation edit/branch/reroll but no file-state undo — the biggest safety gap vs Claude Code's checkpointing. -
Phase 65 — Headless / print mode — M.
evi -p "prompt" [--output-format json|text] [--mode code]for one-shot scripted/CI/cron use, reusing the agent loop. JSON envelope = final text + tool trace + usage. The foundation for any eVi automation story (and a thin SDK later). -
Phase 66 — Granular permissions + permission modes — M. Beyond
category auto-approve: modes (ask / accept-edits / plan / yolo) and rule-based
allow/deny (per tool, per path glob, per shell-command prefix, per domain),
with a
/permissionsview in Settings. - Phase 67 — Sandboxed shell — M/L. Run the shell/code-exec tools in a sandbox (read-only FS outside the project, no network) by default, opt-out per call. OS-specific (bubblewrap/seccomp · sandbox-exec · restricted job object). Hardens the riskiest tool.
-
Phase 68 — Plugins + local marketplace — L (supersedes the pending
"plugin loader"). A plugin bundles commands + skills + hooks + subagent
profiles + optional MCP servers;
evi plugin add <git-url|dir>+ a manifest + a curated index. Subsumes much of the integrations backlog. -
Phase 69 — Output styles — S/M. Switchable response personas (concise /
explanatory / teacher / reviewer) layered on the system prompt, independent of
the Chat/Cowork/Code tool modes.
~/.evi/styles/*.md+ a picker. -
Phase 70 — Multi-agent code review — M. Upgrade
evi reviewto fan out parallel reviewers (correctness / security / perf / tests) via the newrun_subagents_parallel, then synthesize — a local take on Claude Code's multi-agent review. -
Phase 71 — Session resume / fork (CLI) — S/M.
evi --continue,evi --resume <id>,evi --fork <id>off the transcript store; list saved sessions in the web tab bar. Completes session management.
✅ Shipped in 0.30.0: customizable status line (Phase 72 — format
template or custom command in the CLI REPL); routines/triggers (Phase 73 —
POST /api/routine/<token> runs a recipe headless); project-level config
(Phase 74 — repo-local .evi.toml overlay + AGENTS.md recognition).
Still open: plugin component types beyond commands (skills/hooks/MCP/subagent profiles in a plugin) and the integrations backlog below.
Explicitly not adopting (philosophy mismatch): cloud/enterprise backends (Bedrock/Vertex/Foundry), org admin / managed settings, cloud Ultrareview / Ultraplan, S3/Redis session storage, usage analytics dashboards, and the agentic browser (already deferred in favour of MCP browser servers). A full public Agent SDK is deferred too — headless mode (Phase 65) covers the automation need without committing to a stable library surface.
Releases are paused on a GitHub Actions billing block; these are building locally and ship once that clears.
- Phase 79 — in-app update progress toast — ✅ shipped (local): the silent auto-updater now shows a progress toast (downloading % → installing).
-
Phase 80 — full plugin components — ✅ shipped (local): plugins now
bundle hooks (
hooks.toml) and MCP servers (mcp.json, namespaced<plugin>:<name>) on top of commands + skills. Subagent profiles in plugins remain the one planned component type (code-defined dict — a larger change). -
Phase 81 — HTTP hooks — ✅ shipped (local): a hook can POST its event
to a
urlinstead of spawning a command; non-2xx vetoes a before-hook. -
Phase 82 — keybindings — ✅ shipped (local):
~/.evi/keybindings.tomlmaps a key to a slash command in the REPL (press → run). -
Phase 83 — channels — ✅ shipped (local):
POST /api/session/{id}/channelinjects an external alert as a[channel:<source>]system note so the assistant sees it on its next turn (GETlists recent pushes for a UI badge). Routines cover inbound webhook→recipe; this is push-into-live. (live UI toast is a follow-up; the inject + history mechanism is complete.) -
Phase 84 — packaged CI action — ✅ shipped (local): a composite action
.github/actions/evi-runinstalls eVi, writes a backend config, and runs oneevi runheadless prompt (outputresult);evi-run-example.ymldemos it. -
Phase 85 — agent dispatch view — ✅ shipped (local): a 🗂 Dispatch
panel (and
GET /api/dispatch) lists every live session with its state (mode / messages / context / pending / channels) — click to open — plus the runnable workflows;POST /api/dispatch/workflow/{name}launches one server-side and shows the per-step output. -
Phase 86 — dynamic workflows — ✅ shipped (local):
~/.evi/workflows/<name>.tomlorchestrates multi-step, multi-agent runs — each step its own headless agent, contiguousparallel = truesteps run concurrently, and prompts interpolate earlier outputs/vars via{step_id}/{var}.evi workflow new/list/show/run(+ the dispatch panel). Engine is LLM-decoupled (run_stepcallable) so it's fully tested. -
Phase 87 — cross-device session handoff — ✅ shipped (local):
evi sessions handoff+POST /api/session/{id}/handoffreturn resume affordances; the web UI opens/?session=<id>. Sync (evi sync) the per-turn transcript, then resume on the other device (CLI or URL). -
Phase 88 — context-window visualization — ✅ shipped (local):
/context(/ctx) in the REPL and a click-the-chip popover in the web UI break tokens down by system / you / assistant / tools (/api/session/{id}/context). -
Phase 89 — OpenTelemetry / metrics — ✅ shipped (local): opt-in
[telemetry] traces/metrics+otlp_endpoint(orEVI_OTLP_ENDPOINT) export spans around tool calls + tool counters/durations via OTLP. No-op unless the[otel]extra is installed and an endpoint is set;evi/otel.pywraps_dispatch_run. Configurable in Settings → General (telemetry). -
Lighter/later items — ✅ shipped (local): subagent profiles in plugins
(
agents.toml+ thedelegatetool /evi agents) ·evi://deep links (evi/deeplinks.py, Taurievischeme,evi link) · plugin marketplace index (evi/marketplace.py,evi plugin search/install/index,[plugins] index_urls). -
Final small items — ✅ shipped (local): long-context awareness in the
model registry (
ModelRec.context_window+recommend.context_window_for(); surfaced inevi models infoand a nudge onevi models use) ·/recentREPL command (lists recent sessions). The roadmap is now fully cleared.
From a review of developers.openai.com + code.claude.com — the genuinely-new, local-friendly gaps — ✅ shipped (local):
-
Structured Outputs — JSON-Schema-constrained output (
/schema,evi run --schema,evi/structured.py) beyond/json. -
Batch mode —
evi batch <file>runs many prompts headless → JSONL (evi/batch.py); the local analog of the Batch API. -
Expanded hook lifecycle events —
user_prompt_submit(veto blocks the prompt),before_compact,stop, on top of before/after-tool. -
Evals harness —
evi evalruns prompt→assertion suites with a pass-rate (evi/evals.py); gates CI on failures.
Follow-on additions from the same review — ✅ shipped (local):
-
LLM-as-judge evals — a
judgerubric assertion graded by a model. -
Web structured outputs —
/api/chat output_schema(JSON-Schema constrained). -
Local
evi stats— usage/tool/session analytics from transcripts. -
Scheduled evals —
evi schedule add --eval <suite>(drift watch). -
Federation —
evi peer run/delegate_peertool /POST /api/federate: delegate a task to a trusted peer eVi (peers in~/.evi/peers.json;[federation] serveto answer). -
Fuller Responses API —
[llm] responses_toolsenables OpenAI hosted tools (web_search/code_interpreter/file_search) on the Responses path. -
Multi-user web (opt-in) —
[web] multi_user+~/.evi/users.json(evi web-config users …): per-user revocable tokens and isolated workspaces — each user's web sessions, transcripts, and memory live under~/.evi/users/<name>/(a ContextVar-scoped per-user session registry + per-user data roots; cross-user leakage is covered by a test).
-
Phase 90 — fine-tune from transcripts — ✅ shipped (local):
evi finetune exportturns stored sessions into a JSONL chat dataset (one conversation per line;--days/--session/--min-turns/--system/--include-tools). Training stays off-device — feed the JSONL to your trainer of choice. -
Phase 91 — voice engines / cloning — ✅ shipped (local, neural engines
unverified — heavyweight optional installs):
[voice] engineselects system / Coqui XTTS / F5-TTS / Piper (switchable in Settings → Voice +evi voice engines). Cloning engines take aclone_sampleWAV; all lazy-import and error cleanly if deps are absent. AutoSpeaker threads the engine through. -
Phase 92 — CodeQL / secret-scanning — ✅ shipped (local, untested until
CI billing clears):
security.ymlgained a gitleaks job (pinned binary +.gitleaks.tomlallowlist) and a CodeQL job (python + javascript,upload: false→ SARIF artifact, so no GHAS needed on the private repo). -
Phase 93 — Docker image push — ✅ shipped (local): new
docker.ymlbuilds the existing two-stageDockerfileand pushes to GHCR onv*tags (semver +latesttags, buildx + gha cache). -
Phase 94 — sigstore wheel signing — ✅ shipped (local):
release.ymlsigns the sdist + wheel with keyless sigstore after the PyPI upload and attaches the*.sigstore.jsonbundles to the GitHub Release (PyPI also gets PEP 740 attestations via Trusted Publishing).
A large, separately-tracked list (Home Assistant, Notion, Spotify, Slack, native GitHub tool, generic IMAP/SMTP email, RSS, weather, Wikipedia, YouTube transcripts, Todoist, …) lives in Future integrations — backlog. Many become trivial once MCP-server-publish lands (consume existing MCP servers instead of building each tool by hand).
- Agentic browser via Playwright — deprioritised in favour of MCP browser servers (big surface area).
- Fine-tune eVi from transcripts — niche; dream engine already curates.
- Voice cloning for AutoSpeaker (Bark/Tortoise/F5-TTS) — heavy deps + huge models.
- CodeQL / secret-scanning on the private repo — not free; revisit if the repo goes public or GHAS is purchased (or self-host gitleaks).
-
Docker image push in
release.yml; sigstore wheel signing (post-1.0).
Distribution polish (49→51) is the current focus: a new user should install,
get to first chat without a manual backend setup, and stay updated — all
without us hand-holding. After that, MCP-server-publish is the single
highest-leverage feature (it subsumes much of the integrations backlog).
Beyond that, gather real usage via transcripts + evi dream before piling on
more surface area.
Generated from docs/roadmap.md — edit there, not here.
Start here
Guides
- Architecture
- [[Agent SDK (
evi.sdk)|sdk]] - SDK coverage + borrowable features
- Multi-machine setup
- Self-update design (Phase 29 proposal)
- [[Self-build — developing and building eVi with eVi|self-build]]
- Development notes
- Releasing
- Desktop bundling
- Code signing policy
- Surface parity — CLI ↔ Web ↔ Desktop
- eVi vs Claude Code — feature comparison
- Future integrations — backlog
- Roadmap
Feature deep-dives
- eVi feature guides
- Agents & Orchestration
- Recipes, Routines, Scheduled tasks, Channels
- Evals & LLM-as-judge
- Content Guardrails
- Hooks (tool + lifecycle, command/url)
- MCP (client + serve)
- Memory & Context management
- Observability (OpenTelemetry, stats, crash reports)
- Permissions & Sandbox
- Plugins & Marketplace
- Sessions, Resume, Handoff, Checkpoints
- Skills
- Slash commands
- Structured Outputs & Batch
- Ultracode
- Voice (TTS engines, STT, AutoSpeaker)
- Web & Desktop (settings, multi-user, deep links, updater)