Back to Readest

Readest App Code Layout

apps/readest-app/docs/code-layout.md

0.11.210.3 KB
Original Source

Readest App Code Layout

This note summarizes the runtime boundaries inside apps/readest-app, with two goals:

  • explain which directories are server-side, client-side, or mixed
  • explain the directory-level role of apps/readest-app/src/services

First: src-tauri

apps/readest-app/src-tauri is the Tauri native shell layer for all Tauri targets, not just desktop.

  • Desktop: Windows, macOS, Linux
  • Mobile: Android, iOS

That is visible in apps/readest-app/src-tauri/tauri.conf.json, which contains both bundle.android and bundle.iOS configuration, plus mobile deep-link settings.

So the rough split is:

  • apps/readest-app/src: the Next.js/React app
  • apps/readest-app/src-tauri: the native host layer for Tauri desktop and mobile builds

Directory classification inside apps/readest-app

Mostly server-side directories

  • apps/readest-app/src/app/api Next.js App Router server endpoints (route.ts). These run on the server / edge runtime, not in the browser.

  • apps/readest-app/src/pages/api Next.js Pages Router API endpoints. This is where the classic server handlers live, including sync, storage, send, DeepL, and user endpoints.

  • apps/readest-app/src/app/runtime-config.js A server route that emits runtime JavaScript config for the client.

  • apps/readest-app/workers Worker-side backend code outside the normal page UI tree. For example, workers/send-email is operational backend code.

Mostly client-side directories

  • apps/readest-app/src/components Reusable React UI components.

  • apps/readest-app/src/context React context providers and app state wiring.

  • apps/readest-app/src/hooks Client-side React hooks.

  • apps/readest-app/src/store Frontend state stores.

  • apps/readest-app/src/styles Styling, theme assets, and UI presentation helpers.

  • apps/readest-app/src/data Static or bundled app data.

  • apps/readest-app/src/i18n Internationalization resources and setup.

  • apps/readest-app/src/workers Browser worker code used by the frontend.

  • apps/readest-app/public Static assets served to the frontend.

  • apps/readest-app/extension Browser-extension-specific client code.

  • apps/readest-app/extensions Platform integration extensions such as Windows thumbnail support.

Mixed or shared directories

  • apps/readest-app/src/app Mostly frontend routes and UI, but not purely client-side. In Next App Router, page.tsx, layout.tsx, and related files can mix server rendering and client components. The exception is src/app/api, which is server-only.

  • apps/readest-app/src/pages Mixed. src/pages/api is server-only; src/pages/reader/[ids].tsx is frontend page code; _document.tsx is server-side document wiring.

  • apps/readest-app/src/services Shared domain/service layer. Most of this is not “backend-only”; it contains platform adapters, client logic, network clients, sync logic, and some code that is reused by server routes.

  • apps/readest-app/src/utils Shared helpers used by both frontend code and server handlers.

  • apps/readest-app/src/libs Shared library code. Some of it is server-oriented, some client-oriented, some neutral.

  • apps/readest-app/src/helpers General helper code, usually shared.

  • apps/readest-app/src/types Shared type definitions.

  • apps/readest-app/src/__tests__ Test code covering both client and server behavior.

  • apps/readest-app/e2e End-to-end test suite.

  • apps/readest-app/scripts Build, release, and maintenance scripts.

  • apps/readest-app/docs App-specific documentation.

src/app and src/pages at directory level

src/app

  • src/app/api: server-side HTTP endpoints
  • src/app/auth: auth pages and auth-related UI/helpers
  • src/app/library: library UI
  • src/app/o: frontend route
  • src/app/offline: frontend offline page
  • src/app/opds: OPDS browsing UI
  • src/app/reader: reader UI
  • src/app/runtime-config.js: server-generated runtime config endpoint
  • src/app/s: share landing UI
  • src/app/send: send/import UI
  • src/app/updater: updater UI
  • src/app/user: account/subscription/settings UI

So src/app is mostly application UI, with one explicitly server-only subtree: src/app/api, plus the runtime-config route.

src/pages

  • src/pages/api: server-side API routes
  • src/pages/reader: frontend page route(s)
  • src/pages/_app.tsx: application wrapper for Pages Router
  • src/pages/_document.tsx: server-side document shell

So src/pages is mixed, not purely client-side.

src/services breakdown

The most important point is this:

  • src/services is mostly a shared application/service layer
  • it is not the same thing as “backend code”
  • actual HTTP server entrypoints are mainly under src/pages/api and src/app/api

