fedorthinks
Все проекты
В работе2025 — настоящее

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) по поэтапной спеке, каждый этап собран целиком с тестами. Это ещё один рабочий пример того, о чём я всё время говорю: выбери правильную структуру, заземли в ней модель и дай ей делать ровно то, в чём она хороша, — писать следующую страницу.