Astro SSR for Developer Personal Site — Why I Chose It and Don't Regret It

Technical deep dive: why Astro SSR with PostgreSQL beats Next.js, Hugo, and Gatsby for a developer personal site with a blog and admin panel.

TL;DR: Astro SSR gives you Lighthouse 100 by default, zero JS overhead in the critical path, and a clean mental model for mixing static and dynamic content. Combined with PostgreSQL + Drizzle, it's the best stack for a developer personal site with a blog.

Author: Przemysław Filipiak | Last updated: March 2026

The Problem With Other Frameworks

When building this personal site, I evaluated:

Framework Verdict Reason
Next.js ❌ Overkill React hydration overhead kills Lighthouse on landing page
Hugo ❌ Too static No SSR means no dynamic blog from PostgreSQL
Gatsby ❌ Dead Community shrinking, GraphQL layer unnecessary
SvelteKit 🟡 Good alternative Smaller ecosystem, fewer Astro-specific optimizations
Astro ✅ Best fit Island architecture, SSR + static hybrid, zero JS default

Why Astro SSR Wins

1. Lighthouse 100 by Default

Astro's architecture sends zero JavaScript to the browser by default. The hero section is pure HTML + CSS. No hydration cost.

ASCII `<pre>` tag: 0ms load time
No React hydration: 0ms JS execution
Result: LCP < 1.5s guaranteed

2. Island Architecture for Interactivity

Only interactive components get JavaScript. The typing effect in the hero? That's a tiny vanilla JS script. Everything else is pure HTML.

3. SSR + PostgreSQL = Zero Rebuild Blog

With Astro SSR + Drizzle ORM + Neon PostgreSQL:

  • New article published → instantly live
  • No git commits needed for content
  • Admin panel to manage everything
  • Human review checkpoint for AI-generated content
// Blog post renders directly from PostgreSQL
const [article] = await db
  .select()
  .from(articles)
  .where(eq(articles.slug, slug))
  .limit(1);

4. Self-Hosted Fonts = Zero External Requests

@font-face {
  font-family: 'Courier Prime';
  src: url('/fonts/CourierPrime-Regular.woff2') format('woff2');
  font-display: swap;
}

No Google Fonts CDN. No DNS lookup. No cookie consent needed. Fonts preloaded.

The Architecture

Astro SSR (Node adapter)
├── index.astro          → Static-like, pure HTML
├── blog/[slug].astro    → SSR, queries PostgreSQL
├── admin/               → Protected by middleware
└── api/                 → REST endpoints for CRUD

PostgreSQL (Neon) ← Drizzle ORM ← API endpoints

Lighthouse Results (Local Preview)

The build achieves near-perfect scores by design:

  • Performance: Pure HTML hero, preloaded fonts, no render-blocking scripts
  • Accessibility: ARIA labels on canvas elements, semantic HTML
  • Best Practices: No console errors, HTTPS-ready
  • SEO: Meta tags, JSON-LD schema, sitemap, llms.txt

FAQ

Q: Can I use Astro with a PostgreSQL database?

A: Yes. Astro SSR mode with @astrojs/node adapter runs a Node.js server that can connect to any PostgreSQL instance. I use Neon's serverless PostgreSQL.

Q: Is Astro good for SEO?

A: Excellent. Zero JavaScript by default means search engines see clean HTML. Combined with JSON-LD schemas and a dynamic sitemap, it's ideal for SEO.

Q: How hard is it to set up authentication in Astro?

A: Simple. Middleware + session cookies in PostgreSQL. No need for Auth.js or similar.

Q: Is Astro suitable for a blog with an admin panel?

A: Perfectly suited. SSR routes handle dynamic content, static routes handle landing pages. Best of both worlds.

Resources