Tyrtulia TUI
Terminal client for Tyrtulia, the headless forum for small multi-user servers (tildes, pubnixes, club servers). Built with Textual.
- On the server itself it talks to Tyrtulia through its Unix socket: the operating system tells the forum who you are, so there is nothing to log in to.
- From anywhere else it logs in with your SSH key (a signed challenge) and keeps the session token in a private file.
- It only knows
GET /and follows the links the forum returns: an action appears in the footer only when the forum offers it to you (reply, edit, pin, hide...). - Notifications arrive in real time over Server-Sent Events.
Requirements
- Python 3.14.
- OpenSSH client (
ssh-keygen), to sign the login challenge when you connect from outside the server. - A Tyrtulia 1.x instance.
Installation
With uv:
uv tool install tyrtulia-tui
With pip:
python3.14 -m venv ~/.local/share/tyrtulia-tui
~/.local/share/tyrtulia-tui/bin/pip install tyrtulia-tui
ln -s ~/.local/share/tyrtulia-tui/bin/tyrtulia-tui ~/.local/bin/tyrtulia-tui
Administrators can install it once for every user of the server, for example in /opt/tyrtulia-tui with a link in /usr/local/bin.
Usage
On the server, just run it. It finds the socket in /run/tyrtulia/tyrtulia.sock (or /var/run/tyrtulia/tyrtulia.sock on BSD):
tyrtulia-tui
From another machine, point it to the forum and give your username and SSH key. Your first SSH key is registered from the server itself (profile, k) or by the operator:
tyrtulia-tui --url https://forum.example.org --user alice --key ~/.ssh/id_ed25519
The key can also be the .pub file, to sign with ssh-agent. Without --user, you read as a guest and can log in later with l.
| Option | Meaning |
|---|---|
--socket PATH |
Unix socket of the server. |
--url URL |
URL of the server, for remote access. |
--user NAME |
Username for the SSH key login. |
--key FILE |
SSH private key (or its .pub with the agent). Defaults to ~/.ssh/id_ed25519, id_ecdsa or id_rsa. |
--config FILE |
Configuration file. |
Configuration
Every key is optional; command line options win:
# ~/.config/tyrtulia-tui/config.toml
url = "https://forum.example.org"
username = "alice"
key = "~/.ssh/id_ed25519"
# socket = "/run/tyrtulia/tyrtulia.sock"
Session tokens are kept in ~/.local/state/tyrtulia-tui/tokens.json (mode 0600), and the last post you read in each thread in read.json next to it, to show how many posts are new. Both follow XDG_STATE_HOME.
Keys
| Where | Key | Action |
|---|---|---|
| Everywhere | q |
Quit |
i |
Notifications | |
/ |
Search (words, "a phrase", OR, NOT, prefix*) |
|
p |
Your profile and SSH keys | |
l / o |
Log in / log out (remote access) | |
| Threads | Enter |
Open |
n |
New thread | |
w |
Latest or watching | |
r |
Refresh | |
] / [ |
Next / previous page | |
| Thread | ↑ ↓ (k j) |
Move between posts |
r |
Reply to the thread | |
a |
Answer the selected post | |
e / d |
Edit / delete the selected post | |
s |
Subscription: watching, normal, muted | |
t |
Change the title | |
f |
Report the selected post | |
h, P, C |
Moderators: hide or unhide, pin, close | |
Esc |
Back | |
| Editor | Ctrl+S |
Send |
F7 |
Select all | |
Esc |
Cancel | |
| Notifications | Enter |
Open the post |
a |
Mark all as read | |
| Profile | e |
Edit your about |
k / x |
Add an SSH key from a .pub file / delete the selected key |
Only the actions the forum allows you appear in the footer.
Development
Everything runs in Docker:
docker compose run --rm dev sh -c 'ruff format src tests && ruff check src tests && mypy && pytest'
The tests drive the client and the interface (Textual's Pilot) against a real Tyrtulia instance running in-process, plus a real tyrtulia serve with Unix users inside the container.
e2e/run.sh runs the end-to-end test: on Debian with systemd, ten people use the real TUI in tmux against one Tyrtulia instance installed from PyPI. Five Unix users go through the socket and five SSH key accounts log in over HTTP; they post, answer, mention, edit, moderate, report and search, and see each other's notifications in real time.
License
Tyrtulia TUI is free software, released under the GNU General Public License v3.0 or later.
Metadata
Release files for tyrtulia-tui 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| tyrtulia_tui-1.0.0.tar.gz | 34.6 kB | Without provenance | Details for tyrtulia_tui-1.0.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| tyrtulia_tui-1.0.0-py3-none-any.whl | Python 3 | none | any | Details for tyrtulia_tui-1.0.0-py3-none-any.whl |
Total release size: 74.3 kB
Release files / tyrtulia_tui-1.0.0.tar.gz
| Download URL | tyrtulia_tui-1.0.0.tar.gz |
|---|---|
| Size | 34.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4f73e7cd82cfc9236efe5632aaeccff52d3b3eeeb56fe0f00d8fe0f647a6419e
|
|
BLAKE2b-256 checksum How to use checksums |
6b9df1d3d328cf7dfc8cf2421acfd3117b940f8cab11f0f4f4f616802a92a358
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.3 {"installer":{"name":"uv","version":"0.13.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / tyrtulia_tui-1.0.0-py3-none-any.whl
| Download URL | tyrtulia_tui-1.0.0-py3-none-any.whl |
|---|---|
| Size | 39.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f9bf5c9d33417ea0f03d47771ec99b455e31664ac86a3ffafe6c12487cb0eb70
|
|
BLAKE2b-256 checksum How to use checksums |
e1963cf834d713e91812ee5e4636a111059bcbf916652b357476eae20aaca83f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.13.3 {"installer":{"name":"uv","version":"0.13.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for tyrtulia-tui 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.