Enjoy podcasts with Tsacdop.
Tsacdop is a podcast player developed with Flutter, a clean, simply beautiful, and friendly app, which is also free and open source.
Credit to the Flutter team and all involved plugins, especially webfeed, Just_Audio, and Provider.
The podcast search engine is powered by, ListenNotes & PodcastIndex.
- Podcast group management
- Playlists support
- Sleep timer / speed setting
- OPML file export and import
- Auto-syncing in the background
- Listening and subscription history record
- Dark mode / accent color
- Download for offline play
- Auto-download new episodes / auto-delete outdated downloads
- Settings backup
- Skip silence
- Boost volume
More to come...
| Home Page | Group | Podcast | Episode | Dark Mode |
|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
Please Email me you'd like to contribute to support more languages!
Credit to Localizely for kind support to open source projects.
Tsacdop is licensed under the GPL v3.0 license.
The current toolchain is Flutter 3.47.2, Dart 3.13.2, Android Gradle Plugin 9.3.1, Gradle 9.5, and JDK 21. Android release lint requires JDK 21. The iOS deployment target is 15.0.
- Install Flutter and JDK 21, then fetch the source code.
git clone https://github.com/stonega/tsacdop.git
cd tsacdop
flutter config --jdk-dir /path/to/jdk-21
- Resolve the dependencies.
flutter pub get
- Optionally supply a Listen Notes API key at build time. Without it, the app uses Podcast Index search only. Do not commit the key to the repository.
flutter run --flavor fdroid \
--dart-define=LISTEN_NOTES_API_KEY=your_key
- Build Android artifacts. The F-Droid release is intentionally unsigned so
that the store can sign it. The Play flavor reads its signing credentials
from
KEYSTORE,KEYSTORE_PASSWORD,KEY_ALIAS, andKEY_PASSWORD.
flutter build apk --debug --flavor fdroid
JAVA_HOME=/path/to/jdk-21 \
./android/gradlew -p android assembleFdroidRelease
flutter build appbundle --release --flavor play \
--dart-define=LISTEN_NOTES_API_KEY=your_key
- For iOS, run
pod installinios/on macOS, then build with Xcode or Flutter.
cd ios
pod install
cd ..
flutter build ios --release --no-codesign \
--dart-define=LISTEN_NOTES_API_KEY=your_key
Plugins that need compatibility patches are vendored in third_party/. Each
fork includes an UPSTREAM.md file recording its original repository, pinned
commit, and local changes.
You can obtain a Listen Notes key from Listen Notes.
If you have an issue or found a bug, please raise a GitHub issue. Pull requests are also welcome.
- Local storage
- sqflite
- shared_preferences
- Audio
- just_audio
- audio_service
- State management
- provider
- Download
- flutter_downloader
- Background task
- workmanager
UI
src
└──home
├──home.dart [Homepage]
├──searc_podcast.dart [Search Page]
└──playlist.dart [Playlist Page]
└──podcasts
├──podcast_manage.dart [Group Page]
└──podcast_detail.dart [Podcast Page]
└──episodes
└──episode_detail.dart [Episode Page]
└──settings
└──setting.dart [Setting Page]
STATE
src
└──state
├──audio_state.dart [Audio State]
├──download_state.dart [Episode Download]
├──podcast_group.dart [Podcast Groups]
├──refresh_podcast.dart [Episode Refresh]
└──setting_state.dart [Setting]
Service
src
└──service
├──api_service.dart [Podcast Search]
├──gpodder_api.dart [Gpodder intergate]
└──ompl_builde.dart [OMPL export]
- Playlist is unstable
You can reach out to me directly at tsacdop.app@gmail.com.
Or you can join our Telegram Group.
This project is a starting point for a Flutter application.
Here are a few resources to get you started if this is your first Flutter project:
For help getting started with Flutter, view our online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.





