<?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: hammi</title>
    <description>The latest articles on DEV Community by hammi (@hammiwor).</description>
    <link>https://dev.to/hammiwor</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4177732%2F3cd92fc7-635e-4d54-ba93-55561d1b2b58.png</url>
      <title>DEV Community: hammi</title>
      <link>https://dev.to/hammiwor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hammiwor"/>
    <language>en</language>
    <item>
      <title>How I Kept a 4K Media Client Under 1 MB (When Every Player App Weighs 100 MB+)</title>
      <dc:creator>hammi</dc:creator>
      <pubDate>Sun, 11 Oct 2026 20:21:49 +0000</pubDate>
      <link>https://dev.to/hammiwor/how-i-kept-a-4k-media-client-under-1-mb-when-every-player-app-weighs-100-mb-3boj</link>
      <guid>https://dev.to/hammiwor/how-i-kept-a-4k-media-client-under-1-mb-when-every-player-app-weighs-100-mb-3boj</guid>
      <description>&lt;p&gt;I build small software. My latest project, RKMovies, is a 4K-capable media client for Android and Windows that ships as a 0.91 MB APK. Not 91 MB — 0.91 MB. The average video player on the Play Store is 50–200 MB, and I wanted to understand exactly where that weight comes from, so I made an app with none of it.&lt;/p&gt;

&lt;p&gt;Here's the build diary: what I cut, what I kept, and what the trade-offs actually cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the 100 MB goes in a typical player
&lt;/h2&gt;

&lt;p&gt;Strip a mainstream player APK open and the bulk is almost never the playback logic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bundled codecs&lt;/strong&gt; — shipping ffmpeg or libmpv adds 30–70 MB on its own&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI frameworks&lt;/strong&gt; — React Native/Flutter runtimes, webviews, animation libs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Analytics SDKs&lt;/strong&gt; — crash reporters, A/B flags, attribution trackers, each pulling in dependencies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding assets&lt;/strong&gt; — illustrations, Lottie files, intro videos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is video playback. All of it is product surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I did instead
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;System codecs only.&lt;/strong&gt; Android's MediaCodec and Windows' Media Foundation are already on the device, hardware-accelerated, and maintained by the OS vendor for free. NVDEC/QuickSync/MediaCodec paths give you 4K decode without shipping a single codec byte. The app is a thin orchestration layer: demux the container, hand streams to the system decoder, composite the surface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Canvas-rendered UI.&lt;/strong&gt; The player HUD is drawn on a Canvas — dual-zone gestures (left = brightness/volume, right = seek/speed/track cycling), no DOM, no widget tree. It costs hundreds of KB, not tens of MB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No accounts, no telemetry.&lt;/strong&gt; No Firebase, no analytics, no login. This is as much a size decision as a privacy stance — tracking SDKs are transitive-dependency factories.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subtitles via WebVTT.&lt;/strong&gt; SRT parsing converted to WebVTT keeps the subtitle pipeline inside the browser/platform primitives.&lt;/p&gt;

&lt;p&gt;The result: 0.91 MB APK, 27 MB Windows installer, under 15 MB RAM at 4K playback, and it runs on 2 GB RAM phones that choke on mainstream players.&lt;/p&gt;

&lt;h2&gt;
  
  
  What that size budget buys you
&lt;/h2&gt;

&lt;p&gt;Smaller binaries are not just an engineering flex — they change who can use the app:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 GB RAM phones (still a huge installed base in India and SEA) stay smooth&lt;/li&gt;
&lt;li&gt;Downloads fit in a few seconds on 2G/3G data plans&lt;/li&gt;
&lt;li&gt;No "insufficient storage" install failures&lt;/li&gt;
&lt;li&gt;Zero background services, so battery drain tracks actual playback, not ad SDK housekeeping&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The honest trade-offs
&lt;/h2&gt;

&lt;p&gt;System codecs mean codec availability varies by device — an old Android build might lack HEVC 10-bit, where a bundled-codec app plays everything. Multi-track audio (Hindi/Tamil/Telugu/English switching is a core feature for my users) works fine through system paths, but exotic containers can need a fallback. And a Canvas HUD means no accessibility widget tree for screen readers — something I'm still working on.&lt;/p&gt;

&lt;p&gt;If you're building for markets where a 150 MB download is a real barrier, the system-codec path is criminally underused. The device already paid for the silicon; your app doesn't need to bring its own.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I'm the developer of RKMovies — you can see how the size claims hold up at &lt;a href="https://rkmovies.dpdns.org" rel="noopener noreferrer"&gt;rkmovies.dpdns.org&lt;/a&gt;, with the Android APK at &lt;a href="https://rkmovies.dpdns.org/apk" rel="noopener noreferrer"&gt;rkmovies.dpdns.org/apk&lt;/a&gt; and the Windows installer at &lt;a href="https://rkmovies.dpdns.org/desktop" rel="noopener noreferrer"&gt;the desktop page&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>android</category>
      <category>performance</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
