Skip to content

Repository files navigation

Podcast Hacker

Warning

Even though we're past version 1.0, this app is still very much in the early alpha testing phase. The only reason we're past 1.0 is that one or more of the platforms we support does not allow version names below 1.0.

A vibe-coded podcast app that cuts the injected ads out of your episodes.

Podcast Hacker is a Kotlin Multiplatform podcast player (Android + Desktop first-class, iOS best-effort) built around tacita, which downloads each episode twice and diffs the copies to find and remove dynamically-inserted ads. Because tacita needs complete files to diff, playback is download-first — there is no streaming.

What it does

  • Subscribe to podcasts via iTunes search or a pasted RSS url
  • Download episodes through tacita's ad-cutting pipeline
  • Play them with the usual comforts: seek, ±15/30s skips, playback speed, lock-screen / media-key controls, resume-from-position across restarts
  • Background-safe downloads on Android (user-initiated data transfer jobs on api 34+, a foreground service on older versions)

Platform notes

Platform Status Playback engine
Android first-class Media3 ExoPlayer in a MediaSessionService
Desktop (Linux/macOS/Windows) first-class libvlc (bundled) via an in-repo JNA binding
iOS kept compiling, best-effort AVPlayer

Desktop installers bundle libvlc (LGPL 2.1+, dynamically loaded — see THIRD_PARTY_LICENSES.md), so end users need nothing extra installed. Dev builds without the staged bundle (scripts/fetch-libvlc.sh) fall back to a system VLC installation. (JavaFX Media was the original plan but its Linux backend can't decode against current ffmpeg, and vlcj was rejected for being GPL v3 — see TODO.md for the archaeology.)

Building & running

  • Android app: ./gradlew :androidApp:assembleDebug
  • Desktop app: ./start (builds + launches the distributable), or ./gradlew :desktopApp:run
  • iOS app: scripts/sync-ios-version.sh, then open /iosApp in Xcode
  • Tests: ./gradlew check (or per-target: :shared:jvmTest, :shared:testAndroidHostTest, :shared:iosSimulatorArm64Test)
  • On-device Android integration tests: ./gradlew :androidApp:connectedDebugAndroidTest (needs a running emulator or connected device; also run by CI on an emulator)

Installers (deb/msi/dmg) and a debug APK are built by CI and attached to GitHub releases on v* tags.

How it's built

Shared Compose Multiplatform UI and business logic in /shared, driven by redux-store-flow (an app-scoped store with side effects for all IO), Metro for DI, Room KMP for persistence, and ktor + RSSParser for feeds. Per-platform entry points live in /androidApp, /desktopApp, and /iosApp.

The full build plan, per-stage implementation notes, and accumulated gotchas live in TODO.md.

Credit

The whole point of this app is tacita's ad-cutting download pipeline; this is mostly a comfortable player wrapped around it.

About

A vibecoded podcast app

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages