Tithon
github.com/rnoro/tithon- Category
- Developer Tools
- Rank
- No. 1538Tools index
Previous survey · No. 1494 ·
- Pricing
- Open Source
- Type
- TOOL
- Use case
- Coding
- Interfaces
- CLI · Editor Extension
- GitHub
- 14 stars
- Latest release
- v0.2.5
- Date
About
Tithon is a host-side daemon that keeps a Jupyter kernel and its output alive independently of any connected client, so closing an editor, losing SSH, or restarting the daemon doesn't kill a running session. It ships a CLI plus a VSCode extension that opens a percent-format .py file as a live notebook, journaling output to SQLite and storing images as files so AI agents can read them directly instead of parsing base64.
What it does
Tithon moves ownership of an interactive Python session off your editor and onto the machine that runs it. A background service starts the Jupyter kernel as a detached process, records every message that kernel publishes in an append-only log, and keeps a folded view of the current display so a reconnecting client catches up from the last event it saw. Plots are written to disk as ordinary image files. You drive it from a terminal command or from a VS Code extension that treats a plain Python script with cell markers as a notebook.
Why it's ranked here
It fixes a specific, common failure with a design that holds up. Losing a long GPU run's output to a dropped SSH connection is a real cost, and the fix here is structural: the kernel is not a child of the service, so even killing the service leaves it running and reattachable. The tests pin down the hard parts, such as a slow client being cut off instead of growing memory, and late output still landing in the saved result. Against that: it is self-declared alpha, has one listed author, and runs on Unix only.
What's good
The storage choices are sound. Plot images live as real files deduplicated by content hash, so a chart redrawn every training step commits once, and an agent can open the picture instead of decoding base64. Progress bars and sliders come back at their current value rather than their starting one. Outputs never touch the script itself, so diffs stay clean, and an optional project folder of cell outputs can be committed so collaborators see results. The service listens only on a local socket readable by its owner, with no network port.
Tradeoffs
Native Windows is unsupported; the docs send Windows users to WSL. The extension and the service must share a host, so pairing an editor on a laptop with a remote box means forwarding the socket yourself. The project calls itself alpha and warns of rough edges. Pylance users see a brief tab flicker on same-file go-to-definition, a documented upstream issue whose workaround is switching to the ty language server. Kernels live forever unless you opt in to an idle timeout.
How to use it well
Best fit: someone running long training or data jobs on a remote Linux machine through VS Code Remote-SSH or a Tunnel, who wants to close the laptop and return to live output. Install the Python package on the host and the extension in the editor; the extension can start the service itself. Set an idle timeout if you leave many sessions open, since abandoned kernels otherwise keep their memory. It does not replace the JupyterLab browser interface, and it does not manage Python environments for you.
Technical notes+
src/tithon/cli.py defines the daemon, run, attach, status, restart, interrupt, kill and shutdown subcommands and speaks JSON ops over websockets on a unix socket via unix_connect; src/tithon/__main__.py enables python -m tithon for extension hosts without the script on PATH. docs/SPEC.md describes the kernel spawned through jupyter_client under setsid with a persisted connection file, a per-session SQLite WAL journal (executions, messages, artifacts tables), folding that applies carriage-return semantics and collapses update_display_data by a session-scoped display_id, a liveness watchdog (TITHON_KERNEL_WATCHDOG_POLL, default 5 s), and process-group termination only after group ownership is proven. test/test_backpressure.py asserts a subscriber queue capped at 5 stays bounded across 1000 broadcasts and that a stalled sender is dropped after SEND_TIMEOUT; test/test_barrier.py covers the shell-reply router and the idle-status completion barrier (IDLE_BARRIER_TIMEOUT >= 5). pyproject.toml declares Development Status 3 - Alpha, a hatchling build, and dependencies jupyter_client, ipykernel and websockets; extension/package.json registers the tithon-py notebook type and a tithon-widget renderer. docs/known_issue.md documents the Pylance mitigation for a phantom duplicate-extension tab (ADR-062).
Observed
- License
- MIT
- Language
- Python daemon and CLI; TypeScript VS Code extension
- Python requirement
- Python 3.11 or newer
- Packaging
- PyPI package (pip install tithon) plus a VS Code Marketplace extension
- Interfaces
- CLI and VS Code notebook extension; no MCP server or network API
- Platform
- Unix-like hosts, developed and tested on Linux; native Windows unsupported (WSL recommended)
- Transport
- Owner-only (0600) unix domain socket, no TCP listener
- Tests
- pytest suite in a test directory, including backpressure and completion-barrier tests
- Maturity
- Declares Development Status 3 - Alpha
Read from README.md, pyproject.toml, docs/SPEC.md, docs/known_issue.md, src/tithon/cli.py, src/tithon/__main__.py, extension/package.json, extension/README.md, LICENSE, CHANGELOG.md, test/test_backpressure.py, test/test_barrier.py.
What it can do
Open a percent-format .py file as a live notebook in VSCode
percent-format .py file → Live notebook view
Journal notebook output to a database
Kernel output → SQLite records
Store notebook images as files instead of embedding base64
Image output from kernel → Image files
Tags
Tech Stack
Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.