In Progress

Lectio

React Native Expo TypeScript UniWind Zustand React Navigation Axios

Overview

Most Komga clients are designed around manga and comics — page-by-page image viewers that feel awkward for books. Lectio is built specifically for readers whose libraries are mostly EPUB, PDF, and FB2. The goal is a reading-first experience: a clean library layout with large covers, readable metadata, and a reader that feels closer to a dedicated e-reader than a comic app. It connects to a self-hosted Komga server and supports a bundled demo mode for sharing the app with people who don't have a server.

What I built

  • Full library browsing: libraries, series, books, authors, collections, and reading lists
  • Search, filter, and sort across the entire Komga library
  • Komga session token auth with Basic auth fallback for image requests
  • Zustand stores for auth, library state, browse, bookmarks, and read progress
  • UniWind for cross-platform styling with multiple built-in themes
  • Demo mode with a bundled static library, no server required, great for sharing
  • Provider abstraction layer to support additional backends (Kavita tentatively planned)

What I learned

  • React Native and Expo ecosystem differences from web development — native navigation, layout, and gesture handling
  • Designing a provider abstraction so the app is not hard-coupled to a single backend API
  • Managing auth state with Zustand and AsyncStorage across app restarts and token refresh
  • Building cross-platform themes in UniWind that feel native on both iOS and Android

Architecture

flowchart TD
    User([" User"])

    subgraph App["Lectio · React Native (Expo)"]
        Nav["React Navigation
(bottom tabs + native stack)"]

        subgraph Screens["Screens"]
            Login["Login"]
            Home["Home / Libraries"]
            Browse["Series · Books
Authors · Collections"]
            Reader["Reader"]
        end

        subgraph State["Zustand Stores"]
            AuthStore["Auth Store
(AsyncStorage)"]
            LibStore["Library / Browse"]
            Progress["Read Progress
& Bookmarks"]
        end

        Provider["Komga Provider
(Axios)"]
        Theme["NativeWind
Theme System"]
    end

    Server["Komga Server"]
    Demo["Bundled Demo Library"]

    User --> Nav
    Nav --> Screens
    Screens --> State
    State --> Provider
    Provider -->|"REST API"| Server
    Provider -->|"demo mode"| Demo