Building text and markdown files editor with support of workspace AI. Tech: Tauri and SvelteKit.
- Notepad with syntax highlighting for .md and code files
- Markdown viewer and editor
- Folders as workspaces
- Project panel — file tree (all files), drag-and-drop move, context menu (new/rename/delete), live refresh, open in tabs, show/hide hidden files
- Themes
- Multi-Window
- Images preview
- Console — resizable bottom panel with Logs
- AI chat
- Workspace agents powered by OpenCode (tools, permissions, streaming) — the recommended AI story
- Chat (beta) — experimental HTTP chat context, disabled by default; enable in Settings → Dev → Chat (beta). See
docs/beta/for setup.
![]() |
![]() |
|---|---|
![]() |
![]() |
- UI / UX improvements
- Git module
- Extended AI Support
Workspace folders use OpenCode as the agent runtime. SpecOps is the UI; OpenCode runs the model, tools, and session logic on disk.
| Context | Runtime | Where to configure models/API keys |
|---|---|---|
Workspace agents (ws-*) |
OpenCode server | OpenCode (/connect, opencode.json, auth.json) |
Chat (beta) — chat-http |
OpenAI-compatible HTTP (experimental, off by default) | Settings → Dev → Chat (beta) → Providers; see docs/beta/chat-http-providers.md |
- Install OpenCode (development builds expect
opencodeon yourPATH; release builds bundle a sidecar binary):curl -fsSL https://opencode.ai/install | bash - Open a workspace folder in SpecOps (activity rail → add folder).
- By default, SpecOps starts the OpenCode sidecar lazily — not on folder open, but on the first Send in a session tab (or via Settings → Workspaces → OpenCode → Check connection). File editing does not require OpenCode. You can disable this via Settings → Workspaces → OpenCode → Use OpenCode for workspace sessions to use the folder as a plain editor without sessions.
- When enabled, health is shown under Settings → Workspaces → OpenCode.
- Configure a provider in OpenCode (see below) — workspace agents do not use the HTTP connections in SpecOps settings.
- In SpecOps, click Refresh model list (Settings → Workspaces → OpenCode), then pick an agent, provider, and model from the OpenCode catalog in the session composer.
- Use the Sessions sidebar: create a session tab, send a prompt. Tool calls, permission prompts, and question prompts appear in the chat panel.
Sidecar (default) — SpecOps launches the OpenCode sidecar on the first session Send (or via Settings → Workspaces → OpenCode → Check connection), not when the workspace opens. The sidecar process and port (4096 by default) are reused across workspaces until you toggle OpenCode off or stop it. No extra setup unless you set OPENCODE_SERVER_PASSWORD on the server (enter the same value under Server password in settings).
URL — Run OpenCode yourself, for example:
cd /path/to/your/project
opencode serveThen in SpecOps: Settings → Workspaces → OpenCode → URL, set the base URL (for example http://127.0.0.1:4096), and use Check connection.
API keys and model catalogs for workspace agents live in OpenCode, not in SpecOps settings.json. After you connect a provider, use Refresh model list in SpecOps so the composer picks up models from the running server.
Configure providers once with the OpenCode CLI (auth is shared with the sidecar SpecOps starts):
cd /path/to/your/project
opencode- Create an API key at openrouter.ai/keys.
- In the OpenCode TUI, run
/connect, choose OpenRouter, and paste the key. - Run
/modelsand select a model (many OpenRouter models are preloaded).
Alternatively, set the key in ~/.local/share/opencode/auth.json:
{
"openrouter": {
"type": "api",
"key": "sk-or-your-key-here"
}
}Optional: pin or add models in opencode.json (project root or OpenCode config path):
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"openrouter": {
"models": {
"anthropic/claude-sonnet-4": {},
"google/gemini-2.5-flash": {}
}
}
}
}See OpenRouter + OpenCode and OpenCode providers for model IDs and routing options.
- Get an API key from the Z.AI API Console (see Z.AI docs for your plan).
- Authenticate OpenCode — use either
/connectin the TUI or:Search for Z.AI and choose Z.AI Coding Plan (not the generic Z.AI provider; they use different endpoints and model IDs).opencode auth login
- Enter your API key, then run
/modelsand pick a model such as GLM-4.7.
Details: Z.AI + OpenCode, OpenCode providers — Z.AI.
- Health not “Healthy” — Confirm
opencodeis installed (which opencode) or use URL mode against a runningopencode serve. - Empty model list — Connect a provider in OpenCode first, then Refresh model list in SpecOps settings.
- Auth errors — Re-run
/connector fixauth.json; workspace sends never read HTTP keys from SpecOps Dev → Providers. - Legacy workspace chat — Threads from the pre–phase-3 HTTP workspace provider are not migrated into OpenCode sessions.
- Chat (beta) / HTTP chat context — Experimental. Disabled by default; see
docs/beta/chat-http-providers.md. Enable under Settings → Dev → Chat (beta).
More detail: docs/opencode-integration.md (OpenCode), docs/beta/chat-http-providers.md (HTTP chat beta), specs/ops/phase-3/phase-3.md.
From the app/ directory:
npm install
npm run tauri devThis starts the Vite dev server and opens the desktop app. Type-check the frontend with:
npm run checkFrom the app/ directory:
npm testRun tests in watch mode while developing:
npm run test:watchTests live next to source as *.test.ts files under app/src/. Rust backend tests run from app/src-tauri/:
cargo testIf port 1430 is already in use (Vite is pinned to that port), free it and retry:
kill "$(lsof -t -iTCP:1430 -sTCP:LISTEN)"
npm run tauri devFrom the app/ directory:
npm install
npm run tauri buildInstallers and bundles are written to app/src-tauri/target/release/bundle/.
Pushing a semver tag (for example v1.0.0) triggers the Release workflow. It builds macOS (universal binary) and Windows installers and publishes them as assets on the GitHub release for that tag.



