superlogical

Persistent sessionsdesktop + browser

Close the window. Keep the work running.

Close a window or lose your network connection, then return to your running terminals. Your sessions and workspace stay on the computer where you started them.

Reconnect to the same shells
Reopen the app and choose an existing session. Keep the remote computer running while you are away; shutting it down ends the commands running there.
A workspace on each host
Named sessions, tabs, and split blocks belong to their host. Open them from another connected client and the host supplies their layout and terminal state.
Your own view
Scroll, search the terminal history, and choose a theme while other viewers keep their own view of the same shells.

Remote hostsTailscale SSH + standard SSH

Your remote computers, in one workbench.

Add a remote Linux host from the desktop app with Tailscale SSH or your existing SSH access. Keep its terminals, files, and Git work alongside your local sessions.

Tailscale SSH

you@build-server

With both computers on your Tailscale network and Tailscale SSH access enabled, enter your username and the host’s Tailscale name. Complete a browser sign-in check if requested.

Standard SSH

you@server.example.com

Use a hostname, IP address, or SSH alias you can already reach. Your existing SSH keys and settings work here too.

  1. Add a remote host

    Open File → Add Remote Host and choose Set up with SSH.

  2. Enter your destination

    Type user@host or an SSH alias. Optional settings are under Advanced options.

  3. Connect and start working

    Choose Set up & connect, then open a session on your host.

Tailscale is optional and is set up separately. Your computer must be able to reach the host, and your account must have SSH access. Tailscale SSH setup guide
A name and a starting folder
Give the host a display name and choose where new sessions start, or leave those optional settings for later.
Already have connection details?
Choose Manual connection for a host that is already configured. Switching between setup methods keeps what you have typed.
Come back to your work
Choose a saved host to return to its sessions. Keep the remote computer running when you close your app.
Keep your setup when retrying
If the final connection fails, check that the host is reachable and choose Retry connection. The details you entered stay in place.

Worktrees and branchesFile → Worktrees

Find the branch. Open its worktree.

See the repository around your focused terminal: its worktrees and local branches, uncommitted changes, and commits ahead of or behind upstream.

Open where the work lives
Filter by worktree, branch, or commit. Open a worktree as a new tab or session, with its folder ready for the next command.
Create or switch
Create a worktree for a new or existing local branch. Switch the main checkout to an unused branch when it is clean; the host refuses a switch while it has uncommitted changes.
Review before moving on
The selected worktree’s staged and unstaged diff appears beside the list. Move into Changes to keep reviewing that same diff.

Live Git changesFile → Changes

Watch the diff as the work happens.

Review the focused terminal’s worktree in a full view, a floating panel, or a Changes block beside your terminals. File saves, staging, commits, and checkouts update the view.

Staged and unstaged, together
Read changes in split or unified form, with syntax colors and word highlights. The host sends the changed-file list, and the viewer asks for file contents as they come into view.
Stage the part you mean
Stage or unstage a hunk, or select whole files. Restoring an unstaged hunk asks for confirmation before writing it back.
Keep it beside the terminal
Choose Changes from the New Block menu to dock a worktree’s diff in the tab. Its place is saved with the host’s workspace.
Follow changes on the host
Linux and macOS hosts watch the worktree and send file-list updates when something changes. The viewer requests changed contents and keeps its place while the diff refreshes.

Commit historyFile → New Block → History

Read the history beside the work.

Open a repository’s commit graph as a block beside your terminals. Branches, merges, and tags are drawn as lanes; highlight a commit to read its message and diff below the list.

New Block → History beside git log, Shift+Escape to fill the area, and the arrow keys through branches and merges, each commit's diff below. A commit made in the shell arrives on top. Recorded in the browser workbench on a sample project.
Every branch in one graph
Local branches, remote branches, and tags are drawn together, newest first, each commit on its lane with the names that point at it. Shift+Escape fills the terminal area with the block, and the author column appears when there is room.
The highlighted commit, below
Its message, author, time, and for a GitHub remote a link to it there, then its diff, read-only, in split or unified form. Enter moves into the diff; drag the divider to give the list or the diff more room.
New commits arrive on top
Commit, fetch, or rebase in the shell and the graph updates. What you are reading stays where it is, and a notice counts the commits that arrived above it.
Laid out once, on the host
The host walks the repository and lays out the graph once, for every viewer of that repository. Your app asks only for the rows in view, and new commits come as additions, not the whole list again.

Insert Path⌘/ or Ctrl+Shift+/

Find a file and type its path at the cursor.

Press ⌘/ at a prompt, or Ctrl+Shift+/ off the Mac. A small finder opens at the cursor and searches every file and folder under the shell's folder. Choose one, and its path is typed where you were typing, relative to where the shell is.

