Learn-skills.dev scaffold
Project scaffolding - generate boilerplate for common project types with best-practice defaults. Use for: scaffold, boilerplate, template, new project, init, create project, starter, setup, project structure, directory structure, monorepo, microservice, API template, web app template, CLI tool template, library template.
install
source · Clone the upstream repo
git clone https://github.com/NeverSight/learn-skills.dev
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/0xdarkmatter/claude-mods/scaffold" ~/.claude/skills/neversight-learn-skills-dev-scaffold && rm -rf "$T"
manifest:
data/skills-md/0xdarkmatter/claude-mods/scaffold/SKILL.mdsource content
Scaffold
Project scaffolding templates and boilerplate generation for common project types with best-practice defaults.
Project Type Decision Tree
What are you building? │ ├─ API / Backend Service │ ├─ REST API │ │ ├─ Python → FastAPI (async, OpenAPI auto-docs) │ │ ├─ Node.js → Express or Fastify (Fastify for performance) │ │ ├─ Go → Gin (ergonomic) or Echo (middleware-rich) │ │ └─ Rust → Axum (tower ecosystem, async-first) │ ├─ GraphQL API │ │ ├─ Python → Strawberry + FastAPI │ │ ├─ Node.js → Apollo Server or Pothos + Yoga │ │ ├─ Go → gqlgen (code-first) │ │ └─ Rust → async-graphql + Axum │ └─ gRPC Service │ ├─ Python → grpcio + protobuf │ ├─ Go → google.golang.org/grpc │ └─ Rust → tonic │ ├─ Web Application │ ├─ Full-stack with SSR │ │ ├─ React ecosystem → Next.js 14+ (App Router) │ │ ├─ Vue ecosystem → Nuxt 3 │ │ ├─ Svelte ecosystem → SvelteKit │ │ └─ Content-heavy / multi-framework → Astro │ ├─ SPA (client-only) │ │ ├─ React → Vite + React + React Router │ │ ├─ Vue → Vite + Vue + Vue Router │ │ └─ Svelte → Vite + Svelte + svelte-routing │ └─ Static Site │ ├─ Blog / docs → Astro or VitePress │ └─ Marketing / landing → Astro or Next.js (static export) │ ├─ CLI Tool │ ├─ Python → Typer (simple) or Click (complex) │ ├─ Node.js → Commander + Inquirer │ ├─ Go → Cobra + Viper │ └─ Rust → Clap (derive API) │ ├─ Library / Package │ ├─ npm package → TypeScript + tsup + Vitest │ ├─ PyPI package → uv + pyproject.toml + pytest │ ├─ Go module → go mod init + go test │ └─ Rust crate → cargo init --lib + cargo test │ └─ Monorepo ├─ JavaScript/TypeScript → Turborepo + pnpm workspaces ├─ Full-stack JS → Nx ├─ Go → Go workspaces (go.work) ├─ Rust → Cargo workspaces └─ Python → uv workspaces or hatch
Stack Selection Matrix
| Project Type | Language | Framework | Database | ORM/Query | Deploy Target |
|---|---|---|---|---|---|
| REST API | Python | FastAPI | PostgreSQL | SQLAlchemy + Alembic | Docker / AWS ECS |
| REST API | Node.js | Fastify | PostgreSQL | Prisma or Drizzle | Docker / Vercel |
| REST API | Go | Gin | PostgreSQL | sqlx (raw) or GORM | Docker / Fly.io |
| REST API | Rust | Axum | PostgreSQL | sqlx | Docker / Fly.io |
| Web App | TypeScript | Next.js 14+ | PostgreSQL | Prisma or Drizzle | Vercel / Docker |
| Web App | TypeScript | Nuxt 3 | PostgreSQL | Prisma | Vercel / Netlify |
| Web App | TypeScript | Astro | SQLite / none | Drizzle | Cloudflare / Netlify |
| CLI Tool | Python | Typer | SQLite | sqlite3 stdlib | PyPI |
| CLI Tool | Go | Cobra | SQLite / BoltDB | sqlx | GitHub Releases |
| CLI Tool | Rust | Clap | SQLite | rusqlite | crates.io |
| Library | TypeScript | tsup | n/a | n/a | npm |
| Library | Python | hatch/uv | n/a | n/a | PyPI |
Quick Scaffold Commands
Python (API)
# FastAPI with uv mkdir my-api && cd my-api uv init --python 3.12 uv add fastapi uvicorn sqlalchemy alembic psycopg2-binary pydantic-settings uv add --dev pytest pytest-asyncio httpx ruff mypy
Node.js (Web App)
# Next.js 14+ npx create-next-app@latest my-app --typescript --tailwind --eslint --app --src-dir --import-alias "@/*" # Vite + React npm create vite@latest my-app -- --template react-ts
Go (API)
mkdir my-api && cd my-api go mod init github.com/user/my-api go get github.com/gin-gonic/gin go get github.com/jmoiron/sqlx go get github.com/lib/pq
Rust (CLI)
cargo init my-cli cd my-cli cargo add clap --features derive cargo add serde --features derive cargo add anyhow tokio --features tokio/full
Monorepo (Turborepo)
npx create-turbo@latest my-monorepo # Or manual: mkdir my-monorepo && cd my-monorepo npm init -y npm install turbo --save-dev mkdir -p apps/web apps/api packages/shared
API Project Template
Directory Structure (FastAPI Example)
my-api/ ├── src/ │ └── my_api/ │ ├── __init__.py │ ├── main.py # FastAPI app, lifespan, middleware │ ├── config.py # pydantic-settings configuration │ ├── database.py # SQLAlchemy engine, session │ ├── dependencies.py # Shared FastAPI dependencies │ ├── routers/ │ │ ├── __init__.py │ │ ├── health.py # Health check endpoint │ │ └── users.py # User CRUD endpoints │ ├── models/ │ │ ├── __init__.py │ │ └── user.py # SQLAlchemy models │ ├── schemas/ │ │ ├── __init__.py │ │ └── user.py # Pydantic request/response schemas │ └── services/ │ ├── __init__.py │ └── user.py # Business logic ├── alembic/ │ ├── alembic.ini │ ├── env.py │ └── versions/ ├── tests/ │ ├── conftest.py # Fixtures: test DB, client, factories │ ├── test_health.py │ └── test_users.py ├── pyproject.toml ├── Dockerfile ├── docker-compose.yml ├── .env.example ├── .gitignore └── .dockerignore
Directory Structure (Express/Fastify Example)
my-api/ ├── src/ │ ├── index.ts # Entry point, server startup │ ├── app.ts # Express/Fastify app setup │ ├── config.ts # Environment config with zod validation │ ├── database.ts # Prisma client or Drizzle config │ ├── middleware/ │ │ ├── auth.ts │ │ ├── error-handler.ts │ │ └── request-logger.ts │ ├── routes/ │ │ ├── health.ts │ │ └── users.ts │ ├── services/ │ │ └── user.service.ts │ └── types/ │ └── index.ts ├── prisma/ │ └── schema.prisma ├── tests/ │ ├── setup.ts │ └── routes/ │ └── users.test.ts ├── package.json ├── tsconfig.json ├── Dockerfile ├── docker-compose.yml ├── .env.example └── .gitignore
Web App Project Template
Directory Structure (Next.js App Router)
my-app/ ├── src/ │ ├── app/ │ │ ├── layout.tsx # Root layout │ │ ├── page.tsx # Home page │ │ ├── loading.tsx # Global loading UI │ │ ├── error.tsx # Global error boundary │ │ ├── not-found.tsx # 404 page │ │ ├── globals.css # Global styles + Tailwind │ │ ├── (auth)/ │ │ │ ├── login/page.tsx │ │ │ └── register/page.tsx │ │ ├── dashboard/ │ │ │ ├── layout.tsx │ │ │ └── page.tsx │ │ └── api/ │ │ └── health/route.ts │ ├── components/ │ │ ├── ui/ # Reusable primitives │ │ └── features/ # Feature-specific components │ ├── lib/ │ │ ├── db.ts # Database client │ │ ├── auth.ts # Auth helpers │ │ └── utils.ts # Shared utilities │ └── types/ │ └── index.ts ├── public/ │ └── favicon.ico ├── tests/ │ ├── setup.ts │ └── components/ ├── next.config.ts ├── tailwind.config.ts ├── tsconfig.json ├── package.json ├── .env.local.example └── .gitignore
CLI Tool Project Template
Directory Structure (Python / Typer)
my-cli/ ├── src/ │ └── my_cli/ │ ├── __init__.py │ ├── __main__.py # python -m my_cli entry │ ├── cli.py # Typer app, command groups │ ├── commands/ │ │ ├── __init__.py │ │ ├── init.py # my-cli init │ │ └── run.py # my-cli run │ ├── config.py # Config file loading (TOML/YAML) │ └── utils.py ├── tests/ │ ├── conftest.py │ └── test_commands.py ├── pyproject.toml # [project.scripts] entry point ├── .gitignore └── README.md
Directory Structure (Go / Cobra)
my-cli/ ├── cmd/ │ ├── root.go # Root command, global flags │ ├── init.go # my-cli init │ └── run.go # my-cli run ├── internal/ │ ├── config/ │ │ └── config.go # Viper config loading │ └── runner/ │ └── runner.go # Core logic ├── main.go # Entry point, calls cmd.Execute() ├── go.mod ├── go.sum ├── Makefile └── .gitignore
Library Project Template
Directory Structure (npm Package)
my-lib/ ├── src/ │ ├── index.ts # Public API exports │ ├── core.ts # Core implementation │ └── types.ts # Public type definitions ├── tests/ │ └── core.test.ts ├── package.json # "type": "module", exports map ├── tsconfig.json # declaration: true, declarationMap: true ├── tsup.config.ts # Build config: cjs + esm ├── vitest.config.ts ├── .npmignore ├── .gitignore ├── CHANGELOG.md └── LICENSE
Directory Structure (PyPI Package)
my-lib/ ├── src/ │ └── my_lib/ │ ├── __init__.py # Public API, __version__ │ ├── core.py │ └── py.typed # PEP 561 marker ├── tests/ │ ├── conftest.py │ └── test_core.py ├── pyproject.toml # Build system, metadata, tool config ├── .gitignore ├── CHANGELOG.md └── LICENSE
Monorepo Template
Turborepo + pnpm Workspaces
my-monorepo/ ├── apps/ │ ├── web/ # Next.js frontend │ │ ├── src/ │ │ ├── package.json # depends on @repo/shared │ │ └── tsconfig.json # extends ../../tsconfig.base.json │ └── api/ # Fastify backend │ ├── src/ │ ├── package.json │ └── tsconfig.json ├── packages/ │ ├── shared/ # Shared types, utils, validators │ │ ├── src/ │ │ ├── package.json # "name": "@repo/shared" │ │ └── tsconfig.json │ ├── ui/ # Shared React components │ │ ├── src/ │ │ └── package.json # "name": "@repo/ui" │ └── config/ # Shared configs │ ├── eslint/ │ ├── typescript/ │ └── package.json ├── turbo.json # Pipeline: build, test, lint ├── pnpm-workspace.yaml # packages: ["apps/*", "packages/*"] ├── package.json # Root devDeps: turbo ├── tsconfig.base.json # Shared TypeScript config ├── .gitignore └── .npmrc
Cargo Workspaces (Rust)
my-workspace/ ├── crates/ │ ├── my-core/ # Core library │ │ ├── src/lib.rs │ │ └── Cargo.toml │ ├── my-cli/ # CLI binary │ │ ├── src/main.rs │ │ └── Cargo.toml # depends on my-core │ └── my-server/ # API binary │ ├── src/main.rs │ └── Cargo.toml ├── Cargo.toml # [workspace] members = ["crates/*"] ├── Cargo.lock ├── .gitignore └── rust-toolchain.toml
Common Additions Checklist
Project setup complete? Add these: │ ├─ Version Control │ ├─ [ ] .gitignore (language-specific) │ ├─ [ ] .gitattributes (line endings, binary files) │ └─ [ ] Branch protection rules │ ├─ CI/CD │ ├─ [ ] GitHub Actions workflow (test on PR, deploy on merge) │ ├─ [ ] Matrix testing (OS, runtime versions) │ └─ [ ] Release automation │ ├─ Docker │ ├─ [ ] Multi-stage Dockerfile │ ├─ [ ] docker-compose.yml (app + database + cache) │ ├─ [ ] .dockerignore │ └─ [ ] Health check endpoint │ ├─ Code Quality │ ├─ [ ] Linter (ESLint, Ruff, golangci-lint, Clippy) │ ├─ [ ] Formatter (Prettier, Black/Ruff, gofmt, rustfmt) │ ├─ [ ] Pre-commit hooks (Husky, pre-commit) │ └─ [ ] Type checking (TypeScript strict, mypy, go vet) │ ├─ Testing │ ├─ [ ] Test framework configured (Vitest, pytest, go test) │ ├─ [ ] Coverage reporting │ ├─ [ ] Test database setup │ └─ [ ] CI test pipeline │ ├─ Editor │ ├─ [ ] .editorconfig │ ├─ [ ] .vscode/settings.json │ └─ [ ] .vscode/extensions.json │ └─ Documentation ├─ [ ] README.md (project description, setup, usage) ├─ [ ] CONTRIBUTING.md └─ [ ] API documentation (OpenAPI, godoc, rustdoc)
Configuration File Templates
.editorconfig (Universal)
root = true [*] indent_style = space indent_size = 2 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.{py,rs}] indent_size = 4 [*.go] indent_style = tab [*.md] trim_trailing_whitespace = false [Makefile] indent_style = tab
pyproject.toml (Python)
[project] name = "my-project" version = "0.1.0" requires-python = ">=3.12" [tool.ruff] target-version = "py312" line-length = 88 [tool.ruff.lint] select = ["E", "F", "I", "UP", "B", "SIM"] [tool.pytest.ini_options] testpaths = ["tests"] asyncio_mode = "auto" [tool.mypy] strict = true
tsconfig.json (TypeScript - Strict)
{ "compilerOptions": { "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "declaration": true, "declarationMap": true, "sourceMap": true, "outDir": "./dist", "rootDir": "./src" }, "include": ["src"], "exclude": ["node_modules", "dist"] }
Common Gotchas
| Gotcha | Why It Happens | Prevention |
|---|---|---|
| Wrong .gitignore for language | Used generic template, missing language-specific entries | Use or GitHub's templates for your stack |
| Forgot .env.example | Team members don't know which env vars are needed | Create .env.example with every var (empty values) at project start |
| No lockfile committed | Inconsistent dependency versions across environments | Commit package-lock.json, uv.lock, go.sum, Cargo.lock |
| Hardcoded port/host in code | Works locally, breaks in Docker/cloud | Always read from env var with sensible default |
| Tests coupled to real database | Tests fail without running DB, CI setup is complex | Use test containers or in-memory SQLite for unit tests |
| Missing health check endpoint | Deployment orchestrator cannot verify readiness | Add /health endpoint that checks DB connectivity |
| No multi-stage Docker build | Image is 2GB instead of 200MB | Use builder stage for deps/compile, slim runtime stage |
| Mixing tabs and spaces | .editorconfig missing, editor defaults vary | Add .editorconfig to every project root |
| No .dockerignore | Docker context sends node_modules/venv, build takes minutes | Mirror .gitignore entries plus .git directory |
| Monorepo without workspace protocol | Packages resolve from registry instead of local | Use (pnpm) or path deps (Cargo, Go) |
| TypeScript paths not in tsconfig | Module aliases work in dev but fail at build time | Configure paths in tsconfig AND build tool (tsup, vite) |
Reference Files
| File | Contents | Lines |
|---|---|---|
| Complete API scaffolds: FastAPI, Express/Fastify, Gin, Axum with full file content | ~700 |
| Web app scaffolds: Next.js, Nuxt 3, Astro, SvelteKit, Vite+React with config | ~650 |
| CI/CD, Docker, linting, testing, pre-commit, editor config, git templates | ~550 |
See Also
| Skill | When to Combine |
|---|---|
| Container configuration, multi-stage builds, compose orchestration |
| GitHub Actions workflows, deployment pipelines, release automation |
| Test framework setup, coverage configuration, CI test integration |
| Python virtual environments, dependency management with uv |
| TypeScript configuration, strict mode, module resolution |