<?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: Measify</title>
    <description>The latest articles on DEV Community by Measify (@measify).</description>
    <link>https://dev.to/measify</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%2F4239733%2Fad3b63d1-31e1-4487-b852-5d1647f861c0.png</url>
      <title>DEV Community: Measify</title>
      <link>https://dev.to/measify</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/measify"/>
    <language>en</language>
    <item>
      <title>I built a manga translator app with Kotlin Multiplatform, and cut the cost per page from $0.05 to under half a cent</title>
      <dc:creator>Measify</dc:creator>
      <pubDate>Wed, 11 Nov 2026 19:37:23 +0000</pubDate>
      <link>https://dev.to/measify/i-built-a-manga-translator-app-with-kotlin-multiplatform-and-cut-the-cost-per-page-from-005-to-434i</link>
      <guid>https://dev.to/measify/i-built-a-manga-translator-app-with-kotlin-multiplatform-and-cut-the-cost-per-page-from-005-to-434i</guid>
      <description>&lt;p&gt;I'm a solo developer, and for the past months I've been building &lt;strong&gt;&lt;a href="https://mangit.app/?utm_source=devto" rel="noopener noreferrer"&gt;Mangit&lt;/a&gt;&lt;/strong&gt;: an iOS and Android app that translates manga, manhwa and comic pages. You take a photo or screenshot of a page, and the app puts the translation back &lt;strong&gt;inside the speech bubbles&lt;/strong&gt;, so you read the page like it was lettered in your language.&lt;/p&gt;

&lt;p&gt;Here's how it's built and what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pipeline
&lt;/h2&gt;

&lt;p&gt;Every page goes through five steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Detect&lt;/strong&gt; the speech bubbles and text regions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read&lt;/strong&gt; the text (OCR)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Translate&lt;/strong&gt; it, with the source language detected automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Erase&lt;/strong&gt; the original lettering (inpainting) without damaging the art&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typeset&lt;/strong&gt; the translation back into the same bubble, fitting the font size to the space&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Steps 4 and 5 are where most of the work went. A translation that's correct but overflows the bubble, or leaves ghost strokes of the original text, feels broken to readers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kotlin Multiplatform + Compose Multiplatform&lt;/strong&gt; for one shared UI and logic layer on iOS and Android&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Koin&lt;/strong&gt; for DI, &lt;strong&gt;Ktor&lt;/strong&gt; for networking, &lt;strong&gt;Room&lt;/strong&gt; for the local library, &lt;strong&gt;RevenueCat&lt;/strong&gt; for subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Firebase Cloud Functions&lt;/strong&gt; (Node.js) as the backend that orchestrates the AI calls&lt;/li&gt;
&lt;li&gt;A self-hosted processing pipeline on &lt;strong&gt;Modal&lt;/strong&gt; for the detection / erase / typeset work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sharing the UI across both platforms is what makes it realistic to ship this alone. The platform-specific parts are small: image picking, file access, and a couple of &lt;code&gt;expect/actual&lt;/code&gt; abstractions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cost was the real problem
&lt;/h2&gt;

&lt;p&gt;The first version sent every page to a large image model. The output was good, but it cost about &lt;strong&gt;$0.05 per page&lt;/strong&gt;. Manga readers don't translate one page: they translate whole chapters. At that price a free tier is impossible and even paid users can lose you money.&lt;/p&gt;

&lt;p&gt;So I built a "lite" pipeline: smaller specialised models for each step instead of one big model, plus my own typesetting. It now runs at roughly &lt;strong&gt;$0.001 to $0.004 per page&lt;/strong&gt;, with the big model kept as a fallback. That's what lets the app have a real free tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons from going multilingual
&lt;/h2&gt;

&lt;p&gt;The app translates into 30+ languages. The hardest bugs weren't in the translation but in &lt;strong&gt;rendering&lt;/strong&gt;: a font that covers Latin scripts happily renders Thai, Arabic or Hindi as empty boxes, or nothing at all. If you typeset text yourself, test every script you support with real pages, not just English.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;iOS: &lt;a href="https://apps.apple.com/app/mangit/id6756326988?pt=126724485&amp;amp;ct=devto&amp;amp;mt=8" rel="noopener noreferrer"&gt;https://apps.apple.com/app/mangit/id6756326988?pt=126724485&amp;amp;ct=devto&amp;amp;mt=8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Android: &lt;a href="https://play.google.com/store/apps/details?id=com.measify.mangit&amp;amp;referrer=utm_source%3Ddevto" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.measify.mangit&amp;amp;referrer=utm_source%3Ddevto&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's free to try (3 pages to start, then 3 free pages every week). I'd love feedback, especially from anyone who has worked on text detection, inpainting or typesetting, or on Compose Multiplatform at this scale.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>kotlin</category>
      <category>android</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
