This Portfolio Site preview
Ситуация
Статическое портфолио на GitHub Pages: контент — проекты и посты — редактируется в Markdown, а не в разметке компонентов
Задача
Свести публикацию проекта к добавлению файла, без правки компонентов и ручных шагов между коммитом и продакшеном
Действия
Content collections с Zod-схемами, withBase() для base-path, inline-скрипт темы без flash, SEO-набор, деплой на Pages по push
Результат
Невалидный frontmatter ломает сборку, а не деплой; ни одна ссылка не хардкодит base; новый проект — без правки кода
Стек
AstroTypeScriptMarkdownCSS custom properties
Исходники Смотреть на GitHub → Обновлено: 3 нояб. 2026 г.
Содержание
  1. Ситуация
  2. Задача
  3. Действия
  4. Результат
  5. Ограничения
  6. Документация

This Portfolio Site

▶ Схема архитектуры — самодостаточный HTML, открывается в браузере — без установки и сборки

Ситуация

Нужно статическое портфолио, где контент (проекты, посты) редактируется в Markdown, а не в разметке компонентов. Хостинг — GitHub Pages как user site (репозиторий NikitaBoyarkin.github.io, отдаётся из корня домена), деплой — по push, без ручной сборки. Контент и представление должны разделиться: новый проект — это новый .md файл, без правки компонентов.

Задача

От меня требовалось получить сайт, в котором публикация проекта сводится к добавлению файла: без правки компонентов и без ручных шагов между коммитом и продакшеном.

Действия

Стек: Astro 7, TypeScript, Markdown content collections (src/content/{projects,posts}/), Zod-схемы в src/content.config.ts.

Архитектура:

  • Content collections — каждый проект/пост = Markdown + frontmatter; Zod валидирует поля на сборке.
  • Базовый путь — withBase() из src/lib/path.ts применяет base ко всем внутренним ссылкам и картинкам (сейчас сайт отдаётся из корня, base: '/').
  • Тема — inline-скрипт в <head> читает localStorage/prefers-color-scheme и ставит data-theme до первой отрисовки (без flash); CSS custom properties реактивны.
  • SEO — sitemap.xml, robots.txt, rss.xml, JSON-LD, OG/Twitter meta, canonical.
  • Деплой — GitHub Actions собирает dist/ и публикует на Pages по push в master.

Валидация: scripts/check_site.py проверяет обязательные страницы, внутренние ссылки, профиль-картинку и ассеты в index.html.

Результат

Content collections с Zod — это контракт между контентом и представлением: невалидный frontmatter ломает сборку, а не деплой. withBase() инкапсулирует базовый путь GitHub Pages — ни одна ссылка не хардкодит базу. Разделение «контент = .md, представление = .astro» означает, что добавление проекта не требует правки кода.

Ограничения

Это витрина под конкретный хостинг: GitHub Pages как user site и base: '/'. Переезд на project-страницу или другой хостинг потребует правок withBase() и деплой-воркфлоу. Валидация покрывает структуру и ссылки, но не контент.

Документация

Нужен такой же разбор на ваших данных?

Расскажите задачу — вернусь с планом: какие данные нужны, что проверяем и за какой срок. Отвечаю в течение дня.

Обсудить задачу →