Open-source project
Aryan-Raj3112/episteme avatar
Aryan-Raj3112/episteme

Episteme ships five editions of one Kotlin Multiplatform reader, split along network access

A multi-platform document and e-book reader.

1,313 stars66 forksKotlinAGPL-3.0

At a glance

What is it?
Episteme Reader is an AGPL-3.0 document and e-book reader whose Android and desktop builds are published in five editions differing by distribution channel, network access and proprietary extras. Two of them have network permissions removed entirely, and translations require accepting a contributor licence agreement.
Who is it for?
Pick Episteme Reader when you want one reader for PDF, EPUB, MOBI, comics and office documents across Android and desktop, and take the OSS Offline edition if you need an audit trail showing the app cannot reach the network. Do not choose it for ML Kit OCR, cloud sync or cloud text to speech, since the README places those in the Play Store edition's proprietary extras, and the OSS editions substitute a bring your own key path for AI and cloud features.
Can I use it commercially?
Yes, with strict conditions. AGPL-3.0 is a network copyleft licence: if people use a modified version over a network, for example as a hosted service, you must offer them its source code under the same licence.
Is it still maintained?
Yes. The repository last received commits 13 days ago.
What is it written in?
Mainly Kotlin, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Five editions, one reader core

Episteme Reader is described as a customizable reader for documents, e-books, comics and text-heavy files, designed around local-first reading, typography control and flexible layouts, with a consistent Kotlin Multiplatform core across mobile and desktop. The repository layout matches that description: shared/ holds the common code, app/ is the Android application, desktopApp/ is the desktop application, and iosApp/ is the iOS project.

The edition structure is where the design decisions are made visible. The README states that the same core reading experience is available across editions, and that the main differences are distribution channel, network access, and whether proprietary online services are included. Three axes, five products.

The five rows of the table are the Play Store edition for Android, an OSS edition for Android, an OSS Offline edition for Android, a Standard edition for Linux and Windows, and an Offline edition for the same two desktop platforms. The README adds that future desktop platforms can use the same Standard and Offline model as support expands.

The reason this matters more than a normal open source versus proprietary split is that the OSS builds are not simply the Play Store build with the extras removed. They have their own application identifier, their own release stream with an -oss suffix, and, in the case of OSS Offline, no network permissions at all.

The OSS editions replace proprietary extras with bring your own key

The Play Store edition is the one with proprietary extras, and the list is specific: ML Kit OCR, cloud sync, AI tools, cloud text to speech, and PDF bubble zoom. Anyone evaluating this project for those five capabilities is looking at the closed build.

The OSS edition keeps network access and gets different things instead. It is described as a fully open-source Android build with OPDS, downloadable fonts, and bring your own key access to AI and cloud features.

That BYOK framing is the interesting part. The capability is not removed, it is moved: instead of a service the vendor runs, you supply a key and the app talks to a provider you chose. OPDS is a catalog protocol, so the open build can browse an online catalog rather than only a local folder, and downloadable fonts extend the typography control that the reader is built around.

The desktop Standard edition is the full-featured build with the shared KMP reader core and online-capable services, and the desktop Offline edition is described as focused on local reading with online services disabled. Note the deliberate difference in wording between the two offline Android and desktop builds: the Android one has network permissions removed, while the desktop one has online services disabled. Permissions and behaviour are different mechanisms, and the README distinguishes them.

What the reader actually handles

The format list is wider than the name suggests. PDF, EPUB, MOBI/AZW3, FB2, DOCX, ODT/FODT, TXT, Markdown, HTML, and comic archives are all supported, which makes this a document reader with an e-book reader's habits rather than a PDF viewer that also opens EPUB files.

Reading modes cover the cases that make reading on a phone annoying. Paginated reading and vertical scroll are the two obvious ones. Beyond those there is PDF multi-tab reading, PDF reflow, auto-scroll, and musician mode.

PDF tools include ink annotations, highlighting, erasing and text annotations, plus what the README calls reading-focused PDF controls. The PDF engines behind that are listed in the open source libraries section: PdfiumAndroidKt on Android and PDFium underneath it, with libmobi handling MOBI and AZW3. Parsing of HTML and Markdown goes through Jsoup and Flexmark, and Apache Commons Compress handles the archive formats that comic files and office documents are packed in.

Customization is where a reader app is judged, and the list is long enough to suggest this is the author's own reading preferences encoded: app themes, reader themes, custom local fonts, typography controls, spacing, margins and layout tuning. Library tools are local folder sync, organisation, bookmarks, progress tracking and file management. Accessibility items are system text to speech, app language selection, and reader settings that adapt to different reading preferences.

Building it: two Gradle invocations

The README documents a source build in three steps, and the Gradle commands are specific enough to copy.

The clone is the usual one, and then Android Studio is one route and the command line is the other. The documented command line build is:

bash
./gradlew assembleOssDebug

with the output path given as app/build/outputs/apk/oss/debug/Episteme-oss-v{version}-oss-debug.apk, and the README noting that the Android Studio route runs the ossDebug or ossOfflineDebug variant. Those two variant names are the clearest confirmation that offline is a build variant rather than a runtime setting.

The desktop build uses the same wrapper with a distribution task:

bash
./gradlew :desktopApp:packageReleaseDistributionForCurrentOS

and the offline desktop build adds a project property:

bash
./gradlew :desktopApp:packageReleaseDistributionForCurrentOS -PdesktopFlavor=oss

The flavor property for desktop mirrors the Android variant structure, which is the point of the Kotlin Multiplatform core: one flag selects the offline build on both platforms.

