Skip to content
Screenack

About the Blog Stack

What powers this blog

This blog is a statically generated site — Astro pre-builds every page at deploy time into plain HTML, CSS, and JavaScript. No server runtime, no database, no CMS. The result: fast, secure, and cheap to host.

The static site generator is Astro, built on Node.js. Astro ships zero JavaScript to the browser by default, adding only what each page explicitly requires. The visual theme is AstroPaper, which I've adapted and extended for this site. Pagefind handles full-text search, building a search index at deploy time so search works with no backend. Sharp processes every hero image at build time, resizing and cropping to the right dimensions on every deploy.

Jekyll vs. Astro: Lighthouse comparison

Before migrating to Astro in January 2026, the site ran on Jekyll. I measured these scores across three matching posts on desktop using Google Lighthouse. The Astro column reflects production at kyle.skrinak.com as measured on 2026-05-25, after Disqus was removed.

CategoryJekyll (avg)Astro (avg)
Performance5799
Accessibility8793
Best Practices73100
SEO100100

Disqus comment embeds used to modestly lower Performance and Best Practices — third-party scripts affect Largest Contentful Paint. After a one-month free trial generated no conversation, I decided a paid Disqus license wasn't worth maintaining for a personal blog and removed the integration. SEO scores 100 on the production URL. Running Lighthouse against a staging or preview URL drops that score because those URLs don't match the canonical address the site declares.

Revised 2026-05-24: removed Disqus comment integration after a paid trial period.

Current versions

Astro reads these versions directly from package.json at build time. They update automatically whenever a dependency version changes — no manual maintenance.

ComponentVersion
Astro7.0.0
AstroPaper theme5.5.1
Tailwind CSS4.3.2
TypeScript6.0.3
Pagefind1.5.2
Sharp0.35.0
Node.js (minimum)>=22.22.2

What makes it a great platform

Infrastructure and how a post gets published

AWS S3 hosts the blog files; CloudFront delivers them from edge locations worldwide. S3 storage costs almost nothing for static files, and CloudFront caches aggressively.

Every change flows through a two-branch gitflow before reaching production:

  1. develop — all work lands here first.
  2. main — a pull request from develop to main triggers a GitHub Actions build pipeline that runs the full build, validates configuration, and runs a visual-regression pass, then the production deploy: Astro build, S3 sync, and a CloudFront cache invalidation. GitHub Pages is kept separately as an on-demand disaster-recovery fallback: it normally serves a small redirect stub pointing back to kyle.skrinak.com, and only publishes the real site if I manually dispatch the fallback workflow — for an actual AWS outage or to verify the fallback still works.

No post reaches kyle.skrinak.com without first passing its pull request's build and visual-regression checks. GitHub Actions handles all deployments.