Backend Patterns
Use this skill when building backend features. Follow these patterns for consistency.
Project Setup
Replace these placeholders for your project:
- •
@project/→ your package scope (e.g.,@myapp/) - •
packages/paths follow standard monorepo layout
Expected packages:
- •
@project/db- Drizzle database client, DB_SCHEMA export - •
@project/shared- TypeIDs, constants, shared schemas - •
@project/logger- Pino logger wrapper
Quick Reference
| Entity Type | Pattern | Files to Create/Modify |
|---|---|---|
| Service | Factory function with deps, neverthrow | packages/api/src/services/xxx-service.ts, context.ts |
| Schema | 3-file pattern | .db.ts, .zod.ts, .relations.ts in packages/db/src/schema/ |
| Router | ORPC procedures, Result→Error mapping | packages/api/src/routers/xxx-router.ts, routers.ts |
| TypeID | Prefixed ID | packages/shared/src/typeid.schema.ts |
Key Conventions
- •db.query preferred over db.select for simple lookups (see service.md)
- •neverthrow for service error handling,
.match()in routers (see router.md) - •Zod enums with
as const+z.enum()pattern (see schema.md)
Pattern Details
- •For service creation, see service.md
- •For schema creation, see schema.md
- •For router creation, see router.md
Workflow: Adding a New Entity
- •Add TypeID prefix to
packages/shared/src/typeid.schema.ts - •Create schema files in
packages/db/src/schema/{domain}/ - •Create service in
packages/api/src/services/ - •Add to context in
packages/api/src/context.ts - •Create router in
packages/api/src/routers/ - •Export router in
packages/api/src/routers/routers.ts - •Run
bun run db:generateif schema changed