A terminal multiplexer whose sessions outlive the window, the daemon and the reboot. Mouse-first, in the browser, on your desktop and phone. https://illogical.widgets.wtf
  • Rust 67.9%
  • TypeScript 20.6%
  • Python 4.7%
  • JavaScript 2.7%
  • HTML 1.3%
  • Other 2.7%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jake Gaylor 982c4808fb
All checks were successful
check / linux (push) Successful in 1m48s
check / macos (push) Successful in 1m54s
Merge S15: end-to-end channels, device keys and the relay
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 23:08:49 -04:00
.cargo M0: illogicald owns a shell; the browser reattaches exactly 2026-10-01 05:26:16 -04:00
.forgejo/workflows Drop ci.yml: check.yml runs on our own runners (ubuntu-latest never had one) 2026-10-01 21:52:04 -04:00
crates Set TCP_NODELAY on accepted connections: 40 ms off every dial-out round trip 2026-10-01 22:56:06 -04:00
docs S15: end-to-end channels, device keys and the relay (spec and spike) 2026-10-01 23:06:22 -04:00
packaging/homebrew Launch: CI and releases on Forgejo Actions 2026-10-01 21:50:42 -04:00
scripts Merge remote-tracking branch 'origin/main' into worktree-macos-keep-panes 2026-10-01 22:28:32 -04:00
site Launch: the project page (site/) 2026-10-01 22:02:36 -04:00
spikes S15: end-to-end channels, device keys and the relay (spec and spike) 2026-10-01 23:06:22 -04:00
web Launch: just screenshots, and the images for the page 2026-10-01 22:00:33 -04:00
.gitignore Plan M3b VM panes and M6 blocks; record the M3b and S6 spikes 2026-10-01 07:06:30 -04:00
.gitleaksignore Launch: license, a quickstart README, arm64 builds, install script 2026-10-01 21:48:06 -04:00
.mise.toml M2: panes survive the daemon stopping, crashing and rebooting 2026-10-01 06:44:51 -04:00
about.hbs Launch: license, a quickstart README, arm64 builds, install script 2026-10-01 21:48:06 -04:00
about.toml Launch: license, a quickstart README, arm64 builds, install script 2026-10-01 21:48:06 -04:00
BRIEF.md Plan milestones after M6 and a multiplayer track 2026-10-01 09:22:37 -04:00
Cargo.lock Merge branch 'main' into worktree-agent-af8996a7b39b5eb7f 2026-10-01 10:49:42 -04:00
Cargo.toml Launch: license, a quickstart README, arm64 builds, install script 2026-10-01 21:48:06 -04:00
justfile Launch: deploy the page with wrangler; releases download anonymously 2026-10-01 22:17:05 -04:00
LICENSE-APACHE Launch: license, a quickstart README, arm64 builds, install script 2026-10-01 21:48:06 -04:00
LICENSE-MIT Launch: license, a quickstart README, arm64 builds, install script 2026-10-01 21:48:06 -04:00
PLAN.md S15: end-to-end channels, device keys and the relay (spec and spike) 2026-10-01 23:06:22 -04:00
README.md Keep panes running across daemon restarts without systemd 2026-10-01 22:18:43 -04:00
rust-toolchain.toml M0: illogicald owns a shell; the browser reattaches exactly 2026-10-01 05:26:16 -04:00
rustfmt.toml M2b: restarting the daemon leaves running programs untouched 2026-10-01 07:04:09 -04:00
THIRD_PARTY.md Launch: license, a quickstart README, arm64 builds, install script 2026-10-01 21:48:06 -04:00
wrangler.jsonc Launch: deploy the page with wrangler; releases download anonymously 2026-10-01 22:17:05 -04:00

illogical

A terminal multiplexer whose sessions outlive the window, the daemon and the reboot. A daemon owns your terminals; the browser (desktop or phone) draws tabs and splits you drive with the mouse.

Tabs and splits in the browser

  • Mouse first. Click, drag and right-click for tabs and splits. No chords to learn, no prefix key.
  • Durable. Close the window, lose the connection, restart the daemon or reboot: the layout, working directories and scrollback come back, and each pane does what you told it to (a shell where it was, re-run its command, claude --continue). On Linux a daemon restart doesn't even touch running programs.
  • Anywhere on your tailnet. The same live layout on every window and your phone, over Tailscale. Push notifications when a pane rings, a long command finishes, or an agent needs you.
  • Agents as blocks. Claude Code, Codex or any ACP agent as a UI beside your terminals: tool calls with their output, approvals and questions as cards big enough for a thumb.
  • Scriptable. illogical, a CLI for scripts and agents: run, send, wait for a command or a match, tail, search every pane's history.

Single user, Linux (x86_64, arm64) and macOS (Apple silicon). Not meant for the open internet: remote access is your tailnet only.

Install

curl -fsSL https://illogical.widgets.wtf/install.sh | sh

This puts illogicald and illogical in ~/.local/bin and starts the daemon as a service (systemd user unit on Linux, launchd agent on macOS). Run it again to upgrade. ILLOGICAL_VERSION=v0.1.0 picks a version.

Homebrew (macOS, Linux):

brew tap jhgaylor/tap https://git.inevitable.fyi/jhgaylor/homebrew-tap
brew install illogical
illogicald install

From source: see docs/development.md.

On Linux, let it start at boot, before you log in:

loginctl enable-linger $USER

Quickstart

  1. Open http://127.0.0.1:7681. Right-click a pane or a tab for everything. Drag a tab or a pane onto another pane's edge to split it there; drag dividers to resize.

  2. From your phone and other machines, put it behind Tailscale on this machine:

    tailscale serve --bg --https=443 http://127.0.0.1:7681
    

    and open https://<this machine>.<tailnet>.ts.net. Only the Tailscale login that owns the machine gets in (illogicald install -- --owner you@example.com for someone else). On the phone, add it to the home screen, then Notify this device in the session menu.

  3. From a script or another pane:

    illogical run --wait -- cargo build        # a new tab; exits with its exit code
    illogical send %3 'git status' -e          # type a line and press Enter
    illogical wait %3 --match 'listening on'
    illogical tail %3 -f --text
    illogical search 'panic|Traceback' --since 1d
    

    docs/cli.md has the rest.

  4. Agents. Install an adapter (needs Node), then Start an agent… in a pane's menu, or illogical agent "fix the failing test":

    npm install --prefix ~/.local/share/illogical/agents/claude @agentclientprotocol/claude-agent-acp@0.85.0
    npm install --omit=optional --prefix ~/.local/share/illogical/agents/codex @agentclientprotocol/codex-acp@2.1.0
    

    Claude Code in an ordinary pane can raise the same notifications and question cards with three hooks: see Claude Code hooks.

On macOS

Everything above works, except that restarting or upgrading the daemon ends the panes' programs (there's no systemd to hold them); scrollback and layout still come back. VM tabs are Linux only.

More

License

MIT OR Apache-2.0, at your option. Terminal emulation by libghostty; see THIRD_PARTY.md.