-
v0.10.1 — Serve UI under /ui Stable
released this
2026-06-18 09:29:21 +00:00 | 22 commits to main since this releaseChanges
- UI moved under
/ui— the dashboard no longer shares a base path with the RSS feed. All dashboard pages, login (/ui/login), and logout (/ui/logout) live under/ui; bare/redirects to/ui. The RSS/media feed stays at/feedand is now cleanly separated.
🤖 Generated with Claude Code
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- UI moved under
-
released this
2026-06-17 22:27:54 +00:00 | 24 commits to main since this releaseFeatures
- Clear & Resync from Playlist — per-feed action that wipes Episode rows and DownloadedVideo tracking (non-destructive; MP3 files on disk are kept), then triggers an immediate playlist re-poll. Existing files are re-matched; only missing videos re-download.
- Dashboard UI redesign — restyled the MudBlazor dashboard to the warm-dark Castr design (accent #ef6b41, Hanken Grotesk + JetBrains Mono, sidebar layout, stat cards, feed card grid, status pills, restyled login). All functionality, routes, SignalR, and timers preserved.
🤖 Generated with Claude Code
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.9.2 Stable
released this
2026-02-22 21:11:29 +00:00 | 29 commits to main since this releaseBug Fixes
- Fixed settings page showing
1.0.0.0instead of the real version — now readsAssemblyInformationalVersionAttributewhich contains the version embedded at build time - Fixed
docker buildwithoutAPP_VERSIONfailing due to0.0.0-devbeing passed to-p:Version(which requires numeric-only format) — the pre-release suffix is now stripped forAssemblyVersionwhile preserved inInformationalVersion - Added empty-string guard in Dockerfile so a blank
APP_VERSIONbuild arg fails loudly at build time rather than silently embedding an empty version
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Fixed settings page showing
-
v0.9.1 Stable
released this
2026-02-20 22:40:54 +00:00 | 32 commits to main since this releaseBug Fixes
- Fixed Docker build failing with
'v0.9.0' is not a valid version string— MSBuild reads environment variables as properties, so theVERSIONbuild arg was being picked up as theVersionMSBuild property. Renamed toAPP_VERSIONto avoid the collision. Thevprefix is now stripped viasedbefore embedding inInformationalVersion.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Fixed Docker build failing with
-
v0.9.0 Stable
released this
2026-02-20 22:30:47 +00:00 | 33 commits to main since this releaseWhat's New
Bug Fixes
- Fixed feed thumbnail fallback selecting the oldest episode instead of the latest: selection now uses
PublishDatedescending rather than playlist position, so newest-first YouTube playlists show the correct cover art - Fallback log messages now include the episode filename and publish date for easier debugging
Other
- Binary now embeds the release version — visible in startup logs as
Castr v0.9.0 started
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Fixed feed thumbnail fallback selecting the oldest episode instead of the latest: selection now uses
-
v0.8.0 Stable
released this
2026-02-20 19:57:08 +00:00 | 35 commits to main since this releaseWhat's New
Feed Thumbnail Fallback
- When a feed has no configured image URL, the RSS channel image now automatically falls back to the latest episode's YouTube thumbnail
- Secondary fallback to embedded album art if no thumbnail URL is available
- Ensures podcast clients always show artwork even for unconfigured feeds
Bug Fixes
- Fixed potential null reference on thumbnail URL assignment after predicate guard
- Fixed feed names with spaces or special characters producing malformed artwork URLs (missing
Uri.EscapeDataStringon feed name segment) - Improved observability: fallback image selection now logged at
Informationlevel instead ofDebug - Added
Warninglog when a feed has no image source at all, making missing artwork easier to diagnose
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.7.0 Stable
released this
2026-02-15 23:40:03 +00:00 | 37 commits to main since this releaseWhat's New
Extended Episode Metadata
- Extract 8 additional ID3 tag fields from audio files via TagLib: artist, album, genre, year, track number, bitrate, subtitle, and embedded art detection
- New metadata fields displayed in the episode details dialog
- Backfill logic automatically populates new fields for existing episodes on next sync
Embedded Album Art Endpoint
- New
GET /feed/{feedName}/artwork/{filePath}endpoint serves embedded album art directly from MP3 files - 24-hour response caching for optimal performance
- Path traversal protection and input validation
RSS Feed Enhancements
- RSS feed falls back to the artwork endpoint for
<itunes:image>when no YouTube thumbnail exists but the file has embedded art - Per-item
<itunes:author>included when artist metadata is available - Per-item
<itunes:subtitle>included when subtitle metadata is available
Other
- Added
dotnet-tools.jsonmanifest fordotnet-ef
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.6.0 Stable
released this
2026-02-14 23:48:36 +00:00 | 40 commits to main since this releaseWhat's New
Force Resync Button
- Added a Force Resync button to the feed edit page for manually triggering directory sync
- Shows count of new files discovered after sync
- Validates directory exists before syncing — no more silent success on missing directories
- Includes detailed error messages on failure
- Re-entrancy guard prevents concurrent sync operations
API Changes
SyncDirectoryAsyncnow returnsint(count of new files synced) instead ofvoid
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.5.0 Stable
released this
2026-02-14 23:07:44 +00:00 | 43 commits to main since this releaseWhat's Changed
New Features
- Recursive subfolder scanning for feed directories — Feeds now support a configurable
DirectorySearchDepthsetting (0-4) to discover media files in nested subdirectories (e.g., season folders). Files are stored with relative paths and served via updated media endpoints.- New
DirectorySearchDepthfield on Feed entity with EF Core migration - Media endpoint updated to catch-all route (
{**filePath}) for subfolder paths - RSS enclosure URLs encode each path segment individually to preserve
/separators - Dashboard UI field for configuring search depth (0 = root only, 1-4 = subfolder levels)
- 8 new tests added (170 total passing)
- New
Security Hardening
- Server-side validation for directory search depth —
[Range(0, 4)]annotation andMath.Clampprevent excessive recursive enumeration via direct DB/API manipulation - Symlink protection in file enumeration — Resolved paths are checked against the feed root directory, preventing symlinks from escaping the intended directory boundary
Full Changelog: https://github.com/joezombie/castr/compare/v0.4.0...v0.5.0
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Recursive subfolder scanning for feed directories — Feeds now support a configurable
-
v0.4.0 Stable
released this
2026-02-14 22:00:44 +00:00 | 47 commits to main since this releaseWhat's Changed
Improvements
- Move file metadata reading from feed service to sync service — ID3 tag metadata (title, duration, file size) is now read once during directory sync and persisted in the database, instead of being re-read on every RSS feed generation. This simplifies PodcastFeedService to pure database reads and improves feed generation performance.
- New
Title,DurationSeconds,FileSizecolumns on Episode entity with EF Core migration - YouTube metadata takes priority over ID3 tag values
- PodcastFeedService no longer depends on TagLib or performs directory scanning
- 6 new tests added (163 total passing)
- New
Full Changelog: https://github.com/joezombie/castr/compare/v0.3.0...v0.4.0
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Move file metadata reading from feed service to sync service — ID3 tag metadata (title, duration, file size) is now read once during directory sync and persisted in the database, instead of being re-read on every RSS feed generation. This simplifies PodcastFeedService to pure database reads and improves feed generation performance.