A TUI for personal knowledge management — feeds, saved articles, deep research, optional Obsidian export
Project description
wyrd
A small Linux reader for people tired of the feed.
The modern web is mostly other people's machines deciding what you should care about — engagement-tuned timelines, SEO-mulched listicles, ad auctions deciding which article you even see. wyrd is a terminal app built on the opposite premise: you pick the sources, you pick the keywords that matter, articles arrive as plain Markdown stripped of every banner and pop-up, and the only ranking is a transparent keyword score you control. No accounts, no recommendations from a stranger's model, no telemetry from the app itself. The name is Anglo-Saxon for the woven thread of personal fate — your reading list is yours to weave.
Built on RSS / Atom + Hacker News + Reddit — the original, syndication-driven web that still quietly works behind every "feed" — with a deep-research helper that turns Claude loose on the peer-reviewed literature when you want to actually understand something, an embedded terminal for when you don't want to leave, and optional Obsidian export so saved articles become a real local library instead of a bookmark grave on someone else's server.
Requirements: Linux (x86_64 or arm64) with Python 3.12+. wyrd uses
Linux-specific behavior in the embedded terminal (pyte-backed PTY via
os.forkpty). There are no plans to support macOS or Windows — Linux is
the only target I'm interested in maintaining. If you want wyrd on another
platform, a PR is welcome and I'll review it on its merits, but I won't be
writing it myself and I won't gate Linux changes on cross-platform
compatibility. See PLAN.md for the design and roadmap.
What it does
Content discovery. RSS / Atom feeds, Hacker News (top stories), and Reddit
(configurable subreddits) all flow through one scheduler. Audio/video items are
filtered out — it's a reader. Manual refresh with Ctrl+R; auto-refresh runs
quietly on a configurable interval (default hourly) and only notifies when
something new arrives or a source errors. F3 opens an Activity modal
showing recent refresh runs with per-source status and any errors. Plugin
auto-discovery means new sources are a single file drop in plugins/sources/.
Read in-app. Highlighting a feed item fetches the page and renders it as
Markdown right in the TUI (httpx → trafilatura → in-house XML→Markdown
converter that keeps code-block indentation and turns HTML tables into real
GitHub pipe tables). Results are cached. No browser needed for text. o falls
back to opening the URL in a real browser; y copies the URL to your
clipboard (via OSC 52 — works over SSH); Enter or F4 toggles a
reader-focus mode that hides the left panel.
Like → save. l in the Feed snapshots an item into the Saved pane
(d dismisses it). Saved items get editable Tags and Notes alongside
the article, autosaved as you navigate. FTS5-backed search (/) covers
title / summary / article body / notes / tags with bm25 ranking. f in the
Feed cycles between all / interesting only / ranked by keyword score —
the score weights title matches × 3 and summary matches × 1 against your
configured keywords.
Deep research. Press 3, type a topic, hit Enter, and a Claude-driven
agent reads the peer-reviewed literature on it. Each run produces a
structured review paper plus a per-source note with the agent's summary and,
where an open-access copy exists, the full text (PDF or HTML, extracted to
Markdown). Files land in a per-run folder; the left column is a tree of past
runs with live progress while the agent works.
Embedded terminal. 4 opens a pyte-backed PTY running your $SHELL.
F12 detaches; F10 (anywhere) suspends the TUI entirely and drops into a
real shell — the always-works escape hatch.
Obsidian export. Set [obsidian] vault (in config.toml or via the
setup wizard) and every liked article lands as Markdown under
<vault>/<folder>/saved/ while every finished research run lands under
<vault>/<folder>/research/. Direct file writes — no Obsidian CLI or
desktop app required (Obsidian picks up new files automatically). Articles
get YAML frontmatter (url, source, author, published, saved, tags including
wyrd/saved). A like before extraction finishes defers the write until the
worker lands. The wizard has an "Export saved items to vault" button to
migrate everything you'd liked before configuring Obsidian.
Customizable. Theme picker in the setup wizard with live preview;
Ctrl+T cycles themes anywhere. Every app-level key is overridable via
[keys] in config.toml, applied live on save — no restart needed.
Install
uv tool install wyrd-tui # from PyPI (binary is `wyrd`)
uv tool install . # or from a git clone
This puts a wyrd binary on your PATH (under ~/.local/bin by default).
Develop
uv sync # create the venv, install deps
uv run wyrd # launch the TUI
uv run pytest # run the tests
Config lives at ~/.config/wyrd/config.toml, data (the SQLite db) at
~/.local/share/wyrd/wyrd.db. Set WYRD_HOME=/some/dir to relocate both (used by tests).
First run pops the setup wizard — add some RSS feeds (or let Claude suggest them), then Ctrl+R to fetch.
Keys
All shortcuts are configurable — F2 opens the wizard with a "Keybindings" section, or edit [keys] in config.toml directly. Defaults:
1/2— Feed / Saved tabs4— open the embedded terminal (a real$SHELLon a PTY)F12— detach from the embedded terminal (it captures every other key while focused)F10— suspend the TUI and drop into a real$SHELL(escape hatch for anything the embedded emulator mangles)F2— open the setup / preferences wizardF3— open the Activity modal (recent refresh runs; Esc to close)F4— toggle reader focus mode: hides the left panel (feed table / saved list / research tree) so the article fills the screen; works in Feed, Saved, and Researchctrl+r— fetch new content from all configured feedsctrl+t— cycle through Textual themes (persisted to config)- In the Feed pane:
↑/↓browse (the highlighted item's article is fetched and shown as Markdown on the right);Enterenters reader focus mode (article fills the pane —F4exits);llike/save,ddismiss,oopen in a browser if the in-app reader can't parse the page;ycopy the article's URL to the clipboard (via OSC 52 — works over SSH);fcycles the view between all / interesting only (★) / ranked by keyword score;/focuses the search box (FTS5-backed) - In the Saved pane:
↑/↓browse,Enterenters reader focus mode (F4exits), edit Tags/Notes (autosaved on navigate-away),Ctrl+Ssave now,ycopy the article's URL,/focus search ctrl+q— quit (only when the terminal doesn't have focus — detach withF12first)
Project details
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 wyrd_tui-1.0.1.tar.gz.
File metadata
- Download URL: wyrd_tui-1.0.1.tar.gz
- Upload date:
- Size: 65.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0eeb2365c791ba6fe794da28267254048aba2a7403a3f66b5a44813fdd4292be
|
|
| MD5 |
0efe7f70d16f5cac30cabb6f0bc6a087
|
|
| BLAKE2b-256 |
089bfd9fbe8255bf38fa351873b988adae670559728237db4d93c77c1d4258c1
|
File details
Details for the file wyrd_tui-1.0.1-py3-none-any.whl.
File metadata
- Download URL: wyrd_tui-1.0.1-py3-none-any.whl
- Upload date:
- Size: 89.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e9e3f6fb878ad24c668adc095c8168403540dca529cab2bd47010fa5a4af917c
|
|
| MD5 |
08c29d0dedfd97d45ac4ea2e3659cfc7
|
|
| BLAKE2b-256 |
70c49d550224bbc848fb868b5f5505157f5a51e0e40a7b33d2eceb2d9df1486b
|