smterm

agent
Security Audit
Fail
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 5 GitHub stars
Code Fail
  • process.env — Environment variable access in .claude/skills/run-smterm/driver.mjs
  • fs.rmSync — Destructive file system operation in electron/agent-hooks.test.ts
  • fs.rmSync — Destructive file system operation in electron/agent-meta.test.ts
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

Open-source, cross-platform terminal for agentic coding and running coding agents. An AI terminal alternative to Warp and tmux, with a live agents board, git diffs, and a file browser.

README.md

smterm

smterm

A minimal terminal for agentic coding, built to keep you in the loop (yes we love reading the code).

CI License: MIT Platforms

If smterm looks useful to you, a ⭐ helps other people find it.

smterm running four agent sessions in split panes, with the Agents board on the right

smterm is a fast, cross-platform terminal (tabs, split panes, real shells) for people who run
coding agents all day. It stays out of your way like a normal terminal, then adds a few panels
that show you what the agents are actually doing: git diffs, files, and a live agents board that
works with Claude Code. If you have looked for an open-source Warp alternative, or a tmux built
for coding agents, this is that.

  • 🔔 Notifications when a session needs you. Working, waiting for input, or done, shown as a
    dot on the tab and in the sidebar, plus a native OS notification when a background pane wants
    you. No more finding a finished agent an hour late.
  • 🔍 Changes panel. A git diff for the focused pane's working directory, so you can read
    what an agent just touched. Branch and ahead/behind show in the status bar.
  • 📁 Files browser. A lazy per-folder listing rooted at the focused pane's cwd, with git
    decorations (badges on changed files, tinted folders). Click a file to open it in your editor.
  • 🤖 Agents board. A live view of the Claude Code agents you launched inside smterm: the
    root session, its sub-agents, what each is doing, its cwd, and its recent files. Click one to
    jump to its pane.
  • 🪟 Real multiplexer. Tabs and resizable splits. Split a pane and it keeps your shell and
    directory. Quit and reopen and your layout comes back.
  • 🌐 SSH hosts in one click. The hosts in your ~/.ssh/config are listed in the sidebar.
    Click one for a terminal on it; splits and new terminals from that pane stay on the host. A
    dropped connection says so and reconnects on Enter.
  • 🖥️ Cross-platform. macOS, Linux, and Windows, with WSL as a first-class shell target.
  • ⌨️ Command palette (⌘K). New sessions, splits, theme switching, settings.
  • 🎨 Themes and fonts. Minimal Dark, Tokyo Night, Catppuccin, Gruvbox; bundled fonts and
    ligatures.

Install

macOS and Linux:

curl -fsSL https://raw.githubusercontent.com/vcmf/smterm/main/install.sh | sh

Windows (PowerShell):

irm https://raw.githubusercontent.com/vcmf/smterm/main/install.ps1 | iex

A closer look

Agents board showing sessions, sub-agents, status, and token usage Agents board. A live tree of the Claude Code agents you launched: each session, its sub-agents, what they are doing, and token usage. Click one to jump to its pane.
Notification bell with an unread badge in the top bar Notifications when a session needs you. A dot on the tab and a native OS notification the moment a background pane wants input or finishes.
Sidebar tree of sessions and panes with status dots Every session and pane at a glance. The sidebar tree shows each session, its panes, and a status dot: running, needs input, or idle.
Changes panel showing a git diff Changes panel. A live git diff for the focused pane's working directory, with per-file counts and the full unified diff.
Files browser with git decorations on changed files Files browser. A lazy per-folder listing rooted at the pane's cwd, with git decorations on changed files.
Inline file preview open over the terminal Open a file and read it. Click a file to open an inline preview and read what an agent wrote, without leaving the terminal.

Works with Claude Code

Run claude in any pane and the Agents board lights up: the root session, its sub-agents, what
each is doing, its working directory, and the files it touched. It reads Claude Code's own hook
events, so there is zero setup and no global config to edit; smterm only wires the panes it
launches. Agents started outside smterm do not show up.

Why I built this

I love the terminal, and the easiest way to put an agent like Claude Code to work is to launch
it from a CLI. But I also like reading the code an agent writes and making the edits myself, and
a plain terminal makes that hard: you lose track of which session needs you, and you never
really see what changed. smterm keeps the shell I already like and adds just enough to stay in
the loop: the Changes, Files, and Agents panels show what happened, not just that something did. It also behaves the same on macOS, Linux and WSL, which helps since
my work moves between all three.

Also

Beyond the headline features above:

  • Copy and paste, find in scrollback (Cmd/Ctrl+Shift + F)
  • Collapsible sidebar and a shell picker for new tabs
  • The Agents board needs zero setup: it is wired only for panes smterm spawns

Configuration

Settings live in a single JSON file that is the source of truth. Edit it by hand or through the
in-app settings panel; a live watcher re-applies changes as you save.

  • macOS and Linux: ~/.config/smterm/settings.json
  • Windows: %APPDATA%\smterm\settings.json
{
  "font": { "family": "JetBrains Mono", "size": 13, "ligatures": true, "lineHeight": 1.2 },
  "theme": "catppuccin", // minimal | tokyo-night | catppuccin | gruvbox
  "appearance": "system", // dark | light | system (follow the OS)
  "cursorBlink": true,
  "scrollback": 5000,
  "ssh": {
    "hidden": ["bastion"], // your own; the common git hosts are hidden on top
    "shown": [], // git hosts you brought back
    "pinned": ["native:gpu-box"], // kept in the sidebar
    "keepAliveSeconds": 30,
    "restore": "auto", // auto | on-focus
    "colors": { "prod-*": "red", "staging-*": "amber" }, // red | amber | blue | #rrggbb
  },
}

