{"id":33863899,"url":"https://github.com/timkicker/podliner","last_synced_at":"2026-04-25T19:02:03.739Z","repository":{"id":319508285,"uuid":"1058216871","full_name":"timkicker/podliner","owner":"timkicker","description":"Podcasts in any terminal. Fast, clean, offline.","archived":false,"fork":false,"pushed_at":"2026-02-21T00:03:54.000Z","size":2257,"stargazers_count":134,"open_issues_count":9,"forks_count":5,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-21T05:17:13.948Z","etag":null,"topics":["cross-platform","dotnet","podcast","tui"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/timkicker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-16T19:32:02.000Z","updated_at":"2026-02-21T01:47:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"21ce00da-4441-45a3-be1b-1be5b987d526","html_url":"https://github.com/timkicker/podliner","commit_stats":null,"previous_names":["timkicker/podliner"],"tags_count":54,"template":false,"template_full_name":null,"purl":"pkg:github/timkicker/podliner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timkicker%2Fpodliner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timkicker%2Fpodliner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timkicker%2Fpodliner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timkicker%2Fpodliner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/timkicker","download_url":"https://codeload.github.com/timkicker/podliner/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/timkicker%2Fpodliner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32273223,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T18:29:39.964Z","status":"ssl_error","status_checked_at":"2026-04-25T18:29:32.149Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cross-platform","dotnet","podcast","tui"],"created_at":"2025-12-09T12:00:34.066Z","updated_at":"2026-04-25T19:02:03.733Z","avatar_url":"https://github.com/timkicker.png","language":"C#","funding_links":[],"categories":["Table of Contents"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n \u003cimg alt=\"podliner\" src=\"assets/branding/podliner-logo-alt.png\" width=\"360\"\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003ePodcasts in any terminal. Fast, clean, offline. \u003c/b\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003c!-- Badges: replace with real links --\u003e\n  \u003ca href=\"https://github.com/timkicker/podliner/actions\"\u003e\n    \u003cimg alt=\"CI\" src=\"https://img.shields.io/github/actions/workflow/status/timkicker/podliner/release.yml?label=build\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/timkicker/podliner/releases/latest\"\u003e\n    \u003cimg alt=\"Release\" src=\"https://img.shields.io/github/v/release/timkicker/podliner?display_name=tag\u0026sort=semver\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\n    \u003cimg alt=\"License\" src=\"https://img.shields.io/badge/license-GPLv3-blue.svg\"\u003e\n  \u003c/a\u003e\n  \u003cimg alt=\"Platforms\" src=\"https://img.shields.io/badge/platforms-linux%20%7C%20macOS%20%7C%20windows-666\"\u003e\n\u003c/p\u003e\n\n---\n\n## Table of Contents\n- [Why podliner?](#why-podliner)\n- [Screenshots](#screenshots)\n- [Install (stable releases)](#install-stable-releases)\n- [Quick start](#quick-start)\n- [Migrate from other players (OPML)](#migrate-from-other-players-opml)\n- [gPodder sync](#gpodder-sync)\n- [Commands (essentials)](#commands-essentials)\n- [Configuration \u0026 data](#configuration--data)\n- [Audio engines](#audio-engines)\n- [FAQ / Troubleshooting](#faq--troubleshooting)\n- [Contributing](#contributing)\n- [Bug reports, logs \u0026 roadmap](#bug-reports-logs--roadmap)\n- [License \u0026 credits](#license--credits)\n\n---\n\n## Why podliner? \n\n- **Keyboard-first \u0026 mouse-friendly.** Full mouse support (click, select, scroll) with fast TUI feedback.\n- **Vim keys \u0026 commands.** Familiar navigation (`j/k`, `gg/G`, `/` to search) plus concise colon-commands (`:add \u003curl\u003e`, `:queue add`, `:opml import`, `:opml export`).\n- **Chapters.** Podcast-2.0 `\u003cpodcast:chapters\u003e` JSON and ID3 CHAP frames, with a dedicated Chapters tab and `,`/`.` keys to jump.\n- **Sync progress and subscriptions** via the gPodder API (gpodder.net + Nextcloud gPodder-Sync, auto-detected).\n- **MPRIS on Linux.** Media keys (play/pause/next/prev) and status from `playerctl`, KDE/GNOME widgets, etc.\n- **Offline-ready.** Download episodes, resume where you left off, manage a queue.\n- **Sleep timer.** `:sleep 30m` / `:sleep 1h30m` to stop playback after a duration.\n- **Per-feed settings.** Speed override (`:feed speed 1.5`) and auto-download (`:feed auto-download on`) per subscription.\n- **Undo** for destructive actions like queue clear.\n- **Easy migration.** OPML import/export to move subscriptions between players.\n- **Cross-platform.** Single-file builds for Linux, macOS, and Windows.\n- **Engine choice.** Works with mpv, ffplay (FFmpeg), or VLC where available.\n\n\u003e No telemetry. Config lives in your user profile. All local.\n\n\n## Screenshots\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/screens/02-details.png\"  alt=\"Episode-details with shownotes\" width=\"48%\"/\u003e\n  \u003cimg src=\"assets/screens/03-help.png\" alt=\"Help - Commands and Shortcuts\" width=\"48%\"/\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/screens/01-episodes.png\" alt=\"Episodelist with player\" width=\"70%\"/\u003e\n\u003c/p\u003e\n\n\n## Install (stable releases)\n\n### Linux\n```bash\nbash \u003c(curl -fsSL https://github.com/timkicker/podliner/releases/latest/download/install.sh)\n```\nOr via the [AUR](https://aur.archlinux.org/packages/podliner-bin): `yay -S podliner-bin`\n\n### macOS\n```bash\nbash \u003c(curl -fsSL https://github.com/timkicker/podliner/releases/latest/download/install-macos.sh)\n```\n\n### Windows (Powershell)\n\nVia [winget](https://winstall.app/apps/TimKicker.Podliner):\n```powershell\nwinget install --id=TimKicker.Podliner  -e\n```\n\nVia installer:\n```powershell\nirm https://github.com/timkicker/podliner/releases/latest/download/install.ps1 | iex\n```\n\n\u003e Looking for system-wide install, uninstall, pruning, or checksum verification? See the [FAQ](#faq--troubleshooting).\n\n\n## Migrate from other players (OPML)\n\nMost podcast players support **OPML** export/import.\n\n- **Export** your subscriptions from the old player as an `.opml` file (e.g. `subscriptions.opml`).\n- In **podliner**, run `:opml import \u003cpath\u003e` to import.\n- To **export** your current subscriptions from podliner, run `:opml export`. With no path, it writes to your **Documents** folder as:\n  - Linux/macOS: `~/Documents/podliner-feeds.opml`\n  - Windows: `%USERPROFILE%\\Documents\\podliner-feeds.opml`\n- If you prefer to drop files in place, podliner stores its config here:\n  - Linux/macOS: `${XDG_CONFIG_HOME}/podliner` or `~/.config/podliner`\n  - Windows: `%APPDATA%\\podliner`\n\n\n\n## gPodder sync\n\nPodliner syncs your subscriptions and play history with any gPodder-compatible server. Two protocol flavors are supported and auto-detected at login:\n\n- **gpodder.net** (public) + self-hosted gpodder API v2 servers (mygpo, opodsync, podfetch…).\n- **Nextcloud** with the [gPodder-Sync](https://github.com/thrillfall/nextcloud-gpodder) app.\n\n**Quick start**\n```\n# gpodder.net\n:sync login https://gpodder.net \u003cusername\u003e \u003cpassword\u003e\n\n# Nextcloud (plain username/password works; see 2FA note below)\n:sync login https://cloud.example.com \u003cusername\u003e \u003cpassword\u003e\n\n:sync          ← pull + push (full sync)\n:sync auto on  ← sync automatically on startup and exit\n```\n\n**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 \u0026 sessions → *Create new app password*) and use that.\n\nThe 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.\n\nCredentials 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.\n\n## Commands (essentials)\n\u003e Full help browser: `:h`  |  Full list: see [COMMANDS](./COMMANDS.md)\n\n**Playback**\n- Enter: play selected\n- Space: pause/resume\n- Left/Right: seek 10s backward/forward\n- `[` / `]`: slower / faster\n- `,` / `.`: previous / next chapter (if available)\n- `:sleep 30m` | `:sleep 1h30m` | `:sleep off`: sleep timer\n\n**Navigation \u0026 filters**\n- j / k: move down / up\n- gg / G: jump to top / bottom\n- / : search in current list\n- u : toggle \"unplayed only\"\n- `i`: open Shownotes tab • `Esc`: back to episodes\n\n**Chapters**\n- Dedicated **Chapters** tab next to Episodes/Details; shows `Chapters (N)` with a count\n- `,` / `.`: jump to previous / next chapter globally\n- Enter on a chapter row: seek to that chapter\n- `:chapter list|next|prev|jump \u003cn\u003e`: explicit commands\n- Chapters come from Podcast-2.0 `\u003cpodcast:chapters\u003e` URLs and ID3 CHAP frames (local file or HTTP Range)\n\n**Downloads \u0026 queue**\n- d : download or show status\n- :feed queue : switch to queue view\n- :queue add|rm|clear|shuffle : queue ops for selected episode\n- :play-next / :play-prev : next/previous in queue\n- `:undo` : revert the last destructive action (e.g. `:queue clear`)\n\n**Feeds**\n- `:add \u003curl\u003e` : add feed\n- `:feed all|saved|downloaded|history|queue` : switch view\n- `:feed speed \u003cn|off\u003e` : per-feed playback speed override (e.g. `:feed speed 1.5`)\n- `:feed auto-download on|off` : auto-queue new episodes from this feed for download\n\n**Misc**\n- t : toggle theme\n- q : quit\n- :w / :wq : save / save \u0026 quit\n\n\n## Configuration \u0026 data\n\n- **Config**:\n  - Linux: `$XDG_CONFIG_HOME/podliner/` (fallback: `~/.config/podliner/`)\n  - macOS: `$XDG_CONFIG_HOME/podliner/` (fallback: `~/.config/podliner/`)\n  - Windows: `%APPDATA%\\podliner\\`\n- **Logs**:\n  - Linux: `$XDG_STATE_HOME/podliner/logs/` (fallback: `~/.local/state/podliner/logs/`)\n  - Windows: `%LOCALAPPDATA%\\podliner\\logs\\`\n  - File pattern: `podliner-.log` (daily)\n  - Example: `…/podliner/logs/podliner-YYYYMMDD.log`\n- **Downloads**: `~/Podcasts/` by default (all platforms). Override at runtime with `:downloads set-dir \u003cpath\u003e` (or `set-dir reset` to restore default), or by setting `DownloadDir` in `appsettings.json`.\n- **OPML**: imports/exports under [Migrate from other players (OPML)](#migrate-from-other-players-opml)\n\n\u003e Back up `appsettings.json` and `library.json` to migrate settings and library to another machine.\n\n\n## Audio engines\npodliner can use different players:\n- **VLC** (via LibVLC; bundled on Windows via `VideoLAN.LibVLC.Windows`, install `vlc` on Linux/macOS). Preferred: full seek/speed/volume support.\n- **mpv** (IPC socket). Full feature support.\n- **Media Foundation** (Windows only, built-in). No playback speed control.\n- **ffplay** (part of ffmpeg). Fallback only: coarse seek by restart, no live speed/volume.\n\nInstall examples:\n- Debian/Ubuntu: `sudo apt-get install -y vlc mpv ffmpeg`\n- Fedora: `sudo dnf install -y vlc mpv ffmpeg`\n- Arch: `sudo pacman -S --needed vlc mpv ffmpeg`\n- macOS: `brew install --cask vlc \u0026\u0026 brew install mpv ffmpeg`\n- Windows: VLC is bundled; `mpv`/`ffmpeg` optional via your package manager of choice.\n\nEngine selection \u0026 fallback:\n- Default is `auto`: tries VLC first, then an OS-specific fallback chain (Windows: MediaFoundation → mpv → ffplay; Linux/macOS: mpv → ffplay).\n- Switch engines at runtime with `:engine vlc|mpv|ffplay|mediafoundation`.\n- `:play-source auto|local|remote` controls whether to prefer local downloads or the remote URL.\n\n## FAQ / Troubleshooting\n\n### \"No audio engine found”\n\n- Install one of: **mpv**, **ffplay** (ffmpeg), or **VLC**. See [Audio engines](#audio-engines).\n\n### System-wide install?  \n- Linux/macOS: add `--system` to the install command.  \n- Windows (PowerShell): run `Install-Podliner -System` after the bootstrap line.\n\n### Update / Uninstall / Prune\n- Update to latest stable: re-run the install command for your OS.  \n- Uninstall (Linux):\n  ```bash\n  bash \u003c(curl -fsSL https://github.com/timkicker/podliner/releases/latest/download/install.sh) --uninstall\n  ```\n- Uninstall (macOS):\n  ```bash\n  bash \u003c(curl -fsSL https://github.com/timkicker/podliner/releases/latest/download/install-macos.sh) --uninstall\n  ```\n- Uninstall (Windows, PowerShell):\n  ```powershell\n  irm https://github.com/timkicker/podliner/releases/latest/download/install.ps1 | iex\n  Uninstall-Podliner\n  ```\n- Prune old versions (keep active): use `--prune` on Linux/macOS or `Prune-Podliner` on Windows.\n\n### Verify checksums\n\n```bash\n# Download checksums (stable)\ncurl -fsSLO https://github.com/timkicker/podliner/releases/latest/download/SHA256SUMS\n\n# Example: verify Linux x64 tarball\ncurl -fsSLO https://github.com/timkicker/podliner/releases/latest/download/podliner-linux-x64.tar.gz\ngrep 'podliner-linux-x64.tar.gz$' SHA256SUMS | sha256sum -c -\n```\n\n### podliner: command not found\nAdd install path to `PATH`:\n\n- Linux: `export PATH=\"$HOME/.local/bin:$PATH\"` (in `~/.bashrc` / `~/.zshrc`)\n- macOS: `export PATH=\"$HOME/bin:$PATH\"` (in `~/.zprofile` / `~/.zshrc`)\n- Windows: ensure `%LOCALAPPDATA%\\Microsoft\\WindowsApps` is on PATH\n\n### Reset config\nQuit, then move the config directory away (see [Configuration \u0026 data](#configuration--data)), restart to re-initialize.\n\n\n## Contributing\nI welcome all focused PRs.\n\nPlease take a look at [ROADMAP.md](./ROADMAP.md)\n\n**Local dev:**\n```bash\ndotnet build\ndotnet run --project StuiPodcast.App\n```\n\n**Guidelines (short):**\n- C# with `nullable` enabled; keep logging via Serilog.\n- Prioritize robustness and UX over features.\n\n**PR flow:**\n- Fork → branch → PR to `main`\n\n## Bug reports, logs \u0026 roadmap\nWhen filing an issue, please include:\n- `podliner --version` output (shows exact version + RID)\n- OS + architecture (e.g., `linux-x64`, `osx-arm64`, `win-x64`)\n- Steps to reproduce (short and precise)\n- **Logs**: attach the most recent file from `logs/` next to the binary (pattern `podliner-*.log`)  \n  Example: `…/podliner/logs/podliner-20250101.log`\n\nSecurity-sensitive issues: contact tim@kicker.dev.  \n\n\n## License and credits\n\n- License: [GPLv3](LICENSE)\n\n**Libraries used**\n- [Terminal.Gui](https://github.com/migueldeicaza/gui.cs) - TUI framework\n- [Serilog](https://serilog.net/) and [Serilog.Sinks.File](https://github.com/serilog/serilog-sinks-file) - logging\n- [AngleSharp](https://anglesharp.github.io/) - HTML parsing\n- [CodeHollow.FeedReader](https://github.com/codehollow/FeedReader) - RSS/Atom parsing\n- [LibVLCSharp](https://github.com/videolan/libvlcsharp) - VLC bindings\n- [VideoLAN.LibVLC.Windows](https://www.nuget.org/packages/VideoLAN.LibVLC.Windows) - LibVLC binaries for Windows\n- [NAudio](https://github.com/naudio/NAudio) - Windows audio helpers (Media Foundation)\n- [Tmds.DBus](https://github.com/tmds/Tmds.DBus) - D-Bus client (MPRIS on Linux)\n\n**Engines and tools**\n- [VLC](https://www.videolan.org/) - media engine (via LibVLC)\n- [mpv](https://mpv.io/) - media engine (optional)\n- [FFmpeg / ffplay](https://ffmpeg.org/) - tools and fallback playback\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimkicker%2Fpodliner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftimkicker%2Fpodliner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftimkicker%2Fpodliner/lists"}