PenFreely — писать целые книги с LLM
Студия для книг целиком. LLM отлично пишет страницу, но теряет сюжет на масштабе всей книги; PenFreely держит связность каскадом планов сверху вниз (книга → часть → глава → секция → страница) плюс резюме снизу вверх, генерируя прозу только на уровне страницы. Model-agnostic, с кросс-платформенным мостом для запуска своей локальной модели. Rust-бэкенд, SvelteKit, PostgreSQL + pgvector.
- Роль
- Solo founder-engineer
- Стек
- Rust · SvelteKit · TypeScript · PostgreSQL · pgvector · Ollama · WebSocket · Tailwind
- Период
- 2025 — настоящее
Проблема
LLM отлично пишет абзац и неплохо — страницу. И разваливается на длине книги. К девятой главе у героя поменялся цвет глаз, подсюжет тихо исчез, а финал противоречит завязке. У модели нет памяти о целом — только окно перед глазами. Так что «напиши мне роман» даёт либо бессвязный дрейф, либо размытый синопсис, но никогда — настоящую, целостную книгу.
PenFreely сделан ровно под этот разрыв: держать связность всей книги, пользуясь моделью, которая всегда видит лишь маленький её кусочек.
Что делает продукт
Ты описываешь книгу; PenFreely строит структурный план сверху вниз — книга → часть → глава → секция → страница — и генерирует прозу только на уровне страницы, причём каждая страница обусловлена планом плюс накопительными резюме всего, что было раньше. Структура держит сюжет; модель просто хорошо пишет по одной странице за раз.
Это model-agnostic по дизайну: ты сам выбираешь провайдера и модель и переключаешь когда угодно — облако (OpenAI, Anthropic, OpenRouter) или свою локальную модель. Каждая генерация показывает свою стоимость, скорость и токены, так что счёт под контролем. И это твоя книга на твоей модели — никакой навязанной цензуры, никакая платформа не решает, что тебе писать.
Что я построил
Движок связности. Ядро — каскад планов сверху вниз плюс авто-резюме снизу вверх. Поскольку проза генерируется только на уровне страницы — обусловленная планом и короткими резюме, а не всей рукописью, — контекстное окно остаётся маленьким, а стоимость ограниченной, при этом книга остаётся целостной на любой длине.
Мост локальных моделей — бесплатно и приватно. Небольшой кросс-платформенный бинарь
(penfreely-bridge) позволяет запустить свою модель через Ollama и использовать её прямо в студии.
Он делает только исходящее защищённое WebSocket-соединение к бэкенду, поэтому работает за роутерами
и фаерволами без открытия портов, и текст не покидает машину пользователя. Бинарники для macOS (Apple
Silicon и Intel), Windows и Linux.
Реальная продуктовая поверхность. Студия на SvelteKit для планирования и письма, выбор провайдера/модели, телеметрия по каждой генерации и весь поток «план → страница» — на Rust-API.
Архитектурные решения
План — это артефакт; проза производна. Источник истины — структурный план, а не сгенерированный текст. Та же spec-driven дисциплина, что и везде: владей планом — и любую страницу можно перегенерировать, не ломая книгу.
Генерируй мало — держи связность. Генерируется только проза на уровне страницы, всегда обусловленная планом плюс резюме — никогда вся книга в контексте. Именно это делает вывод книжной длины одновременно связным и доступным по цене.
LLM-агностично до ядра. Провайдер и модель сидят за портом; локальная и облачная — один и тот же интерфейс для остальной системы. Смена модели — это выбор, а не миграция; тот же аргумент, что я повторяю про «не женись на одной модели».
Чистая архитектура, строго. Rust-бэкенд — воркспейс слоёв: чистый домен-крейт без IO, application с use-cases и портами, infrastructure-адаптеры и HTTP/WS-интерфейс — с миграциями sqlx и типизированным wire-протоколом, общим с мостом. Фронт на SvelteKit покрыт vitest и Playwright. PostgreSQL + pgvector с самого начала, чтобы поиск и масштаб не приколачивать потом.
Текущий статус
PenFreely живёт и активно развивается на penfreely.com. Я сделал его в одиночку — продуктовая рамка, архитектура и ревью мои, — дирижируя ИИ-агентами (Claude Code на Opus, Codex) по поэтапной спеке, каждый этап собран целиком с тестами. Это ещё один рабочий пример того, о чём я всё время говорю: выбери правильную структуру, заземли в ней модель и дай ей делать ровно то, в чём она хороша, — писать следующую страницу.