Building Bluesky comments for my blog
Ненавижу Disqus.
Годы вела блог без нормальных комментариев — подходящего решения не находилось.
- Disqus: медленный, тяжёлый, трекает, ничего не контролируешь, тормозит страницы.
- Самостоятельный хостинг: по сути свой мини-соцсервис — пользователи, спам, модерация, БД, задержки.
- GitHub Issues: годится для дев-блогов, но костыль и требует аккаунт GitHub.
- Без комментариев: чисто, но теряются беседы и открытия.
Я давно в Bluesky: комьюнити ок, API вменяемый, децентрализация, люди делают блог-посты в протоколе и комментарии через Bluesky. Почему бы не так же?
Почему Bluesky уместен
- Нет своей инфраструктуры: без БД, аутентификации и модерации — это уже в Bluesky.
- Более богатый контент: изображения, ссылки, треды.
- Реальные профили и переносимость — больше ответственности, меньше троллинга.
- Кроссплатформенность: обсуждения видны и в соцсети, и в блоге.
- Я владею постом, комментаторы — своими реплаями.
Процесс: публикую пост, шарю в Bluesky, добавляю AT URI — ответы на тот пост становятся комментариями в блоге.
Компонент
AT Protocol: DID (did:plc:…/did:web:…), CID, AT URI (at://did…/app.bsky.feed.post/postid). Чтобы получить тред, достаточно вызвать getPostThread с нужным URI, без аутентификации.
Архитектура:
- главный компонент треда;
- компонент ответа с метаданными и ссылкой на оригинал;
- компонент встраиваний (изображения, превью ссылок). Простая и небольшая композиция.
Треды: вложенность произвольная; выбрала рекурсивный рендер с отступами и ограничением в 5 уровней — дальше обычно спор на двоих.
Обогащения: изображения через CDN, часто по несколько — адаптивная сетка + модалка; внешние ссылки — карточки; неизвестные типы — аккуратный фолбэк.
Интеграция с Astro: React + client:load, передаю did и postCid из фронтматтера: bsky: did: "my-bluesky-did" postCid: "the-post-id"
Что узнала
- TypeScript помогает: пакеты с типами (@atcute/client) сняли кучу багов и ускорили разработку.
- Прогрессивное улучшение: комментарии — доп. слой; без JS или при падении API пост остаётся читабельным.