Skip to content

chore: migrate from Jekyll to Astro#484

Open
slumbering wants to merge 9 commits into
BedrockStreaming:masterfrom
slumbering:from-jekyll-to-astro
Open

chore: migrate from Jekyll to Astro#484
slumbering wants to merge 9 commits into
BedrockStreaming:masterfrom
slumbering:from-jekyll-to-astro

Conversation

@slumbering

@slumbering slumbering commented May 29, 2026

Copy link
Copy Markdown

Jekyll → Astro migration

Replaces the Jekyll stack with Astro 6.x in a single atomic cutover. All 309 posts, every URL, the visual design, and the Amplify PR-preview flow are preserved.

What changes

Was Is now
Jekyll + Ruby + Type-on-Strap remote theme Astro 6 + Content Collections + TypeScript
_posts/, _layouts/, _includes/, _sass/, _data/, pages/ astro/src/content/, astro/src/{layouts,components,data,styles,pages}/
JamesIves/github-pages-deploy-actiongh-pages branch withastro/action@v3 + actions/deploy-pages@v4
simple-jekyll-search Pagefind (308 pages indexed)
AWS Amplify auto-detect Jekyll AWS Amplify via new amplify.yml (Node 22 + Astro build)

Preserved (verified)

  • 309 posts migrated to astro/src/content/{blog,conferences,videos}/ with frontmatter intact
  • 117 custom permalinks honored verbatim — verified by astro/scripts/verify-urls.mjs (735/735 URLs)
  • 18 redirect_from paths → meta-refresh stubs in dist/
  • Legacy /blog/page:num URLs → meta-refresh to /blog/page/N/
  • All assets/images (~382 MB) verbatim under astro/public/
  • Matomo Site ID 2 (env-gated via PUBLIC_MATOMO_ENABLED)
  • Dark mode, KaTeX, Mermaid (build-time SVG), Slideshare, YouTube, Twitter widgets, RSS (309 items), sitemap

Verification

cd astro && npm run build           # exit 0, 683 pages
node astro/scripts/verify-urls.mjs  # 735/735, 0 missing
npx astro check                     # 0 errors, 0 warnings

⚠️ Manual steps before merge

  1. GitHub Pages source (Settings → Pages): if currently "Deploy from a branch: gh-pages", flip to "GitHub Actions" — the new deploy-pages@v4 workflow needs it.
  2. AWS Amplify console: set env var PUBLIC_MATOMO_ENABLED=false scoped to preview branches (so previews don't pollute Matomo).
  3. Post-deploy smoke check: home page, a sample post, /feed.xml, /tags/, /search/.

Out of scope (follow-ups)

  • Root assets/ + images/ (~382 MB) duplicated in astro/public/ — optional cleanup commit
  • Footer keeps a hat-tip to Type-on-Strap (intentional)

Atomic migration commit. The site now builds from astro/ using Astro 6.x
+ Content Collections + TypeScript, deployed to GitHub Pages via
  withastro/action.

What changed:
- Remove Jekyll source (_posts/, _layouts/, _includes/, _sass/, _data/,
  pages/)
- Remove Jekyll configs (_config.yml, Gemfile*, type-on-strap.gemspec,
  root CNAME, root index.html)
- Remove Docker dev environment (Dockerfile, .dockerignore,
  .devcontainer/)
- Replace .github/workflows/integration.yml (Jekyll CI -> Astro CI:
  type-check, build, verify-urls)
- Replace .github/workflows/deployment.yml (Jekyll deploy ->
  withastro/action@v3 + actions/deploy-pages@v4)
- Update astro/src/components/Footer.astro: remove 'Powered by Jekyll'
  attribution
- Update CONTRIBUTING.md for Astro workflow
- Update README.md with Astro tech stack
- Add ROLLBACK.md with atomic revert procedure
- Update .gitignore: drop Jekyll-specific entries, add .omo/ and Node
  ignores
@slumbering slumbering changed the title chore: cutover from Jekyll to Astro chore: migrate from Jekyll to Astro May 29, 2026
Original Jekyll setup used AWS Amplify with zero in-repo config
(auto-detected
Jekyll from Gemfile + _config.yml). After the Astro cutover, Amplify's
auto-detection no longer works since the repo root is no longer a
recognizable
framework.

This commit adds amplify.yml at the repo root telling Amplify how to
build
the Astro project from astro/:

- appRoot: astro (monorepo pattern)
- Node 22 via nvm (required by Astro 6.x)
- preBuild: npm ci
- build: npm run build (runs 'astro build && pagefind --site dist')
- artifacts: astro/dist
- cache: astro/node_modules

CONTRIBUTING.md updated to document the restored PR preview mechanism.
@slumbering slumbering force-pushed the from-jekyll-to-astro branch from c9f63b4 to 5e2eb43 Compare May 29, 2026 13:42
slumbering and others added 7 commits May 29, 2026 15:50
…rted SCSS used Jekyll-style relative paths ()\nwhich worked in Jekyll's compile context but fail in Astro: Vite tries to\nresolve them from → \nwhich doesn't exist. Fonts actually live in \nand are served at at runtime.\n\nChange -font-path variables in 4 SCSS files to absolute URL paths:\n- _katex.scss\n- _pacifico.scss\n- _source-sans-pro.scss\n- font-awesome/_variables.scss\n\nThis eliminates Vite's 'didn't resolve at build time' warnings and makes\nKaTeX, Font Awesome, Pacifico, and Roboto fonts render correctly in\nblog posts.
The home page CSS referenced /images/common/banner_xl-medium.jpg and banner_xl-small.jpg under responsive @media breakpoints, but these variants never existed in the repo. They were a Type-on-Strap convention relying on a Gulp pipeline that was never run here. Browsers were silently 404ing them and falling back to the base banner_xl.jpg.

Remove the two @media overrides. The base .call-out_img rule already serves banner_xl.jpg at all viewport sizes (which is what users were already seeing). Eliminates the 2 remaining Vite 'didn't resolve at build time' warnings; visual behavior unchanged.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
The home page and /blog/page/N/ stopped showing post-info (date + authors
with avatars) below each post-teaser title. Original Jekyll layout
rendered _includes/blog/post_info.liquid for every post-teaser via
_includes/blog/blog.liquid.

Extract two reusable components:
- PostInfo: ports post_info.liquid DOM (avatars + name + date with
  localized month names via @/data/language)
- PostTeaser: ports the full blog.liquid post-teaser block (thumbnail +
  header + h1.post-link + PostInfo + excerpt)

Use PostTeaser on both /  (home) and /blog/page/[page]/. The blog index
now matches the home page's post-teaser DOM (was previously ul/li and
missing thumbnail support).
The post detail header now uses the shared PostInfo component so it matches the Jekyll post_info.liquid DOM instead of custom post-meta markup.

Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant