This project is almost entirely vibe-coded. Use at your own risk.
Mimir is an open source desktop terminal manager built with Go, Wails, Svelte, and xterm.js.
It focuses on local-first terminal workflows: local shells, SSH sessions, tmux-backed reconnects, command templates, notes, recordings, audit logs, and AI-assisted command workflows.
Mimir is pre-MVP software. Expect breaking changes while the terminal, SSH, recording, and update flows are hardened.
| Platform | Status | Notes |
|---|---|---|
| Windows 11 | Primary | Main development platform, most tested |
| Linux (Debian/Ubuntu) | Experimental | Builds and runs; WebKit2GTK quirks possible |
| macOS (Apple Silicon) | Experimental | CI-built; limited manual testing |
Other OS versions may build or run but are not validated. Treat unlisted platforms as unsupported.
- Multi-session terminal UI with split panes and folders
- Windows terminals via ConPTY, Linux via PTY
- SSH profiles with password/key authentication and jump hosts
- SSH host-key verification (TOFU)
- tmux-backed SSH reconnect with unique session isolation
- SFTP file browser for remote hosts
- Keyboard: Ctrl+Tab / Ctrl+Shift+Tab or Ctrl+Shift+←/→ switch panes, Ctrl+Shift+1…9 jump to the n-th terminal in the sidebar (restoring it if minimized; the sidebar shows the digit), Ctrl+Shift+M minimizes the active pane, Ctrl+Shift+O restores the last minimized one (Ctrl+Shift+U also works outside Linux, where GTK reserves it), Ctrl+Shift+T opens a new terminal, Ctrl+Shift+N toggles notes, Ctrl+Shift+P templates
- Terminal scrollback search (Ctrl+Shift+F)
- 58 built-in command templates with discovery-driven variables
- Workflow engine with playbooks, approval flow, and AI steps
- Workflow picker (Ctrl+Shift+W) for quick playbook execution
- AI integration (OpenAI, Ollama, Anthropic) with guardrails
- Local notes panel with markdown support
- Optional command history capture and search
- Terminal recording with scrubbed export and GIF generation
- Self-update with SHA256 verification and staged install
- Local audit/activity logs
- i18n (English, German)
Mimir is local-first by default.
- Command history is opt-in. History is parsed from an OSC control channel that is treated as untrusted: fields are length-capped and control characters are rejected to prevent history poisoning from terminal output.
- SSH RC injection is opt-in per profile and does not write to remote
~/.bashrc. - AI context is sanitized and can be excluded from prompts.
- tmux integration is a setting (Settings → tmux integration): invisible (default; tmux only keeps sessions alive, mouse/copy/links handled by Mimir), classic (tmux owns the mouse and copy-mode) or off for local terminals. Switching between invisible and classic is applied to running sessions immediately. SSH profiles keep their per-profile tmux switch.
- Copy and links in panes: drag to select; when a program such as Claude Code has taken over the mouse, hold Shift while dragging. The context menu offers "Copy as one line" for text a program wrapped itself (URLs, long commands). URLs are underlined on hover; Ctrl+click (Cmd on macOS) opens them in the browser, the context menu can open or copy them.
- Coding-agent awareness: when Claude Code or Codex runs in a pane, Mimir shows the agent and its state in the pane header and can open a side panel fed by the agent's own session file: the snippets of its last answer (exact text, no terminal line wrapping), the files it read or changed next to the git working-tree status, and the commands it ran with their exit codes. Detection can be turned off in Settings.
- Credentials (SSH passwords, AI API key) are stored in the OS keyring when available. Without a keyring, they are kept in an encrypted file protected by a master password (Argon2id) plus a per-machine identifier where the OS provides one, using envelope encryption. The master password is the primary protection; the machine identifier only adds friction against copied files. FIDO2/hardware-key unlock is supported as an additional key slot.
- Terminal recordings store raw output on disk. Keystroke (input) recording is off by default. Scrubbing is best-effort, pattern-based, and applied only on export — it cannot redact free-form secrets such as a typed password.
aggGIF export downloads are pinned and SHA256-verified.- Self-updates download from GitHub Releases, verify SHA256 checksums, stage the binary, and apply on restart. The running binary never modifies itself.
See SECURITY.md and docs/security-notes.md.
- Go 1.25.x
- Node.js 22+
- npm
- Wails CLI v2
Install Wails:
go install github.com/wailsapp/wails/v2/cmd/wails@latestLinux builds also need the Wails native dependencies. On Debian/Ubuntu:
sudo apt-get install libgtk-3-dev libwebkit2gtk-4.0-dev pkg-config build-essentialThe entire buildable application lives in app/. Run all build and test
commands from there.
cd mimir/app
go mod tidy
cd frontend
npm install
cd ..
wails devRun tests:
cd app
go test ./...
cd frontend
npm run buildLocal Windows + Linux release from PowerShell:
.\app\scripts\release-all.ps1 -Version 0.1.0 -UpdateRepository OWNER/REPOLinux:
./app/scripts/release-linux.sh 0.1.0 --update-repo=OWNER/REPOmacOS:
./app/scripts/release-macos.sh 0.1.0 --update-repo=OWNER/REPOArtifacts and checksums.txt are written to app/build/release/.
See docs/releasing.md.
The repository includes GitHub Actions for:
- CI on
mainand pull requests - Cross-platform release builds on tags matching
v* - Publishing release artifacts and checksums
To publish a release:
git tag v0.1.0
git push origin v0.1.0.
├── app/ # The buildable application (Go + Svelte + Wails)
│ ├── *.go # Wails backend (package main: App struct + bindings)
│ ├── terminal/ # Local and SSH terminal management
│ ├── ssh/ # SSH profiles, keys, known hosts, secrets
│ ├── template/ # Command templates
│ ├── workflow/ # Workflow engine, playbooks, approval
│ ├── update/ # Update checker, downloader, staging
│ ├── aiflow/ # AI tool-flow policy and context handling
│ ├── history/ # Optional command history
│ ├── recording/ # Asciicast recording and GIF export
│ ├── notes/ # Markdown notes storage
│ ├── folder/ # Terminal folder grouping
│ ├── safeio/ # Atomic file writes
│ ├── frontend/ # Svelte frontend
│ ├── templates/ # Built-in command templates (Wails assetdir)
│ ├── build/ # Wails build assets (icon, platform manifests)
│ ├── scripts/ # Local release scripts
│ ├── go.mod wails.json # Go module + Wails config
├── docs/ # Architecture, security, testing, release docs
├── .github/ # CI and release workflows
└── README.md LICENSE SECURITY.md CONTRIBUTING.md
Why is
package mainatapp/root and not split into subpackages? Wails v2 generates its JS bindings from theAppstruct inpackage mainand expects it alongsidewails.json. The backend files (app_*.go,ai*.go, …) are all methods on*App, so Go requires them in one directory.
MIT. See LICENSE.
0 comments
log in to comment.