<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Felis Cato</title>
    <description>The latest articles on DEV Community by Felis Cato (@farhanms123).</description>
    <link>https://dev.to/farhanms123</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1015814%2F2012e740-21f8-4969-92b8-776bb3071e36.png</url>
      <title>DEV Community: Felis Cato</title>
      <link>https://dev.to/farhanms123</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/farhanms123"/>
    <language>en</language>
    <item>
      <title>(🐱-1-3; HOLD) Flutter, Wewayangan Media Preview</title>
      <dc:creator>Felis Cato</dc:creator>
      <pubDate>Sun, 26 Apr 2026 09:07:52 +0000</pubDate>
      <link>https://dev.to/farhanms123/-1-3-flutter-wewayangan-media-preview-1f6i</link>
      <guid>https://dev.to/farhanms123/-1-3-flutter-wewayangan-media-preview-1f6i</guid>
      <description>&lt;p&gt;See how much I failed:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://dev.to/farhanms123/media-preview-and-converter-with-kotlin-compose-multiplatform-1m8p"&gt;(🐱-1-1; Drop) Media Preview and Converter with Kotlin Compose Multiplatform - DEV Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/farhanms123/-1-failed-again-by-react-native-develop-media-preview-and-converter-wewayangan-media-viewer-3me5"&gt;(🐱-1-2; Failed, Again) By React Native, Develop Media Preview and Converter (Wewayangan Media Viewer) - DEV Community&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(🐱-1-3) Flutter, Wewayangan Media Preview&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I get that name with the help of Google Search AI. I just want to find name in Java that resemble "theaterical" and "video". It means Shadowy (bayang-bayang / Wayang). A traditional show of theaterical puppet, where the show is run behind screen and the audience could watch a magnificent ragnarok and monarchy act in white black screen, an imagining of life essence. Or something like that.&lt;/p&gt;

&lt;p&gt;Welp, I would not tell you much. I would go with Flutter. First, I need boilerplate or wizard.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You could see project details, MVP, and scenarios here: &lt;a href="https://github.com/FarhanMS123/wewayangan-mediaplayer/issues/1" rel="noopener noreferrer"&gt;Alpha Design · Issue #1 · FarhanMS123/wewayangan-mediaplayer&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Dear Diary
&lt;/h1&gt;

&lt;p&gt;As usual, I would use Gemini Pro and Google Search AI. Let's just use the same query as previous blog. For you curious, my prompts are:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Please explore thoroughly, use every alternatives keywords similar to these and explore those keywords, explore as much as possible. Every stacks and tools found, try to find alternative or similar things to it. You could try to find on blogs, forum, or community related. Such as Medium, Dev.to, Reddit, or Youtube. At summary, give list of all stacks and tools you found. Please explore:&lt;/p&gt;

&lt;p&gt;For Flutter development (keep scope only to Flutter), explore frameworks, bootstrapers, project wizard, scaffolding, boilerplates, templates, starterpack, meta-framework, stacks, tech stacks, opinioned, and battery-ready.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By this prompt, I am not only ask to find a project wizard, I do hunting for every tech stacks available related to the scope I want to found.&lt;/p&gt;

&lt;p&gt;Long story short, I found Very Good CLI, Stacked CLI, and Mason. I ever take a look of Very Good CLI and I would use it for this app starter. Not as previous, I would just go with it.&lt;/p&gt;

&lt;p&gt;To learn flutter, I would just go with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/get-started/codelab" rel="noopener noreferrer"&gt;Write your first Flutter app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/get-started/fundamentals" rel="noopener noreferrer"&gt;Learn the fundamentals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Find more &lt;a href="https://docs.flutter.dev/get-started/learn-flutter" rel="noopener noreferrer"&gt;Learn Flutter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;and &lt;a href="https://docs.flutter.dev/reference/learning-resources" rel="noopener noreferrer"&gt;Flutter learning resources&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also read and follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.flutter.dev/announcing-flutter-3-38-dart-3-10-building-the-future-of-apps-503429eeb685" rel="noopener noreferrer"&gt;https://blog.flutter.dev/announcing-flutter-3-38-dart-3-10-building-the-future-of-apps-503429eeb685&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.dart.dev/announcing-dart-3-10-ea8b952b6088" rel="noopener noreferrer"&gt;https://blog.dart.dev/announcing-dart-3-10-ea8b952b6088&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.flutter.dev/whats-new-in-flutter-3-38-3f7b258f7228" rel="noopener noreferrer"&gt;https://blog.flutter.dev/whats-new-in-flutter-3-38-3f7b258f7228&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/resources/bootstrap-into-dart" rel="noopener noreferrer"&gt;https://docs.flutter.dev/resources/bootstrap-into-dart&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dart.dev/overview" rel="noopener noreferrer"&gt;https://dart.dev/overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dart.dev/language" rel="noopener noreferrer"&gt;https://dart.dev/language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dart.dev/tutorials/server/cmdline" rel="noopener noreferrer"&gt;https://dart.dev/tutorials/server/cmdline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dart.dev/tutorials" rel="noopener noreferrer"&gt;https://dart.dev/tutorials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, I just left for 2 hours today (15 Jan 2026), and suddenly the whole site changes. I even haven't finish reading the foundation !? So for you, just use &lt;a href="https://web.archive.org/web/20260107170208/https://docs.flutter.dev/" rel="noopener noreferrer"&gt;7 Jan 2026&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;16 Jan 2026&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ok, I already read the foundation. I take a look to VGV and it already bootstrap Bloc as State Managment. I actually want to try MobX, but well if the boilerplate already giving their opinion, so be it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://cli.vgv.dev/docs/overview" rel="noopener noreferrer"&gt;https://cli.vgv.dev/docs/overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cli.vgv.dev/docs/templates/core" rel="noopener noreferrer"&gt;https://cli.vgv.dev/docs/templates/core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.verygood.ventures/blog/scalable-best-practices" rel="noopener noreferrer"&gt;https://www.verygood.ventures/blog/scalable-best-practices&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In learning project structure, I will try Stacked CLI. Of course, I already do everything in environment setup. I would follow &lt;a href="https://stacked.filledstacks.com/docs/getting-started/overview" rel="noopener noreferrer"&gt;Overview | The Production Flutter Framework&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dart pub global activate stacked_cli
stacked &lt;span class="nt"&gt;--help&lt;/span&gt;
stacked create &lt;span class="nt"&gt;--help&lt;/span&gt;
stacked create app &lt;span class="nt"&gt;--help&lt;/span&gt;
stacked create app my_first_app
stacked create view counter
stacked create view login
stacked create service authentication
stacked create view textReverse
&lt;span class="c"&gt;# ... do some form annotation ...&lt;/span&gt;
stacked generate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I got, this Stacked CLI is not only opinioned, but also became wizard and generator for any usecases. I still not see much about state management, but it handles the routing. A perfect match if wants to create a big project. The issues, we follow their architecture. You can tell this is equivalent to NestJS.&lt;/p&gt;

&lt;h1&gt;
  
  
  Environment Setup
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;Similar to previous blog to setup Android Studio via Jetbrain Toolbox&lt;/li&gt;
&lt;li&gt;Install plugins Flutter and Dart both Android Studio / Intelij IDEA and VSCode. Also, ARB Editor.&lt;/li&gt;
&lt;li&gt;I already ever download Flutter, but I will reinstall it again. The flutter with saved in &lt;code&gt;C:\ProgramData\flutter&lt;/code&gt;, if not works create a new folder &lt;code&gt;C:\dev&lt;/code&gt;. Why? I need a dedicated development folder, close to the root, and has no spaces in the path.&lt;/li&gt;
&lt;li&gt;Create a flutter project using &lt;a href="https://cli.vgv.dev/docs/templates/core#why-very-good-core" rel="noopener noreferrer"&gt;very good cli&lt;/a&gt;. Honestly, just follow the site until I can run a windows app.

&lt;ul&gt;
&lt;li&gt;because I have no site, I would use farhanms123.github.io as organization. Actually, I haven't read if it is allowed in legal practice. Please tell me if I have been criminal because of this.&lt;/li&gt;
&lt;li&gt;I also follow to &lt;a href="https://docs.flutter.dev/platform-integration/windows/setup" rel="noopener noreferrer"&gt;targeting Windows&lt;/a&gt;, and &lt;a href="https://docs.flutter.dev/platform-integration/android/setup" rel="noopener noreferrer"&gt;Android&lt;/a&gt;. But, now I will flavor the Windows first.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dart pub global activate very_good_cli

very_good create flutter_app wewayangan_mediapreview &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--desc&lt;/span&gt; &lt;span class="s2"&gt;"Wewayangan (Media Preview)"&lt;/span&gt; &lt;span class="nt"&gt;--org&lt;/span&gt; &lt;span class="s2"&gt;"io.github.farhanms123"&lt;/span&gt;

&lt;span class="nb"&gt;cd &lt;/span&gt;wewayangan_mediapreview

&lt;span class="c"&gt;# flutter packages get&lt;/span&gt;
very_good packages get &lt;span class="nt"&gt;--recursive&lt;/span&gt;

flutter doctor &lt;span class="nt"&gt;-v&lt;/span&gt;

flutter emulators &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; flutter devices

very_good packages check licenses

flutter doctor &lt;span class="nt"&gt;--android-licenses&lt;/span&gt;

flutter run &lt;span class="nt"&gt;-d&lt;/span&gt; windows &lt;span class="nt"&gt;--flavor&lt;/span&gt; development &lt;span class="nt"&gt;--target&lt;/span&gt; lib/main_development.dart

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Default languages will use English, so I do not need localization&lt;/li&gt;
&lt;li&gt;The app would be simple, so dedicated folder for state builder &lt;code&gt;lib/{view name}/cubit/&lt;/code&gt; is so overkill. I prefer better to put state builder&lt;/li&gt;
&lt;li&gt;Seems I do not know the project structure much. I may need to learn it. Make it more opinioned.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Development Phase
&lt;/h1&gt;

&lt;p&gt;Ok. I start my development. It took long enough to reconsider project structure. I use Google Antigravity and ask Gemini Pro High to make recommendation. Here you go &lt;a href="https://github.com/FarhanMS123/wewayangan-mediaplayer" rel="noopener noreferrer"&gt;FarhanMS123/wewayangan-mediaplayer: Video Preview, Convert Compressor, and other simple videokit.&lt;/a&gt; if you want to see the source and &lt;a href="https://github.com/FarhanMS123/wewayangan-mediaplayer/issues/1" rel="noopener noreferrer"&gt;Alpha Design · Issue #1&lt;/a&gt; to give you my plan.&lt;/p&gt;

&lt;p&gt;My objective, I always try to figure it out the author of the boilerplates and libraries while respecting their original design.&lt;/p&gt;

&lt;p&gt;I want to have dart dot-shorthands, so I need to update sdk to minimum 3.10.0. And also, I want to use &lt;a href="https://pub.dev/packages/yaru" rel="noopener noreferrer"&gt;Ubuntu yaru&lt;/a&gt;. As I works only for myself, its too tiring to make a mockup, so I left all blueprints in my head.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# pubspec.yaml (part of it; just slightly modify)&lt;/span&gt;
&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^3.10.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter pub get
flutter pub outdated
flutter pub upgrade
flutter pub add yaru
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The design is using Stacked, where the media is covering full of its container, by the top of it is floating a navbar at full-top of edge and may full or padding control-player on bottom-edge. Yes, common media viewer, has similar structure like Scaffold with transparent app bar (became navbar) and bottom sheet (control player). &lt;/p&gt;

&lt;p&gt;But, instead of wrap navbar and control in a container with expanding gaps, those would just directly became children of stacks with no additional isolation. I have a plan to make the control moveable. My references would going to be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/ui/layout#stack" rel="noopener noreferrer"&gt;Layouts in Flutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/ui/interactivity#step-2-subclass-statefulwidget" rel="noopener noreferrer"&gt;Add interactivity to your Flutter app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/ui/widgets/layout" rel="noopener noreferrer"&gt;Layout widgets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/reference/widgets" rel="noopener noreferrer"&gt;Flutter widget index&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://api.flutter.dev/flutter/widgets/Stack-class.html" rel="noopener noreferrer"&gt;Stack class - widgets library - Dart API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ubuntu/yaru.dart/tree/main/example/lib" rel="noopener noreferrer"&gt;yaru.dart/example/lib at main · ubuntu/yaru.dart&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I need to play a video (video playback), apparently official &lt;a href="https://docs.flutter.dev/cookbook/plugins/play-video" rel="noopener noreferrer"&gt;video_player&lt;/a&gt; won't work in Windows. Need replacement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/video_player" rel="noopener noreferrer"&gt;video_player | Flutter package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://fluttergems.dev/video/" rel="noopener noreferrer"&gt;Top Flutter Video Player, Youtube Player, MP4 Player packages | Flutter Gems&lt;/a&gt; check Windows and Android&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/media_kit" rel="noopener noreferrer"&gt;media_kit | Dart package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Seems yoru remove title bar in Windows, so I need to install &lt;a href="https://stackoverflow.com/questions/68852107/how-to-remove-title-bar-from-flutter-app-built-for-windows" rel="noopener noreferrer"&gt;How to Remove Title Bar from Flutter app built for windows? - Stack Overflow&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;I found this &lt;a href="https://leanflutter.dev/our-packages" rel="noopener noreferrer"&gt;Our Packages | LeanFlutter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;When I try to find how &lt;a href="https://github.com/ubuntu/yaru.dart/tree/main" rel="noopener noreferrer"&gt;ubuntu/yaru.dart&lt;/a&gt; remove title bar, it bring me to &lt;a href="https://github.com/ubuntu/yaru_window.dart" rel="noopener noreferrer"&gt;ubuntu/yaru_window.dart&lt;/a&gt;. And I found out it also use window_manager.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter pub add media_kit
flutter pub add media_kit_video
flutter pub add media_kit_libs_video
flutter pub add window_manager
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I took a long time just to develop primary view. Too much thought and consideration. Need to understand MVP. And now, I have dilemma and questioning why I chose Yaru at first. So, I choose to go with Material.&lt;/p&gt;

&lt;p&gt;Now, I am enlighten. Purposely this is my project structure. But, somehow, I feel stray as I want to follow how VGV CLI lead me in the first place, the feature/page folder is directly under the &lt;code&gt;lib/&lt;/code&gt;. So, I thought, why doesn't I extend the &lt;code&gt;app/&lt;/code&gt; use-case?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;view&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;       &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;l10n&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;arb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;app_en&lt;/span&gt;&lt;span class="nc"&gt;.arb&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;app_es&lt;/span&gt;&lt;span class="nc"&gt;.arb&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;gen&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;l10n&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;pages&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;photo&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nc"&gt;.gitkeep&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;video&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;       &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;cubit&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;       &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;video_cubit&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;       &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;video&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;       &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;view&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;           &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;video_page&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;shared&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nc"&gt;.gitkeep&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;bootstrap&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;main_development&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;main_production&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;main_staging&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Originally, I put all pages inside &lt;code&gt;lib/pages/&lt;/code&gt; and add &lt;code&gt;lib/shared/&lt;/code&gt;. For shared, I thought to put like widgets, states, consts, even views, and maybe such functions, etc. But, how about I encourage those inside &lt;code&gt;lib/app/&lt;/code&gt;? And those, I propose this structure. I could also put more inside &lt;code&gt;app/&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;view&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;widgets&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;l10n&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;arb&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;app_en&lt;/span&gt;&lt;span class="nc"&gt;.arb&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;app_es&lt;/span&gt;&lt;span class="nc"&gt;.arb&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;gen&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;l10n&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;photo&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nc"&gt;.gitkeep&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;video&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;cubit&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;video_cubit&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;video&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;view&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;       &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;video_page&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;       &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;video_widgets&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;bootstrap&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;main_development&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;main_production&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;main_staging&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;+0224&lt;/strong&gt; Oops... I forgot. If my objective is to not reinventing the wheel, I should find FOSS GPL-compatible media player from Github or the vast internet that works both in Windows and Android.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;+0227&lt;/strong&gt; As I start building the video functions, I found few challenges:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I have stack, unsized position-container-column, and wish this single Slider component to have width as wide as available space of Container&lt;/li&gt;
&lt;li&gt;the components I build has more children and grandchildren&lt;/li&gt;
&lt;li&gt;I really want to reimplement photo and zoom feature when I should approach MVP first&lt;/li&gt;
&lt;li&gt;as such, I need to keep my hand from migrating the component into a base component&lt;/li&gt;
&lt;li&gt;The grandchildren issues arises as MediaKit has player and controller object in view component, while the controller/panel is in grandchild&lt;/li&gt;
&lt;li&gt;need find a way to pass object Player and VideoController to context and retrieve by &lt;code&gt;.of()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, I find few keywords and links. (thanks to Google AI and my skill to query building).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GOOGLE: flutter material stretch item to width of column&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/data-and-backend/state-mgmt/options#inheritedwidget-and-inheritedmodel" rel="noopener noreferrer"&gt;Approaches to state management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;InheritedWidget&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dart.dev/tools/linter-rules" rel="noopener noreferrer"&gt;Linter rules&lt;/a&gt;; Find: name, case, flutter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;+0228&lt;/strong&gt; Seems I need to restructure my best practice for this VGV boilerplate, the use of Context, Provider, ChangeNotifier, Bloc, Multi Blocs and Providers, passing to grand children, stateless pages, and stateful view. And maybe I need to implement Repository-Model pattern.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GOOGLE: pass context; flutter pass context; flutter buildcontext; flutter add data to context; flutter pass object to context; flutter provider context; flutter repository pattern; flutter access parent property&lt;/li&gt;
&lt;li&gt;GOOGLE: flutter access parent property via context&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flutteris.com/blog/en/widget-state-context-inheritedwidget?ref=plugfox.dev" rel="noopener noreferrer"&gt;flutteris.com/blog/en/widget-state-context-inheritedwidget?ref=plugfox.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.flutter.dev/data-and-backend/state-mgmt/simple" rel="noopener noreferrer"&gt;Simple app state management&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;InheritedWidget, ChangeNotifier, Ancestor&lt;/li&gt;
&lt;li&gt;GOOGLE: flutter architecture; flutter design pattern; flutter mvvc&lt;/li&gt;
&lt;li&gt;GOOGLE: flutter service repository pattern&lt;/li&gt;
&lt;li&gt;&lt;a href="https://codewithandrea.com/articles/flutter-repository-pattern/" rel="noopener noreferrer"&gt;Flutter App Architecture: The Repository Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://robertbrunhage.com/articles/flutter-architecture-repository-service-pattern" rel="noopener noreferrer"&gt;Flutter Architecture: The Repository-Service Pattern&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://plugfox.dev/flutter-fundamentals/" rel="noopener noreferrer"&gt;🕊️ Flutter | plugfox.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;+0426&lt;/strong&gt; It seems this project is takes too long. I have many professional things to do. So I drop this project here. I may add new links and references and notes on the progress and just continue on this post.&lt;/p&gt;

