Пишу социальную читалку книг с AI-агентом: построили всё, кроме самой читалки. Нужен совет
Привет! Меня зовут Родион, и я делаю пет-проект Reader.Market. Это не просто очередная читалка, а попытка сделать инструмент для Deep Reading — вдумчивого чтения с AI-саммари, извлечением ключевых идей и (с недавних пор) социальными функциями.
В этой статье я хочу рассказать не столько о продукте, сколько о процессе его создания. Я пишу код в паре с AI-агентом Qoder (от Alibaba Cloud). И если вы думаете, что AI-кодинг — это просто "сгенерируй мне функцию сортировки", то добро пожаловать под кат.
Я покажу, как AI стал для меня Архитектором, Фулстеком, DevOps-инженером и даже Техническим писателем. Мы построили почти всё... кроме одной, самой главной части, с которой я сейчас зашел в тупик и прошу совета сообщества.
Часть 1. Архитектор: "Нам нужна социальная сеть"
Когда я решил превратить читалку в социальную платформу, задача казалась огромной. Мне нужно было спроектировать мессенджер, профили, систему друзей. Я поставил задачу Qoder-у, и он выдал не просто код, а полноценные спецификации.
1. Мессенджер и Deep Linking
Qoder спроектировал схему БД (Group, Channel, Message) и WebSocket-сервис для обмена сообщениями. Но самое крутое — он продумал UX. Он предложил систему Deep Linking (/messages?user={id}), чтобы кнопка "Написать" в профиле пользователя сразу открывала нужный чат, даже если его еще не существовало.
2. Профили пользователей
Спецификация user-profiles-implementation.md, которую сгенерировал агент, описывала публичные страницы так, как это сделал бы Senior-разработчик: с виртуальными полками книг, графиками статистики чтения и приватностью.
Часть 2. AI как Fullstack-разработчик
Дальше мы перешли к "мясу" — реализации фич.
Админка и RBAC
Мне нужна была панель модерации. Qoder спроектировал систему прав доступа (RBAC) с нуля:
- БД: Добавил поле accessLevel ('admin', 'moder', 'user').
- Логика: Реализовал паттерн "мягкого удаления", где модератор скрывает контент, а не удаляет физически.
- Интерфейс: Сгенерировал таблицу пользователей с пагинацией, поиском и функцией "Impersonate" (войти под пользователем) для отладки.
Дизайн-система и UX
Qoder оказался неплохим дизайнером.
- Ре-дизайн: Он полностью переработал страницы входа и регистрации, предложив цветовую схему "Academic Blue" и "Soft Cream Paper", чтобы они соответствовали "книжному" духу.
- Мелочи: Внедрил "умные даты" (например, "5 минут назад" для свежего, "12 января" для старого) и сортировку отзывов, где твой собственный всегда сверху.
Часть 3. Хроники падающего продакшена (DevOps mode)
Самое интересное началось, когда мы выкатили это в прод. Qoder здесь выступил как Lead DevOps и SRE.
Сначала он написал Deployment Runbook — пошаговый план настройки Nginx, PM2, SSL и PostgreSQL. А потом мы начали тушить пожары.
Инцидент №1: npm run build падает
Локально всё работало, а на сервере сборка падала с ошибкой esbuild not found.Диагноз AI: Локально мы делаем npm install (ставится всё), а на проде CI-скрипт делал npm ci --only=production. Пакет esbuild лежал в devDependencies, поэтому на сервере его просто не было.Решение: Перенести пакет в dependencies.
Инцидент №2: Ошибки 404 на файлы Vite
Сайт открывался, но в консоли было красно от ошибок загрузки скриптов.Диагноз AI: Приложение в проде пыталось вести себя как dev-сервер, запрашивая виртуальные файлы Vite (/@fs/...).Решение: Мы перенастроили vite.config.ts, чтобы он бандлил все зависимости (включая React) внутрь dist, и отключили dev-middleware в Express.
Инцидент №3: "Гонка" при инициализации
Иногда приложение падало с Cannot read properties of null при старте.Диагноз AI: Race Condition. JS-код пытался повесить обработчики событий на DOM-элемент ридера, который еще не успел отрендериться React-ом и в целом мне не нравилось то что получается в модуле чтения книг.Решение: Внедрение retry-механизма с экспоненциальной задержкой (нет), но это бред полный, ниже я как раз опишу свои мучения с выбором адекватной open source читалки.
Часть 4. Главная проблема: Читалка (The Reader)
И вот мы подошли к финалу. Мы построили мощный бэкенд, социальную сеть, админку, AI-аналитику. Но у меня до сих пор нет нормальной читалки.
Сейчас в проекте работает временная заглушка — самописный HTML-ридер.
- Он умеет пагинировать вроде (что работает криво немного).
- Он поддерживает только простые форматы (TXT, FB2).
- В нем нет нормального выделения текста, поиска и навигации.
Моя боль
Самый важный этап проекта прямо сейчас — это выбор и внедрение Open Source движка для чтения.
Мне нужно поддерживать "зоопарк" форматов:
- PDF (самое сложное)
- DOC / DOCX
- EPUB
- FB2
- MOBI / AZW3
- TXT
Qoder предлагал использовать foliate-js. Это крутая библиотека, она нативно работает в браузере, поддерживает EPUB, FB2 и (экспериментально) PDF. Но я не уверен, потянет ли она "тяжелые" PDF с версткой или сложные DOCX.
Стек технологий reader.market
Backend
- Node.js - JavaScript runtime environment
- Express - Web application framework
- PostgreSQL - Relational database management system
- Drizzle ORM - TypeScript ORM for database operations
- Ollama - Local AI model runner
- TypeScript - Typed superset of JavaScript
Frontend
- React 19 - User interface library
- Foliate.js - Professional ebook rendering engine
- Tailwind CSS - Utility-first CSS framework
- TanStack Query - Server state management
- Lucide React - Icon library
- Radix UI - Accessible UI components
- Wouter - React router
Development & Deployment
- Vite - Fast build tool
- Docker - Containerization platform
- PM2 - Production process manager
- Nginx - Web server and reverse proxy
- Let's Encrypt - SSL certificate management
Вопрос к сообществу
Я обращаюсь к вам, разработчики. Быть может вы сталкивались с веб-читалками? Какую библиотеку (или комбинацию библиотек) лучше всего использовать для процесса чтения, для самой читалки, самого важного для этого сервиса (React/TypeScript)?
Требования:
- Open Source.
- Максимальная всеядность (FB2, PDF, EPUB — критично, DOCX — желательно).
- Возможность кастомизации (мне нужно будет внедрить туда свое меню для выделения текста и AI-анализа).
Может быть, стоит взять PDF.js для PDF и Epub.js для книг? Или есть мощный комбайн типа foliate-js, который я недооцениваю? Или стоит смотреть в сторону Readium?
Пожалуйста, напишите в комментариях свои варианты. Я возьму лучшее решение, реализую его вместе с Qoder (это будет тот еще челлендж!) и в следующей статье поделюсь результатами и готовым кодом интеграции.
P.S. Проект живой, посмотреть на текущую (пока еще "хромую" в плане чтения) версию можно здесь: Reader.Market.
P.S.S. Возможно упустил что то в процессе написания статьи, было много всего интересного, если что в коментах с радостью отвечу :)