A modern, feature-rich podcast streaming application built with Flutter. Jolcast provides a seamless experience for discovering, streaming, and enjoying your favorite podcasts.
- ๐ต Stream Podcasts - High-quality audio streaming with playback controls
- ๐ Browse & Discover - Explore curated podcast collections
- ๐ Search - Find podcasts with debounced search functionality
- โญ Favorites & History - Track your listening preferences
- ๐ Secure Authentication - User login and session management
- ๐จ Beautiful UI - Modern design with custom splash animations
- โก Fast Performance - Optimized for smooth user experience
- ๐ฑ Responsive Design - Works seamlessly across different screen sizes
How to download:
- Visit the Releases page
- Scroll to the Assets section
- Download the
jollycast-v*.apkfile (ignore the "Source code" zip files) - Install on your Android device
Note: If no APK is available, download from GitHub Actions artifacts or use Option 2 (Appetize.io) to try the app.
No installation needed! Try Jolcast directly in your browser. See Appetize Setup Guide for details.
Join our beta testing program for early access to new features. Contact the maintainer for an invitation.
For demo/testing purposes, use these credentials:
- Phone Number:
08114227399 - Password:
Development@101
๐ Note: Screenshots coming soon!
- Framework: Flutter 3.24.0
- Language: Dart 3.5.0+
- State Management: Riverpod 2.6.1
- Chosen for compile-time safety, testability, and separation of concerns
- Uses
NotifierProviderandAsyncNotifierProviderfor robust state handling
- HTTP Client: Dio 5.7.0 (with auth interceptors)
- Audio Playback: Just Audio 0.9.42
- Secure Storage: Flutter Secure Storage 9.2.2
- Local Storage: SharedPreferences 2.3.3
- Local Database: Hive 2.2.3
- Routing: Go Router 14.6.2
- Flutter SDK 3.24.0 or higher
- Dart SDK 3.5.0 or higher
- Android Studio / Xcode (for Android/iOS development)
-
Clone the repository
git clone https://github.com/decodedfaith/jollycast.git cd jollycast/jollycast -
Install dependencies
flutter pub get
-
Run the app
flutter run
-
Build APK
flutter build apk --release
-
Build App Bundle (for Play Store)
flutter build appbundle --release
The project follows MVVM (Model-View-ViewModel) architecture:
lib/
โโโ core/ # Core utilities, constants, and themes
โ โโโ constants/ # App-wide constants (colors, strings, etc.)
โ โโโ theme/ # Theme configuration
โ โโโ utils/ # Utility functions
โโโ models/ # Data models (Episode, Podcast, User)
โโโ providers/ # Riverpod providers
โโโ screens/ # UI screens
โโโ services/ # API and business logic services
โโโ viewmodels/ # State management (Riverpod notifiers)
โโโ widgets/ # Reusable UI components
โโโ main.dart # App entry point
Run tests with:
# Unit tests
flutter test
# Integration tests
flutter test integration_test/The project includes automated tests for:
- Authentication flow
- Podcast fetching and display
- Audio playback functionality
- State management logic
Chosen for:
- Type Safety: Compile-time error detection
- Testability: Easy to mock and test
- Separation of Concerns: Clear separation between UI and business logic
- Performance: Optimized rebuilds and caching
- Dio with custom interceptors for authentication
- Automatic token refresh handling
- Comprehensive error handling with user-friendly messages
- Backend Availability: Assumed the provided API is stable with client-side caching
- Search Logic: Implemented client-side filtering of podcast list
- Categories: Auto-categorize podcasts into 12 predefined genres based on metadata
- Authentication: Token persists across app restarts for seamless user experience
With more time, I would implement:
- Offline Mode: Full offline support using Drift/Hive for caching
- Background Audio: System notification controls using
audio_service - Push Notifications: Firebase Cloud Messaging for new episode alerts
- Advanced Testing: Golden tests for UI regression
- Accessibility: Enhanced screen reader support
- iOS Version: Full iOS implementation with platform-specific features
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Faith Adetunji
- GitHub: @decodedfaith
- LinkedIn: Faith Adetunji
- Jolly Podcast API for providing the backend services
- Flutter community for amazing packages and support
- All contributors who help improve this project
For support, email [email protected] or open an issue in this repository.
Built with โค๏ธ by Faith (decodedfaith) using Flutter