The build files are Kotlin DSL, with build.gradle.kts, settings.gradle.kts and gradle.properties at the root, a gradlew wrapper with the usual .bat counterpart, a spotless/ directory for formatting, a fastlane/ directory for release automation, and a scripts/ directory. The project also depends on Room for persistence, Timber for logging, Coil and Media3 for media and image loading, and JNA, which is how a JVM application reaches native libraries for document rendering.

AGPL-3.0 for the code, a contributor agreement for the translations

The repository is AGPL-3.0, which for a distributed application is the strict end of the permissive spectrum, and no legal advice is offered here. The practical consequence for a reader choosing an edition is that the licence travels with the build, so the offline editions and the Play Store edition are not the same licence situation for a business that modifies and distributes them.

Translations are governed separately, and this is the part that surprises people. The README states that translations are managed through a self-hosted Weblate instance at translate.epistemereader.com, with a sign in using GitHub to contribute, and that translation contributors are required to accept the Episteme Contributor License Agreement before submitting changes.

The file in the repository root is named CLA.md, not LICENSE.md, which reflects that split. A separate agreement for translations and a copyleft licence for the code is a coherent arrangement rather than a contradiction, but it means a translator signs one set of terms and a code contributor operates under another.

The self-hosted Weblate instance is also a dependency worth noting. A community translation platform hosted by the project is not available if the project goes away, and the README does not describe an export path. For a project whose selling point is offline-first reading, the translation workflow being online is a mild inconsistency rather than a contradiction, since contributors are not end users.

iOS is in the tree and in the badges, not in the edition table

The repository contains an iosApp/ directory and the header of the README carries a Download on the App Store badge pointing at an Episteme PDF Ebook Reader listing. Yet the editions table lists only Android and desktop platforms, and the five rows make no mention of iOS.

That is the one place where this README leaves a reader guessing. The stated edition model is Standard and Offline per platform, and the note about future desktop platforms says the same model can extend as support grows, which implies the edition matrix is expected to grow by platform. Whether iOS currently offers a Standard and an Offline variant, and how those map to the App Store build, is not stated.

The release history offers a partial answer. The three most recent tags are v1.0.56-oss, v1.0.57-oss and v1.0.58-oss, all titled as Android releases, with the last on 2026-10-09. So the tagged, dated release line is the Android open source one, and the desktop and store builds are distributed from the project's own site and GitHub releases rather than from a comparable tag stream.

The last push was on 2026-10-10, one day after the newest tag, and the repository is not archived. For a project publishing five editions, that one repository is the only place to check what changed, since there is no per-edition changelog in the README.

Where Episteme is the wrong tool

The boundaries are mostly about the edition split rather than the feature set.

The first is a capability you need that lives only in the closed build. ML Kit OCR, cloud sync, cloud text to speech and PDF bubble zoom are Play Store extras. The OSS edition has a bring your own key path to AI and cloud features, which is not the same as a working integration with someone's account, and OCR has no named equivalent in the open description at all. If your workflow depends on scanning a document into a searchable PDF, verify that before choosing the open build.

The second is document collaboration. Everything in the feature list is local-first: local folder sync, file management, local fonts. There is no shared library, no annotation sharing and no multi-user anything in the description, so a team that wants a common reading queue is looking at the wrong category of application.

The third is the offline guarantee itself. Offline editions are described as having network permissions removed, which is a strong property, but the reader still runs on an operating system, and the README does not describe network auditing, certificate pinning, or what happens to the bring your own key credentials if the build is replaced. For a reader with a BYOK path, that key is the asset to think about.

The fourth is simply that this is a large application with a lot of surface. Ten formats, comic archives, annotations, themes, two platforms, five editions. If you need a minimal PDF viewer, the feature list is not a selling point.

Editorial conclusion

Pick Episteme Reader when you want one reader for PDF, EPUB, MOBI, comics and office documents across Android and desktop, and take the OSS Offline edition if you need an audit trail showing the app cannot reach the network. Do not choose it for ML Kit OCR, cloud sync or cloud text to speech, since the README places those in the Play Store edition's proprietary extras, and the OSS editions substitute a bring your own key path for AI and cloud features. Verify first which edition you are installing, because OSS and OSS Offline have different application identifiers and the offline variant is not the same build with a preference toggled.

Frequently asked questions

What is the difference between the Episteme Reader OSS and OSS Offline editions?

Both are open-source Android builds, but the OSS edition is online-capable and adds OPDS, downloadable fonts and bring your own key access to AI and cloud features, while the OSS Offline edition has network permissions removed entirely.

Which file formats does Episteme Reader support?

PDF, EPUB, MOBI/AZW3, FB2, DOCX, ODT/FODT, TXT, Markdown, HTML and comic archives, according to the README. The document engines listed underneath are PdfiumAndroidKt, PDFium and libmobi, with Jsoup, Flexmark and Apache Commons Compress for parsing.

How do I build the Android version of Episteme Reader from source?

Clone the repository and run `./gradlew assembleOssDebug`, or open the project in Android Studio and run the ossDebug or ossOfflineDebug variant. The APK lands at app/build/outputs/apk/oss/debug/Episteme-oss-v{version}-oss-debug.apk.

Can I contribute a translation to Episteme Reader?

Translations go through the project's self-hosted Weblate instance at translate.epistemereader.com with a GitHub sign in, and the README states that contributors must accept the Episteme Contributor License Agreement before submitting changes. The agreement is the CLA.md file in the repository root.

Official sources

  1. Aryan-Raj3112/episteme on GitHub
  2. Issues
  3. License: AGPL-3.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/aryan-raj3112-episteme.svg)](https://hysenlabs.com/projects/aryan-raj3112-episteme)

Was this useful?