git diff, then ⌘/: checkout lists what matches, checkout form narrows it to one file, and Enter types its path at the cursor. Recorded in the Mac app on a sample project.
Opens where you type
Below the cursor, or above it near the bottom of the screen, with what you type starting at the cursor's column. Escape closes it and gives the keyboard back to the terminal.
Ranked like an editor's file finder
Letters in order with gaps allowed, words in any order: checkout form finds apps/storefront/src/checkout/CheckoutForm.tsx. A file named for what you typed comes before one that only sits in a matching folder.
Typed the way a shell reads it
Relative to the shell's folder, from home as ~/… when you start with ~/, or in full with ⌘Enter. A name with spaces is quoted. Nothing runs until you press Enter.
Your project, not your whole disk
It follows the repository's .gitignore and skips node_modules and caches. The host reads the folder when the finder opens and forgets it when it closes: no index, nothing kept.
Match locally once the paths arrive
A folder of up to 20,000 paths is sent to your app once, so every keystroke is ranked on your side. Where the connection allows, searches travel on a stream of their own, so a busy terminal does not hold them up.
Markdown and image previews
Open Files from New Block to browse the folder beside your terminal. Markdown opens rendered by default, with a Source toggle; images open as previews.

Automatic Contrast Correctionon by default

Colors you can read, on the theme you chose.

Most terminal programs pick colors for a dark background, so on a light theme they fade out. Superlogical checks each color against your background and fixes only the ones that fail.

The same listing on a light theme: the colors lsd sent, then what Superlogical paints. Every color now meets 4.5:1 against the background.
user
sent#ffffd71.02:1
painted#7f734c4.51:1
date
sent#00d7871.82:1
painted#0085414.54:1
directory
sent#0087ff3.40:1
painted#0072dc4.53:1
Keeps the hue
Pale green becomes a green you can read, not a grey.
Leaves the rest alone
Colors that already pass are painted exactly as the program sent them.
Per viewer, not per session
Each client corrects for its own theme, so people on light and dark themes can share one session.

Themessystem by default

Follow your system, or pick your own.

Choose System, Light, or Dark, and a theme for each. System follows your device as it changes, switching between the light and dark themes you saved.

Thirty-two built in
Catppuccin, Dracula, Gruvbox, Nord, Rose Pine, Tokyo Night, Solarized, Everforest, Kanagawa and the rest, in light and dark, beside Superlogical Light, One Dark, and two high-contrast palettes. Nothing to download or install.
Bring your own
Import a terminal palette — the same shape most emulators publish, and the one the built-in themes are written in — or a Zed theme family. Export the current theme to start a custom one.
The whole app, not just the terminal
A palette names twenty colors; the app needs twenty more for its tabs, panels, and menus. Superlogical derives them from the palette, keeping each color's hue and moving it only as far as 4.5:1 against the background requires. Every bundled theme is held to that floor by a test.
Yours alone
Themes are saved on your device, so a shared session never forces your colors on anyone else.

Shape and densityrounded and comfortable by default

Rounded or square, roomy or flush.

Shape draws blocks and tabs as rounded cards set apart on a darker ground, or as square cells divided by single lines. Rounded comes roomy or tight: Density leaves room around and between blocks, or sets them flush. Square cells share one divider, so they are always flush.

More room for text
Compact closes the gaps between blocks and against the window, and the square shape is drawn that way already.
Switch any time
Change either one from the command palette or the View menu. Your shells keep running, and both are saved with the window, so the room you left the rounded shape with is the room it comes back with.

Performancemeasured on Linux

Fast to type into. Fast to come back to.

Your terminals run on their host, which sends your screen only what changed. A key press is echoed back in 1.19 ms, and 64 terminals are back on screen 19.8 ms after a reconnect.

Typing

Key press to echo, p50
1.19ms
1,000 terminals running, same machine. p99: 1.28 ms.
Key press to echo in a browser, p50
1.18ms
Through the host's gateway over WebSocket. WebTransport: 1.16 ms.
Host CPU per key press
15µs
1,000 terminals typed into at 4 keys per second each.

Reconnecting

64 terminals back on screen
19.8ms
Each with 10,000 rows of output, same machine.
64 terminals' screens over a network
173ms
100 Mbit/s, 20 ms round trip. At 80 ms: 622 ms.
16 terminals' screens in a browser
9.5ms
Through the host's gateway over WebSocket. WebTransport: 2.4 ms.

Scale

Host memory per terminal
282KB
1,000 idle shells on one host: 290 MB in all.
Of one CPU core for 1,000 idle terminals
6.2%
12.2% while all 1,000 are typed into.
Per frame from a busy terminal
835B
100 new lines a frame, 4,977 rows of history kept.
How we measure
Medians of 5 runs of Superlogical's benchmarks, each in a fresh process, on a Linux workstation pinned to 8 cores (16 threads). Your hardware, your network, and the programs in your terminals change the numbers.

Start with a session on this machine.

The desktop app includes a local terminal host. Start there, then add a remote Linux host when you need one.