Портфолио В активной разработке
artka.dev (этот блог)
Личный сайт и блог. Astro 5 SSG + динамическая админка, билингв RU/EN, рендер Mermaid и LaTeX на build-time, полная JSON-LD граф-разметка.
Стек
- Astro 5
- TypeScript 5.9
- PostgreSQL 18
- Drizzle ORM
- Better-Auth
- Tailwind 4
- Vitest 3
- Playwright
- Docker
- GitHub Actions
- Dokploy
Результаты
- SSG-первый сайт с on-demand островами для админки и SSR-only маршрутами для авторизации.
- Билингв RU/EN с pipeline'ом перевода через Claude Haiku 4.5 и per-key hash tracking; CI-гвард `pnpm translate:check` блокирует пуш с дрейфом.
- Полная JSON-LD `@graph`-разметка (Person/Organization/WebSite/Blog/BlogPosting/BreadcrumbList/WebPage/CollectionPage/ItemPage) с articleBody-excerpt'ом для LLM-цитирования; per-page OG через Satori для каждого landing.
- Build-time рендер Mermaid через Playwright (SSR-safe SVG) и LaTeX через KaTeX — нулевой клиентский JS на статических страницах.
- Курс-плеер поверх content collections: прогресс в Postgres + Better-Auth, авто-complete по dwell-time, on-demand PNG-сертификаты, per-course RSS.
- Деплой: GHCR + Dokploy webhook; миграции при старте контейнера.
Контекст
Хотел один простой сайт под все мои публикации, без CMS-зоопарка. Astro 5 — естественный выбор: SSG для контента, on-demand острова там, где нужен сервер.
Архитектура
- Контент в Markdown/MDX в
src/content/posts/*.md. Source of truth — RU; EN — auto-generated через скрипт перевода с git-committed артефактами. - Админка — SSR-only маршруты под
/admin/*, защищены middleware с Better-Auth. - БД — Postgres + Drizzle. Хранит
posts_meta(curated order, pinned, hidden) и search_vector для FTS. - Поиск — Pagefind для публичной части (статика), Postgres FTS для админки.
- SEO/LLM — единый
@graphJSON-LD изsrc/lib/seo/,llms.txt/llms-full.txt, named-bot rules вrobots.txt.
Что узнал
- Astro 5 i18n с
prefixDefaultLocale: falseотлично работает, если RU — источник правды и EN получают/en/-префикс. - Mermaid через
rehype-mermaid(Playwright) даёт SSR-safe SVG, без клиентского JS — но 32 диаграммы добавляют 5–10 секунд cold-start билда. - Bilingual translation pipeline через Claude Haiku 4.5 окупается уже на 5–10 постах. Per-key hash tracking предотвращает re-translation неизменённого контента.
- Единый JSON-LD
@graphсо стабильными@idи cross-references — гораздо более «citable» сигнал для LLM-краулеров, чем разрозненные inline-блоки. - Smart-suffix в title (
{title} | artka.dev) на уровне layout снимает с авторов страниц обязанность помнить про бренд — и это на десятки CTR-процентов сильнее, чем просто goодый title.
Что дальше
Постмортемы с production-инцидентов агентских систем, второй курс про production-ready agent loops, open-source нескольких MCP-серверов. См. /now.