Multi-session terminal chat for blemees-agentd (Claude Code + Codex).
Project description
blemees-tui
Multi-session terminal chat for blemees-agentd — Claude Code + Codex agents,
side-by-side, in one process. Watch a session running in another terminal,
take ownership when you need to type, and never lose a transcript across
restarts.
Status: v0.1 alpha. The core loop is complete; see
docs/IMPLEMENTATION.mdfor what's done and what's next, anddocs/PARITY_BACKLOG.mdfor the curated parity backlog.
Why
Claude Code and Codex are great in their own terminal, but bouncing between
sessions, recovering from a closed shell, or watching a long-running
agent from a second machine all leave you stitching tabs together by hand.
blemees-tui is a thin presentation layer over blemees-agentd
that keeps every session live in one window:
- Multi-session sidebar with keyboard navigation (
Ctrl+1..0,Ctrl+Tab,:select N). - Watch mode — observe a session running anywhere
(
blemees-agentdis a Unix-socket daemon; SSH-forward it across machines) and take ownership with one click. - Streaming Markdown transcript with collapsible reasoning, syntax-highlighted Edit diffs, Write previews per language, and live token estimates.
- Persistent across restarts — sessions snapshot to disk after every turn; cold start paints from cache and only replays new daemon frames.
- Per-session drafts — typed text travels with the session, not the composer.
- First-class observability — footer chip, event-log overlay
(
Ctrl+E), raw-frame debug pane (Ctrl+D), persistent log file.
Install
# PyPI (when published)
pip install blemees-tui
# uv tool
uv tool install blemees-tui
# pipx
pipx install blemees-tui
# Homebrew (planned)
brew install blemees/tap/blemees-tui
Requires Python ≥ 3.11 and a running blemees-agentd ≥ 0.9.0 Unix socket.
Quickstart
# Auto-resolve the daemon socket (uses $BLEMEES_AGENTD_SOCKET, then
# $XDG_RUNTIME_DIR/blemees/agentd.sock, then /tmp/blemees-agentd-<uid>.sock)
blemees
# Or point explicitly:
blemees --socket /path/to/agentd.sock
| Action | Keys |
|---|---|
| New session | Ctrl+N |
| Attach to existing (watch) | Ctrl+T |
| Switch session | F1–F12, Ctrl+Tab |
| Switch to session ≥ 13 | :select 13 |
| Close current session | Ctrl+W |
| Delete current session | Ctrl+Shift+W |
| Interrupt turn | Ctrl+C |
| Force reconnect | Ctrl+R |
| Event log overlay | Ctrl+E |
| Debug pane (raw frames) | Ctrl+D |
| Save transcript (Markdown) | Ctrl+S |
| Toggle reasoning visibility | t |
| Help overlay | ? |
| Quit | q |
/foo slash commands forward verbatim to the active backend (so Claude
Code skills and Codex slash commands stay reachable). :foo is reserved
for TUI commands — see :help.
Configuration
$XDG_CONFIG_HOME/blemees/tui.toml (or ~/.config/blemees/tui.toml):
[connection]
socket = "" # empty = auto-resolve
[defaults]
backend = "" # empty = first advertised by hello_ack
claude_model = "sonnet"
codex_model = "gpt-5.2-codex"
claude_permission_mode = "default"
codex_sandbox = "workspace-write"
[ui]
theme = "dark" # dark | light
sidebar_width = 28
show_thinking = false
markdown_code_theme = "monokai"
[logging]
level = "info" # debug | info | warn | error
keep_days = 7
CLI overrides:
blemees --socket /tmp/blemees-agentd.sock --log-level debug
Env-var overrides: BLEMEES_AGENTD_SOCKET, BLEMEES_TUI_THEME,
BLEMEES_TUI_LOG_LEVEL, BLEMEES_TUI_BACKEND.
Persistence
Files under $XDG_STATE_HOME/blemees/tui/:
sessions.json— index of live + watching sessions.history.json— bounded ring (200 entries) of closed-but-remembered sessions.snapshots/<id>.json— full per-session in-memory state cached to disk so a TUI restart skips the full daemon replay.transcripts/—Ctrl+SMarkdown exports.tui.log— rotating log (weekly, 7 keep).
Develop
pip install -e '.[dev]'
pytest # 85 tests
ruff check .
ruff format --check .
See CONTRIBUTING.md for the workflow.
Docs
docs/SPEC.md— full v0.1 contract (state model, protocol, persistence, observability).docs/IMPLEMENTATION.md— milestone plan and what's shipped.docs/PARITY_BACKLOG.md— curated Claude Code feature backlog with priorities.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file blemees_tui-0.1.0.tar.gz.
File metadata
- Download URL: blemees_tui-0.1.0.tar.gz
- Upload date:
- Size: 79.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
48088b35ab4ed44c7600777e552c8dc5fda9569d8cefb3a54a71e6092e998df0
|
|
| MD5 |
57a51933ec80217475cc058514fe5447
|
|
| BLAKE2b-256 |
0b4d567bcfc789e150c5daef8026566439b824a39be478db71dcc81773b86380
|
Provenance
The following attestation bundles were made for blemees_tui-0.1.0.tar.gz:
Publisher:
release.yml on blemees/blemees-tui
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
blemees_tui-0.1.0.tar.gz -
Subject digest:
48088b35ab4ed44c7600777e552c8dc5fda9569d8cefb3a54a71e6092e998df0 - Sigstore transparency entry: 1445165067
- Sigstore integration time:
-
Permalink:
blemees/blemees-tui@650900405d569e1160d26274cad8089aaa1caca7 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/blemees
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@650900405d569e1160d26274cad8089aaa1caca7 -
Trigger Event:
push
-
Statement type:
File details
Details for the file blemees_tui-0.1.0-py3-none-any.whl.
File metadata
- Download URL: blemees_tui-0.1.0-py3-none-any.whl
- Upload date:
- Size: 71.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4441d74c857c1c8091f3a31b55762e13d6e88337c6f4fc4c680fef3ee141d5ed
|
|
| MD5 |
226c101e0c2b33e55094617a1a60fd8f
|
|
| BLAKE2b-256 |
56d5a4e229305cba80895b071647e4ddb73d060144c344f2ab9efc1bb61ef7dc
|
Provenance
The following attestation bundles were made for blemees_tui-0.1.0-py3-none-any.whl:
Publisher:
release.yml on blemees/blemees-tui
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
blemees_tui-0.1.0-py3-none-any.whl -
Subject digest:
4441d74c857c1c8091f3a31b55762e13d6e88337c6f4fc4c680fef3ee141d5ed - Sigstore transparency entry: 1445165433
- Sigstore integration time:
-
Permalink:
blemees/blemees-tui@650900405d569e1160d26274cad8089aaa1caca7 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/blemees
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@650900405d569e1160d26274cad8089aaa1caca7 -
Trigger Event:
push
-
Statement type: