Правила для людей и агентов
Спецификации
Спецификации — точные правила HERON, записанные как открытый контракт: что лежит в папке сайта, как файлы становятся адресами, что значит каждое поле, что проверяет сборка и как сайт попадает на сервер. Дизайнеры, редакторы, разработчики и ИИ-агенты работают по одному и тому же тексту.
Каждая спецификация перенесена на этот сайт целиком, на русском и английском. Первым обновляется репозиторий на GitHub, сайт — сразу следом; каждая страница заканчивается ссылкой на свою последнюю версию в git.
Простыми словами
Представьте HERON как повара, который готовит строго по книге рецептов. Спецификации — эта книга: какие продукты кладут в папку сайта (страницы, фотографии, один файл настроек) и что получается на выходе (готовые страницы, карта сайта, файлы для поисковиков и нейросетей). «Само как-то» здесь ничего не происходит: каждое правило записано.
Раз правила записаны, на одном сайте могут работать совсем разные помощники и не мешать друг другу: вы правите текст, дизайнер меняет внешний вид, ИИ-агент добавляет страницы. Все трое читают один и тот же текст.
Пример. Правило из контракта: файл content/ru/about.md становится страницей /ru/about/. Это нигде не настраивается. Вы создаёте файл, и после следующей сборки страница на месте.
content/en/about.md → https://example.com/about/
content/ru/about.md → https://example.com/ru/about/
Когда эти страницы нужны. Когда сборка остановилась с кодом ошибки, когда нужно точно знать, что делает поле, или когда вы передаёте сайт агенту и хотите, чтобы он соблюдал правила.
Когда можно пропустить. Чтобы сделать и опубликовать первый сайт, хватит гайдов. Возвращайтесь сюда, когда нужен точный ответ.
Что такое контракт
Контракт — договорённость двух сторон. Здесь одна сторона — HERON, другая — папка вашего сайта. Сайт обещает держать файлы в оговорённых местах и форматах, а HERON — собирать его каждый раз одинаково и точно говорить, что не так, если что-то не подходит.
Договорённость записана и открыта, поэтому читать код HERON не нужно никому — ни человеку, ни ИИ-агенту. Если документация и поведение расходятся, это ошибка HERON, и её исправляют в HERON вместе с текстом.
Контракт — это ещё и обещание во времени. Сайт, который следует ему сегодня, соберётся и завтра: стабильная версия HERON собирает и старые сайты, а возможности добавляются и убираются только обдуманно, со сменой версии.
Карта спецификаций
| Страница | Что в ней | Когда читать |
|---|---|---|
| Папка сайта и адреса | что такое HERON, структура проекта, дерево контента, ключи, слаги и адреса, ссылки, старые адреса, страница 404, языки | планируете сайт или не знаете, куда положить файл |
| Формат страницы | markdown-файл, фронтматтер из восьми групп, секции и их части, двенадцать форм секций | пишете или проверяете страницу |
| site.yaml | все блоки файла настроек: сайт, организация, SEO и записка для llms.txt, аналитика, сборка, schema.org, nginx, gone | меняете настройку |
| theme.yaml | типы страниц и их секции, связи между страницами, размеры и форматы картинок | делаете или меняете тему |
| Картинки и файлы | папка media, видео, что не режется, static, .env, что генерируется и что лежит руками, ограничения |
добавляете картинки, файлы или секреты |
| Сборка | восемь этапов сборки, разбор секций, что видит шаблон, генераторы, команды, коды ошибок, хуки | сборка остановилась с кодом или вы пишете тему |
| Развёртывание | контейнеры, скрипты обновления, CI, минимум для nginx, переезд со старого сайта, бэкап | перед первой публикацией или переездом |
| Поставка | образ и pip-пакет, версии, выходы папкой и образом, конфиг nginx, теги, формы, безопасность | выбираете версию, собираете образ или настраиваете сервер |
Как каждая форма секции выглядит на настоящей странице, с её markdown, HTML и стилями, — справочник форм.
Формы секций коротко
| Форма | Как пишется | Что рисует тема |
|---|---|---|
| prose | Обычные абзацы | Текстовый блок |
| list | - пункт или - **Термин.** текст | Список или пары «термин — текст» |
| steps | 1. **Заголовок.** текст | Нумерованные шаги |
| checklist | Три и больше групп ###, в каждой список | Карточки |
| two-lists | Ровно две группы ### со списками | Две колонки, вроде «подходит / не подходит» |
| table | Таблица markdown со строкой-разделителем | Таблица |
| facts | Строки «ключ — значение», по паре в строке, без шапки | Ключевые факты |
| faq | Вопросы ### без списков | Вопросы и ответы плюс разметка FAQ для поиска |
| callout | Цитата > | Выделенная врезка |
| timeline, gallery, alert | По классу .timeline, .gallery, .alert | Шкала, галерея, список предупреждений |
Как спецификации остаются актуальными
- Один источник. Спецификации лежат в репозитории HERON, рядом с кодом, который описывают.
- Одна правка — один коммит. Меняется поведение — его описание меняется в том же коммите. Тесты проверяют образцы файлов, поэтому устаревший образец упадёт раньше, чем его кто-то скопирует.
- Сначала git, следом этот сайт. Изменение сначала попадает в репозиторий, копия на сайте обновляется сразу за ним, поэтому разрыв между ними минимальный. Каждая страница здесь заканчивается разделом «Источник» с именем файла и ссылкой на него.
- Постоянные ссылки. Ссылки на ветку prod всегда показывают последние стабильные правила, например 20-data-contract.md в ветке prod. Точная версия, например
0.1.0, хранит свою копию навсегда. - Внутри образа.
heron docs contractпечатает версию, которая совпадает с вашим HERON, даже без интернета. Подробнее — документация в терминале.
Архитектура
HERON — файловый сборщик сайтов. На вход папка с контентом, картинками, темой и одним конфигом. На выходе статический сайт в dist/ или готовый образ nginx с этим сайтом внутри.
HERON не копируется в сайт. Он поставляется одним артефактом — образом heron:<версия> (и тем же кодом как pip-пакет для локальной разработки). Сайт объявляет нужную версию в site.yaml, и HERON отказывается собирать сайт, версию которого не поддерживает.
HERON делается сразу под несколько разных сайтов: спроектированный по одному, он вырождается в этот сайт с абстрактными именами переменных.
Стек
Ядро: Python 3.12 · Jinja2 · markdown-it-py · pydantic · Pillow · click. Пакетный менеджер uv, линтер ruff, тесты pytest.
Обвязка: Docker · nginx · Bash.
Сервис форм (heron-relay, отдельный компонент, позже): FastAPI, без базы; SQLite подключается только как спул повторной отправки.
Компоненты
heron/core/— парсер markdown, дерево и URL, резолв связей, рендерер, обработка картинок;heron/modules/— генераторы: sitemap, robots, llms.txt, JSON-LD, hreflang, redirects, feed;heron/contracts/— pydantic-схемыsite.yaml,theme.yaml, фронтматтера, версии HERON;heron/cli.py— командыnew,init,check,serve,build,page;scripts/site.sh— сборка, упаковка в образ nginx, просмотр и проверка сайтов из репозитория HERON; настройки вenv/.env.<сайт>.<окружение>;- папка сайта —
site.yaml,content/,data/,media/,static/,theme/,plugins/. Кода HERON, Dockerfile, compose и скриптов сборки в ней нет; heron-relay— отдельный сервис приёма форм: почта, вебхук в CRM, Telegram. Разворачивается только там, где формы есть.
Решения
Зафиксированы в спецификации поставки:
- сборщик статики вместо Django/Wagtail — сайту нечего обслуживать в рантайме;
- ядро поставляется образом и версией, а не копией в каждом репозитории сайта: три копии ядра означают три расходящихся сборщика;
- формы обслуживает отдельный сервис, а не HERON: HERON обязан остаться «один проход, без состояния, вышел»;
- база данных не хранит ни контент, ни настройки сайта. Источник истины — файлы. Нарушение этого правила превращает HERON в WordPress;
- макеты дизайна переводятся в Jinja2,
support.js(69 КБ React-рантайма) в прод не идёт; - сборка идёт без сети:
--network=none, ничего не докачивается на этапе сборки.
Схема
папка сайта
site.yaml · content/ · data/ · media/ · static/ · theme/
|
v
heron:<версия> (образ или pip-пакет)
контракты -> парсер -> резолв -> рендер -> генераторы
|
+----------+-----------+
v v
dist/ образ nginx
(на хостинг) (site.sh image на хосте)
|
v
nginx ------> посетитель
|
v
heron-relay (позже)
| | |
почта CRM Telegram
Сайт не зависит от heron-relay: сервис лежит — статика продолжает отдаваться, теряется только отправка формы.
Текст архитектуры повторяет docs/architecture.md в ветке prod (правка 2026-10-04).
Вопросы
Нужно ли читать спецификации, чтобы сделать сайт?
Нет. Для большинства сайтов хватает гайдов и конфигуратора. Спецификации — для точных ответов: имя поля, код ошибки, пограничный случай.
Зачем контракт открытый?
Чтобы люди и ИИ-агенты следовали одним правилам, не читая код, и чтобы сайт, собранный сегодня, собирался и завтра. Чего нет в контракте, то не обещано.
Что верно, если этот сайт и git расходятся?
Git в ветке prod: он обновляется первым. Копия внутри вашего образа верна для вашей точной версии. Этот сайт догоняет сразу после изменения.
Что если нужно то, чего контракт не описывает?
Сначала посмотрите, что HERON уже умеет. Если этого действительно нет, опишите потребность в репозитории, а на сайте пока возьмите самый простой честный вариант.