&lt;p&gt;You should see all my plans and updates here:&lt;br&gt;
&lt;a href="https://github.com/FarhanMS123/wewayangan-mediaplayer/issues/1" rel="noopener noreferrer"&gt;Alpha Design · Issue #1 · FarhanMS123/wewayangan-mediaplayer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You could also follow the commits and repository. Spoiler alert, I may want to learn Event-Driven Architecture, Airflow, and gRPC. So, golang, python, Rust, and Kafka could be next experiment.&lt;/p&gt;

&lt;p&gt;Ciaaa~&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;+0502&lt;/strong&gt; I want to add few more list&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dio, mobx, &lt;a href="https://riverpod.dev/" rel="noopener noreferrer"&gt;Riverpod&lt;/a&gt;, watch_it,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stacked.filledstacks.com/docs/in-depth/viewmodels/" rel="noopener noreferrer"&gt;View Models | The Production Flutter Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.dhiwise.com/post/deep-dive-into-flutter-routing-everything-you-need-to-know" rel="noopener noreferrer"&gt;Navigating the Basics: A Comprehensive Guide to Flutter Routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://verygood.ventures/blog/very-good-location-sharing-chat-app/" rel="noopener noreferrer"&gt;Building a Very Good Location Sharing Chat App with Flutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://medium.com/@pererikbergman/repository-design-pattern-e28c0f3e4a30" rel="noopener noreferrer"&gt;Repository Design Pattern. The repository pattern is one of the… | by Per-Erik Bergman | Medium&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://fluttersamples.com/" rel="noopener noreferrer"&gt;Flutter Architecture Samples&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://arcane.art/#/" rel="noopener noreferrer"&gt;Arcane Arts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devjournal</category>
      <category>flutter</category>
      <category>showdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>(🐱-1-2; Failed, Again) By React Native, Develop Media Preview and Converter (Wewayangan Media Viewer)</title>
      <dc:creator>Felis Cato</dc:creator>
      <pubDate>Mon, 05 Jan 2026 12:18:38 +0000</pubDate>
      <link>https://dev.to/farhanms123/-1-failed-again-by-react-native-develop-media-preview-and-converter-wewayangan-media-viewer-3me5</link>
      <guid>https://dev.to/farhanms123/-1-failed-again-by-react-native-develop-media-preview-and-converter-wewayangan-media-viewer-3me5</guid>
      <description>&lt;p&gt;You may actually read my &lt;a href="https://dev.to/farhanms123/media-preview-and-converter-with-kotlin-compose-multiplatform-1m8p"&gt;unfinish previous post&lt;/a&gt; where I try to learn Kotlin to Develop this app. But, now, I want to do that in React Native. I just thought doing in Kotlin (for native performance) is almost overkill. That's why I flee to React Native. But, why RN? It is simple, it is javascript, and NPM has many libraries for every day. Uuh... I mean I want to end this project as fast as possible. You may met me again for other exploration and journey.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Summary. I want to have a battery-ready boilerplate, so of course I go with Expo. Unfortunately, it only support Web (SSG), Android, and iOS. &lt;del&gt;It is not support Desktop. That's why I would (once again) find alternative and go to Flutter. Wish me luck. 🤞&lt;/del&gt; Or I would not use Expo. I'll try my best. 🤞&lt;/p&gt;

&lt;p&gt;Yes. This is a failed project as RNW is not working. I may not trying hard. Well, let's just go with Flutter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Written Notes
&lt;/h1&gt;

&lt;p&gt;Ok. I would not wrote much. As before, I would explore RN frameworks, bootstrapers, project wizard, boilerplates, templates, starterpack, meta-framework, battery-ready, scaffolding, stacks, opinioned, and the alternatives. Then, I compare every project structure.&lt;/p&gt;

&lt;p&gt;Fast forward, I use Gemini and Google Search AI. &lt;strong&gt;It found out:&lt;/strong&gt; Expo Framework, Infinite Red Ignite CLI, Create T3 Turbo, and Create Expo Stack (CES). &lt;strong&gt;Other interesting things:&lt;/strong&gt; Tamagui Starters, Tamagui Takeout, Solito, Gluestack UI Starter, Obytes Starter, Expo Router Starter, and NativeWind Starter. &lt;strong&gt;And last...&lt;/strong&gt; &lt;a href="https://github.com/thecodingmachine/react-native-boilerplate" rel="noopener noreferrer"&gt;TheCodingMachine React Native Boilerplate&lt;/a&gt;, @react-native-community/cli, NativeWind, and NativeWindUI. Actually, there are much, you could try to prompt them by keywords earlier.&lt;/p&gt;

&lt;p&gt;When I do prompting, there are certain keywords pop-up: Expo and Solito. By process of elimination, the one that certainly focused for Mobile development are Ignite, CES, and TheCodingMachine while both extend Expo framework.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ignite CLI&lt;/strong&gt; resulting few decision: Code Native Generation or Manual? Expo Router (dep: expo-router; Experimental) or React Router? This boilerpalte is opinioned following Infinite Red's best practice. Which is using MobX as state management. With Demo App, there is additional dependency name &lt;code&gt;expo-application&lt;/code&gt;. And with Expo Router, would have main to &lt;code&gt;expo-router/entry&lt;/code&gt;. No styling, use react navigation, apisauce, data-fns, and reactotron.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CES/RN-new&lt;/strong&gt; has: React Navigation or Expo Router? Nativesind/StyelSheet (vanilla)/Unistyle/NativewindUI? Use Zustand? Use auth with Supabase or Firebase? setup EAS? The &lt;code&gt;@react-navigation/&lt;/code&gt; is using &lt;code&gt;stack&lt;/code&gt; module. Has &lt;code&gt;.yarn/&lt;/code&gt; and its auto commit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TheCodingMachine&lt;/strong&gt; is built on-top of ReactNativeCommunity template generator. The only question: use Typescript? It is not using Expo. But, using Zod, with react navigation, ky, react native mmkv, and reactotron.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am not need an overkill boilerplate. An Expo Framework with Expo Router is enough. And I need to target Android and Desktop. I love Tailwind, so I may use Nativewind, Uniwind, xor NativewindUI. I also don't need a test suit. In conclusion, I would follow basic &lt;a href="https://reactnative.dev/docs/environment-setup" rel="noopener noreferrer"&gt;React-Expo setup&lt;/a&gt; and then take few modules and project structure from these boilerplate.&lt;/p&gt;

