
Sunday Suspense
Open-source Flutter app to listen to Sunday Suspense episodes
Timeline
Oct 2022 — Jan 2023
Role
Solo
Team
Solo
Status
CompletedTechnology Stack
Key Challenges
- Keeping the episode database fresh as new episodes air — manual curation would never keep up, so the entire pipeline had to be automated end-to-end
- Building a minimalistic Flutter audio player that handles background playback, lock-screen controls, and resume-where-you-left-off without bloat
- Organising hundreds of episodes into a sensible taxonomy — by category, genre, and author — without duplicating entries or confusing the browse experience
- Making a meaningful GPL v3.0 stance in a hobby project: the license terms had to be loud and clear so forks stay open source
Key Learnings
- GitHub Actions can own the entire content pipeline — scheduled scrapes, regenerated JSON databases, and backups, all without owning any infrastructure
- A minimalistic player UI respects the content: Sunday Suspense is audio storytelling, and the chrome should get out of the way
- Distributing via GitHub Releases (instead of the Play Store) keeps distribution aligned with the GPL v3.0 philosophy and removes a closed-source middleman
- Open-source licensing only works if you document the philosophy, not just the legal text — the README plain-language section matters as much as the LICENSE file
The Problem
Sunday Suspense is a cult-favourite Bengali radio show — part thriller anthology, part storytelling tradition. For millions of listeners, finding and replaying specific episodes used to mean digging through YouTube playlists, SoundCloud links, or scattered Telegram channels. There wasn't a single, well-built mobile app that treated the show with the curation it deserved.
On top of that, every attempt I saw at a "Sunday Suspense app" was closed-source. The maintainer would disappear, the app would go stale, and the community would lose access. I wanted something different: open source, GPL-licensed, and built to last.
What I Built
Sunday Suspense is an open-source Flutter app for listening to the show on Android. It pulls from a curated, regularly-updated episode database, organises episodes by category, genre, and author, and ships with a clean, minimalistic player that doesn't get in the way of the story.
Everything ships from this repo — no proprietary backend, no telemetry, no ads. The app is distributed via GitHub releases, and the full source is under GPL v3.0.
Features
- Smooth, responsive UI — built natively with Flutter for fluid scrolling and transitions
- Curation by category — episodes hand-grouped so you can browse by mood, not just by date
- Categorised by genre and author — Satyajit Ray adaptations, Feluda, Byomkesh, Tarini Khuro, and more
- Search — find a specific episode by title, author, or story
- Playback history — the player remembers where you left off, so you can resume mid-story
- Minimalistic player — large play/pause, scrub bar, and that's it. No distractions while a story is playing
- Updated weekly — new episodes land in the database automatically; no app update required
How It Works
The app is a thin Flutter client over a versioned episode database. The database holds episode metadata — title, author, genre, category, audio URL, duration — and is bundled with the build. The audio itself streams from publicly hosted sources.
The player is a single-screen experience: tap an episode, hit play, lock your phone. Playback history is persisted locally, so the next launch can offer "continue listening" at the top of the home screen.
Architecture at a glance
Flutter app (Dart)
│
├── Local episode database (JSON) ── updated weekly via CI
├── Audio player (background-capable, lock-screen controls)
├── Playback history (local persistence)
└── Search + browse UI (Material)
Automation
This is the part I'm quietly proud of. Two GitHub Actions workflows keep the database fresh without me lifting a finger:
update_db.yml— runs on a weekly schedule, scrapes the latest episode metadata, regenerates the JSON database, and pushes the result back to the repodb_backup.yml— mirrors the database to a backup location so a bad scrape can never wipe out months of curation
You can see the status of both workflows right on the README badges. The app never goes stale — your library is always the latest library.
License Philosophy
This project is licensed under GPL v3.0, and I'm deliberate about what that means:
- Anyone can fork, modify, and redistribute — as long as they stay open source
- You cannot take this code, rebrand it, and ship a closed-source copy on the Play Store or App Store
- Any derivative work must disclose its source, state its changes, and retain the original copyright
- Selling a non-free copy is explicitly not permitted
The README spells this out plainly: "You can ONLY use the source code of this app for Open Source Project under GPL v3.0." I chose GPL specifically because the show itself is a cultural good, and the tooling around it should stay a cultural good too.
Building from Source
The project builds like any standard Flutter app:
git clone https://github.com/imsudip/sunday_suspense.git
cd sunday_suspense
flutter pub get
flutter runYou'll need the Flutter SDK installed. Contributions are welcome — there's a CONTRIBUTING.md in the repo.
Links
- GitHub: imsudip/sunday_suspense
- Releases: github.com/imsudip/sunday_suspense/releases
- License: GPL v3.0
Timeline
The repo was created at the end of October 2022, and development kicked off the next month. The Flutter app took shape over a few months, and the project wrapped up in late January 2023 with the addition of GitHub Actions workflows to keep the episode database fresh.
- Oct 2022 — Repo created and initial Flutter app scaffolded
- Nov 2022 — Core features built: audio player, episode curation by genre/author, search, playback history
- Jan 2023 — GitHub Actions automation added (update_db.yml for weekly episode DB refresh, db_backup.yml for backups); final commit
