<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rok Retar · Engineering notes</title>
    <link>https://www.retar.app/#notes</link>
    <atom:link href="https://www.retar.app/feed.xml" rel="self" type="application/rss+xml"/>
    <description>Write-ups of problems Rok Retar solved in Kotlin, Kotlin Multiplatform and Kobweb, with the code.</description>
    <language>en</language>
    <lastBuildDate>Sun, 25 Oct 2026 12:00:00 GMT</lastBuildDate>
    <item>
      <title>Password managers can't see a canvas: real sign-in forms in Compose for the web</title>
      <link>https://www.retar.app/blog/password-managers-compose-multiplatform-web</link>
      <guid isPermaLink="true">https://www.retar.app/blog/password-managers-compose-multiplatform-web</guid>
      <description>Compose Multiplatform draws its text fields on a canvas, so browser password managers have nothing to fill or save. How Parrot slides a real HTML form under the canvas without changing how the fields look, from sign-in to new-password forms, and the focus fight, Tab order and font path it took to get there.</description>
      <pubDate>Sun, 25 Oct 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Neural voices in shared Kotlin: Kokoro on ONNX Runtime, without sherpa-onnx or espeak</title>
      <link>https://www.retar.app/blog/kokoro-tts-shared-kotlin-onnx-runtime</link>
      <guid isPermaLink="true">https://www.retar.app/blog/kokoro-tts-shared-kotlin-onnx-runtime</guid>
      <description>Part two of Parrot's on-device voices: replacing sherpa-onnx with ONNX Runtime behind one Kotlin interface, calling its C API from Kotlin on iPhone, and porting an English pronunciation front end so Kokoro needs no espeak-ng.</description>
      <pubDate>Tue, 20 Oct 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>My Android app in a browser: Parrot on Kotlin/Wasm</title>
      <link>https://www.retar.app/blog/android-app-in-the-browser-kotlin-wasm</link>
      <guid isPermaLink="true">https://www.retar.app/blog/android-app-in-the-browser-kotlin-wasm</guid>
      <description>How Parrot's shared Kotlin code went from phones to the browser: 57 of 59 modules compiling with two build files changed, a SQLite database saved into IndexedDB, Readium under a Compose canvas, and what the first screen costs to download.</description>
      <pubDate>Fri, 16 Oct 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Highlighting the sentence the narrator is reading: EPUB read-along with Media3</title>
      <link>https://www.retar.app/blog/epub-read-along-media3</link>
      <guid isPermaLink="true">https://www.retar.app/blog/epub-read-along-media3</guid>
      <description>How Parrot keeps the text and the narration in step: SMIL media overlays, one ExoPlayer playlist per chapter, page turns for split sentences, and the Media3 update that silently killed playback.</description>
      <pubDate>Tue, 13 Oct 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Every catalogue is hostile: an OPDS client in Kotlin Multiplatform</title>
      <link>https://www.retar.app/blog/opds-catalogue-client-kotlin-multiplatform</link>
      <guid isPermaLink="true">https://www.retar.app/blog/opds-catalogue-client-kotlin-multiplatform</guid>
      <description>Building Parrot's OPDS catalogue browser in shared Kotlin: parsing two feed formats, keeping passwords on their origin, and the nine bugs a security review found.</description>
      <pubDate>Tue, 13 Oct 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Never lose someone's place: syncing reading positions across devices and formats</title>
      <link>https://www.retar.app/blog/syncing-reading-positions</link>
      <guid isPermaLink="true">https://www.retar.app/blog/syncing-reading-positions</guid>
      <description>How Parrot syncs where you are in a book: local-first writes, compare-and-set revisions on the server, when to settle a conflict and when to ask, and moving a position between an ebook and its audiobook.</description>
      <pubDate>Tue, 13 Oct 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Neural voices on an e-ink reader: on-device TTS in Parrot with sherpa-onnx</title>
      <link>https://www.retar.app/blog/on-device-neural-tts-android</link>
      <guid isPermaLink="true">https://www.retar.app/blog/on-device-neural-tts-android</guid>
      <description>How Parrot reads any ebook aloud with Kokoro and Supertonic running on the phone: downloading 150 MB voices safely, preparing chapters ahead, and the lambda that crashed every synthesis.</description>
      <pubDate>Tue, 13 Oct 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Wrapping the AppsFlyer SDK into a Kotlin Multiplatform library (when no official KMP SDK exists)</title>
      <link>https://www.retar.app/blog/appsflyer-kmp-wrapper</link>
      <guid isPermaLink="true">https://www.retar.app/blog/appsflyer-kmp-wrapper</guid>
      <description>A coroutine-first wrapper around the AppsFlyer Android and iOS SDKs: all the logic in common code, two thin native adapters, deep links as a Flow, and 160 tests that never touch a real SDK.</description>
      <pubDate>Sun, 28 Jun 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Shipping SQLCipher inside a static Kotlin/Native framework (so the iOS team changed nothing)</title>
      <link>https://www.retar.app/blog/sqlcipher-static-kotlin-native-framework</link>
      <guid isPermaLink="true">https://www.retar.app/blog/sqlcipher-static-kotlin-native-framework</guid>
      <description>Baking SQLCipher into a static Kotlin/Native framework so the iOS team adds nothing, not even a linker flag.</description>
      <pubDate>Sun, 21 Jun 2026 12:00:00 GMT</pubDate>
    </item>
    <item>
      <title>Building a smooth, infinite carousel in Kobweb</title>
      <link>https://www.retar.app/blog/infinite-carousel</link>
      <guid isPermaLink="true">https://www.retar.app/blog/infinite-carousel</guid>
      <description>A gapless, endlessly looping carousel in Kobweb and Silk: one CSS transform, no timers, no scroll code.</description>
      <pubDate>Mon, 17 Nov 2025 12:00:00 GMT</pubDate>
    </item>
  </channel>
</rss>
