Skip to main content

CLIque: a folder for every CLI on the box

A folder for every CLI on the box. Coding sessions in the browser, kept alive in tmux.
Claude Code, Codex, Gemini, Grok, Antigravity, or anything you add in four lines of config.

Python 3.11+ No dependencies MIT tests 0.50.54 GitHub stars Buy me a coffee Donate


CLIque is a driver, not an IDE. It does not parse a vendor's protocol, impersonate a model, or reimplement the tools you already have. It keeps a private tmux server, puts every CLI session in a folder you can actually find, and gives you a browser to jump between them.

If you run more than two coding agents at once, you already know the problem: terminals everywhere, no idea which one is waiting on you, a conversation you cannot get back to. CLIque is the panel for that.

24 MB resident. No framework, no node_modules, no build step. tmux, a PTY, and the Python standard library.

Who it's for

Using one AI coding agent? Claude Code, Codex, Cursor's CLI, Gemini, Grok, Antigravity — CLIque puts it in your browser. Kick off a task, close the laptop, and check on it from your phone on the couch. Nothing to babysit, nothing to install but Python and tmux.

Running several at once? You already know the problem: terminals everywhere, no idea which one is waiting on you, a conversation you cannot get back to. CLIque is the one screen in front of all of them — folders, a status ring on each, one click to jump, and a real phone notification when one wants you.

Driving a fleet? Run ten agents across ten repos, each in its own git worktree so they do not step on each other, reap the idle ones to reclaim memory and resume them later exactly where they left off, and script the whole thing over an HTTP API.

It is not an IDE, not another AI, and not a replacement for your CLIs — it is the control panel in front of the tools you already use. If you want the tool to be the agent, look elsewhere.

What it does

