Repository navigation
Releases: kazimics/podara
Releases · kazimics/podara
Release list
v1.0.2
v1.0.2 - 2026-07-28
Changed
- Release builds now verify that the Git tag matches
packageVersion, run the complete test suite, and smoke-test the packaged application before producing installers - CI now runs the complete desktop test suite instead of maintaining an explicit test allowlist
Fixed
- OPML import now rejects oversized documents, DOCTYPE declarations, external entities, external DTDs, and entity-expansion payloads
- Podcast feed fetching now falls back to a conditional GET when HEAD is rejected or fails, and limits response bodies to 10 MiB
- Download paths now use stable feed and episode hashes, preventing same-title overwrites, directory traversal, invalid Windows device names, and title changes breaking paused downloads
- Podcast creation, subscription refresh, cache metadata updates, and queue replacement now use database transactions so partial failures roll back cleanly
- JDBC statements and result sets are now closed deterministically across all database DAOs
- System window close requests now respect saved close behavior and persist the playback session before quitting
- Queue removal, paused-download resume, safe audio extensions, subscription metadata refresh, and RSS cache handling received additional correctness fixes
Tests
- Added regression coverage for malicious and oversized OPML, HEAD fallback, feed-size limits, download path safety, same-title downloads, and transactional rollback
- Replaced external MP3 dependencies in download tests with deterministic local HTTP servers
v1.0.1
v1.0.1 — 2026-07-13
Fixed
- Queue episode cards now fall back to the podcast artwork when an episode has no cover image, consistent with the
episode list behavior (applies to playback initiated from PodcastDetail, History, Favorites, and Downloads) - Add Podcast dialog now shows a centered loading spinner with "Adding…" while the RSS feed is being fetched, and only
closes on success
v1.0.0
Podara 1.0.0
We’re excited to announce the first stable release of Podara, a desktop podcast player for Windows.
Highlights
Refined desktop experience
- Introduced a cohesive metallic visual system with improved hover, pressed, border, and accent states across
controls. - Redesigned Subscriptions, History, Favorites, and Downloads with consistent episode cards, spacing, empty states,
selection toolbars, and actions. - Improved playback queue and full-player controls with clearer hierarchy and consistent pill-style actions.
- Standardized dropdown menus, toolbar actions, Settings controls, and in-app dialogs.
- Added a persistent Add Podcast action on the Subscriptions page, so RSS feeds can be added even when
subscriptions already exist.
Playback and library
- Episode favorites are available throughout the app, with a dedicated Favorites page.
- Playback is context-aware: playing from History, Favorites, Podcast Details, or Downloads continues through that
screen’s episode list. - Queue actions include visual feedback when episodes are added.
- Playback position, queue, speed, and volume are persisted between sessions.
- System tray controls and configurable close behavior let audio continue while the main window is hidden.
Fixes
- Fixed the currently playing item highlight in History.
- Fixed paused and active download transitions to keep task state, progress, and actions consistent.
- Fixed Recent Update subscription sorting to use each podcast’s latest episode date.
- Fixed episodes played from Favorites not being recorded in listening history.
- Improved download-resume handling when a server ignores range requests.
- Preserved queue metadata when removing the currently playing item.
- Improved podcast metadata refresh while preserving local user state.
- Ensured system window-close requests follow the configured close behavior and save the playback session before
quitting.
Installation
Download the installer asset for your system:
- MSI — suitable for managed or enterprise installations.
- EXE — standard Windows installer.
Thank you for using Podara.
v1.0.0-alpha5
v1.0.0-alpha5
🎯 Episode Favorites
Save episodes you love with the new Favorites feature — your personal collection, always at your fingertips.
- Favorites sidebar page — a dedicated Favorites page matching the History layout, with search, date grouping, and clear all
- Favorite buttons everywhere — heart-shaped toggle buttons on PodcastDetailScreen, History, Downloads, FullPlayer (current episode & recommendations), and QueueDrawer
- Persistent storage — favorites survive app restarts via a new
podcastFavoritetable with snapshot metadata, so episodes stay visible even if the source feed is gone - Shared UI component —
EpisodeActionIconButtonandFavoriteEpisodeButtonfor consistent 36dp circular hover interaction across all screens
🔄 Context-Aware Playback Queue
The queue now follows your context, just like modern music players:
- History → tap play → the entire history list becomes your queue
- Favorites → tap play → the entire favorites list becomes your queue
- Podcast Detail → tap play → the full episode list becomes your queue
- Downloads → tap a completed download → all downloaded episodes become your queue
- Add to Queue still works — manually added items appear after the context items
- Discover "Play Latest" adds to the current queue without replacing it
✨ Visual Feedback
- Fly-away animation on the Add to Queue button — a translucent playlist icon flies downward-right with fade-out, confirming the episode was added
🖼️ Cover Art Fix
- Downloads completed row playback now loads episode artwork from the database, fixing missing cover art in MiniPlayer and FullPlayer
📋 Queue Drawer Consolidation
- FullPlayer's queue button now opens the same QueueDrawer as MiniPlayer (slides from right with scrim overlay), instead of a separate internal drawer that couldn't close via scrim click
🧪 Tests
FavoriteDaoTest— insert, replace, delete, toggle, clear, snapshot fallback, persistence across database reopenFavoritesScreenTest— empty state, title/search, hidden clear action when empty, saved episode rendering- Updated History, Downloads, and App GUI tests for the new signatures
v1.0.0-alpha4
[1.0.0-alpha4] - 2026-07-08
Added
- Real-time seek preview — dragging the progress slider in MiniPlayer and FullPlayer now shows the scrub position
live in the time display, instead of only revealing the position after releasing the drag - Playback progress persistence — app now saves playback position every 30 seconds and on quit; reopening resumes
from where you left off. Queue and playback state (speed, volume) are also persisted across sessions
Fixed
- FullPlayer episode details missing after queue switch — collapsing the FullPlayer, selecting a different episode
from the playback queue (MiniPlayer's Queue button → QueueDrawer), then re-expanding the FullPlayer would show no
description, publish date, or duration metadata. Three-part fix:MediaPlayerState.play()now storesepisodeIdonQueueItemwhen adding to the queue, soplayFromQueue()
retrieves it later- When
play()finds an existing URL in the queue, it updates the staleQueueItem.episodeId(handles
cross-session DB restore where pre-fix items had null ids) restoreSession()falls back tosession.currentEpisodeIdwhen the queue item'sepisodeIdis null
- Auto-play-next not firing after track completion — three-part fix:
keep-open=yesmpv option prevents mpv from unloading the file at EOF, ensuringeof-reached=yesis detectable
on the next poll tick- Replaced
pendingPlayflag with a timestamp-based guard (3s window) that reliably distinguishes false start-up
transitions from real EOF, while also preventing the pause handler on the same poll tick from overriding the state
just set byplayNext() - Added PAUSED→PLAYING resume detection in the pause handler so that
isPlayingis restored after the brief
pause=yesduring initial file loading, ensuring the EOF handler can fire later
- Play/Pause button icon stuck after track ends — caused by the same root issue: EOF was never detected so
isPlayingnever transitioned tofalse; fixed by the three-part fix above
Changed
lastPlayStartMstimestamp recorded inMediaPlayerState.play()for discriminating stale vs real state transitions
v1.0.0-alpha3
rename project to Podara
v1.0.0-alpha2
v1.0.0-alpha2 — System Tray & Close Behavior
Added
- System tray icon — persistent tray icon with app logo while the app is running
- Tray context menu — Show/Hide Podium, Play/Pause, Previous, Next, Quit (dark themed, CJK supported)
- Close behavior dialog — on first close, asks whether to quit or minimize to tray; "Remember my choice" checkbox
persists the selection - Close behavior setting — change anytime in Settings → Close Behavior: "Ask me every time" / "Quit the app" /
"Minimize to tray"
Changed
- Close button no longer exits immediately — checks remembered action or shows the dialog
- Window can be hidden to tray while playback continues
Technical
- Uses Swing JDialog for the tray menu (JPopupMenu and AWT PopupMenu have multi-monitor and CJK rendering issues on
Windows) - Multi-monitor aware — menu appears on the correct display
- 15 new i18n keys (EN/ZH) for tray and close behavior
v1.0.0-alpha
podium-windows — First public alpha release.
A modern, open-source Podcast app for Windows, built with Kotlin + Compose Multiplatform.
Installation
Download the installer below:
| Format | Description |
|---|---|
podium-1.0.0.msi |
Windows Installer — registers in Add/Remove Programs |
podium-1.0.0.exe |
Portable executable — run directly, no installation needed |
Features
- 🎨 Custom UI — Immersive undecorated window, custom title bar, sidebar navigation, gold gradient buttons
- 📥 Download & offline management — pause/resume downloads, storage stats, single/batch delete, per-task speed
limit - 🔍 Discover podcasts — browse featured cards and trending charts (powered by Apple Podcasts)
▶️ Playback controls — play/pause, seek, speed adjustment, 10s skip, libmpv audio engine- ⏰ Sleep timer — auto-pause after a set duration
- 📋 Queue management — cover art, drag-to-reorder with real-time animation
- 📤 OPML import/export — transfer subscriptions between apps
- 📜 Listening history — track what you've played
- 📂 Subscription management — unsubscribe individually or in batch, sort by name / update / listen time
- 🌐 Multi-language — English / Simplified Chinese
Tech Stack
| Layer | Technology |
|---|---|
| UI | Compose Multiplatform + Material 3 |
| Audio | libmpv (via JNA) |
| Image Loading | Coil 3 |
| Database | JDBC SQLite |
| Networking | Ktor |
| RSS Parser | rssparser |
Known Issues
- Some non-standard RSS feeds may fail to parse
- Apple Podcasts discovery may be restricted in certain regions
- This is an alpha release — you may encounter edge-case bugs
Feedback
Please report issues on GitHub Issues.