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 shows production at kyle.skrinak.com, which I measured on 2026-11-01 after the accessibility and image fixes.
| Category | Jekyll (avg) | Astro (avg) |
|---|---|---|
| Performance | 57 | 99 |
| Accessibility | 87 | 100 |
| Best Practices | 73 | 92 |
| SEO | 100 | 100 |
Best Practices averages 92 because the 2017 Duke meetup post embeds a Microsoft Sway presentation, which Lighthouse faults for third-party cookies.
Disqus comment embeds used to modestly lower Performance and Best Practices — third-party scripts affect Largest Contentful Paint. After a one-month paid 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 preview URL drops that score because those URLs don't match the canonical address the site declares.
On 2026-10-31, I ran Lighthouse against every page type in both the light and dark themes. It found accessibility failures: link and badge colors a shade too faint for their backgrounds, breadcrumb links set apart by color alone, a skipped heading level on tag pages, and two embeds without titles. Fixing them brought Accessibility to 100 on the three posts in the table above. The same audit caught the hero image telling browsers it displays at 1200 pixels wide, when the layout caps it at 736. Desktop readers now download a smaller file.
Revised 2026-05-24: removed Disqus comment integration after a paid trial period.
Revised 2026-11-01: re-measured the Astro column after accessibility and hero image fixes.
Current versions
At build time, Astro reads the installed dependency versions from package-lock.json, and the theme and Node.js rows from package.json. This table is current as of the last build, on . Dependency versions update automatically whenever the lockfile changes — no manual maintenance.
| Component | Version |
|---|---|
| Astro | 7.4.0 |
| AstroPaper theme (forked from) | 5.5.1 |
| Tailwind CSS | 4.3.2 |
| TypeScript | 6.0.3 |
| Pagefind | 1.5.2 |
| Sharp | 0.35.5 |
| Node.js (minimum) | >=22.22.2 |
What makes it a great platform
- Zero server runtime. Every page is a static HTML file. There is nothing to patch, no runtime to exploit, and no server to go down under load.
- Strong SEO and accessibility. Production scores SEO 100 without extra configuration. Accessibility reached 100 on the comparison posts after an October 2026 pass on theme colors and markup. (An earlier version of the site included Disqus comments lazy-loaded on scroll; after a month of paid trial without engagement I decided the license cost outweighed the value and removed the integration.)
- Full-text search without a backend. Pagefind builds a search index at deploy time. Readers can search the entire archive without any API call to a server.
- Automatic image optimization. Sharp resizes and crops every hero image at build time. Browsers receive the right size for their viewport — no oversized images shipped over the wire.
- Dark mode. Theme toggle persists across sessions, respects system preference on first visit.
- RSS feed. Astro generates the full RSS feed at build time for every post.
- Visual regression testing. Playwright runs screenshot comparisons on every pull request to catch unintended layout changes before they reach production.
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:
- develop — all work lands here first.
- 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.
No post reaches kyle.skrinak.com without first passing its pull request's build and visual-regression checks. GitHub Actions handles all deployments.