История изменений
Каждый шаг docfixer — от первого прототипа до сегодняшнего релиза. Честно: что вышло в свет, от чего отказались, что сломалось.
---
Unreleased
Подписка открывает навыки сразу, без «квоты пройдена»
Раньше после одобрения заявки на подписку навыки всё равно упирались в лимиты: агент сравнивал имя плана с фиксированным списком pro / pro_monthly, а реальные гранты из админки и CLI пишут monthly / yearly. Подписчик с любым планом теперь считается «pro», и дневная квота по запросам снимается — остаётся только учёт по токенам. Дополнительно в админке (Настройки → Пользователи) для каждого юзера сразу видно «сегодня» и «за 30 дней» — больше не «0 всегда».
SkillEditor: кнопка «Поделиться» прижата к низу
Подвал модалки редактора навыка перестроен — кнопки всегда у нижней кромки независимо от высоты поля промпта. Появилась отдельная кнопка «Поделиться»: нажимаете один раз и навык уходит в общий каталог (то же, что «Подать заявку на публикацию», только сразу под рукой). После отправки заявки кнопка дизейблится — нельзя подать повторно, пока админ не отклонит.
Журнал админа теперь показывает работу агента
Когда юзер создаёт навык через SkillChat, каждое сообщение чата и финальный черновик пишутся в кольцевой буфер логов /api/admin/logs (он уже подключён к панели в разделе «Админ»). Раньше в логах было видно только финальный прогон навыка, теперь — вся работа LLM-агента по формулировке инструкции.
Раздел «Помощь»: пять тем вместо одной страницы
Раздел помощи переработан. Теперь это не одна устаревшая заметка про навыки, а пять тем: «Навыки» (создание, запуск, каталог, публикация), «Файлы и редактор» (форматы, папки, track changes, экспорт, шаринг, облака, офлайн), «Аккаунт и подписка» (уровни доступа, тарифы, лимиты) и «Частые вопросы». Есть индекс с быстрым стартом: четыре шага от перетаскивания файла до скачивания результата. Всё написано по-русски и по-английски и выверено по текущему интерфейсу — от чата создания навыка до переключателя «Локально / Облако». Открыть: ссылка «Помощь» в подвале или /help.
---
0.7.5 · Август 2026
Навыки: тумблер «Поделиться», сохранение результатов в таблицу, токен-счётчик
Навыки: делитесь когда готовы
В SkillEditor появился тумблер «Поделиться». Навык создаётся в вашем личном списке; если включить тумблер — он также становится доступен другим пользователям в общем каталоге. Если оставить выключенным — навык останется только у вас. Решение принимаете вы сами, без отдельных шагов «отправить на проверку» и без ожидания какого-либо результата. Если полезный навык нужен сообществу — просто поделитесь.
Результат навыка сразу в таблице
Когда навык завершает работу, исправленный документ автоматически добавляется в таблицу файлов с меткой «через <название>» и цветной звёздочкой рядом с именем. Не нужно гадать «куда делся результат?». Цвет звезды — детерминированный djb2-хеш от id навыка, так что один и тот же навык всегда получает один цвет и в таблице, и в operational sidebar. При наведении на звезду — тултип с именем и относительным временем («применён 2 мин назад»); старые записи в IndexedDB без временной метки деградируют gracefully (показывается только имя).
Колонка «Обновлён»
Каждая строка файла показывает время последнего изменения или загрузки. Относительное время («5 мин назад», «вчера», «12 авг») сразу, в тултипе — полная дата. Форматтер locale-aware (русские месяцы на русском), graceful degradation на старых timestamp'ах.
Настройки переделаны в drawer
Модалка настроек теперь — настоящий drawer с изменяемыми размерами; ширина и высота сохраняются per-user между сессиями. Включена вкладка «Хранилище»: реальные подключения Yandex.Disk, Google Drive и S3 (credentials шифруются AES-256-GCM на rest). У подписчиков появляется кнопка «Сохранить в облако» в таблице файлов и переключатель «Локально / Облако» для синхронизации между устройствами.
Tooltip upgrade
Tooltips теперь принимают JSX с <br/> — многострочные пояснения работают. Старое white-space: nowrap заменено на pre-wrap (переносы сохраняются). Новый проп hidePopover отключает popover в админских таблицах, где текст уже виден inline — раньше дублировалось.
Per-user token counter (админ)
Админ видит потребление токенов per user в таблице members — tokens_in/tokens_out totals. Usage захватывается от LLM-провайдера (pi backend отдаёт usage.inputTokens/outputTokens в JSONL-стриме; opencode — через info.tokens) и аккумулируется через accountTokens() на каждом REST-роуте. В чате навыков стоимость последнего хода видна внизу сообщения; в operational sidebar — после прогона.
Исправления
- Wrapped lines внутри list items в юридических документах рендерились отдельными
<p>выше списка, и первая строка каждого пункта терялась — исправлено: indented-продолжение теперь часть предыдущего<li>. - Клик по скилл-карточке был no-op если файл не выбран или прогон заблокирован — заменён на toast с понятным объяснением («выберите файл», «подождите прогона»).
- Удалён устаревший бейдж «Локально» из таблицы файлов — источник теперь явный, через переключатель Локально/Облако.
---
0.6.5 · Июль 2026
Навыки на сервере, единый каталог
Навыки живут на сервере
Ваши навыки хранятся в SQLite (custom_skills) и синхронизируются между устройствами. IndexedDB остаётся fallback'ом для офлайн-режима, но как только сеть появляется — источник правды на сервере. У каждого юзера квота (skill_ops): 5 create/delete за 30 дней для бесплатных, без лимита для pro и admin.
Публичный каталог
Навыки, которые вы сделали доступными другим, попадают в общий каталог (/api/skills/catalog) и отображаются у всех пользователей docfixer в operational sidebar (кнопка «Из каталога»). Навыки, которые вы оставили приватными, в каталоге не появляются. Одобренные навыки зеркалятся на диск в $SHARE_FS_ROOT/skills/<user>/<id>.md — для бэкапа и офлайн-доступа.
Единая модель навыков
Больше нет отдельных веток «коррекция» и «перевод» — каждый навык это Scenario с полями name, description, instruction, order. Иконки подбираются автоматически по ключевым словам из имени (Типограф, Корректор, Перевод, etc.). Pipeline полностью data-driven.
Operational sidebar переделан
Правая панель навыков пережила большую переделку: каждая карточка показывает цвет навыка, бэйдж статуса, X для отмены прогона, и eye-icon для превью. У подписчиков — multi-skill режим (выбираете несколько навыков, запускаются как один супер-промпт).
---
0.6.4 · Июнь 2026
Новый документ, предупреждение про ИИ, полировка таблицы
Кнопка «Новый» в тулбаре
Создаёт пустой DOCX прямо из интерфейса. Минимальный валидный документ (Content_Types, document.xml, rels) собирается в браузере маленьким самописным zip-writer'ом — без round-trip'а на сервер.
Предупреждение про ИИ
Добавлено напоминание: при отправке текста в ИИ-агент данные уходят внешним LLM-провайдерам. Напоминание показывается при запуске навыка или открытии чата — не как одноразовое согласие, а как постоянный контекст.
Таблица файлов: папки, drag-and-drop, сортировка
Плоская таблица стала деревом с виртуальными папками. Перетащите файл на папку, чтобы переместить; в корень — обратно наверх. Колонки сортировки (имя/размер/обновлён) запоминают выбор пользователя в сессии.
---
0.6.3 · Май 2026
Облачные хранилища: только Яндекс.Диск
Убрали интеграции с Google Drive и Dropbox. Они требовали OAuth round-trip'ы к сторонним серверам, противоречили обещанию приватности («ваши файлы остаются на устройстве» — а сами через Google роутим), а опрос пользователей показал, что Яндекс.Диск покрывает 90% сценария «синхронизация между устройствами». Код коннекторов остался в репо — интеграция возвращается одним PR.
Яндекс.Диск как единственная first-party опция
OAuth Authorization Code + PKCE (S256). Пароль пользователя мы никогда не видим, code обменивается на токен серверно, токен хранится зашифрованным AES-256-GCM. Redirect URI зарегистрирован в приложении Яндекс OAuth (Платформы → Веб-сервисы) — https://docfixer.ru/oauth/verify на проде, http://localhost:5173/oauth/verify для dev.
Бэкап локальной модели
HF_HOME (~/.cache/huggingface) теперь имеет документированный override-путь. Если хотите поставить другой argos-пакет — DOCFIXER_AUTO_INSTALL_LOCAL_MODELS=argos,opus-mt и перезапустите агент.
---
0.6.2 · Май 2026
Коммерческие юридические документы и страница «О проекте»
Оферта и пользовательское соглашение переписаны с нуля
Старые тексты были общим шаблоном, скопированным у конкурента. Новая оферта (/offer) покрывает всё, что нужно русскому SaaS: реквизиты исполнителя, порядок расчётов, правила подписки, политика возвратов, контакты для претензий. Пользовательское соглашение (/terms) определяет запрещённый контент (без персональных данных, без коммерческой тайны, без нелегального материала — это то, на что ссылается AI-предупреждение из 0.6.4). Оба документа версионируются в static-pages/ и пререндерятся vite-prerender.ts — статический HTML идентичен тому, что рендерит SPA.
«О проекте» переписан
Старая страница «О проекте» была технологической стеной «мы используем OnlyOffice SDK vX.Y.Z, x2t.wasm, Bun runtime». Удалили и написали benefits-oriented версию: мгновенная загрузка редактора, офлайн-работа, локальное хранение, автопроверка орфографии, ИИ-правки, кастомные навыки, экспорт в DOCX/PDF. То же содержание, другая рамка — технические детали живут в AGENTS.md, а не на публичном сайте.
---
0.6.1 · Апрель 2026
Мгновенное переключение, hover-prefetch, навыки по описанию
Переключение между редактором и списком мгновенное
Таблица файлов остаётся в памяти при открытии файла в редакторе. Возврат не перезагружает и не перерисовывает. iframe редактора выгружается (чтобы освободить память), но сам компонент таблицы сохраняется — нет мерцания, нет re-mount, позиция скролла выживает.
Hover-prefetch
При наведении на кнопку «Открыть в редакторе» файл начинает конвертироваться через x2t.wasm в фоне. К моменту клика бинарник готов и редактор открывается сразу. Prefetch отменяется через 150ms после mouseleave чтобы не тратить работу впустую.
Навыки по описанию
В старом сайдбаре «Навыки» были только пользовательские навыки. Теперь можно описать задачу обычными словами («сделай текст более формальным», «проверь пунктуацию во всём документе») — агент построит инструкцию и выполнит. Это была первая интеграция LLM-пайплайна в UI.
Подписка и управление пользователями
Админ получил таблицу members со статусами подписок, эндпоинт для продления (+30 дней или +1 год) и revoke. Magic-link авторизация через Timeweb SMTP (конфиг через SMTP_HOST, SMTP_USER, SMTP_PASS). Magic-ссылки живут 30 минут и одноразовые.
Тёмная тема и переключение языка в футере
Управление темой и языком переехало из модалки настроек в нижнюю панель. Причина: открытие настроек требовало двух кликов и модалки — слишком много трения для тоггла, который юзеры переключают 5–10 раз за сессию.
---
0.5.9 · Март 2026
Сплэш-скрин, PWA-установка
Сплэш-скрин при первом визите
Пока x2t.wasm (~57 МБ, brotli ~17 МБ) и OnlyOffice web-apps бандл грузятся, вы видите сплэш-скрин с логотипом и прогресс-баром. Бар отражает реальный прогресс скачивания из service worker cache. Когда всё готово — сплэш плавно уходит. Последующие визиты стартуют мгновенно из кэша.
PWA: установить как приложение
Манифест и service worker на месте. В Chrome/Edge/Safari можно установить docfixer как standalone-приложение — в лаунчере, без браузерной шапки. Работает офлайн благодаря cache-first стратегии service worker'а для шрифтов/wasm/api-bootstrap.
---
0.5.0 · Апрель 2026 · первый PoC
Первый прототип, который реально заработал. Одностраничное приложение, открывающее .docx в браузере через OnlyOffice 7.4.1, встроенный как iframe. Можно редактировать, сохраняется обратно на диск. Больше ничего. Никакого ИИ, никаких навыков, никакого облака, никакой авторизации.
Что работало
- Интеграция с OnlyOffice 7.4.1 через JavaScript SDK (
api.js). - x2t.wasm для конвертации загруженных
.docxиз OOXML-zip в bSer-формат, который редактор хочет внутри. - Панель настроек для URL OnlyOffice-сервера (во время разработки указывала на локальный Docker-контейнер).
- Drag-and-drop файла прямо в редактор.
Что не работало
- Загрузка была медленной (~10 секунд только на редактор).
- Редактор всегда открывался в «desktop»-режиме — на телефонах ломалось.
- Не было способа вернуться к списку файлов без закрытия вкладки.
- Файлы жили только в памяти iframe; refresh = потеря данных.
Эти четыре проблемы определили следующие полгода работы.
---
Исправления (во всех версиях)
- Документы с картинками выживают в офлайне (sandbox iframe теперь доставляет свои шрифты и ассеты через service worker cache).
- Редактор открывается с первой попытки — ушла race на холодном старте между
api.jsи бинарником документа. - Логотип в редакторе ведёт обратно на главную, а не открывает пустую страницу.
- SMTP-уведомления уходят на русском без mojibake — UTF-8 enforced end-to-end.
- Загруженный файл сразу в таблице — не нужно обновлять страницу.
- Все правки идут через track changes — каждая видна и отменяется индивидуально.
- Wrapped lines внутри list items в юридических документах — часть того же пункта.
- Клик по скилл-карточке всегда даёт фидбэк (toast или запуск), нет no-op.
- Источник файлов (Локально/Облако) — явный переключатель, без неоднозначного «где мои файлы».