Top-level files in src/services

  • appService.ts Base application service abstraction.

  • nativeAppService.ts Native/Tauri-facing app service implementation.

  • nodeAppService.ts Node-capable service implementation.

  • webAppService.ts Web/browser-oriented service implementation.

  • bookService.ts Book-level operations such as covers, metadata shaping, and book-related domain logic.

  • libraryService.ts Library management logic.

  • settingsService.ts Reading and persisting settings.

  • backupService.ts Backup/import-export related logic.

  • cloudService.ts Cloud-related app behavior.

  • fontService.ts Custom font handling.

  • imageService.ts Image-related helper logic.

  • ingestService.ts Import / ingest pipeline for incoming content.

  • persistence.ts Shared persistence utilities.

  • transformService.ts Content transformation entrypoints.

  • commandRegistry.ts Command registration / dispatch.

  • transferManager.ts and transferMessages.ts Transfer pipeline coordination.

  • environment.ts and runtimeConfig.ts Runtime environment detection and injected runtime configuration.

  • constants.ts and errors.ts Shared constants and error types.

These top-level files are mostly shared client/application-layer code, with some runtime branching for web, node, and Tauri.

src/services/database

Platform-specific database access and migrations.

  • webDatabaseService.ts: browser/web DB implementation
  • nodeDatabaseService.ts: Node-side DB implementation
  • nativeDatabaseService.ts: native/Tauri DB implementation
  • migrate.ts and migrations/: schema and migration logic

This is shared infrastructure code, not an HTTP backend directory.

src/services/sync

Sync clients and replica-sync orchestration.

  • legacy/remote sync client code such as KOSyncClient.ts
  • replica sync flow: bootstrap, publish, pull, apply, persistence, cursor storage, encryption, and passphrase handling
  • adapter subdirectory for sync categories such as dictionary, font, texture, OPDS catalog, and settings

This is mostly client-side sync orchestration talking to backend endpoints like src/pages/api/sync.ts and src/pages/api/sync/replicas.ts.

src/services/send

“Send to Readest” and content conversion logic.

  • sendAddress.ts, devicePrefs.ts, inboxDrainer.ts
  • conversion/: article/page-to-EPUB conversion pipeline, sanitization, TOC building, asset bundling, and worker protocol

This is mostly application logic used by frontend flows and server endpoints together.

src/services/metadata

Book metadata lookup services.

  • provider implementations like Google Books and Open Library
  • shared metadata types and orchestration service

This is shared integration logic. Actual HTTP exposure happens via route handlers such as src/app/api/metadata/search.

src/services/dictionaries

Dictionary import, parsing, lookup, and provider registry.

  • readers/parsers for StarDict, SLOB, and related formats
  • provider adapters for dictionary/web/wikipedia/wiktionary sources
  • dictionary service, deduplication, content ID, and lookup candidate generation

This is primarily client/application functionality.

src/services/annotation

Annotation models and provider adapters.

  • annotation types and normalization
  • provider adapters such as Foliate and MR export/import

Mostly shared reader-side logic.

src/services/nav

Navigation, fragments, grouping, locations, and lookup utilities for books.

Mostly client-side reader logic.

src/services/opds

OPDS feed handling and subscription state.

  • feed parsing/checking
  • auto-download support
  • stream and subscription helpers

Mostly frontend/domain logic, sometimes paired with server proxy routes.

src/services/translators

Translation provider integration.

  • provider adapters for DeepL, Google, Azure, Yandex
  • preprocessing, cache, polish, and translator utilities

Mixed integration code. Some providers are used via server APIs to avoid exposing secrets.

src/services/tts

Text-to-speech abstraction and implementations.

  • WebSpeechClient.ts: browser TTS
  • NativeTTSClient.ts: native/Tauri TTS
  • EdgeTTSClient.ts: remote/provider-backed TTS
  • controller/data/types/utilities

Mixed runtime code, mostly used by the reader frontend.

src/services/ai

AI chat/embedding/RAG related abstractions.

  • adapters and providers
  • prompts, chunking, retry logic, logging
  • local AI store and RAG service

Mixed integration code. The services are shared, while actual HTTP endpoints live under src/app/api/ai.

src/services/hardcover and src/services/readwise

Third-party reading service integrations.

  • Hardcover sync client and mapping store
  • Readwise client integration

Mostly client/application integration code.

src/services/rsvp

RSVP reader mode logic.

  • controller, persistence, utilities, and types

Client-side reading feature code.

src/services/transformers

Text/content transformation modules.

  • language, punctuation, whitespace, proofread, sanitization, footnote, style, simplecc, warichu

Shared pure logic, usually frontend-facing but not tied to a single runtime.

Practical mental model

If you want a fast rule of thumb for this repo, use this:

  • HTTP backend entrypoints: src/pages/api, src/app/api, workers
  • frontend UI/routes: src/app except api, plus src/components, src/hooks, src/store
  • shared app/domain logic: src/services, src/utils, src/libs, src/types
  • native host layer for desktop + Android + iOS: src-tauri

That model matches the codebase much better than “everything under src is client code.”