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
- Astro docs: https://docs.astro.build
- Drizzle ORM: https://orm.drizzle.team
- Neon PostgreSQL: https://neon.tech
- This site's source: https://github.com/delta240mvt