BA

backend-development

A reference guide and framework for building RESTful APIs, SQL database schemas, and JWT authentication.

Install

mkdir -p .claude/skills/backend-development && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/1186" && unzip -o skill.zip -d .claude/skills/backend-development && rm skill.zip

Installs to .claude/skills/backend-development

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Backend API design, database architecture, microservices patterns, and test-driven development. Use for designing APIs, database schemas, or backend system architecture.
169 chars✓ has a “when” trigger
Intermediate

Key capabilities

  • Define RESTful API endpoint conventions
  • Specify standard JSON response and error formats
  • Design PostgreSQL database schemas with UUIDs and soft deletes
  • Implement JWT authentication with token verification
  • Apply cache-aside and cache invalidation patterns

How it works

The skill provides code examples and structural guidelines for common backend development tasks, including API design, database schema creation, authentication, caching, and rate limiting.

Inputs & outputs

You give it
A request for backend API design, database architecture, or authentication patterns
You get back
Code examples and structural patterns for API endpoints, database schemas, JSON formats, authentication, caching, rate limiting, and observability

When to use backend-development

  • Designing RESTful API endpoints
  • Defining efficient SQL database schemas
  • Implementing JWT authentication flows

About this skill

Backend Development

API Design

RESTful Conventions

GET    /users          # List users
POST   /users          # Create user
GET    /users/:id      # Get user
PUT    /users/:id      # Update user (full)
PATCH  /users/:id      # Update user (partial)
DELETE /users/:id      # Delete user

GET    /users/:id/posts  # List user's posts
POST   /users/:id/posts  # Create post for user

Response Format

{
  "data": { ... },
  "meta": {
    "page": 1,
    "per_page": 20,
    "total": 100
  }
}

Error Format

{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "Invalid input",
    "details": [
      { "field": "email", "message": "Invalid format" }
    ]
  }
}

Database Patterns

Schema Design

-- Use UUIDs for public IDs
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  public_id UUID DEFAULT gen_random_uuid() UNIQUE,
  email VARCHAR(255) UNIQUE NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW(),
  updated_at TIMESTAMPTZ DEFAULT NOW()
);

-- Soft deletes
ALTER TABLE users ADD COLUMN deleted_at TIMESTAMPTZ;

-- Indexes
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_created ON users(created_at DESC);

Query Patterns

-- Pagination with cursor
SELECT * FROM posts
WHERE created_at < $cursor
ORDER BY created_at DESC
LIMIT 20;

-- Efficient counting
SELECT reltuples::bigint AS estimate
FROM pg_class WHERE relname = 'users';

Authentication

JWT Pattern

interface TokenPayload {
  sub: string;      // User ID
  iat: number;      // Issued at
  exp: number;      // Expiration
  scope: string[];  // Permissions
}

function verifyToken(token: string): TokenPayload {
  return jwt.verify(token, SECRET) as TokenPayload;
}

Middleware

async function authenticate(req: Request, res: Response, next: Next) {
  const token = req.headers.authorization?.replace('Bearer ', '');
  if (!token) {
    return res.status(401).json({ error: 'Unauthorized' });
  }

  try {
    req.user = verifyToken(token);
    next();
  } catch {
    res.status(401).json({ error: 'Invalid token' });
  }
}

Caching Strategy

// Cache-aside pattern
async function getUser(id: string): Promise<User> {
  const cached = await redis.get(`user:${id}`);
  if (cached) return JSON.parse(cached);

  const user = await db.users.findById(id);
  await redis.setex(`user:${id}`, 3600, JSON.stringify(user));
  return user;
}

// Cache invalidation
async function updateUser(id: string, data: Partial<User>) {
  await db.users.update(id, data);
  await redis.del(`user:${id}`);
}

Rate Limiting

const limiter = rateLimit({
  windowMs: 60 * 1000,  // 1 minute
  max: 100,             // 100 requests per window
  keyGenerator: (req) => req.ip,
  handler: (req, res) => {
    res.status(429).json({ error: 'Too many requests' });
  }
});

Observability

  • Logging: Structured JSON logs with request IDs
  • Metrics: Request latency, error rates, queue depths
  • Tracing: Distributed tracing with correlation IDs
  • Health checks: /health and /ready endpoints

When not to use it

  • When the project does not use RESTful APIs
  • When the project does not use PostgreSQL for its database
  • When the project does not use JWT for authentication

Limitations

  • It focuses on RESTful API conventions
  • It provides patterns for PostgreSQL database design
  • It details JWT authentication

How it compares

This skill offers standardized, opinionated patterns for backend components, contrasting with ad-hoc or unguided development approaches.

Compared to similar skills

backend-development side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
backend-development (this skill)174moNo flagsIntermediate
backend-patterns01moNo flagsAdvanced
drizzle-orm322moNo flagsIntermediate
event-store-design52moNo flagsAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

Search skills

Search the agent skills registry