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)
- Dedicated Chat context (
chat-http) gated by HTTP connection setup - OpenAI-compatible HTTP provider and Debug provider
- Streaming assistant responses (SSE)
![]() |
![]() |
|---|---|
![]() |
![]() |
- 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 (chat-http) |
OpenAI-compatible HTTP | SpecOps Settings → Chats → Providers |
- 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 a local OpenCode sidecar for that directory (default port
4096). You can disable this via Settings → Workspaces → OpenCode → Use OpenCode for workspace agents to use the folder as a plain editor without agents. - 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, then pick an agent, provider, and model from the OpenCode catalog in the workspace agent composer.
- Use the Agents sidebar: create an agent tab, send a prompt. Tool calls, permission prompts, and question prompts appear in the chat panel.
Sidecar (default) — SpecOps launches OpenCode when you open a workspace (when OpenCode is enabled). 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 Chats → Providers. - Legacy workspace chat — Threads from the pre–phase-3 HTTP workspace provider are not migrated into OpenCode sessions.
More detail: docs/providers.md (Chat HTTP vs workspace), 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.