Command palette Ctrl/Cmd+K: fuzzy jump between sessions, most-recently-used first. > commands, @ sessions, ~ past conversations.
History Every conversation your CLIs have kept, filed by directory, resumable in one click. Repeated runs of the same scheduled agent fold into one row.
Resume & reap An idle tab has its process stopped after a few hours — ~700 MB freed for an idle Claude — and its tab greys out. Click it and it resumes exactly where it was. Ten open tabs cost what two do.
Worktrees Start a session in its own git worktree, so several agents work the same repo at once without touching each other's files. Delete the session and the worktree goes too — unless it has uncommitted work.
Conversation view A CLI that draws full-screen keeps no scrollback; View conversation reads its transcript back — your turns and the assistant's prose, tools and thinking left out — in a clean sheet.
Agent-drivable A one-word state per session, a wait-until-done call, and a skill, so an agent can drive CLIque itself: fan one task across many repos and collect the results.
Filter One button in the sidebar hides every stopped session — and any folder left empty by it — so a list of two dozen collapses to what is actually running.
Folders A tree. Drag to reorder folders and sessions, or drop a session on a folder to file it. Double-click rename, right-click, search, collapse to a rail (Ctrl/Cmd+B). Each row names the git branch it is on, and how many files have changed.
Tabs Drag to reorder, Alt+19 to jump. Names shrink first; what still will not fit lands in N more, wearing the same working / waiting ring. Closing a tab is not killing the session.
Terminal Live output, full scrollback on reattach, resize, auto-reconnect, themed to the panel. Drag to copy, even when the CLI wants the mouse. Ctrl/Cmd+C copies a selection and interrupts when there isn't one; Ctrl/Cmd+Shift+C copies the screen.
Links URLs in the pane are clickable: a new tab, or a new window with Ctrl/Cmd. http(s) only. A URL that wrapped onto the next line is still one link. A file path opens a read-only look — copy it, or drop it into the prompt.
Scroll lock Scroll up and the view detaches from the stream. A badge says how far behind you are; the bottom, the lock, or Ctrl/Cmd+Shift+L catches you up.
Paste a screenshot Ctrl/Cmd+V saves the image into the session's own directory and drops the path where you were typing. Nothing is sent until you press enter.
See what it made An agent writes a screenshot into the session's directory and a count appears in the tab bar. Grid, full size, and the path back into your prompt in one click.
Prompt drafts A half-typed instruction survives a tab switch, a reload, and a closed laptop. Per session, on the server, so it follows you to another device.
Workspace Open tabs, their order, the one in front, and which groups are collapsed live on the server. A reload attaches the tab you are looking at, then warms the rest in the background without resizing the pane. Sign in somewhere else and the strip is where you left it.
Status A ring around the CLI's own logo: an arc turning means working, a steady pulse means finished and waiting for you, idle draws nothing. The logo is never recoloured.
The box CPU, memory, disk and VIEWS in the bottom bar. Views is live connections on the box, not open tabs — hover if the number looks high; extras are another window or a phone.
Waiting on you Three tiers: tmux's clock, regexes you declare per CLI, and a POST .../attention a session fires from your own hook. Nothing here knows which vendor is talking.
Unread A dot on anything that produced output while you were elsewhere, and a rule in the pane where you stopped reading.
Which CLI The pane edge, the active tab and the prompt box carry the CLI's colour, so switching tabs tells you where you are typing. Colours editable per CLI.
Themes Nine presets, light / dark / system, custom CSS in three slots, independent font sizes, a monospace picker that falls back on every OS.
API Every action in the panel is an HTTP call, with bearer tokens and read-only ones. Full reference in API.md, kept honest by a drift check in the test suite.
Changelog Settings → Changelog: the last few releases, with a link to the rest on GitHub. After an upgrade, What's new sits on the bottom bar and goes straight there.
Told, not checked One webhook URL, POSTed when a session wants you, errors, finishes or dies. ntfy, Gotify, Discord, Mattermost and Uptime Kuma push all speak it. Real phone notifications, no app of ours.
Monitoring GET /healthz answers without a login. Point Uptime Kuma, Gatus or Healthchecks at it. Anonymously it says {"ok": true} and nothing else.
Security Password login (scrypt), API tokens, CSRF, Origin and Host checks, CSP with per-response nonces. See SECURITY.md.
Touch Long press a session for the menu right-click gives, with tap targets sized for a finger.
Phone & PWA Install it as its own app — no tabs, no URL bar, full screen from the bottom bar. Built for a phone browser too: a drawer sidebar, a full-width pane, an on-screen row for the keys a terminal needs (Esc, Tab, Ctrl+C, arrows), and a wheel that scrolls a full-screen CLI's own view.

Not built, on purpose: subagent visualisation, a respawn controller, multi-host, a Ralph loop. Those need to know which vendor is talking. This product does not.

What is next, and why that order: ROADMAP.md. What shipped: CHANGELOG.md.

Quick start

Needs Python 3.11+ and tmux. Nothing else.

git clone https://github.com/thejdubb02/clique.git
cd clique
python3 -m clique password    # prompted; stored as an scrypt hash
python3 -m clique             # http://127.0.0.1:3200

State lives in $CLIQUE_HOME, default ~/.clique. To edit the CLI catalogue, python3 -m clique config drops one where your edits survive an upgrade.

Once it is on PyPI, pip install clique-panel gives you a clique command (the package is clique-panel because clique there is an unrelated library).

It binds to loopback on purpose. Put a tunnel in front of it (Tailscale Serve, Caddy, nginx) if you want it from another machine. Do not bind it to the public internet. Anyone who reaches the panel has a terminal as the user that started it.

# optional: behind Tailscale
tailscale serve --bg --set-path /clique http://127.0.0.1:3200

A systemd user unit is in deploy/.

GET /healthz answers without a login ({"ok":true} and nothing else), so Uptime Kuma, Gatus or Healthchecks can watch it.

Adding a CLI

A block in clique/config/clis.toml. Reload the page. No restart, no code:

[cli.grok]
label   = "Grok CLI"
command = "grok"
args    = []
color   = "#6f42c1"

There is no per-CLI branch in the codebase. If adding one ever needs a code change, the design has failed.

