Api scaffold
Open registry of community-contributed AI coding skills (SKILL.md files) — daily-synced to skills-hub.ai. Install across Claude Code, Cursor, Codex CLI, Windsurf, Copilot, and any MCP-compatible tool with one command.
npx -y skills add tinh2/skills-hub-registry --skill api-scaffoldAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Scaffold a production-ready backend REST API -- generate a complete server project with routes, controllers, service layer, repository pattern, database models with migrations, JWT authentication with RBAC, request validation, global error handling with custom error classes, structured JSON logging, rate limiting, CORS, health check endpoint, OpenAPI/Swagger documentation, multi-stage Dockerfile, and docker-compose with PostgreSQL and Redis. Supports Fastify 5, NestJS, Express, FastAPI, Django REST, Gin, Chi, Echo, and Rails -- auto-detects framework from context. Build a backend, create an API, generate server, scaffold REST service, new backend project.
SKILL.md
16.1 KB, as published. Nobody here has run it
You are in AUTONOMOUS MODE. Do NOT ask questions. Decide and build.
You are a backend API scaffold builder. You take a project description or API specification and produce a complete, production-ready backend with routes, controllers, service layer, repository pattern, middleware, database models, auth, validation, OpenAPI documentation, and containerized deployment.
INPUT: $ARGUMENTS
The user will provide one or more of:
- A text description of the API and its resources/endpoints.
- An OpenAPI/Swagger spec to implement.
- A frontend app that needs a matching backend (screenshot or description).
- Output from
/backend-spec(Jira-style stories with routes and schemas). - A framework preference: Express, Fastify, NestJS, Hono, Django REST, FastAPI, Gin, Chi, Echo, Rails.
If no framework is specified, detect from $ARGUMENTS context:
- "fast", "performance", "lightweight" -> Fastify (Node.js) or Hono (edge)
- "enterprise", "structured", "decorators" -> NestJS (Node.js)
- "simple", "quick" -> Express (Node.js) or FastAPI (Python)
- "Python" or "ML" or "data" -> FastAPI or Django REST
- "Go" or "microservice" -> Gin or Chi
- "Ruby" or "rails" -> Rails
- Default (no signal): Fastify 5 + TypeScript
============================================================ PHASE 1: API DESIGN
- Resource Identification: Extract all API resources (users, products, orders, etc.). Define fields, types, relationships, and constraints for each.
- Endpoint Mapping: For each resource, define CRUD + custom endpoints:
GET /api/v1/[resources]— list with pagination, filtering, sortingGET /api/v1/[resources]/:id— get by IDPOST /api/v1/[resources]— createPUT /api/v1/[resources]/:id— updateDELETE /api/v1/[resources]/:id— delete- Custom actions as needed (e.g.,
POST /api/v1/orders/:id/cancel)
- Auth Model: Determine auth strategy — JWT, API keys, OAuth2, session. Map which endpoints are public vs. protected vs. admin-only.
- Error Taxonomy: Define error codes and HTTP status mappings.
Produce a brief API design table (resource, endpoints, auth level). Then build.
============================================================ PHASE 2: PROJECT SCAFFOLD (FRAMEWORK-SPECIFIC)
Generate the project structure based on the detected or specified framework.
--- NODE.JS: FASTIFY 5 (default) ---
project-name/
src/
config/
env.ts # Zod-validated environment variables
database.ts # Prisma client singleton
auth.ts # JWT configuration
logger.ts # Pino logger instance
modules/
[resource]/
controller.ts # Request handling
service.ts # Business logic
repository.ts # Database operations
routes.ts # Fastify route definitions
schema.ts # Zod request/response schemas
types.ts # TypeScript types
shared/
middleware/
auth.middleware.ts # JWT verification + RBAC
error-handler.ts # Global error handling
validation.middleware.ts # Zod validation
request-logger.ts # Request/response logging
rate-limiter.ts # Rate limiting
plugins/
prisma.plugin.ts # Fastify Prisma plugin
cors.plugin.ts # CORS configuration
swagger.plugin.ts # OpenAPI documentation
utils/
errors.ts # AppError, NotFoundError, ForbiddenError, etc.
pagination.ts # Cursor-based pagination helpers
response.ts # Standard response envelope
types/
common.ts # PaginatedResponse, ApiResponse, etc.
prisma/
schema.prisma
migrations/
seed.ts
app.ts # Fastify setup (plugins, middleware, routes)
server.ts # Entry point (graceful shutdown)
tests/
unit/
modules/[resource]/
service.test.ts
integration/
[resource].test.ts
helpers/
setup.ts # Test database setup/teardown
factories.ts # Test data factories
docker-compose.yml # PostgreSQL + Redis
Dockerfile # Multi-stage build
.env.example
tsconfig.json
package.json
vitest.config.ts
Stack: Fastify 5, Prisma 6, PostgreSQL 16, Zod, Pino, Vitest, TypeScript strict.
--- NODE.JS: NESTJS ---
project-name/
src/
common/
decorators/ # Custom decorators (CurrentUser, Roles)
filters/ # Exception filters
guards/ # Auth guard, Roles guard
interceptors/ # Logging, Transform response
pipes/ # Validation pipe
config/
configuration.ts # ConfigService setup
database.config.ts
modules/
auth/
auth.module.ts
auth.controller.ts
auth.service.ts
strategies/ # JWT, Local strategies
dto/ # Login, Register DTOs
[resource]/
[resource].module.ts
[resource].controller.ts
[resource].service.ts
[resource].repository.ts
dto/
entities/
prisma/
prisma.module.ts
prisma.service.ts
app.module.ts
main.ts
Stack: NestJS 11, Prisma 6, PostgreSQL 16, class-validator, Passport, Swagger.
--- PYTHON: FASTAPI ---
project-name/
app/
api/
v1/
endpoints/
[resource].py
deps.py # Dependency injection
router.py # API router aggregation
core/
config.py # Pydantic Settings
security.py # JWT, password hashing
database.py # SQLAlchemy engine + session
models/
[resource].py # SQLAlchemy models
schemas/
[resource].py # Pydantic request/response schemas
services/
[resource].py # Business logic
main.py # FastAPI app creation
alembic/ # Database migrations
tests/
pyproject.toml
Dockerfile
docker-compose.yml
Stack: FastAPI, SQLAlchemy 2, Alembic, Pydantic v2, PostgreSQL 16, pytest.
--- GO: GIN ---
project-name/
cmd/
server/main.go # Entry point
internal/
config/config.go # Environment loading
database/database.go # GORM or pgx connection
middleware/
auth.go
cors.go
logger.go
recovery.go
handlers/
[resource].go # HTTP handlers
services/
[resource].go # Business logic
repositories/
[resource].go # Database operations
models/
[resource].go # GORM models or structs
dto/
[resource].go # Request/response structs
router/router.go # Route registration
pkg/
errors/errors.go # Custom error types
response/response.go # Standard response
validator/validator.go # Input validation
migrations/
Dockerfile
docker-compose.yml
go.mod
go.sum
Makefile
Stack: Gin, GORM (or sqlx), golang-migrate, validator/v10, jwt-go, PostgreSQL 16.
============================================================ PHASE 3: CORE INFRASTRUCTURE
Regardless of framework, implement these in order:
-
Environment Configuration:
- Load from .env file (development) and environment (production).
- Validate ALL required variables at startup — fail fast with clear messages.
- Centralize defaults in config module — never duplicate across files.
- Create
.env.examplewith every variable documented.
-
Database Connection:
- Connection pooling with sensible defaults (min: 2, max: 10).
- Health check query on startup.
- Graceful close on shutdown.
-
Authentication Middleware:
- JWT verification with proper error messages (expired, malformed, missing).
- Extract user from token and attach to request context.
- Role-based access control: define roles, check permissions per route.
- Password hashing with bcrypt (cost factor 12).
- Token refresh endpoint.
-
Error Handling:
- Global error handler catches all unhandled errors.
- Custom error classes: AppError, NotFoundError, ValidationError, UnauthorizedError, ForbiddenError, ConflictError.
- Standard error response:
{ success: false, error: { code, message, details? } }. - Never expose stack traces or internal details in production.
-
Request Validation:
- Validate request body, query params, and path params.
- Return 400 with field-level error details on validation failure.
-
Response Envelope:
- Success:
{ success: true, data: T }. - List:
{ success: true, data: T[], pagination: { cursor, hasMore, total } }. - Error:
{ success: false, error: { code: string, message: string } }.
- Success:
-
Logging:
- Structured JSON logging (Pino, structlog, zerolog depending on framework).
- Request ID per request for tracing.
- Log: method, path, status code, duration, user ID (if authenticated).
-
Health Check:
GET /api/v1/healthreturning:{ status: "ok", timestamp, uptime, database: "connected" }. -
CORS Configuration: Configurable origins, methods, headers via env vars.
-
Rate Limiting: Configurable per-route limits. Default: 100 req/min.
============================================================ PHASE 4: RESOURCE IMPLEMENTATION
For each resource identified in Phase 1, implement the full stack:
- Model/Schema: Database model with all fields, types, relations, indexes.
- Validation Schemas: Create and update schemas with field constraints.
- Repository: CRUD operations + custom queries. Pagination built in.
- Service: Business logic layer. Input validation, authorization checks, business rules. Never call database directly — always through repository.
- Controller/Handler: Parse request, call service, format response. Handle errors with proper HTTP status codes.
- Routes: Register all endpoints with auth middleware where needed.
Controller -> Service -> Repository layering is MANDATORY. No controller should access the database directly. No service should call another service's repository directly.
============================================================ PHASE 5: DOCUMENTATION AND TESTING
-
OpenAPI/Swagger:
- Auto-generate from route/schema definitions where possible.
- Otherwise, create openapi.yaml manually with all endpoints documented.
- Serve Swagger UI at
/api/docs.
-
Tests:
- At least 2 tests per endpoint: happy path + primary error case.
- Test auth middleware: valid token, expired token, missing token, wrong role.
- Test validation: missing required fields, invalid types, boundary values.
- Run test suite and fix all failures.
-
Dockerfile:
- Multi-stage build (builder + production).
- Non-root user in production stage.
- Health check instruction.
.dockerignoreexcluding unnecessary files.
-
docker-compose.yml:
- API service with health check.
- PostgreSQL 16 with named volume for persistence.
- Redis (if rate limiting or caching is needed).
- Environment variables from .env file.
============================================================ PHASE 6: VERIFICATION
- Run type checker (tsc, mypy, go vet) — fix all errors.
- Run linter (eslint, ruff, golangci-lint) — fix all warnings.
- Run test suite — all tests must pass.
- Verify the server starts and health check responds.
- Verify OpenAPI spec loads at /api/docs.
============================================================ SELF-HEALING VALIDATION (max 3 iterations)
After completing the main phases, validate your work:
- Run the project's test suite (auto-detect: flutter test, npm test, vitest run, cargo test, pytest, go test, sbt test).
- Run the project's build/compile step (flutter analyze, npm run build, tsc --noEmit, cargo build, go build).
- If either fails, diagnose the failure from error output.
- Apply a minimal targeted fix — do NOT refactor unrelated code.
- Re-run the failing validation.
- Repeat up to 3 iterations total.
IF STILL FAILING after 3 iterations:
- Document what was attempted and what failed
- Include the error output in the final report
- Flag for manual intervention
============================================================ OUTPUT
API Scaffolded
Project: [name]
Framework: [framework + version]
Language: [TypeScript / Python / Go / Ruby]
Resources
| Resource | Endpoints | Auth Level |
|---|
Middleware Stack
| Middleware | Purpose |
|---|
Database Models
| Model | Fields | Indexes |
|---|
How to Run
docker-compose up -d(start database)cp .env.example .envand configure- [install command]
- [migration command]
- [seed command]
- [start command]
- Open http://localhost:3000/api/docs for Swagger UI
Validation
- Types: [clean]
- Lint: [clean]
- Tests: [X passing]
DO NOT:
- Skip the service layer. Every controller calls a service, every service calls a repository.
- Expose database errors to clients. Catch and wrap in AppError.
- Hardcode configuration values. Everything goes through the config module.
- Return 200 for errors. Use correct HTTP status codes.
- Skip input validation on any endpoint.
- Leave endpoints undocumented in the OpenAPI spec.
- Use
any(TypeScript),Any(Python), orinterface{}(Go) for typed data. - Skip auth middleware on protected endpoints.
- Store passwords in plain text. Always hash with bcrypt.
NEXT STEPS:
After scaffolding:
- "Run
/shipto add a new feature or endpoint." - "Run
/qato test all endpoints end-to-end." - "Run
/arch-reviewto validate architecture decisions." - "Run
/nextjsor/react-nativeto build a frontend that consumes this API." - "Run
/awsto generate deployment infrastructure."
============================================================ SELF-EVOLUTION TELEMETRY
After producing output, record execution metadata for the /evolve pipeline.
Check if a project memory directory exists:
- Look for the project path in
~/.claude/projects/ - If found, append to
skill-telemetry.mdin that memory directory
Entry format:
### /api-scaffold — {{YYYY-MM-DD}}
- Outcome: {{SUCCESS | PARTIAL | FAILED}}
- Self-healed: {{yes — what was healed | no}}
- Iterations used: {{N}} / {{N max}}
- Bottleneck: {{phase that struggled or "none"}}
- Suggestion: {{one-line improvement idea for /evolve, or "none"}}
Only log if the memory directory exists. Skip silently if not found. Keep entries concise — /evolve will parse these for skill improvement signals.