miniflux-tui-py
A Python TUI (Terminal User Interface) client for the Miniflux self-hosted RSS reader built with Textual.
Status
Production/Stable
This project has reached production stability with:
- ✅ Comprehensive feature set (categories, feeds, settings, history, runtime theme switching)
- ✅ Non-blocking background operations (sync while using the UI)
- ✅ Robust CI/CD with automated security and quality workflows
- ✅ High test coverage (>60%) across Python 3.11-3.15
- ✅ OpenSSF Best Practices badge
- ✅ Container builds with SLSA attestation
- ✅ Professional documentation and API reference
Features
Core Functionality
- 📖 Browse and read RSS entries with keyboard navigation
- ✓ Mark entries as read/unread, starred/unstarred
- 💾 Save entries to third-party services (Pocket, Instapaper, etc.)
- 🌐 Open in browser or fetch original content for truncated entries
- 📝 HTML to Markdown conversion for readable display
Organization & Filtering
- 🗂️ Multiple sort modes - date (newest first), feed (alphabetical), or status (unread first)
- 📁 Group by feed or category with expand/collapse
- 🔍 Filter by status - unread only or starred only
- 🔎 Search through entries by title or content
- 🏷️ Category management - organize feeds into categories
Feed Management
- 🔄 Auto-discover feeds from URLs
- ⚙️ Configure feeds - scraping rules, rewrite rules, fetch settings, blocklist/allowlist
- 🔁 Refresh feeds - individual feeds or all feeds
- 📊 Feed status - view problematic feeds and errors
- 🛠️ Feed settings editor - comprehensive feed configuration
User Experience
- ⌨️ Keyboard-driven - extensive Vim-style shortcuts
- 🎨 Runtime theme switching - toggle dark/light mode instantly with 'T' key
- 🔄 Non-blocking sync - navigate and read entries while syncing in background
- 📚 Reading history - browse your 200 most recently read entries
- 🔐 Password manager integration for secure credential storage
- 📦 Multi-platform - Linux, macOS, Windows support
Installation
From PyPI (Recommended with uv)
# Install uv (see: https://docs.astral.sh/uv/getting-started/installation/)
# On macOS/Linux: brew install uv
# On Windows: winget install astral-sh.uv
# Or visit https://docs.astral.sh/uv/getting-started/installation/
# Install miniflux-tui-py
uv tool install miniflux-tui-py
# Create configuration
miniflux-tui --init
# Run the application
miniflux-tui
Alternative: Using pip
pip install miniflux-tui-py
miniflux-tui --init
miniflux-tui
Note: After installation with uv tool install or pip install, you can run the application directly with miniflux-tui (no uv run needed). You can also run it as a Python module: python -m miniflux_tui.
Prebuilt Binaries (GitHub Releases)
If you do not want to manage a Python environment, each tagged release now attaches standalone binaries for Linux (x86_64), macOS (arm64), and Windows (x86_64):
- Download the archive for your platform from the GitHub Releases page.
- Extract the archive:
- Linux/macOS:
tar -xzf miniflux-tui-<os>-<arch>.tar.gz - Windows: right-click the
.zipfile and choose Extract All…
- Linux/macOS:
- (Linux/macOS only) Make the binary executable:
chmod +x miniflux-tui - Run the TUI:
./miniflux-tui --init
Note: macOS may quarantine binaries downloaded from the internet. If macOS blocks execution, run
xattr -d com.apple.quarantine miniflux-tuionce after extraction.
Container Image (Docker/Podman)
# Pull the signed image from GitHub Container Registry
# `latest` tracks the default branch. Replace with a release tag (e.g. v0.4.0) to pin.
docker pull ghcr.io/reuteras/miniflux-tui:latest
# Create a configuration directory on the host if it does not exist
mkdir -p ~/.config/miniflux-tui
# Generate a config file (writes to the mounted directory)
docker run --rm -it \
-v ~/.config/miniflux-tui:/home/miniflux/.config/miniflux-tui \
ghcr.io/reuteras/miniflux-tui:latest \
--init
# Launch the TUI (shares configuration and uses your terminal)
docker run --rm -it \
-v ~/.config/miniflux-tui:/home/miniflux/.config/miniflux-tui \
ghcr.io/reuteras/miniflux-tui:latest
The image is built-in CI, published to GHCR, and signed with Sigstore Cosign using GitHub OIDC so you can verify it with:
cosign verify ghcr.io/reuteras/miniflux-tui:latest
From Source (For Developers)
# Install uv (see: https://docs.astral.sh/uv/getting-started/installation/)
# On macOS/Linux: brew install uv
# On Windows: winget install astral-sh.uv
# Or visit https://docs.astral.sh/uv/getting-started/installation/
# Clone the repository
git clone https://github.com/reuteras/miniflux-tui-py.git
cd miniflux-tui-py
# Install all dependencies (including dev and docs)
uv sync --all-groups
# Create default configuration
uv run miniflux-tui --init
# Run the application (use 'uv run' when running from source without installing)
uv run miniflux-tui
Note: uv run is only needed when running from source without installing the package. After installing with uv tool install or pip install, use miniflux-tui directly.
Documentation
Full documentation is available at reuteras.github.io/miniflux-tui-py
GitHub Codespaces
GitHub Codespaces provides a preconfigured, browser-accessible development
environment that works well with the terminal-based interface of
miniflux-tui-py. This repository includes a .devcontainer/devcontainer.json
so every Codespace starts from a Python 3.13+ image, installs uv, and runs
uv sync --locked --all-groups automatically. After the first boot you can launch the
TUI with the same commands documented in the
From Source section:
uv run miniflux-tui --init
uv run miniflux-tui
To verify the setup before running the application, use:
uv run miniflux-tui --check-config
Keeping your Miniflux credentials secret
Use Codespaces secrets to store your credentials so only the Codespaces that you start can read them:
- In the repository, go to Settings → Codespaces secrets and add two secrets:
MINIFLUX_SERVER_URL: Your Miniflux server URL (e.g.https://miniflux.example.com)MINIFLUX_API_KEY: Your Miniflux API token
- Launch a Codespace for this repository. GitHub injects the secrets into the environment each time the Codespace starts. If both secrets are present and no config file exists, miniflux-tui will create a Codespaces-optimized config automatically on first run.
- To create the config manually instead, run
miniflux-tui --init-codespace.
Each collaborator must define their own secrets—your personal Codespaces secrets are never shared with other users, and theirs are not shared with you. Avoid writing raw tokens to tracked files inside the Codespace so they are not accidentally committed.
The Codespace is set up so the Visual Studio Code Testing view is ready to run the project's
pytest suite without extra configuration. Visual Studio Code also auto-formats Python files
with Ruff on save and wires up the default interpreter to the repo's .venv, so
the editor, formatter, and tests all work straight away.
Configuration
Create a configuration file at:
- Linux:
~/.config/miniflux-tui/config.toml - macOS:
~/.config/miniflux-tui/config.toml - Windows:
%APPDATA%\miniflux-tui\config.toml
Example configuration:
server_url = "https://miniflux.example.com"
password = ["op", "read", "op://Personal/Miniflux/API Token"]
allow_invalid_certs = false
[theme]
unread_color = "cyan"
read_color = "gray"
[sorting]
default_sort = "feed" # Options: "feed", "date", "status"
default_group_by_feed = false
Retrieving your API token securely
Miniflux authenticates using API tokens. Instead of storing the token directly
in config.toml, configure the password field with a command that prints the
token to stdout. This keeps the secret in your password manager (for example
1Password, Bitwarden, or pass).
To create a token:
-
Log into your Miniflux server.
-
Go to Settings → API Keys → Create a new API key.
-
Store the generated token in your password manager.
-
Update the
passwordcommand so it outputs the token, e.g.:# 1Password example password = ["op", "read", "op://Personal/Miniflux/API Token"] # Environment variable example password = ["/bin/sh", "-c", "printf %s \"$MINIFLUX_TOKEN\""]
Keyboard Shortcuts
Entry List View
| Key | Action |
|---|---|
| ↑/↓ or k/j | Navigate entries |
| Enter | Open entry |
| m | Toggle read/unread |
| * | Toggle star |
| e | Save entry to third-party service |
| s | Cycle sort mode (date/feed/status) |
| g | Toggle grouping by feed |
| c | Toggle grouping by category |
| Shift+G | Expand all feeds/categories (when grouped) |
| Shift+Z | Collapse all feeds/categories (when grouped) |
| h or ← | Collapse individual feed/category (when grouped) |
| l or → | Expand individual feed/category (when grouped) |
| X | Open feed settings (when on a feed) |
| r | Refresh current feed on server |
| Shift+R | Refresh all feeds on server |
| , | Sync entries from server (fetch new) |
| u | Show unread entries only |
| t | Show starred entries only |
| / | Search entries (interactive dialog) |
| Shift+M | Manage categories |
| Shift+H | Toggle reading history view |
| Shift+X | Open scraping rule helper |
| Shift+T | Toggle theme (dark/light) |
| ? | Show keyboard help |
| i | Show system status |
| Shift+S | Show TUI settings |
| q | Quit application |
Entry Reader View
| Key | Action |
|---|---|
| ↑/↓ or k/j | Scroll up/down |
| PageUp/PageDown | Fast scroll |
| J | Next entry |
| K | Previous entry |
| u | Mark as unread |
| * | Toggle star |
| e | Save entry to third-party service |
| o | Open in browser |
| f | Fetch original content |
| X | Open feed settings |
| Shift+X | Open scraping rule helper |
| b or Esc | Back to list |
| ? | Show keyboard help |
| i | Show system status |
| Shift+S | Show TUI settings |
Contributing
Contributions are welcome! See CONTRIBUTING.md for details on:
- Setting up your development environment
- Running tests and checks
- Submitting pull requests
For release information and troubleshooting, see:
- RELEASE.md - How to create releases
- docs/RELEASE_TROUBLESHOOTING.md - Handling release failures
Development
# Install all development dependencies
uv sync --all-groups
# Lint code
uv run ruff check .
# Type check
uv run pyright miniflux_tui tests
# Run tests
uv run pytest tests --cov=miniflux_tui
# Preview documentation locally
uv run zensical serve
Why Python?
This project is a Python implementation of cliflux (Rust), created since I don't now Rust and wanted to do some changes to that code.
License
MIT License - see LICENSE file for details.
Related Projects
Metadata
Release files for miniflux-tui-py 0.8.15
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| miniflux_tui_py-0.8.15.tar.gz | 470.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| miniflux_tui_py-0.8.15-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 602.2 kB
Release files / miniflux_tui_py-0.8.15.tar.gz
| Download URL | miniflux_tui_py-0.8.15.tar.gz |
|---|---|
| Size | 470.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e249feeb3ea6b9d6f6e96caf00e300b211198202a98d8b67de993d8ed14740f2
|
|
BLAKE2b-256 checksum How to use checksums |
650cef42aa956c4a65a8adab78c0e52a258984b0f778c7613b668d0f83b124be
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.
Transparency logRelease files / miniflux_tui_py-0.8.15-py3-none-any.whl
| Download URL | miniflux_tui_py-0.8.15-py3-none-any.whl |
|---|---|
| Size | 131.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
10e5b3d5406a4902ea1864cafb3337de9ff765446f5a2e37b94c3f77b7ada59d
|
|
BLAKE2b-256 checksum How to use checksums |
493a7cdd8951dfa166047b711c3b16c2aaec5fc1bf40eb6a0105e53c667e79b9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Aug 14, 2026.
Transparency log