Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Build modern full-stack web applications with Next.js (App Router, Server Components, RSC, PPR, SSR, SSG, ISR), Turborepo (monorepo management, task pipelines, remote caching, parallel execution), and RemixIcon (3100+ SVG icons in outlined/filled styles). Use when creating React applications, implementing server-side rendering, setting up monorepos with multiple packages, optimizing build performance and caching strategies, adding icon libraries, managing shared dependencies, or working with Typ
.claude/skills/microck-web-frameworks/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 73% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 24% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 72% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 170% | 0% |
Comprehensive guide for building modern full-stack web applications using Next.js, Turborepo, and RemixIcon.
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
Use when building a standalone application:
Setup:
bashnpx create-next-app@latest my-app cd my-app npm install remixicon
Use when building multiple applications with shared code:
Setup:
bashnpx create-turbo@latest my-monorepo # Then configure Next.js apps in apps/ directory # Install remixicon in shared UI packages
| 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 |
bash# 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
bash# 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
tsx// 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" />
Next.js References:
Turborepo References:
RemixIcon References:
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 pipelineturbo.json:
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"] } } }
tsx// 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> }
tsx// 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> }
yaml# .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 }}
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:
bash# 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
Next.js:
Turborepo:
RemixIcon:
Building with this stack:
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 12,839 | 11,666 | -9% | 1 | 1 | 0% | 2,687 | 4,657 | +73% | 0 | 0 | — |
case-02 | fail→pass | 12,458 | 2,775 | -78% | 1 | 1 | 0% | 2,147 | 2,661 | +24% | 0 | 0 | — |
case-03 | fail→pass | 24,676 | 18,518 | -25% | 1 | 1 | 0% | 5,238 | 6,395 | +22% | 0 | 0 | — |
case-04 | fail→pass | 13,389 | 7,498 | -44% | 1 | 1 | 0% | 2,120 | 3,644 | +72% | 0 | 0 | — |
case-05 | fail→pass | 8,203 | 7,031 | -14% | 1 | 1 | 0% | 1,317 | 3,562 | +170% | 0 | 0 | — |
case-06 | pass→pass | 10,256 | 6,352 | -38% | 1 | 1 | 0% | 1,607 | 3,293 | +105% | 0 | 0 | — |
case-07 | fail→pass | 10,707 | 2,152 | -80% | 1 | 1 | 0% | 2,028 | 2,648 | +31% | 0 | 0 | — |
case-08 | pass→pass | 5,830 | 5,558 | -5% | 1 | 1 | 0% | 996 | 3,218 | +223% | 0 | 0 | — |
case-09 | fail→pass | 10,523 | 11,101 | +5% | 1 | 1 | 0% | 1,990 | 4,515 | +127% | 0 | 0 | — |
case-10 | pass→pass | 9,330 | 4,281 | -54% | 1 | 1 | 0% | 1,709 | 3,030 | +77% | 0 | 0 | — |
case-11 | pass→pass | 3,673 | 4,134 | +13% | 1 | 1 | 0% | 616 | 2,937 | +377% | 0 | 0 | — |
case-12 | pass→pass | 7,128 | 6,177 | -13% | 1 | 1 | 0% | 1,301 | 3,307 | +154% | 0 | 0 | — |
case-13 | pass→pass | 11,852 | 5,485 | -54% | 1 | 1 | 0% | 1,927 | 3,388 | +76% | 0 | 0 | — |
case-14 | pass→pass | 11,775 | 12,146 | +3% | 1 | 1 | 0% | 1,940 | 4,373 | +125% | 0 | 0 | — |
case-15 | fail→pass | 14,656 | 11,517 | -21% | 1 | 1 | 0% | 2,261 | 4,157 | +84% | 0 | 0 | — |
case-16 | fail→pass | 11,177 | 2,063 | -82% | 1 | 1 | 0% | 1,848 | 2,563 | +39% | 0 | 0 | — |
case-17 | pass→pass | 10,425 | 10,618 | +2% | 1 | 1 | 0% | 1,869 | 4,161 | +123% | 0 | 0 | — |
case-18 | fail→pass | 10,217 | 2,938 | -71% | 1 | 1 | 0% | 1,451 | 2,646 | +82% | 0 | 0 | — |
case-19 | pass→pass | 9,671 | 6,854 | -29% | 1 | 1 | 0% | 1,641 | 3,370 | +105% | 0 | 0 | — |
case-20 | pass→pass | 11,646 | 11,652 | +0% | 1 | 1 | 0% | 2,194 | 4,639 | +111% | 0 | 0 | — |
case-21 | pass→pass | 11,178 | 11,243 | +1% | 1 | 1 | 0% | 2,044 | 4,331 | +112% | 0 | 0 | — |
case-22 | pass→pass | 9,177 | 6,296 | -31% | 1 | 1 | 0% | 1,578 | 3,405 | +116% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.