Всем привет! На создание этого проекта меня подтолкнула банальная проблема: я читаю очень много (в среднем по книге каждые 2-3 дня) и со временем начал путаться в авторах, сериях и том, что уже прочитано, а что нет. Существующие решения либо обрастали лишним функционалом, либо не давали нормального контроля над личной библиотекой.
Поэтому было решено сделать свой инструмент для комфортного чтения с акцентом на каталогизацию, кроссплатформенность и статистику. Поделюсь тем, как это устроено под капотом, какую архитектуру я выбрал и с чем пришлось столкнуться при реализации.
Архитектура и стек: почему PWA и браузерные технологии?
Главное требование к читалке - полная независимость от платформы и доступность с любого устройства (ПК, смартфон, планшет, телевизор) без необходимости ставить отдельные нативные приложения под каждую ОС.
PWA (Progressive Web App): Приложение устанавливается в систему прямо из браузера и работает в отдельном окне.
Оффлайн-доступ: За кэширование статики и работу без подключения к сети отвечает Service Worker.
Хранилище данных: Все книги и файлы обрабатываются исключительно на стороне клиента.
Что под капотом: архитектура, оффлайн и хранение гигабайт в браузере
Когда я проектировал читалку, главным требованием было отказаться от хранения самих файлов книг на сервере в пользу Client-Side First архитектуры. Сервер не индексирует, не передает и не хранит ваши библиотеки.
Service Worker и PWA: Приложение упаковано как прогрессивное веб-приложение. За кэширование статики и мгновенную загрузку интерфейса отвечает Service Worker. Интернетом для самого процесса чтения пользоваться не нужно вообще - закачал базу и можно читать хоть в автономном режиме.
IndexedDB + OPFS (Origin Private File System): Забудьте про костыли с локальным хранилищем (localStorage с его убогим лимитом в 5 МБ). Для работы с файлами книг используется IndexedDB и современная файловая система браузера OPFS.
Математика проста: в Chromium-подобных браузерах лимит хранилища для одного домена составляет до 60% от свободного дискового пространства устройства. На современном смартфоне или ПК это десятки или сотни гигабайт. Учитывая, что средний файл .fb2 или .epub без иллюстраций весит около 1–2 мегабайт, в памяти браузера легко умещается полноценная библиотека из десятков тысяч книг.
Гибридная синхронизация метаданных: Так как вся тяжелая база книг живет локально на устройстве пользователя, по сети гоняются исключительно легкие метаданные (текущая позиция чтения, настройки, оценки и статистика для облачного профиля - если пользователь решил авторизоваться). Сами файлы книг на сервер не отправляются вообще. Для передачи конкретной книги между устройствами используется генерация временных хэш-ссылок с позицией чтения.
OPDS-каталоги: «Из коробки» встроена поддержка легальных каталогов (например, Библиотека Мошкова), при этом пользователь может подключать любые сторонние OPDS-источники.
Учет и статистика: Проект создавался в первую очередь ради структурирования прочитанного. Реализована сортировка по жанрам, авторам, сериям, выставление оценок и ведение детальной истории чтения.
Синхронизация и шаринг: На текущем этапе реализована генерация уникальных ссылок с привязкой к конкретной позиции в тексте (через метаданные), что позволяет переносить прогресс или делиться книгой. В планах - полноценная фоновая автосинхронизация метаданных между девайсами.
Интегрированная озвучка (TTS): Реализован режим чтения вслух с помощью встроенных в браузер речевых движков с сохранением позиции воспроизведения.
Поддерживаемые форматы: Фокус сделан на .fb2 как на основной стандарт для текстовой русскоязычной литературы. В перспективе планируется расширение форматов (включая .epub).
Безопасность, приватность и серверная часть
Один из частых вопросов касается безопасности и хранения пользовательских данных.
Где лежат файлы книг? Серверная часть не хранит, не индексирует и не передает файлы пользовательских книг. Вся обработка и хранение текстовых файлов происходят изолированно в песочнице браузера на устройстве пользователя.
Зачем нужна авторизация? Регистрация полностью опциональна и используется исключительно для привязки облачного профиля, в котором хранятся легкие метаданные: настройки интерфейса, общий прогресс чтения и оценки. Читать книги с локального диска можно полностью без регистрации и создания аккаунтов.
Проект развивается открыто и пишется под практические нужды. Буду рад конструктивной технической критике, идеям и пожеланиям в комментариях!