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 platform