← На главную

Waldi гарантирует 100 просмотров каждому посту

12.07.2026 11:26 · hackernews

Waldi — это не просто очередной минималистичный блог-движок. Его фишка в гарантированном минимуме читателей: каждый пост получает как минимум 100 просмотров до того, как в дело вступит какой-либо алгоритм. Система называется Serendipity. Каждое утро зарегистрированный читатель получает на почту случайный пост от незнакомца — никакой чёрной магии алгоритмов.

Запросы проходят через ServeHTTP. Определить, заходишь ли ты на блог или на основной домен, просто. Идёт дешёвая проверка: совпадает ли поддомен с именем пользователя. Если нет — система лезет в Postgres за подтверждённым кастомным доменом. Результат кэшируется с положительным или отрицательным TTL, чтобы не долбить базу каждым запросом. Куки привязаны к домену: если залогинился на основном домене, сессия работает и на поддоменах. А кастомные домены изолированы.

В основе — чистый Go. Нет слоёв абстракции «на вырост». Handlers напрямую дёргают store, никаких интерфейсов во имя «завтра пригодится». Вся сложная логика постов (модель редактора Tiptap) вынесена в пакет internal/post. Там же проверяется JSON-схема и рендерится безопасный HTML. У этого пакета нет зависимостей ни от базы, ни от HTTP. Именно он покрыт самыми плотными юнит-тестами.

Всё остальное — тоже просто: миграции на Append-Only SQL, фоновые задачи без очередей и воркеров (просто CRON-скрипты), загрузка картинок на диск или в Cloudflare R2 с конвертацией в WebP, переводные JSON-каталоги i18n без дублирования шаблонов. Интерфейс на серверном рендеринге с Go-шаблонами. Никаких CSS-фреймворков — main.css написан вручную. Редактор на TypeScript собирается одной командой esbuild в editor.js.

Но самое необычное — админка. Её нет. Вместо веб-панели — Telegram-бот. Он умеет /users, /posts, /pool, /verify, /delete, /invite. Управлять блогом можно прямо из мессенджера. Никакого «зайти в админку» — пиши боту.

Развернуть свой экземпляр можно — код под MIT. Есть Docker Compose и инструкция в DEPLOY.md. Но нужно понимать: работа с читателями и гарантированные просмотры замкнуты на основном инстансе waldi.blog. Свой сервер будет тихим изолированным островом. Приоритет разработки — waldi.blog.

Почта — любой SMTP, но отдельные From-адреса для транзакционных и массовых рассылок. TLS на кастомные домены — Caddy, подхватывающий Let's Encrypt. CI/CD — GitHub Actions, деплой по SSH при мерже в main. Резервные копии — ежедневный дамп Postgres с загрузкой в R2.

Wildcard-посты распределяются в два этапа. Сначала приоритет у постов, которые админ отметил через Telegram. Если таких нет — жестоко простой SQL-запрос: ищем опубликованные и не прочитанные посты (≥50 слов) на языке читателя, исключая его собственные и посты тех, на кого он подписан. Те, у кого меньше 100 просмотров, получают фору. Позже под это планируется полноценная скоринг-система с весом подписок и дочитываний.

Языки добавляются одним файлом JSON и правкой в каталоге — шаблоны не трогаешь. RTL делается одной строчкой. Локаль по умолчанию — farsi (fa).

Читать оригинал →