7fb72f4d99df97d906cd984a4a7202f7d1434dcc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tuipub
A terminal Micropub client for posting notes to your IndieWeb site. It logs in with IndieAuth and is built with Rust and Ratatui. It's developed against StarPunk, but sticks to the spec, so other Micropub servers should work too.
Install
cargo install --path .
Use
tuipub login example.com # opens your browser to approve access
tuipub # write and publish a note
tuipub whoami # show the account and endpoints
tuipub logout # revoke the token and forget the account
Running tuipub with no account starts the login flow first.
Keys
| Key | Action |
|---|---|
| Tab / Shift-Tab | Next / previous field |
| Ctrl-S | Publish (asks to confirm) |
| Ctrl-R | Reload crosspost targets from the server |
| Ctrl-O | Open the last published post |
| Esc / Ctrl-Q | Quit (asks if there's unpublished text) |
| ↑ ↓ / j k, Space, a | Crosspost list: move, toggle, all/none |
Content is sent as written (Markdown for StarPunk). Tags are comma-separated, and a leading # is dropped.
How it works
- Discovery: reads
rel="micropub"andrel="indieauth-metadata"from your site'sLinkheaders and HTML. If there's no metadata link, it falls back toauthorization_endpoint/token_endpoint. - Login: authorization code flow with PKCE (S256). tuipub runs a one-shot callback server on
127.0.0.1:<random port>and useshttp://127.0.0.1:<port>/as itsclient_id. The client ID and redirect URI share an origin, so the server needs no client registration. It checksstateandiss. Scopes requested:create media. - Token storage: the system keyring (Secret Service / gnome-keyring), keyed by your profile URL. Account settings go in
~/.config/tuipub/config.toml. - Posting: always sends a JSON body.
mp-syndicate-tolists exactly the checked targets, and an empty list means "crosspost nowhere". If the target list can't be loaded,mp-syndicate-tois left out and the server's default applies (the confirm dialog says so).
Environment
TUIPUB_TOKEN: use this token instead of the keyring (e.g. one made in StarPunk's/admin/tokens).TUIPUB_CONFIG_DIR: use a different config directory (handy for dev servers).
StarPunk notes
- StarPunk 2.3.3+ stores the Title as the note's
# Headingfirst line. Older versions ignore it, so on those, start the note with# Headinginstead. - Editing, deleting and listing posts aren't supported yet, because StarPunk's Micropub endpoint doesn't implement
update,deleteorq=sourcelisting.
Develop
cargo test
cargo clippy --all-targets -- -D warnings
To try it against a local StarPunk, start it with DEV_MODE=true, SITE_URL/ADMIN_ME/DEV_ADMIN_ME=http://127.0.0.1:8099/, then run TUIPUB_CONFIG_DIR=/tmp/tp tuipub login 127.0.0.1:8099. Bare localhost / 127.* addresses default to http://.
Languages
Rust
100%