Digital readingWeb · Android · iOSV1.0Release on · Autumn 2027

Describe

Nearly 80,000 free books, streamed to read.

Describe opens up Project Gutenberg's public-domain library: novels, poetry, philosophy and science, in French, English and dozens of other languages. Open a book and read it page by page, with nothing to download, on the web, Android and iOS; your reading picks up where you left off, on all your devices.

FreeWeb, Android and iOSSynced reading
Describe on desktop: the home page and its library
Describe on mobile: a page being read
Real screenshots of the app

The concept

An entire library, in your pocket

The great public-domain texts are free, but often poorly presented. Describe brings them together in a single polished app that is fast and a pleasure to read.

A vast catalogue

Nearly 80,000 public-domain works, updated every day from the official Project Gutenberg catalogue.

Streamed reading

Nothing to download: only the displayed page arrives, and the next one is already preloaded.

Pick up where you left off

Without an account, your reading stays on the device; with an account, it syncs across the web, Android and iOS.

In pictures

The app, exactly as it is

The catalogue: 78,423 books, search, language filter and themes
The full catalogue
The page for Candide, by Voltaire: summary, subjects, “Read for free” and “My library”
A book's page
The full-screen reader: Candide, chapter II, page 9 of 104
The reader
The reader in sepia theme with its settings: text size, themes, font
Sepia theme and settings
The table of contents open, with the current chapter highlighted
The table of contents
My library: reading statistics and books in progress with their progress
My library
Search results for “victor hugo”, filtered to French
Search
The home page shelves: French classics and great texts in English
The home page shelves
  • The Describe home page on mobile
    Home
  • Search results on mobile, in two columns
    Search
  • The page for Candide on mobile
    Book page
  • The reader on mobile, page 9 of 104
    Reading

The reader

Designed for long reading, without fatigue

Full screen, typography built for long reads, pages that turn in 3D around the spine on mobile: the book stays centre stage while the interface fades away.

  • Three moodsLight, sepia or night; text from 14 to 32 pixels, serif (Literata) or sans-serif font.
  • Pages that turnOn mobile, the page turns in 3D around the spine, just like a real book.
  • Table of contentsEach chapter starts a new page; jump from one chapter to another in a single gesture.
  • Keyboard-friendly tooLeft and right arrow keys turn the pages; your position is saved automatically.

Features

Find, read, and pick up where you left off

Instant search

Multiple words, accent-insensitive, across the whole catalogue.

Languages and themes

Seven reading languages and ten themes (novels, poetry, drama, crime…); the catalogue state stays in the URL, easy to share.

Detailed book pages

Authors, subjects, summary and recent read count, so you can choose before opening.

My library

Books you start are added automatically, with the page where you stopped and your reading statistics.

Optional account

Read without an account; create one to find your library everywhere.

Native apps

Android and iOS share all their code with Kotlin Multiplatform.

3D rotunda

The site's home page is a Three.js library you move through as you scroll.

Fast

Local catalogue, cached pages, next page preloaded.

Technology & architecture

Under the hood of Describe

A Kotlin (Ktor) API with a hexagonal architecture enforced by the compiler: each layer is a separate Gradle module, and the domain cannot import Ktor, the database or an HTTP client. The API contract is a Kotlin Multiplatform module shared by the server and the Android and iOS apps.

Architecture diagramProduct coreData flow
  1. 01

    Apps

    • WebAngular, Tailwind CSS 4, a Three.js library rotunda driven by GSAP
    • Android + iOSKotlin Multiplatform and Compose Multiplatform, all code shared
    • coreKotlin API contract compiled for the server and mobile
  2. 02

    Describe API

    Ktor · /api/v1

    • HTTP presentationRoutes, JWT, errors, composition root
    • ApplicationCatalogue, reading, accounts, library, sync
    • DomainModels, ports, pagination, no technical dependencies
  3. 03

    Infrastructure

    • PostgreSQL / H2Local catalogue, accounts, libraries, reading progress
    • Project GutenbergDaily CSV (78,000 books in ~25 s) and texts, cached
    • GutendexSummaries and popularity, in the background

The journey of a page being read

  1. 1The reader requests /books/{id}/manifest: page count and table of contents.
  2. 2It loads the displayed page from /books/{id}/pages/{n} and preloads the next one.
  3. 3On first access, the server downloads the text from Gutenberg just once and keeps it cached on disk.
  4. 4The text is split into pages of around 2,500 characters; each chapter starts a new page.
  5. 5The position is saved: on the device for a visitor, on the server for a signed-in account.

Architecture choices

  • Hexagonal, checked by the compilerOne layer per Gradle module: importing Ktor or the database into the domain breaks the build.
  • A local catalogueGutendex took 40 to 70 s to respond: the official catalogue is imported and resynced every day, so search is local and instant.
  • Paginated streamingOnly the displayed page travels; pages are cached by the browser and the raw text is served in byte ranges.
  • Secure by designBCrypt passwords, signed JWT, Gutenberg URLs built from the ID (no SSRF), capped text size.

Every technology, by family

Backend

  • Kotlin 2.4
  • Ktor 3.6 (Netty)
  • Exposed 1.6
  • Flyway 13
  • HikariCP 7
  • kotlinx.serialization
  • Coroutines
  • JVM 21

Front-end

  • Angular 22
  • TypeScript 6
  • Tailwind CSS 4.3
  • GSAP 3.15 + ScrollTrigger
  • Three.js
  • Signals
  • Zoneless

Mobile

  • Kotlin Multiplatform
  • Compose Multiplatform 1.12
  • Material 3
  • Ktor Client
  • Coil 3
  • Android
  • iOS

Data & storage

  • PostgreSQL 17
  • H2
  • Disk cache for texts
  • LRU page cache

Payments & third-party services

  • Project Gutenberg
  • Gutendex
  • Apache Commons CSV

Authentication & security

  • BCrypt
  • JWT (HS256)
  • SSRF protection
  • CORS

Quality & tooling

  • JUnit / kotlin-test
  • Ktor test host
  • Vitest
  • Prettier
  • Test pyramid

DevOps & CI/CD

  • Docker
  • Docker Compose
  • Nginx
  • Gradle 9

Monitoring

  • /api/v1/health
  • Docker healthchecks
  • Logback

Inventory taken from the product's source code and configuration.

Frequently asked questions

Everything about Describe

Yes. The books come from Project Gutenberg and are in the public domain; you read them freely, with no subscription.

A reading app for your readers?

Library, publisher, school or media outlet: Describe shows what our team can do with a catalogue, content streaming and cross-platform apps. Tell us about your project.