Claude Code and Gemini CLI can also declare an autonomy pill (the mode above the prompt). That is four keys in the same block (modes, mode_key, mode_label), documented in the comments of clis.toml. Omit them and the pill stays hidden, which is the right default for a CLI whose approval is a launch flag.

Why it is stdlib-only

A coding-agent session already costs hundreds of megabytes. The manager's job is to disappear into that budget. Measured: 24 MB resident.

That also means the real ceiling on concurrent sessions is the agents, not this. On a 16 GB box with ~9 GB free, roughly a dozen at once.

Design notes that are easy to get wrong

  • Own tmux server (tmux -L clique). Isolated from everything else on the box.
  • A PTY exists only while a browser is attached. An idle session costs this process nothing; cost scales with open tabs, not with session count.
  • Each viewer gets its own grouped tmux session. Plain attach makes every client share one size, so tmux shrinks the pane to the smallest watcher.
  • Closing a tab is not killing a session. Detach sends SIGHUP; tmux and the CLI carry on.
  • kill() refuses sessions that are not ours unless forced.

Tests

Neither suite is mocked. The failure modes worth catching (tmux quoting, a PTY that never gets its first byte) only exist across a real socket. GitHub Actions runs all three on every push. They start their own panel and tmux server, so they cannot touch the one you are using.

python3 tools/smoke.py                 # engine, against a real tmux server
python3 tools/smoke_http.py            # server, over real HTTP + WebSocket
python3 tools/api_drift.py             # API.md still covers every route and setting
ruff check .

They will not catch a UI that renders wrong. Open the page for that.

Contributing

Patches welcome, with a short filter: CONTRIBUTING.md. Feature ideas that need to know which vendor is talking get refused. That is the product, not a freeze.

Support the dev

Free, and staying that way. If it saved you an afternoon, this is the tip jar.

Buy me a coffee

Network Address
BTC Bitcoin 3A3nA8BQFmXdvyUQokHhPd8HAd99wRDYFQ
SHIB Ethereum 0x6b5DEd92946692D50642dC3af169727225E32D3b
DOGE Dogecoin DNiJeUJUVaVTDuteLXCtP7JVgvdL2NqoYp

License

MIT. Built by Justin Willhite.

A hole that reaches a terminal is a private advisory, not a public issue. See SECURITY.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

clique_panel-0.50.54.tar.gz (571.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

clique_panel-0.50.54-py3-none-any.whl (586.7 kB view details)

Uploaded Python 3

File details

Details for the file clique_panel-0.50.54.tar.gz.

File metadata

  • Download URL: clique_panel-0.50.54.tar.gz
  • Upload date:
  • Size: 571.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for clique_panel-0.50.54.tar.gz
Algorithm Hash digest
SHA256 bc5eca0c8cf8703d046c57c8bf4c5c2f5fdb8da988567d04d668096de35d0f77
MD5 99227d68f6152e2b5e1e5149ffac02fc
BLAKE2b-256 d4abe30bdd85b2f59f7398db897093f49a0daa122d84d6cba2d2073f00c4cae4

See more details on using hashes here.

Provenance

The following attestation bundles were made for clique_panel-0.50.54.tar.gz:

Publisher: publish.yml on thejdubb02/clique

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file clique_panel-0.50.54-py3-none-any.whl.

File metadata

  • Download URL: clique_panel-0.50.54-py3-none-any.whl
  • Upload date:
  • Size: 586.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for clique_panel-0.50.54-py3-none-any.whl
Algorithm Hash digest
SHA256 c92c298d5e764bb9a3686887831364582f5ee4ffe05c14ad91c791edb7807ad4
MD5 86e5ec0d68476297c67e3a3316280ab1
BLAKE2b-256 9026d19cf37150d589cea8339e0906c8a7dfc31a2185db0a021cd336f6d89f6a

See more details on using hashes here.

Provenance

The following attestation bundles were made for clique_panel-0.50.54-py3-none-any.whl:

Publisher: publish.yml on thejdubb02/clique

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.50.54 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page