Backend build
A workshop of personal Claude Code skills — design, build, and writing craft
npx -y skills add muzalee/claude-atelier --skill backend-buildAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
3 things to look at
- 12 days oldThe repository was created 12 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 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.
- 0 stars0 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
Implement the backend from a BACKEND_DESIGN.md brief — set up plugins, database, routes, tests, and wire everything into the server entry. Biased toward Fastify + Node. Use when user says "build the backend", "implement the server", "code the API from the brief", or after running /backend-design.
SKILL.md
5.1 KB, as published. Nobody here has run it
Turn a BACKEND_DESIGN.md brief into a working backend. Read the brief first, follow its decisions, don't invent architecture the brief didn't decide.
Example prompts
- "Build the backend from the brief"
- "Implement the notifications service"
- "Code the API defined in BACKEND_DESIGN.md"
- "Start building the server for checkout"
Prerequisites
- A
BACKEND_DESIGN.mdfile at.design/<feature-slug>/(produced by/backend-design). - If none exists, stop and tell the user to run
/backend-designfirst — this skill needs a brief, not a vibe.
Process
-
Read the brief in full. Note every decision the brief locked in:
- Stack (Fastify vs other), schema strategy (JSON Schema / TypeBox / Zod), ORM, datastore
- Plugin boundaries, decorators, hooks
- Auth model, error shape, logger config
- Every route in the API surface table
- Deployment target, migrations strategy
-
Scan the codebase. If this is an existing project, do NOT restart from scratch. Extend what's there. Check:
package.jsonfor existing deps- Existing plugin tree, route files, decorator definitions
- Existing DB connection, migration setup, test framework
.env/env.examplefor existing config keys
-
Confirm the build plan before writing code. State back:
- Files you'll create / modify (as a short list)
- New dependencies needed (and why)
- Migration(s) that will be generated
- Build order (foundations → auth → routes → tests)
Wait for confirmation.
-
Build in this order (skip any step already handled by the codebase):
- Server entry — Fastify instance, logger config,
setErrorHandler,setNotFoundHandler, graceful shutdown,listen. - Config plugin —
@fastify/envwith JSON Schema validation of every env var the brief names. - Database plugin — connection, pool config, decorator (
fastify.db), close on shutdown. - Auth plugin — the mechanism from the brief (JWT / session / API key). Decorators for
request.user,fastify.authenticatepreHandler. - Migrations / schema — generate the schema matching the entities in the brief. One migration per entity or logical group.
- Routes — one plugin per domain. For each route in the API table, delegate to the
fastify-routeskill's shape:schema:with body/params/querystring/response, thin handler, service function underneath for business logic. - Tests — one test file per route plugin. Cover happy path + one validation failure + one auth failure. Match the test framework already in the project (or
node:test/vitestif greenfield). - Observability wiring — Pino config per environment, healthcheck route, any transport the brief calls out.
- Server entry — Fastify instance, logger config,
-
Run the checks at the end:
npm run build(ortsc --noEmit) — must passnpm test— must pass- Start the server locally and hit the healthcheck once — must return 200
-
Summarize in ~5 lines: files created, migrations added, tests passing, server started successfully. Point at anything the brief said to do that you deferred (and why).
Rules
- The brief is the source of truth. If a decision isn't in the brief, either infer from the codebase or ask. Don't invent.
- One schema library. Never mix JSON Schema, TypeBox, and Zod in the same project.
- Thin handlers, fat services. Route handlers stay under ~20 lines. Business logic goes in
src/services/<domain>.ts. - Every route gets a schema. No untyped
request.body. If the brief says an endpoint takes{ email }, that's a schema, not a comment. - Errors: throw, don't return. The global
setErrorHandlershapes the response. - Follow
keep-it-simplefor commit messages and any inline docs written along the way. - Don't add anything the brief didn't ask for — no rate limiting, CORS, Swagger UI, admin panel, etc. unless the brief names it.
Anti-patterns
- Rewriting the plugin tree the codebase already has just because "the brief's structure looks different." Extend, don't replace.
- Writing a giant
index.tswith all routes inline. The brief specifies plugin boundaries — respect them. - Adding
try/catcharound every route body to log errors. Fastify's request logger andsetErrorHandleralready cover this. - Generating a full Prisma schema when the brief only needs three tables. Match scope.
- Skipping tests because "the brief didn't explicitly ask for them." Every route gets at least one test.
When to stop and ask
- The brief conflicts with the existing codebase (e.g. brief says JWT, codebase uses sessions). Ask which wins.
- The brief calls for a service that isn't available in this environment (e.g. Redis not installed). Ask for the fallback.
- A "simple" migration would be destructive on existing data. Ask before running.
Gives 0 of the 12 instructions most data backend skills give
Counted across 229 of the 229 authors here whose files we hold, read 2026-08-06
- separate business logic into service layersin 22 of 229, across 15 files
- select only needed database columnsin 20 of 229, across 13 files
- retry failures with exponential backoffin 20 of 229, across 13 files
- abstract data access into repository classesin 19 of 229, across 12 files
- Use centralized error handlersin 17 of 229, across 10 files
- Use AsNoTracking for read-only queriesin 16 of 229, across 4 files
- Implement structured loggingin 15 of 229, across 4 files
- Use async/await for all I/O operationsin 15 of 229, across 3 files
- use resource-based URLs for REST APIsin 15 of 229, across 9 files
- Use dependency injection for all servicesin 14 of 229, across 2 files
- Invalidate cache on data updatesin 13 of 229, across 9 files
- Use a dependency injection containerin 12 of 229, across 4 files
Said here and by no other author read
- Read the design brief before writing any code
- Extend existing codebase instead of restarting from scratch
- Confirm the build plan and wait for approval
- Build server entry first
- Create config plugin with env schema validation
- Create database plugin with shutdown hooks
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once.