Podcasts in any terminal. Fast, clean, offline.
- Why podliner?
- Screenshots
- Install (stable releases)
- Quick start
- Migrate from other players (OPML)
- gPodder sync
- Commands (essentials)
- Configuration & data
- Audio engines
- FAQ / Troubleshooting
- Contributing
- Bug reports, logs & roadmap
- License & credits
- Keyboard-first & mouse-friendly. Full mouse support (click, select, scroll) with fast TUI feedback.
- Vim keys & commands. Familiar navigation (
j/k,gg/G,/to search) plus concise colon-commands (:add <url>,:queue add,:opml import,:opml export). - Chapters. Podcast-2.0
<podcast:chapters>JSON and ID3 CHAP frames, with a dedicated Chapters tab and,/.keys to jump. - Sync progress and subscriptions via the gPodder API (gpodder.net + Nextcloud gPodder-Sync, auto-detected).
- MPRIS on Linux. Media keys (play/pause/next/prev) and status from
playerctl, KDE/GNOME widgets, etc. - Offline-ready. Download episodes, resume where you left off, manage a queue.
- Sleep timer.
:sleep 30m/:sleep 1h30mto stop playback after a duration. - Per-feed settings. Speed override (
:feed speed 1.5) and auto-download (:feed auto-download on) per subscription. - Undo for destructive actions like queue clear.
- Easy migration. OPML import/export to move subscriptions between players.
- Cross-platform. Single-file builds for Linux, macOS, and Windows.
- Engine choice. Works with mpv, ffplay (FFmpeg), or VLC where available.
No telemetry. Config lives in your user profile. All local.
bash <(curl -fsSL https://github.com/timkicker/podliner/releases/latest/download/install.sh)Or via the AUR: yay -S podliner-bin
bash <(curl -fsSL https://github.com/timkicker/podliner/releases/latest/download/install-macos.sh)Via winget:
winget install --id=TimKicker.Podliner -eVia installer:
irm https://github.com/timkicker/podliner/releases/latest/download/install.ps1 | iexLooking for system-wide install, uninstall, pruning, or checksum verification? See the FAQ.
Most podcast players support OPML export/import.
- Export your subscriptions from the old player as an
.opmlfile (e.g.subscriptions.opml). - In podliner, run
:opml import <path>to import. - To export your current subscriptions from podliner, run
:opml export. With no path, it writes to your Documents folder as:- Linux/macOS:
~/Documents/podliner-feeds.opml - Windows:
%USERPROFILE%\Documents\podliner-feeds.opml
- Linux/macOS:
- If you prefer to drop files in place, podliner stores its config here:
- Linux/macOS:
${XDG_CONFIG_HOME}/podlineror~/.config/podliner - Windows:
%APPDATA%\podliner
- Linux/macOS:
Podliner syncs your subscriptions and play history with any gPodder-compatible server. Two protocol flavors are supported and auto-detected at login:
- gpodder.net (public) + self-hosted gpodder API v2 servers (mygpo, opodsync, podfetch…).
- Nextcloud with the gPodder-Sync app.
Quick start
# gpodder.net
:sync login https://gpodder.net <username> <password>
# Nextcloud (plain username/password works; see 2FA note below)
:sync login https://cloud.example.com <username> <password>
:sync ← pull + push (full sync)
:sync auto on ← sync automatically on startup and exit
Nextcloud + 2FA / WebAuthn: generic Basic-Auth with your normal password fails with HTTP 401 on 2FA-enabled accounts. Create a dedicated App-Password in Nextcloud (Settings → Security → Devices & sessions → Create new app password) and use that.
The detected flavor is stored in gpodder.json so subsequent launches don't re-probe. :sync status shows which flavor is active. Run :sync help in the app for the full command reference.
Credentials are stored in the OS keyring when available (libsecret on Linux, Keychain on macOS, Credential Store on Windows), with a plaintext fallback in gpodder.json if the keyring is unavailable.
Full help browser:
:h| Full list: see COMMANDS
Playback
- Enter: play selected
- Space: pause/resume
- Left/Right: seek 10s backward/forward
[/]: slower / faster,/.: previous / next chapter (if available):sleep 30m|:sleep 1h30m|:sleep off: sleep timer
Navigation & filters
- j / k: move down / up
- gg / G: jump to top / bottom
- / : search in current list
- u : toggle "unplayed only"
i: open Shownotes tab •Esc: back to episodes
Chapters
- Dedicated Chapters tab next to Episodes/Details; shows
Chapters (N)with a count ,/.: jump to previous / next chapter globally- Enter on a chapter row: seek to that chapter
:chapter list|next|prev|jump <n>: explicit commands- Chapters come from Podcast-2.0
<podcast:chapters>URLs and ID3 CHAP frames (local file or HTTP Range)
Downloads & queue
- d : download or show status
- :feed queue : switch to queue view
- :queue add|rm|clear|shuffle : queue ops for selected episode
- :play-next / :play-prev : next/previous in queue
:undo: revert the last destructive action (e.g.:queue clear)
Feeds
:add <url>: add feed:feed all|saved|downloaded|history|queue: switch view:feed speed <n|off>: per-feed playback speed override (e.g.:feed speed 1.5):feed auto-download on|off: auto-queue new episodes from this feed for download
Misc
- t : toggle theme
- q : quit
- :w / :wq : save / save & quit
- Config:
- Linux:
$XDG_CONFIG_HOME/podliner/(fallback:~/.config/podliner/) - macOS:
$XDG_CONFIG_HOME/podliner/(fallback:~/.config/podliner/) - Windows:
%APPDATA%\podliner\
- Linux:
- Logs:
- Linux:
$XDG_STATE_HOME/podliner/logs/(fallback:~/.local/state/podliner/logs/) - Windows:
%LOCALAPPDATA%\podliner\logs\ - File pattern:
podliner-.log(daily) - Example:
…/podliner/logs/podliner-YYYYMMDD.log
- Linux:
- Downloads:
~/Podcasts/by default (all platforms). Override at runtime with:downloads set-dir <path>(orset-dir resetto restore default), or by settingDownloadDirinappsettings.json. - OPML: imports/exports under Migrate from other players (OPML)
Back up
appsettings.jsonandlibrary.jsonto migrate settings and library to another machine.
podliner can use different players:
- VLC (via LibVLC; bundled on Windows via
VideoLAN.LibVLC.Windows, installvlcon Linux/macOS). Preferred: full seek/speed/volume support. - mpv (IPC socket). Full feature support.
- Media Foundation (Windows only, built-in). No playback speed control.
- ffplay (part of ffmpeg). Fallback only: coarse seek by restart, no live speed/volume.
Install examples:
- Debian/Ubuntu:
sudo apt-get install -y vlc mpv ffmpeg - Fedora:
sudo dnf install -y vlc mpv ffmpeg - Arch:
sudo pacman -S --needed vlc mpv ffmpeg - macOS:
brew install --cask vlc && brew install mpv ffmpeg - Windows: VLC is bundled;
mpv/ffmpegoptional via your package manager of choice.
Engine selection & fallback:
- Default is
auto: tries VLC first, then an OS-specific fallback chain (Windows: MediaFoundation → mpv → ffplay; Linux/macOS: mpv → ffplay). - Switch engines at runtime with
:engine vlc|mpv|ffplay|mediafoundation. :play-source auto|local|remotecontrols whether to prefer local downloads or the remote URL.
- Install one of: mpv, ffplay (ffmpeg), or VLC. See Audio engines.
- Linux/macOS: add
--systemto the install command. - Windows (PowerShell): run
Install-Podliner -Systemafter the bootstrap line.
- Update to latest stable: re-run the install command for your OS.
- Uninstall (Linux):
bash <(curl -fsSL https://github.com/timkicker/podliner/releases/latest/download/install.sh) --uninstall - Uninstall (macOS):
bash <(curl -fsSL https://github.com/timkicker/podliner/releases/latest/download/install-macos.sh) --uninstall - Uninstall (Windows, PowerShell):
irm https://github.com/timkicker/podliner/releases/latest/download/install.ps1 | iex Uninstall-Podliner
- Prune old versions (keep active): use
--pruneon Linux/macOS orPrune-Podlineron Windows.
# Download checksums (stable)
curl -fsSLO https://github.com/timkicker/podliner/releases/latest/download/SHA256SUMS
# Example: verify Linux x64 tarball
curl -fsSLO https://github.com/timkicker/podliner/releases/latest/download/podliner-linux-x64.tar.gz
grep 'podliner-linux-x64.tar.gz$' SHA256SUMS | sha256sum -c -Add install path to PATH:
- Linux:
export PATH="$HOME/.local/bin:$PATH"(in~/.bashrc/~/.zshrc) - macOS:
export PATH="$HOME/bin:$PATH"(in~/.zprofile/~/.zshrc) - Windows: ensure
%LOCALAPPDATA%\Microsoft\WindowsAppsis on PATH
Quit, then move the config directory away (see Configuration & data), restart to re-initialize.
I welcome all focused PRs.
Please take a look at ROADMAP.md
Local dev:
dotnet build
dotnet run --project StuiPodcast.AppGuidelines (short):
- C# with
nullableenabled; keep logging via Serilog. - Prioritize robustness and UX over features.
PR flow:
- Fork → branch → PR to
main
When filing an issue, please include:
podliner --versionoutput (shows exact version + RID)- OS + architecture (e.g.,
linux-x64,osx-arm64,win-x64) - Steps to reproduce (short and precise)
- Logs: attach the most recent file from
logs/next to the binary (patternpodliner-*.log)
Example:…/podliner/logs/podliner-20250101.log
Security-sensitive issues: contact tim@kicker.dev.
- License: GPLv3
Libraries used
- Terminal.Gui - TUI framework
- Serilog and Serilog.Sinks.File - logging
- AngleSharp - HTML parsing
- CodeHollow.FeedReader - RSS/Atom parsing
- LibVLCSharp - VLC bindings
- VideoLAN.LibVLC.Windows - LibVLC binaries for Windows
- NAudio - Windows audio helpers (Media Foundation)
- Tmds.DBus - D-Bus client (MPRIS on Linux)
Engines and tools
- VLC - media engine (via LibVLC)
- mpv - media engine (optional)
- FFmpeg / ffplay - tools and fallback playback



