LogoShip
v2.0
ship.dev / dashboard
LIVE
75%done
Total runtime14:02:47
Lessons completed6/8
Current streak4 days ๐Ÿ”ฅ
โœ“01 โ€” Project Init & App Router
0:47
โœ“02 โ€” Layouts & Nested Routes
1:12
โœ“03 โ€” Server Components Deep Dive
2:08
โœ“04 โ€” Streaming & Suspense
1:54
โœ“05 โ€” Data Fetching Patterns
2:31
โœ“06 โ€” Edge Middleware & Auth
2:19
+2 more modules...
app/blog/[slug]/page.tsxRSC refactor
- export default function Page() {
- const [data, setData] = useState(null)
- useEffect(() => fetchData(), [])
- return <div>{data?.title}</div>
+ export default async function Page() {
+ const data = await db.post.findFirst()
+ return <div>{data.title}</div>
}
47 lessons ยท 14 hours ยท real codebases

Stop reading
docs. Start
shipping Next_

Fourteen concentrated hours. Every lesson filmed inside a real codebase shipping real features โ€” server components, streaming, edge middleware โ€” not toy demos.

47
lessons
14h
runtime
0
toy demos

Module 01 unlocks instantly. No credit card. No friction.

Mid-level React devsJunior startup devsFreelancers
Server ComponentsStreamingEdge MiddlewareISR CachingApp RouterParallel RoutesIntercepting RoutesServer ActionsVercel DeployObservabilityServer ComponentsStreamingEdge MiddlewareISR CachingApp RouterParallel RoutesIntercepting RoutesServer ActionsVercel DeployObservability
Curriculum

47 lessons.
Zero filler.

01Foundation5 lessons ยท 47 min

Project Init & App Router

From npx create-next-app to a working multi-route application in under 20 minutes. File-based routing, the app/ directory, and why pages/ is dead.

app/layout.tsx
// Root layout โ€” runs on every route
export default function RootLayout({
children,
}: { children: React.ReactNode }) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}
โ–ถYou ship: A multi-page Next.js app with shared layout
Lesson preview for Project Init & App Router โ€” code editor showing Foundation implementation
47 min
01
02Server Components8 lessons ยท 2h 08min

RSC Data Patterns

Async components that fetch directly from your database. No useEffect, no loading spinners, no client bundle bloat. The mental model shift that changes everything.

app/posts/page.tsx
// No useState. No useEffect. No API route.
export default async function PostsPage() {
const posts = await db.post.findMany({
orderBy: { createdAt: "desc" },
take: 10,
})
return <PostList posts={posts} />
}
โ–ถYou ship: A server-rendered data feed, zero client JS
Lesson preview for RSC Data Patterns โ€” code editor showing Server Components implementation
2h 08min
02
03Streaming6 lessons ยท 1h 54min

Streaming & Suspense Boundaries

Ship the shell instantly, stream the data. Suspense boundaries that make slow DB queries invisible to users. Progressive hydration without the complexity.

app/dashboard/page.tsx
import { Suspense } from "react";
export default function Dashboard() {
return (
<Suspense fallback={<MetricsSkeleton />}>
<SlowMetrics />
</Suspense>
)
}
โ–ถYou ship: A dashboard that loads shell in <100ms
Lesson preview for Streaming & Suspense Boundaries โ€” code editor showing Streaming implementation
1h 54min
03
04Edge Middleware7 lessons ยท 2h 19min

Auth Middleware at the Edge

Protect routes before they render. JWT validation, geo-blocking, A/B testing โ€” all running at the CDN edge with sub-millisecond latency worldwide.

middleware.ts
export function middleware(req: NextRequest) {
const token = req.cookies.get("session")
// if (!token) redirect to /login
if (!token) {
return NextResponse.redirect(
new URL("/login", req.url)
)
}
}
โ–ถYou ship: Auth-protected routes running at the edge
Lesson preview for Auth Middleware at the Edge โ€” code editor showing Edge Middleware implementation
2h 19min
04
What you'll ship

Real features.
Real codebases.

01โ€“02
Multi-route app with shared layout
App Router, nested routes, parallel route groups
03
Server-rendered data feed, 0kb client JS
Async server components querying Postgres directly
04
Dashboard that shells in <100ms
Suspense streaming, skeleton states, progressive hydration
05
Auth-protected routes at the edge
JWT middleware, sub-millisecond validation worldwide
06
ISR-cached blog with on-demand revalidation
Incremental static regen, webhook-triggered cache busting
07โ€“08
Full deploy pipeline with monitoring
Vercel, OpenTelemetry, error tracking, performance budgets
terminal โ€” zsh
โ–ˆ
Free to start

You've seen enough
code to trust it.

Module 01 is free. No account required until you decide to continue. See exactly how the course is taught before you commit to anything.

2,847
developers enrolled
4.9/5
avg. rating
< 5min
to first lesson
Full curriculum

Every module.
Every lesson.

curriculum.json โ€” 47 lessons ยท 14h 02m total
01Project Init & App Router
5 lessons47m
02Layouts, Templates & Route Groups
6 lessons1h 12m
03Server Components Deep Dive
8 lessons2h 08m
04Streaming & Suspense Boundaries
6 lessons1h 54m
05Data Fetching Patterns
7 lessons2h 31m
06Edge Middleware & Auth
7 lessons2h 19m
07ISR & Cache Strategies
5 lessons1h 43m
08Deploy, Monitor & Ship
3 lessons1h 24m

Download Full Curriculum

Get the complete 47-lesson breakdown as a PDF โ€” module descriptions, lesson durations, and what you'll ship after each section.

No spam. One email with the PDF. Unsubscribe any time.

โ€œI was the dev at my agency who kept saying 'we'll figure out App Router eventually.' Three days after finishing Ship, I migrated our biggest client to RSC. We shipped features in half the time.โ€

MK
Marcus Kowalski
Frontend Lead @ Vertex Studio, Chicago