&lt;p&gt;Not like Kotlin, I already have experience in JavaScript, TypeScript, NodeJS, NextJS, and React. For now, I just need to learn-by-doing to understand Android or mobile skeleton.&lt;/p&gt;

&lt;p&gt;Ok. Let's just start.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;4 Jan 2026&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As Expo cannot have Windows, I need to test few things. I would try to generate Expo, Ignite CLI, CES, and TCM. Then, I follow every modules and principles they have. For a moment, I need the most battery-ready, so Expo + App Router + Nativewind.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx rn-new@latest rnrnnew &lt;span class="nt"&gt;--expo-router&lt;/span&gt; &lt;span class="nt"&gt;--nativewind&lt;/span&gt; &lt;span class="nt"&gt;--zustand&lt;/span&gt; &lt;span class="nt"&gt;--yarn&lt;/span&gt;

npx ignite-cli new rnigcli &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bundle&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;com.rnigcli &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--git&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--install-deps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--packager&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;yarn &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--target-path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\f&lt;/span&gt;arha&lt;span class="se"&gt;\D&lt;/span&gt;ownloads&lt;span class="se"&gt;\w&lt;/span&gt;orkspace&lt;span class="se"&gt;\t&lt;/span&gt;emp&lt;span class="se"&gt;\r&lt;/span&gt;nigcli &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--remove-demo&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--experimental&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;expo-router &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workflow&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cng &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--no-timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seems I would chose either CES xor TCM. CES would be the first thing I choose. If such ad-hoc use-case need a dependencies, I will imitate one of them (include vanilla and ignite cli). I will document every consideration in next steps.&lt;/p&gt;

&lt;h1&gt;
  
  
  Environment Setup
&lt;/h1&gt;

&lt;p&gt;I would follow &lt;a href="https://docs.expo.dev/get-started/set-up-your-environment/?platform=android&amp;amp;device=simulated&amp;amp;mode=development-build&amp;amp;buildEnv=local" rel="noopener noreferrer"&gt;Expo setup environment&lt;/a&gt; and &lt;a href="https://reactnative.dev/docs/set-up-your-environment" rel="noopener noreferrer"&gt;React Native setup environment&lt;/a&gt;. Similar to previous blog, I use Windows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Via Jetbrains Toolbox, install Android Studio. Use latest SDK.&lt;/li&gt;
&lt;li&gt;Download Jetbrains Runtime SDK with JCEF (JBRSDK-JCEF)&lt;/li&gt;
&lt;li&gt;Download Android 15 SDK&lt;/li&gt;
&lt;li&gt;Set Environment Variables, use GUI.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk
PATH=%PATH%:%ANDROID_HOME%\platform-tools
PATH=%PATH%:%ANDROID_HOME%\emulator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Download Android Emulator. I use Android Desktop Medium.&lt;/li&gt;
&lt;li&gt;Generate Expo project with Create Expo State / rn.new
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx rn-new@latest wewayangan --expo-router --nativewind --zustand --yarn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;undo commit as CES would commit &lt;code&gt;.yarn/&lt;/code&gt; into it. Remove it first.&lt;/li&gt;
&lt;li&gt;Git commit all content inside for initiation, ensure &lt;a href="https://www.toptal.com/developers/gitignore/api/node,reactnative,react" rel="noopener noreferrer"&gt;.gitignore&lt;/a&gt; exists.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npx expo install expo-dev-client&lt;/code&gt; and git commit again&lt;/li&gt;
&lt;li&gt;Install &lt;a href="https://marketplace.visualstudio.com/items?itemName=expo.vscode-expo-tools" rel="noopener noreferrer"&gt;Expo Tools - Visual Studio Marketplace&lt;/a&gt;, &lt;a href="https://marketplace.visualstudio.com/items?itemName=msjsdiag.vscode-react-native" rel="noopener noreferrer"&gt;React Native Tools - Visual Studio Marketplace&lt;/a&gt;, and other extension related to Expo and React Native&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npx expo-doctor&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything should already been setup. I would follow few tutorial and guidelines along this app development.&lt;/p&gt;

&lt;p&gt;No. Please also do this for React Native Windows. &lt;a href="https://microsoft.github.io/react-native-windows/docs/rnw-dependencies" rel="noopener noreferrer"&gt;System Requirements · React Native for Windows&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Libraries Setup &amp;amp; Framework Preparation
&lt;/h2&gt;

&lt;p&gt;I should say many steps is not shown previously, it includes push branch to Github, Extention already installed, global npm, and fixing missing toolkit from expo-doctor. Goodness, no issues.&lt;/p&gt;

&lt;p&gt;The Framework is not fully complete, I want to build to Android and Windows for this MVP. Then, I need to install few libraries.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Good things, &lt;a href="https://docs.expo.dev/develop/app-navigation/#expo-router-recommended-for-expo-projects" rel="noopener noreferrer"&gt;Expo Router Navigation&lt;/a&gt; is installed by default.&lt;/li&gt;
&lt;li&gt;Then, I need &lt;a href="https://microsoft.github.io/react-native-windows/docs/getting-started" rel="noopener noreferrer"&gt;React Native Windows&lt;/a&gt;, NativeWind, and Zustand/Zod&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;F**K. Why should I... I should explore it and research it more. In the end, EXPO not working with Windows. Even, the official ReactNativeWindows is encapsulating Electron, like whaaaaaat...&lt;/p&gt;

&lt;p&gt;Should I just move on to Flutter? Or I just give up the Desktop one. Why in the world.&lt;/p&gt;

&lt;p&gt;Ok. &lt;del&gt;I will start Flutter&lt;/del&gt;. After this all mess is done, I will wrote some ranting how to choose your first programming language unwisely without following the mainstream "YOU SHOULD START BY THE BASIC!".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;4 Jan 2026&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, no, hehe. I would not use Expo. Just learn by it. Ok, I use CES and following previous steps. One thing should be remember, the initial commit by CES is also include &lt;code&gt;.yarn/&lt;/code&gt;. I need to undo commit and remove it first.&lt;/p&gt;

