I spent the last several months solo-building Tuneline, a cross-platform media player, from a single Flutter codebase that ships native apps to macOS, Windows, Linux, Android, Google TV, and iOS. No Electron. Here is the stack and a few things that bit me.

The stack

Flutter 3.38 / Dart 3.10 — one codebase, six targets.

media_kit for playback — libmpv on desktop, ExoPlayer on Android. Avoiding per-platform video plugins was the single biggest sanity win.

Riverpod for state, Hive for local storage, Dio for HTTP.