Build modern full-stack web applications with Next.js (App Router, Server Components, RSC, PPR, SSR, SSG, ISR), Turborepo (monorepo management, task pipelines,…
Web Frameworks Skill Group
Comprehensive guide for building modern full-stack web applications using Next.js, Turborepo, and RemixIcon.
Overview
This skill group combines three powerful tools for web development:
Next.js - React framework with SSR, SSG, RSC, and optimization features
Turborepo - High-performance monorepo build system for JavaScript/TypeScript
RemixIcon - Icon library with 3,100+ outlined and filled style icons
When to Use This Skill Group
Building new full-stack web applications with modern React
Setting up monorepos with multiple apps and shared packages
Implementing server-side rendering and static generation
Optimizing build performance with intelligent caching
Creating consistent UI with professional iconography
Managing workspace dependencies across multiple projects
Deploying production-ready applications with proper optimization
Stack Selection Guide
Single Application: Next.js + RemixIcon
Use when building a standalone application:
E-commerce sites
Marketing websites
SaaS applications
Documentation sites
Blogs and content platforms
Setup:
npx create-next-app@latest my-app
cd my-app
npm install remixicon
Monorepo: Next.js + Turborepo + RemixIcon
Use when building multiple applications with shared code:
Microfrontends
Multi-tenant platforms
Internal tools with shared component library
Multiple apps (web, admin, mobile-web) sharing logic
Design system with documentation site
Setup:
npx create-turbo@latest my-monorepo
# Then configure Next.js apps in apps/ directory
# Install remixicon in shared UI packages
Framework Features Comparison
Feature
Next.js
Turborepo
RemixIcon
Primary Use
Web framework
Build system
UI icons
Best For
SSR/SSG apps
Monorepos
Consistent iconography
Performance
Built-in optimization
Caching & parallel tasks
Lightweight fonts/SVG
TypeScript
Full support
Full support
Type definitions available
Quick Start
Next.js Application
# Create new project
npx create-next-app@latest my-app
cd my-app
# Install RemixIcon
npm install remixicon
# Import in layout
# app/layout.tsx
import 'remixicon/fonts/remixicon.css'
# Start development
npm run dev
Turborepo Monorepo
# Create monorepo
npx create-turbo@latest my-monorepo
cd my-monorepo
# Structure:
# apps/web/ - Next.js application
# apps/docs/ - Documentation site
# packages/ui/ - Shared components with RemixIcon
# packages/config/ - Shared configs
# turbo.json - Pipeline configuration
# Run all apps
npm run dev
# Build all packages
npm run build
RemixIcon Integration
// Webfont (HTML/CSS)
<i className="ri-home-line"></i>
<i className="ri-search-fill ri-2x"></i>
// React component
import { RiHomeLine, RiSearchFill } from "@remixicon/react"
<RiHomeLine size={24} />
<RiSearchFill size={32} color="blue" />
Reference Navigation
Next.js References:
App Router Architecture - Routing, layouts, pages, parallel routes
Server Components - RSC patterns, client vs server, streaming
Data Fetching - fetch API, caching, revalidation, loading states
Optimization - Images, fonts, scripts, bundle analysis, PPR
Turborepo References:
Setup & Configuration - Installation, workspace config, package structure
Task Pipelines - Dependencies, parallel execution, task ordering
Caching Strategies - Local cache, remote cache, cache invalidation
RemixIcon References:
Integration Guide - Installation, usage, customization, accessibility
Common Patterns & Workflows
Pattern 1: Full-Stack Monorepo
my-monorepo/
├── apps/
│ ├── web/ # Customer-facing Next.js app
│ ├── admin/ # Admin dashboard Next.js app
│ └── docs/ # Documentation site
├── packages/
│ ├── ui/ # Shared UI with RemixIcon
│ ├── api-client/ # API client library
│ ├── config/ # ESLint, TypeScript configs
│ └── types/ # Shared TypeScript types
└── turbo.json # Build pipeline
turbo.json:
{
"$schema": "https://turbo.build/schema.json",
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": [".next/**", "!.next/cache/**", "dist/**"]
},
"dev": {
"cache": false,
"persistent": true
},
"lint": {},
"test": {
"dependsOn": ["build"]
}
}
}
Pattern 2: Shared Component Library
// packages/ui/src/button.tsx
import { RiLoader4Line } from "@remixicon/react"
export function Button({ children, loading, icon }) {
return (
<button>
{loading ? <RiLoader4Line className="animate-spin" /> : icon}
{children}
</button>
)
}
// apps/web/app/page.tsx
import { Button } from "@repo/ui/button"
import { RiHomeLine } from "@remixicon/react"
export default function Page() {
return <Button icon={<RiHomeLine />}>Home</Button>
}
Pattern 3: Optimized Data Fetching
// app/posts/[slug]/page.tsx
import { notFound } from 'next/navigation'
// Static generation at build time
export async function generateStaticParams() {
const posts = await getPosts()
return posts.map(post => ({ slug: post.slug }))
}
// Revalidate every hour
async function getPost(slug: string) {
const res = await fetch(`https://api.example.com/posts/${slug}`, {
next: { revalidate: 3600 }
})
if (!res.ok) return null
return res.json()
}
export default async function Post({ params }: { params: { slug: string } }) {
const post = await getPost(params.slug)
if (!post) notFound()
return <article>{post.content}</article>
}
Pattern 4: Monorepo CI/CD Pipeline
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
- run: npm install
- run: npx turbo run build test lint
env:
TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }}
TURBO_TEAM: ${{ secrets.TURBO_TEAM }}
Utility Scripts
Python utilities in scripts/ directory:
nextjs-init.py - Initialize Next.js project with best practices
turborepo-migrate.py - Convert existing monorepo to Turborepo
Usage examples:
# Initialize new Next.js app with TypeScript and recommended setup
python scripts/nextjs-init.py --name my-app --typescript --app-router
# Migrate existing monorepo to Turborepo with dry-run
python scripts/turborepo-migrate.py --path ./my-monorepo --dry-run
# Run tests
cd scripts/tests
pytest
Best Practices
Next.js:
Default to Server Components, use Client Components only when needed
Implement proper loading and error states
Use Image component for automatic optimization
Set proper metadata for SEO
Leverage caching strategies (force-cache, revalidate, no-store)
Turborepo:
Structure monorepo with clear separation (apps/, packages/)
Define task dependencies correctly (^build for topological)
Configure outputs for proper caching
Enable remote caching for team collaboration
Use filters to run tasks on changed packages only
RemixIcon:
Use line style for minimal interfaces, fill for emphasis
Maintain 24x24 grid alignment for crisp rendering
Provide aria-labels for accessibility
Use currentColor for flexible theming
Prefer webfonts for multiple icons, SVG for single icons
Resources
Next.js: https://nextjs.org/docs/llms.txt
Turborepo: https://turbo.build/repo/docs
RemixIcon: https://remixicon.com
Implementation Checklist
Building with this stack:
Create project structure (single app or monorepo)
Configure TypeScript and ESLint
Set up Next.js with App Router
Configure Turborepo pipeline (if monorepo)
Install and configure RemixIcon
Implement routing and layouts
Add loading and error states
Configure image and font optimization
Set up data fetching patterns
Configure caching strategies
Add API routes as needed
Implement shared component library (if monorepo)
Configure remote caching (if monorepo)
Set up CI/CD pipeline
Configure deployment platformdon't have the plugin yet? install it then click "run inline in claude" again.