rune-terminal is a clean-room rethinking of a programmer's workstation —
a modern terminal, a dual-pane file manager, an AI surface and a plugin
system, built on a new architectural center:
Taurias the desktop shell and packaging layerGoas the primary runtime, backend and orchestration coreReact + TypeScriptas the frontend workspace UIRustonly for the Tauri shell boundary
Short names used across the repository:
- product name: rune terminal
- short name / binary:
rterm - Go module:
github.com/Mesteriis/rune-terminal
The rewrite is intentionally not a fork-shaped refactor. It takes the product ideas that matter from earlier projects and rebuilds them on a cleaner runtime, transport and state model.
Pre-release. No
1.0.0has been cut and the repository is not running a main-ready / release-train workflow yet. The Go core is the most stable layer; the frontend (frontend/src/) is being rewritten and new widgets are added continuously. Seedocs/workflow/roadmap.mdanddocs/workflow/known-limitations.mdfor the current state.
rune-terminal exists with respect for the lineage it grew out of:
- Wave Terminal introduced strong product ideas — terminal + workspace composition, block-oriented workflows, local and remote session integration, AI as a first-class direction.
- TideTerm explored those ideas further in a real fork and made the trade-offs much more visible in practice.
Relevant historical repositories:
- Wave Terminal:
https://github.com/wavetermdev/waveterm - TideTerm:
https://github.com/sanshao85/tideterm
Additional contemporary reference:
- Warp:
https://www.warp.dev/
Warp is a product reference for selected terminal interaction patterns and remote agent-management workflows. It is not a lineage source and should not turn the project back into a parity exercise.
rune-terminal is not a denial of either project. It is a deliberate
next step: keep the good ideas, drop the architectural habits that were
becoming too expensive to evolve.
- product semantics should not be trapped inside transport plumbing
- terminal runtime, workspace state, tool execution and policy need clear boundaries
- AI features need a stable platform, not an ever-growing command bucket
- security, approvals, trusted allowlists, ignore rules and audit cannot be bolted on later
- a modern desktop shell should be lighter and cleaner than the previous Electron-based stack
A terminal-centered workspace platform with:
- long-lived terminal and workspace primitives
- local-first runtime semantics with room for remote session models
- policy-aware AI tooling from day one
- explicit trust and secret-protection controls
- a codebase that can evolve without collapsing into monolithic transport and handler layers
- Core truth lives in the backend. Terminal, workspace, policy and tool execution semantics belong in the Go core.
- Transport is an adapter, not the product model. HTTP, SSE and Tauri integration expose the platform; they do not define it.
- Security is part of the foundation. Capabilities, approvals, trusted rules, ignore rules and audit are baseline features.
- Small modules beat central buckets. Avoid giant files, giant registries and giant handler surfaces.
- AI consumes the platform, it does not own it. Tools, policy and runtime contracts must stay stable outside of any single AI integration.
- Local-first, remote-ready. Start with clean local semantics, then extend to SSH and other runtime targets without changing the model.
- Architecture decisions must be explicit. Important trade-offs live in ADRs, not in unspoken code drift.
apps/desktop/— Tauri shell and native app hostcmd/rterm-core/— Go entrypoint for the runtime processcore/— domain / runtime modules (workspace, terminal, tool runtime, policy, audit, transport, plugins, agent, conversation, execution)frontend/— React + TypeScript UI source (frontend/src/is the active tree; earlier drafts underfrontend/app/*orfrontend/rterm-api/*are gone)plugins/— reference plugins for therterm.plugin.v1protocolinternal/ids/— crypto/rand ID and token helpersscripts/— developer wrappers (build, run, guards)docs/— architecture docs, ADRs, workflow notes and validationfrontend/docs/— frontend-local docs (evolves with the rewrite)
Required toolchain:
- Go
1.26+ - Node
24+ - npm
11+ - Rust stable with
cargo
Desktop runtime requirements:
- macOS: Xcode Command Line Tools (
xcode-select --install) - Linux: the normal Tauri / WebKitGTK desktop prerequisites for your distro
Launch note:
- This repository uses the local npm Tauri CLI from
@tauri-apps/cli. cargo tauriis not required and is not the supported dev entrypoint.- The supported command is
npm run tauri:dev.
scripts/go.sh resolves the Go binary without assuming a specific PATH.
Install dependencies and build the Go sidecar used by the Tauri shell:
npm install
npm --prefix frontend install
npm run build:coreLaunch the app:
npm run tauri:devOr use the Makefile wrapper:
make runWhat npm run tauri:dev does:
- fail-fast checks for
npm,cargo,curl, macOS CLT, local Tauri CLI, frontend deps and the built Go core binary - starts the frontend Vite dev server on
127.0.0.1:5173if it is not already running - launches the Tauri shell against
apps/desktop/src-tauri/tauri.conf.json
If you want to run the active frontend and backend outside Tauri, the supported split dev loop is:
make devWhat make dev does:
- starts the standalone Go core behind
airfor live rebuild/restart on Go source changes - starts the frontend with the normal Vite dev server / React refresh
- keeps both processes in one long-lived terminal session so browser smoke tests can reuse the same backend/frontend pair instead of restarting them between runs
If you want the split pieces separately, keep using:
make run-backend-watch
make run-frontendDefault local addresses:
- frontend:
http://127.0.0.1:5173 - backend API:
http://127.0.0.1:8090 - auth token shared by both targets:
runa-local-dev-token(historical default, safe to override) - backend-only task control token:
runa-local-dev-task-token(used by task worker control routes; not exposed to the frontend)
You can override those defaults via make variables when needed:
make LOCAL_BACKEND_PORT=8091 LOCAL_AUTH_TOKEN=my-dev-token run-backend-watch
make LOCAL_BACKEND_URL=http://127.0.0.1:8091 LOCAL_AUTH_TOKEN=my-dev-token run-frontend
make LOCAL_BACKEND_PORT=8091 LOCAL_AUTH_TOKEN=my-dev-token devIf you need to override task-worker control separately, set
LOCAL_TASK_CONTROL_TOKEN=... on make run-backend, make run-backend-watch,
or make dev.
The first make dev / make run-backend-watch run bootstraps a local
copy of air-verse/air into tmp/tools/air so it does not depend on a
global air binary in your PATH.
If npm run tauri:dev fails:
- Missing Go core binary:
npm run build:core- Missing local Tauri CLI or root dependencies:
npm install- Missing frontend dependencies:
npm --prefix frontend install- Missing Rust toolchain:
rustup toolchain install stable- Missing macOS Command Line Tools:
xcode-select --installSanity checks:
npm exec tauri -- --version
cargo --versionIf you were trying cargo tauri dev directly, switch to:
npm run tauri:devRun the full validation suite:
npm run validateIf you only need to rebuild the Go runtime binary used by the desktop shell before launching Tauri, run:
npm run build:coreValidation results are recorded under
docs/validation/.