Пишу социальную читалку книг с 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)?

Требования:

  1. Open Source.
  2. Максимальная всеядность (FB2, PDF, EPUB — критично, DOCX — желательно).
  3. Возможность кастомизации (мне нужно будет внедрить туда свое меню для выделения текста и AI-анализа).

Может быть, стоит взять PDF.js для PDF и Epub.js для книг? Или есть мощный комбайн типа foliate-js, который я недооцениваю? Или стоит смотреть в сторону Readium?

Пожалуйста, напишите в комментариях свои варианты. Я возьму лучшее решение, реализую его вместе с Qoder (это будет тот еще челлендж!) и в следующей статье поделюсь результатами и готовым кодом интеграции.

P.S. Проект живой, посмотреть на текущую (пока еще "хромую" в плане чтения) версию можно здесь: Reader.Market.

P.S.S. Возможно упустил что то в процессе написания статьи, было много всего интересного, если что в коментах с радостью отвечу :)

2
5 комментариев