&lt;p&gt;I follow everything in &lt;a href="https://microsoft.github.io/react-native-windows/docs/rnw-dependencies" rel="noopener noreferrer"&gt;system requirements&lt;/a&gt;, of course not following scripts. Still failed, even after installing .Net 6 for whatever reason. Then, I gave up and use scripts in &lt;code&gt;node_modules\react-native-windows\scripts\rnw-dependencies.ps1&lt;/code&gt;, it &lt;strong&gt;install .Net 8&lt;/strong&gt; for some reason while not match with the docs. I do it. And finally, still not working.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;✖ Building Solution
 ✖ Build failed with message 5:5&amp;gt;LINK : fatal error LNK1104: cannot open file &lt;span class="s1"&gt;'C:\Users\username\.nuget\packages\microsoft.windowsappsdk\1.7.250401001\buildTransitive\native\..\..\lib\win10-\Microsoft.WindowsAppRuntime.Bootstrap.lib'&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\u&lt;/span&gt;sername&lt;span class="se"&gt;\D&lt;/span&gt;ownloads&lt;span class="se"&gt;\w&lt;/span&gt;ewayangan-mediaplayer&lt;span class="se"&gt;\n&lt;/span&gt;ode_modules&lt;span class="se"&gt;\r&lt;/span&gt;eact-native-windows&lt;span class="se"&gt;\M&lt;/span&gt;icrosoft.ReactNative&lt;span class="se"&gt;\M&lt;/span&gt;icrosoft.ReactNative.vcxproj]. Check your build configuration.
 ℹ Gathering MSBuild data &lt;span class="k"&gt;for &lt;/span&gt;telemetry.
 ℹ Unable to find msbuildproperties.g.json
Command failed with error MSBuildError: 5:5&amp;gt;LINK : fatal error LNK1104: cannot open file &lt;span class="s1"&gt;'C:\Users\username\.nuget\packages\microsoft.windowsappsdk\1.7.250401001\buildTransitive\native\..\..\lib\win10-\Microsoft.WindowsAppRuntime.Bootstrap.lib'&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;C:&lt;span class="se"&gt;\U&lt;/span&gt;sers&lt;span class="se"&gt;\u&lt;/span&gt;sername&lt;span class="se"&gt;\D&lt;/span&gt;ownloads&lt;span class="se"&gt;\w&lt;/span&gt;ewayangan-mediaplayer&lt;span class="se"&gt;\n&lt;/span&gt;ode_modules&lt;span class="se"&gt;\r&lt;/span&gt;eact-native-windows&lt;span class="se"&gt;\M&lt;/span&gt;icrosoft.ReactNative&lt;span class="se"&gt;\M&lt;/span&gt;icrosoft.ReactNative.vcxproj]
Your telemetry sessionId was ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aaa... I still do not know. I want give up for now. This will be archived and next time is about troubleshooting this, doing some Nativewind works, and try to push Expo further. This development of Wewayangan using React Native is failed and ends here. I just want to get native experience and RNW is using Electron is a big no for me.&lt;/p&gt;

&lt;p&gt;For now, let's just going with Flutter.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;8 Jan 2026&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>devjournal</category>
      <category>javascript</category>
      <category>mobile</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>(🐱-1-1; Drop) Media Preview and Converter with Kotlin Compose Multiplatform</title>
      <dc:creator>Felis Cato</dc:creator>
      <pubDate>Sat, 20 Dec 2025 09:05:08 +0000</pubDate>
      <link>https://dev.to/farhanms123/media-preview-and-converter-with-kotlin-compose-multiplatform-1m8p</link>
      <guid>https://dev.to/farhanms123/media-preview-and-converter-with-kotlin-compose-multiplatform-1m8p</guid>
      <description>&lt;p&gt;I have issues on Google Photo app. It can play and view most media extensions, such as webm and webp. It could zoom on video, even editing photo. It is great, but there are missing few features. I can speed up or slow down the video, natively taking snapshot on video, or convert or scale down (compress, resize, resolution, etc) space size of media files in bulk. For the conversion, I need it from WebP or PNG to JPEG (lossy MozJPEG) and WebM to MP4. As video size compression or resolution reducer, I need to find encoder similar to png -&amp;gt; jpeg. Seems MP4 in HEVC/H.265/AV1 codec.&lt;/p&gt;

&lt;p&gt;As a developer, I choose the most reasonable path I could think of. Yes, reinventing the wheels. But, I am not that blind, so I do research; I mean I ask AI to do the research. For now, only Google Photo and VLC Media that has 2 feature of all missing. I would go to NotebookLM and ask it to do Deep Research, also Gemini 3 Pro, Gemini 3 Pro Deep Research, and Google AI Search.&lt;/p&gt;

&lt;p&gt;So, the results are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NLM:&lt;/strong&gt; MX Player Pro, KMPlayer Plus, Zoom Video Player, FX Player, OPlayer, Aves Gallery, Fossify Gallery, F-Stop Media Gallery, Standard Gallery, EzyCapture, Video to Photo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;G3P:&lt;/strong&gt; KMPlayer, MX Player, Panda Video Compressor &amp;amp; Converter, Aves Gallery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;G3PDR:&lt;/strong&gt; MiXplorer, Aves Gallery, XPlayer, Simple Gallery Pro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GAIS:&lt;/strong&gt; KMPlayer, MX Player, Zoom Video Player&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Welp... seems what I want to have already exists out there and I need to review each one. Nvm... Let's just coding it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;in this blog, you would follow my elaborated journey in developing this App. I have no experience in Java and Kotlin, so this also showing from the beginning how I start program in Kotlin.&lt;/p&gt;

&lt;p&gt;I actually end my journaling and not continue using Kotlin to do this project. Feel free to read my journey in embracing Kotlin Compose Multiplatform.&lt;/p&gt;

&lt;p&gt;Uuh... I just give up. Kotlin would be my next project because it involve server action. Unfortunately, everything I wrote in commonMain would not reflect to server. So, I should find a way to connect it. I would try hard everything I wrote, I should not wrote the logic flow once again in server specific-platform. And I don't want to wrote a boilerplate for it. Trust me, I ask Google Search AI. (Jk. I know it slop. I would do proper research when time come)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  Framework Exploration
&lt;/h1&gt;

&lt;p&gt;I already have an objective. An MVP of Media Viewer (PNG, JPG, MP4, WebP, WebM) with zoom mode, Snapshot, Speed mode, Converter with Compression and rescaling, and bulk conversion. My additional requirements are name formatting, and Zoom-in frame (and preview) in seek player. Also, cross-platform so I could also use it on Desktop -- Windows and Linux.&lt;/p&gt;

