A beautiful, cross-platform media player with a Netflix-style UI, built with Flutter.
My main inspiration was the Infuse app on iOS, which features a modern UI and excellent metadata fetching. However, since Infuse is an iOS-only app, I set out to build something cross-platform. I wanted a simple, elegant media player that could organize my local library without any complicated setup. Many existing solutions are either too bloated, require a server, or involve a tedious setup process. Penguin is built to just work—point it to your folder, and it automatically parses your files, fetches metadata, and presents them in a beautiful, modern UI.
- Zero-Config Folder Resolution: The standout feature of Penguin is its simplicity. Just add a parent folder, and the application resolves and groups everything by itself—handling complex TV show and anime file structures effortlessly.
- Beautiful Netflix-style UI: A responsive, visually striking layout with an integrated 'Continue Watching' section and unified media grids.
- Automatic Metadata Fetching: Automatically grabs posters, backdrops, and details for your movies and TV shows from TMDB.
- Video Playback: Hardware-accelerated video decoding utilizing
media_kit. - Advanced Subtitle Rendering: Prioritizes native subtitle styles (like ASS/SSA) with configurable fallbacks.
- Privacy-First: Your data stays yours. Watch states and libraries are stored completely locally using SQLite (Drift).
| Layer | Technology |
|---|---|
| Framework | Flutter (Dart) |
| Playback | media_kit (libmpv) |
| State Management | Riverpod |
| Database | Drift (SQLite) |
| Metadata | TMDB API |
| UI | Material 3, Google Fonts, Phosphor Icons |
To fetch rich metadata (posters, synopses, ratings), Penguin requires a TMDB API key.
How to get a key:
- Create an account on TheMovieDB (TMDB).
- Go to your Account Settings > API.
- Generate a new API key (v3 auth).
How it's stored securely:
When you enter your TMDB API key in Penguin, it is stored locally on your device (using shared_preferences). It is never sent to any external server other than directly to TMDB to fetch movie data. Your library, watch history, and API keys are completely private and secure.
- Linux: Fully working and tested.
- Windows: Fully working and tested.
- iOS, Web, Android: Architecturally possible via Flutter, but not yet officially tested.
The easiest way to run Penguin is to download precompiled binaries from the Releases section of this repository:
- Windows: Download
Penguin_Installer.exeand run the installer to set up the app on your system. - Linux: Download the
.debpackage and install it using your package manager (e.g.,sudo dpkg -i penguin_1.0.0-1_amd64.deb).
To compile and run Penguin on Linux, you will need the standard Flutter Linux build dependencies along with libmpv.
You'll need the Flutter Linux development tools and mpv libraries. On Ubuntu/Debian, you can install them using:
sudo apt-get update
sudo apt-get install clang cmake ninja-build pkg-config libgtk-3-dev
sudo apt-get install mpv libmpv-dev(Note: libmpv might already be installed on your OS if you use other media players.)
Make sure you have Flutter installed. Then clone the repository and run:
flutter pub get
flutter run -d linuxTo build a release executable:
flutter build linuxTo compile and run Penguin on Windows, you will need the standard Flutter Windows build dependencies.
- Install the Flutter SDK.
- Install Visual Studio with the "Desktop development with C++" workload checked.
Clone the repository and run:
flutter pub get
flutter run -d windowsTo build a release executable:
flutter build windowsTo compile a standalone setup installer, use Inno Setup to build the installer.iss script in the root directory.
- Performance (Linux only): For best performance, 100% display scaling is recommended. The app runs smoother after shaders have been compiled.
- Test and optimize for Android, iOS, and Web platforms.
- Streamline the automatic media detection and metadata fetching flow.
- Add more comprehensive custom subtitle styling options.
- Implement smart playlists or custom collections.
- Add cast info in more info page.
- Add keyboard shortcuts