SSH hosts

smterm reads the hosts from your ~/.ssh/config (including Included files). Connect to
host…
(the sidebar's search icon, the palette, or the new-tab menu's "All hosts…") lists them:
pinned first, then recent, then the rest. Enter opens a tab, ⌥Enter splits right, ⇧Enter
splits down, and right-click pins, hides or copies the ssh command. The sidebar's Remote
section keeps just the hosts you pinned or have open. It never keeps its own host list, passwords or keys: a click runs the system ssh <alias>, so keys, ssh-agent, 1Password, ProxyJump and password or 2FA prompts all work as
in any terminal. Editing the config updates the list as you save. Wildcard patterns
(Host *.corp) aren't listed. Git hosts (github.com, gitlab.com, …) are hidden by default;
show one again from the picker's "Hidden" footer (recorded in ssh.shown). Hide your own hosts
with right-click → Hide host, or "ssh": { "hidden": ["bastion"] }; that list adds to the git
defaults, it doesn't replace them. Hiding is by alias, so it applies in every environment.

  • Know where you are. A remote pane's header shows where it runs (user@hostname from your
    config, else the alias). Give hosts a colour with ssh.colors: ssh-style patterns such as
    prod-* or prod-*,db-*,!db-test, first match wins (keep pattern keys non-numeric: JSON
    orders number-like keys first). The header, its tab and the sidebar carry it, so a
    production shell doesn't look like a scratch box.

  • Splits stay on the host. Splitting an SSH pane, or opening a new terminal in it, opens
    another ssh to the same host. "Open folder in split" stays local.

  • Keepalive. smterm adds ServerAliveInterval=30 (with ServerAliveCountMax=4), so an idle
    pane survives NAT timeouts and a dead link ends in about two minutes instead of hanging.
    "ssh": { "keepAliveSeconds": 0 } leaves it to your config.

  • Reconnect. When ssh exits, the pane says why and Enter (or the Reconnect button)
    connects again. A connection that was up for 30 s (after its last password prompt) and then
    loses its link (ssh says so: "closed by remote host", "Broken pipe", …) reconnects on its
    own, up to three times in a row (after 2, 5 and 10 s) and six in all until you reconnect it
    yourself. Each try is a fresh login shell, so a RemoteCommand in your config runs again. A
    clean exit, a logout, a drop at a password prompt, or one that fails straight away never
    does; "ssh": { "autoReconnect": false } turns it off. After a relaunch SSH panes reconnect
    as they're shown; with "ssh": { "restore": "on-focus" } they wait for Enter instead, which
    is handy for password or 2FA hosts. Connect all (beside the bell once two or more wait,
    and in the palette) connects every waiting one, including those in tabs you haven't opened
    yet: the first pane per host, then the rest once it's past its password prompt, so they can
    share a ControlMaster.

  • Prompt-free splits. Each pane is its own ssh. For hosts that ask for a password, let
    OpenSSH share one connection by adding this to your ~/.ssh/config:

    Host *
      ControlMaster auto
      ControlPath ~/.ssh/cm-%C
      ControlPersist 10m
    
  • WSL. On Windows, the hosts in each running WSL distro's ~/.ssh/config are listed too and
    connect with that distro's own ssh.

  • The Changes and Files panels show local folders only, so for an SSH pane they say it's remote.

What is still rough

This is v0. I use it every day, and it will still surprise you sometimes.

  • On macOS it is Apple Silicon only for now. Intel is not built yet.
  • The app is not code-signed or notarized, so installing it outside the script gives you a
    security prompt the first time.
  • Agent status comes from a heuristic (is the pane still producing output, or has it gone
    quiet?), so it reads the state wrong once in a while.
  • The Agents board only knows about Claude Code today, since it reads Claude's hook events. The
    code under it does not assume any particular agent, so others can plug in later.
  • Windows and WSL have had far less real-world use than macOS and Linux, so expect rougher edges
    there.
  • After a full quit, your tabs and layout come back on relaunch, but running processes are not
    restored yet.

Most of these are already on the near-term roadmap, so they should not be rough for long.

Found a bug? Open an issue. What you did, what
happened, and what you expected is all it takes for a useful report.

Build from source

git clone https://github.com/vcmf/smterm
cd smterm
make install   # deps, native module rebuild, git hooks
make run       # dev mode
make dist      # package an installable build for your OS

make run uses its own dev profile (~/.config/smterm-dev, %APPDATA%\smterm-dev on
Windows; a DEV badge by the logo), so it runs next to an installed smterm without touching its
settings or layout.
SMTERM_PROFILE=<name> make run picks another profile (one per worktree, say);
SMTERM_PROFILE=default uses the installed app's config, only while that app is closed. An
installed smterm ignores SMTERM_PROFILE; start it with --profile=<name> instead (macOS:
open -a smterm --args --profile=qa).

Run make help for the full list of targets (make check runs lint + tests, make fmt
formats). Logic lives in small pure modules with real tests (make test).

Stack, if you care: Electron, React, TypeScript, xterm.js on the WebGL renderer, and node-pty
for the shells. Zustand for state, react-resizable-panels for the layout, Vitest for tests.
Design and decisions live in docs/: start with
ARCHITECTURE.md and ROADMAP.md.

License

MIT. Do what you want with it.

Reviews (0)

No results found