&lt;p&gt;As I am playing with Codec, I need a language mature and native enough it has libraries I need. Normally, we will think about React Native (with Expo) or Flutter (not that mature) to solve this. But, I also think about Kotlin Compose Multiplatform (Java is mature), NativeScript (NodeJS via nodify or runtime-node-api, only support Obj-C APIs), CapacitorJS / Ionic Framework (HTML is easier but SPA; Native should use Java and similar). In near native should use Xamarin / .Net MAUI, Android (Java/Kotlin), and .Net (C# / VB) Windows Form.&lt;/p&gt;

&lt;p&gt;What I want is single Write Once, run Anywhere. Goodness knows, RN and KCMP may be the best choice. But, I need to consider the app must have a faster cold start, and codec library should have imported to Dart. So, Flutter should be the best choice. Originally, I just want to learn KCMP and disregards what futures I could have if I began to start RN or Flutter or native Android and iOS development like right now. Ugh... the illusion of free will.&lt;/p&gt;

&lt;p&gt;Well, then. Puck (the great spirit) it. I will just go... by... ugh Wheel of Name giving me Flutter. So I must go by KCMP ;-) I just want to learn Android development with Kotlin (")&amp;gt; Let's Go!&lt;/p&gt;

&lt;h1&gt;
  
  
  Starting the Journey
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;this is journey about learning Kotlin, you could skip to the next session&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;React Native has Expo Framework, so that Flutter has Very Good CLI. For this one, I don't want to reinventing the wheel, I need a batteries-ready, boilerplate, template, or project generator like NextJS, Laravel, and Spring Boot (with all libraries can be add). Seems for Kotlin, nothing. Or I may have not yet finding these gems. The hunting can go on along the Development as Always.&lt;/p&gt;

&lt;p&gt;This is my first time I am going with Kotlin, so I search it. The second list is &lt;a href="https://developer.android.com/kotlin" rel="noopener noreferrer"&gt;Kotlin and Android  |  Android Developers&lt;/a&gt; and become the starting point by following every links and the referrals. And those I get to &lt;a href="https://kotlinlang.org/docs/multiplatform/compose-multiplatform-create-first-app.html" rel="noopener noreferrer"&gt;Create your Compose Multiplatform app | Kotlin Multiplatform Documentation&lt;/a&gt;; and well... I may need to learn few basics Kotlin first before I continue my journey.&lt;/p&gt;

&lt;p&gt;I just know &lt;a href="https://kotlinlang.org/docs/multiplatform/quickstart.html" rel="noopener noreferrer"&gt;that Jetbrain&lt;/a&gt; has &lt;a href="https://github.com/JetBrains/JetBrainsRuntime" rel="noopener noreferrer"&gt;JetBrainsRuntime (JBR)&lt;/a&gt; that bundled with Java Chromium Embedded Framework (JCEF) by default when installed any Intellij-based IDE. Originally, I want to use Adoptium OpenJDK, but this JBR force me to analyze why it is better.&lt;/p&gt;

&lt;p&gt;I tried to find Course in Udemy or any online Course that elaborate Kotlin. What I need is a long Course that explain deeply about Kotlin, a masterclass or bootcamp but not Android Course. Seems most courses only cover basic Functional Programming like Go or Javascript. Welp... It would be just fine to following official docs &lt;a href="https://kotlinlang.org/docs/getting-started.html" rel="noopener noreferrer"&gt;Kotlin Get Started&lt;/a&gt; and following &lt;a href="https://plugins.jetbrains.com/plugin/10081-jetbrains-academy" rel="noopener noreferrer"&gt;JetBrains Academy Plugin for JetBrains IDEs&lt;/a&gt;, and also doing few on-boarding first to know Intellij Idea more. Oh! There actually is &lt;a href="https://www.coursera.org/learn/kotlin-for-java-developers" rel="noopener noreferrer"&gt;Coursera by Jetbrains&lt;/a&gt; exists, and it is free. And actually from the Plugin, an actual e-book Atomic Kotlin &lt;a href="https://www.atomickotlin.com/" rel="noopener noreferrer"&gt;Learning Resources for the Kotlin Programming Language&lt;/a&gt;. Also, &lt;a href="https://www.codecademy.com/catalog/language/kotlin" rel="noopener noreferrer"&gt;Kotlin Courses &amp;amp; Tutorials | Codecademy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I met few difficulty in running on-boarding sample demo Kotlin and Java. I would follow tutorial hell for this Kotlin and related so I would understand the concept behind it. Seems there is few things that Intellij not setting up. As I said, I never really do Java in best practices except Android Tutorial, and even that, I do JavaScript coding style. I really hate too much abstraction and interface. Put that aside, I need to finish this on-boarding to ensure everything is ready.&lt;/p&gt;

&lt;p&gt;All how to setup the project would be put inside Environment Setup. In here I would just raise few question. Even if I said built-in, seems it can't be reach within CMD. So, I would try to refine environment setup. By default it would take JDK from Adoptium, lets change that.&lt;/p&gt;

&lt;p&gt;So, JBR with JCEF is just to run the IDE, not development. Meaning I need to download JBRSDK-JCEF from IDE. Well... I assume kotlin is a binary file instead of JAR, but seems not.&lt;/p&gt;

&lt;p&gt;What I like about IDEs are they have starter pack or bootstraper of any project they have. Such as Eclipse, Netbeans, Visual Studio, and Intellij series. For now, I am supervising Kotlin bootstraper with Intellij, Maven, and Kotlin. I still figuring out outside download kotlin compiler, how could I get kotlinc via JBRSDK? Oh! also I would use &lt;a href="https://plugins.jetbrains.com/plugin/10080-rainbow-brackets" rel="noopener noreferrer"&gt;Rainbow Brackets Plugin for JetBrains IDEs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In conclusion, I use Gradle DSL-Kotlin for Multi-Module Build. I love more common project structure with extendable use-case. Next question remains... Could I setup these project in other IDE like VSCode, Ecplise, or Netbeans? Could I code Kotlin Multiplatform without IntelijIDEA? What could be the simplest Kotlin setup and execution to mimick NodeJS and NPM based project? In Gradle based project, I can't see how the terminal execute Kotlin project, but in non-grade I can see it execute Java and import kotlin compile module.&lt;/p&gt;

&lt;p&gt;Ok, I already finish learning everything about Kotlin, though takes 4 days. As I already know PHP, JavaScript, and Go; Kotlin actually pretty simple even though it has too many types of classes, like I want to complain you could just need max 3 type of classes, but you have like 5? Why... I only follow Intellij IDEA learning the GUI, inspecting every types of project structure in create project wizard, Inspecting of every &lt;a href="https://kotlinlang.org/docs/getting-started.html#console" rel="noopener noreferrer"&gt;Kotlin Use-Case&lt;/a&gt;, and learning via &lt;a href="https://kotlinlang.org/docs/kotlin-tour-welcome.html" rel="noopener noreferrer"&gt;Kotlin Tours&lt;/a&gt; both beginner and Intermediate. But, not expect I would following OOP and Project Structure best practice of Kotlin and Compose Multi-platform. I would only use the Wizard. And, lets continue to having a quickstart and tours of Kotlin Compose Multi-platform.&lt;/p&gt;

&lt;p&gt;Uuh, I actually just see this and Kotlin has actually all resources I need: &lt;a href="https://kotlinlang.org/education/" rel="noopener noreferrer"&gt;Kotlin for Education&lt;/a&gt;, &lt;a href="https://kotlinlang.org/docs/learning-materials-overview.html" rel="noopener noreferrer"&gt;Learning materials overview&lt;/a&gt;, &lt;a href="https://kotlinlang.org/docs/multiplatform/kmp-learning-resources.html" rel="noopener noreferrer"&gt;Learning resources&lt;/a&gt;. What ever, now I want to compare generating KCMP from &lt;a href="https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform" rel="noopener noreferrer"&gt;Plugin&lt;/a&gt; and from &lt;a href="https://kmp.jetbrains.com/?android=true&amp;amp;ios=true&amp;amp;iosui=compose&amp;amp;desktop=true&amp;amp;web=true&amp;amp;webui=compose&amp;amp;server=true&amp;amp;includeTests=true" rel="noopener noreferrer"&gt;KMP Web Wizard&lt;/a&gt; with covering all platform. I will use Android Studio to do so. Creating CMP project from plugin in Android result few &lt;a href="https://developer.android.com/kotlin/multiplatform/plugin#migrate" rel="noopener noreferrer"&gt;deprecated on Android Gradle above 9.0.0&lt;/a&gt;. Also showing error from KMP Web Wizard, and both has same structure. And for now, I would learn KCMP following &lt;a href="https://kotlinlang.org/docs/multiplatform/compose-multiplatform-create-first-app.html" rel="noopener noreferrer"&gt;Create your Compose Multiplatform app | Kotlin Multiplatform Documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ok. Already done learning KCMP. The missing pieces of these learning, I just doing "book" reading, while I missing what modules is imported, how to breakdown components, see annotation, classess, or functions behind the logic. I would learn in doing the real works. For additional notes, by long consideration, this project should be done using Flutter or React Native, it is because I do not really need a very native and hard cross-platform solution. I just need Android and Desktop implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Server and Web
&lt;/h2&gt;

&lt;p&gt;In KMP Wizard, it ask to generate Web (with Kotlin/JS and Kotlin/Wasm) and Server with Ktor. I thought if I make some action in commonMain, then if I serve the web server, the action would run via server. Something like RPC or NextJS React Server Action, which KCMP would generate the endpoints for us. But seems not. The action in button only works in browser and not sent back into Ktor.&lt;/p&gt;

&lt;p&gt;I try to explore with Gemini (I am too lazy to explore properly... urgh...), React Native actually has Expo Router and Server Action. Then, Flutter has no built-in and must use Serverpod and Celest. And finally, Kotlin must use Kotlinx.rpc. Seems, I must explore again thoroughly. I have other use-case that I should use Kotlin and write-once, applied anywhere.&lt;/p&gt;

&lt;h1&gt;
  
  
  Environment Setup
&lt;/h1&gt;

&lt;p&gt;After long consideration, here are few things need to setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;del&gt;Install JDK, either &lt;a href="https://adoptium.net/temurin/releases" rel="noopener noreferrer"&gt;Eclipse Adoptium Temurin&lt;/a&gt; or JetbrainRuntime JRB-JDK via &lt;a href="https://github.com/JetBrains/JetBrainsRuntime/releases" rel="noopener noreferrer"&gt;release page&lt;/a&gt; or built in Intellij IDEA&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Install Android Studio via Jetbrain Toolbox&lt;/li&gt;
&lt;li&gt;Install extension &lt;a href="https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform" rel="noopener noreferrer"&gt;Kotlin Multiplatform&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Install Kotlin (kotlin-compiler), could via &lt;a href="https://github.com/JetBrains/kotlin/releases/tag/v2.3.0" rel="noopener noreferrer"&gt;release&lt;/a&gt; or built-in&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Install SDK via File &amp;gt; Project Structure &amp;gt; under Platform Settings &amp;gt; SDKs. Download new SDK from it, better use JBRSDK-JCEF. This can be accessed when create new project. Recommended to use v21 or v25 in 25 Dec 2025.&lt;/li&gt;
&lt;li&gt;Enable &lt;a href="https://stackoverflow.com/questions/64906975/intellij-kotlin-how-do-i-fix-ensure-that-you-have-a-dependency-on-the-kotlin" rel="noopener noreferrer"&gt;KotlinJavaRuntime&lt;/a&gt; and then in Project, do Tools &amp;gt; Kotlin &amp;gt; Configure Kotlin in Project&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If everything setup, let's generate the project using &lt;a href="https://kmp.jetbrains.com/?android=true&amp;amp;desktop=true&amp;amp;includeTests=false" rel="noopener noreferrer"&gt;KMP Wizard&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Blueprint
&lt;/h1&gt;

&lt;p&gt;N/A&lt;/p&gt;

&lt;h1&gt;
  
  
  Development Notes
&lt;/h1&gt;

&lt;p&gt;Uuh... Sorry. Seems I need to end this here. I should already know when to stop and choose wisely. "You could use any programming language" is actually b*llsh*t as my program is actually simple enough which no need to scale. So, I would go using React Native, not because it is easy, but because it met my minimal my requirement. Actually, KCMP is much more easier enough to learn.&lt;/p&gt;

&lt;p&gt;So, I would leave this a piece of junks in here, so you could read my learning workflow. End of journey. Bye!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;30 Dec 2025&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>android</category>
      <category>mobile</category>
      <category>kotlin</category>
      <category>devjournal</category>
    </item>
  </channel>
</rss>
