samiul@portfolio:~/projects/dareader$ cat README.md

03 dareader

[desktop] [kotlin] [updated 2026-09]

A Tachiyomi-style reader for Linux in Kotlin + Compose Multiplatform that loads Keiyoushi's Android extensions directly on the desktop JVM.

status: early: loader slice working

samiul@portfolio:~/projects/dareader$ cat problem.txt

Keiyoushi extensions ship as Android APKs: Dalvik bytecode linked against android.* classes. A desktop JVM can't load dex at all, let alone satisfy those imports.

samiul@portfolio:~/projects/dareader$ cat build.log

The extension runtime does it in-process: parse the APK manifest without installing, convert the dex to a jar with dex2jar, run two ASM repair passes over the bytecode, then load each jar in its own child-first classloader with android.* stubbed out on the JVM. The approach and the compat module are vendored from Suwayomi-Server rather than reinvented. The loader slice renders browse → detail → reader against live extensions (exercised on MangaDex and Comic Fury), with an extension store, install trust checks and a dark Material 3 shell on Compose Multiplatform. Revenant takes the other route to the same problem and runs extensions in a sidecar server.

samiul@portfolio:~/projects/dareader$ cat highlights.txt

  • APK → dex2jar → ASM repair → child-first classloader, all in-process
  • android.* stubbed on the desktop JVM
  • Browse → detail → reader working against live extensions
  • Extension store with an install trust pipeline
  • Compose Multiplatform, Material 3 dark shell

samiul@portfolio:~/projects/dareader$ cat stack.toml

# dareader

lang = "kotlin + java"

ui = "compose multiplatform, material 3"

load = "dex2jar + asm repair passes"

isolate = "child-first classloader per jar"

compat = "android.* stubs on the jvm"

status = "loader slice working"

stack = ["Kotlin", "Compose Multiplatform", "Java", "Gradle"]

samiul@portfolio:~/projects/dareader$ git remote -v

interactive shell: try help, ls, open 04, phosphor amber

SH‑TERM  ▚  MODEL 2026