Why 100k GitHub stars in 3 years matters (and Next.js took 8)
Astro just crossed 100,000 GitHub stars. Vanity metric? Let me break this down: it took 3 years to get there. Next.js needed 8 years to hit 130,000 stars.
Do the math: Astro's growing 2.6x faster than the framework that owns the market. It's no accident that Cloudflare and Netlify are pushing it as their Vercel alternative.
Astro 5.0 (dropped January 28, 2026) brings three major shifts: Content Layer API v2, Server Islands, and Vite 6 integration. But before you get excited about features, here's what this actually means for your budget and team.
Astro's architecture is called Islands Architecture. Think of it like this: your site defaults to a desert island—pure HTML and CSS, zero JavaScript. When you need interactivity, you plant interactive components like palm trees at strategic points. The rest stays empty beach (and fast).
In plain terms: Astro ships zero JavaScript to the browser unless you explicitly ask for it.
Next.js ships an entire React framework even when you're rendering static text.
That's the difference that cuts load times in half and hosting bills to zero.
Server Islands: the feature Next.js has been teasing for 18 months
Here's the problem: your page has static content (a blog post) and dynamic content (live comments or updated pricing). What do you do?
In Next.js, you get two bad options: (1) make the whole page dynamic (lose speed), or (2) load dynamic stuff client-side with JavaScript (content flash, weak SEO).
Server Islands let you mix both on the same page without client-side JavaScript. Static HTML gets generated at build time. Dynamic "islands" render on the server with every request, but insert straight into the HTML without hydrating anything in the browser.
Real-world example: a blog post with live comments.
---
// Static content (generated once at build)
const post = await getPost(Astro.params.slug);
---
<article>
<h1>{post.title}</h1>
<div>{post.content}</div>
<!-- Dynamic island: renders on every request -->
<server:island>
<Comments postId={post.id} />
</server:island>
</article>
The page caches as static, but comments update on every load without extra JavaScript. Next.js has a similar feature called Partial Prerendering (PPR), but it's been marked "experimental" for 18 months. Astro ships it stable today.
| Feature | Astro 5.0 | Next.js 15 |
|---|---|---|
| Server Islands | Stable (since Jan 2026) | Experimental (PPR since May 2024) |
| Zero JS by default | Yes | No (React runtime always present) |
| Hydration cost | Only interactive islands | Entire page |
| Deploy anywhere | Yes (VPS, Cloudflare, Netlify) | Optimized for Vercel |
The bottom line is: if your site is 80% static and 20% dynamic (blogs, docs, portfolios), Server Islands give you the best of both worlds. If your app is 100% dynamic (dashboards, SaaS), Next.js is still more straightforward.
Content Layer API v2: unified data loading without the TypeScript mess
Until recently, loading content from multiple sources was chaos. Contentful on one side, local Markdown on another, external APIs with their own logic. Three different systems, three sets of TypeScript types you invented on the fly, three separate failure points.
Content Layer API v2 unifies all of that into a single interface:
import { defineCollection, z } from 'astro:content';
const blog = defineCollection({
loader: contentful({ space: 'xxx', token: 'yyy' }),
schema: z.object({
title: z.string(),
publishedAt: z.date(),
author: z.string(),
}),
});
const docs = defineCollection({
loader: file('docs/**/*.md'),
schema: z.object({
title: z.string(),
category: z.enum(['guide', 'reference']),
}),
});
What changed in v2: you can now use any data source (CMS, REST APIs, GraphQL, databases) with the same pattern. The TypeScript type infers automatically from the Zod schema. No more any floating around your codebase.
Compare that to Next.js: in Next.js 15, each data source requires its own custom loader in getStaticProps or generateStaticParams. If you have 3 sources, you write 3 loaders. In Astro, you write 3 lines.
Real limitation: Content Layer API generates data at build time, not runtime. If your dashboard needs metrics that change every second, this won't work. You still need traditional SSR or client-side fetching.
The $540/year calculation nobody's talking about
A Hacker News user posted this last week: "Migrated from Next.js to Astro in 3 days, my hosting dropped from $45/month on Vercel to $0 on Cloudflare Pages." The comment has 247 upvotes.
Let's run the numbers for a real site: 100,000 monthly visitors, 500,000 page views, with some dynamic routes (like a pricing page updated every hour).
Next.js on Vercel:
- Pro plan: $20/month (includes Edge Functions, 100GB bandwidth)
- Extra Edge Functions: $15/month (if you exceed Pro limits)
- Extra bandwidth: $10/month (if you exceed 100GB)
- Total: $45/month → $540/year
Astro on Cloudflare Pages:
- 100k requests: $0 (free tier covers up to 100k requests/day)
- Edge Functions: included free
- Bandwidth: unlimited
- Total: $0/month → $0/year
Astro on Netlify:
- 100GB bandwidth: $0 (free tier)
- Edge Functions: included
- Total: $0/month → $0/year
Astro on VPS (Hetzner/DigitalOcean):
- Basic VPS (2GB RAM): $5/month
- Node.js server with PM2
- Total: $5/month → $60/year
The difference: $540/year vs $0-$60/year. Over 5 years, you save $2,700 with Astro on Cloudflare, or $2,400 on a VPS.
Heads up: this only works if your site is mostly static or uses light SSR. If you have a dashboard with complex auth, WebSockets, and real-time updates, Vercel costs more but it's still simpler to deploy.
When I tested this migration with my team two weeks ago, the real time was: 8 hours for a senior dev to move a Next.js blog (20 static pages + API routes) to Astro. ROI pays for itself in the first month if your team bills over $100/hour.
When Astro wins (and when Next.js still makes sense)
After a month running Astro 5.0 in production (migrated my consultancy's blog and two client sites), here's my take:
Choose Astro if:
- Your content is 70%+ static (blogs, docs, portfolios, landing pages)
- You want extreme load speed (perfect Core Web Vitals with zero effort)
- Your team uses multiple dev frameworks (React + Vue + Svelte in the same project)
- You need deploy flexibility (no Vercel lock-in)
- Your hosting budget is tight
Stick with Next.js if:
- Your app is mostly dynamic (dashboards, SaaS, apps with auth)
- You need complex routing with nested layouts and parallel routes
- Your team already has 2+ years of Next.js experience
- You're deep in the Vercel ecosystem (Analytics, Speed Insights, etc.)
- You need 24/7 enterprise support (Vercel Pro/Enterprise)
The reality of migrating: Next.js to Astro is NOT a drop-in replacement. You'll rewrite:
- All API routes (Next.js API routes → Astro endpoints)
- The routing system (file-based similar, but different syntax)
- Data fetching (getStaticProps → Content Layer API)
- Interactive components (you need to explicitly mark them with
client:load)
Real learning curve: 1 week for an experienced React dev. 2-3 weeks for a full team.
Disclaimer: I haven't personally tested Astro with projects that have more than 1,000 dynamic pages. Official benchmarks say it scales well, but my experience is limited to sites up to 200 pages.
In my hands-on testing over the past few weeks, the biggest win wasn't speed (which is brutal), but mental clarity. You know exactly what JavaScript goes to the browser because you marked it explicitly. In Next.js, there's always a React runtime floating around that you didn't ask for.
The framework grew from 0 to 100k stars in 3 years. Next.js took 8. The numbers speak for themselves: there's real momentum here.
The question isn't whether Astro will keep growing—it's when your project will be next to migrate.




