Claude Skills Guide

Claude Code for Nitric Cloud Framework Workflow

The Nitric framework provides a refreshing approach to cloud development—write once, deploy anywhere (AWS, Azure, GCP). Combined with Claude Code, you get an AI-powered development partner that understands both your business logic and cloud infrastructure patterns. This guide shows you how to integrate Claude Code into your Nitric workflow for maximum productivity.

Understanding Nitric and Claude Code Together

Nitric lets developers define cloud resources using a declarative approach directly in TypeScript, Python, Go, or C#. Instead of wrestling with cloud-specific SDKs or YAML templates, you write regular code that describes your infrastructure:

import { bucket, queue, api } from '@nitric/sdk';

const documents = bucket('documents').allow('read', 'write');
const processingQueue = queue('processing').allow('send', 'receive');
const documentsApi = api('documents');

When you run nitric up, Nitric compiles this into cloud-specific templates and handles deployment. It’s elegant—but even elegant frameworks benefit from an AI assistant that understands the nuances.

Setting Up Claude Code for Nitric Projects

The first step is ensuring Claude Code understands your Nitric project structure. Create a CLAUDE.md file in your project root:

# Project Context

This is a Nitric serverless project using TypeScript.
- Main API definition: src/api/
- Business logic: src/services/
- Tests: tests/

Key Nitric resources:
- APIs: documentsApi, usersApi
- Storage: documents bucket
- Queues: processingQueue

Framework: Nitric v2 with AWS/Azure providers

This context helps Claude provide relevant suggestions when you’re working on routes, middleware, or resource definitions.

Generating API Routes with Claude Code

One of Claude Code’s strongest use cases in Nitric projects is intelligent API route generation. Instead of manually creating each route file, describe your endpoint and let Claude scaffold it:

// Claude prompt: "Create a document upload handler that validates
// the file type and adds it to the documents bucket"
import { validate } from '../middleware/validation';
import { documents } from '../resources';

documentsApi.post('/documents', async (ctx) => {
  const file = ctx.req.files?.[0];
  
  if (!file) {
    ctx.res.status = 400;
    ctx.res.body = 'No file provided';
    return ctx;
  }
  
  const allowedTypes = ['pdf', 'docx', 'txt'];
  const ext = file.name.split('.').pop() || '';
  
  if (!allowedTypes.includes(ext)) {
    ctx.res.status = 415;
    ctx.res.body = `Invalid file type. Allowed: ${allowedTypes.join(', ')}`;
    return ctx;
  }
  
  await documents.write(file.name, file.content);
  await processingQueue.send({ file: file.name, action: 'index' });
  
  ctx.res.status = 201;
  ctx.res.body = JSON.stringify({ 
    success: true, 
    file: file.name 
  });
  
  return ctx;
});

Claude Code will understand that ctx.req and ctx.res follow Nitric’s context pattern, and suggest appropriate middleware and error handling.

Building Multi-Cloud Compatible Services

Nitric’s killer feature is deployment to multiple clouds from the same codebase. Use Claude Code to ensure your services remain cloud-agnostic:

// Prompt Claude: "Make this function cloud-agnostic, avoiding
// AWS-specific or Azure-specific APIs"
export class DocumentService {
  private storage: Bucket;
  private queue: Queue;
  
  constructor() {
    this.storage = bucket('documents');
    this.queue = queue('processing');
  }
  
  async processDocument(filename: string): Promise<ProcessResult> {
    // Use Nitric abstractions, not cloud-specific SDKs
    const fileData = await this.storage.file(filename).read();
    
    // Process with cloud-agnostic logic
    const result = await this.analyzeDocument(fileData);
    
    // Queue next steps using Nitric queues
    await this.queue.send({
      documentId: filename,
      status: result.status,
      metadata: result.metadata
    });
    
    return result;
  }
}

Actionable Advice: Always use Nitric’s built-in abstractions (bucket, queue, api, schedule) rather than importing cloud-specific SDKs directly. This keeps your code portable and lets Claude help you more effectively.

Implementing Authentication Patterns

Security is non-negotiable in cloud applications. Claude Code excels at implementing authentication patterns that work across cloud providers:

import { secrets } from '@nitric/sdk';

// Prompt: "Add JWT validation middleware for the users API"
export const authenticate = async (ctx: Context): Promise<Context> => {
  const authHeader = ctx.req.headers.authorization;
  
  if (!authHeader?.startsWith('Bearer ')) {
    ctx.res.status = 401;
    ctx.res.body = 'Missing or invalid authorization header';
    return ctx;
  }
  
  const token = authHeader.substring(7);
  
  try {
    // Use Nitric secrets for secure key management
    const jwtSecret = await secrets.get('jwt-secret').access();
    
    const payload = await verifyToken(token, jwtSecret);
    ctx.req.set('user', payload);
    
    return ctx;
  } catch (error) {
    ctx.res.status = 403;
    ctx.res.body = 'Invalid token';
    return ctx;
  }
};

// Apply to protected routes
usersApi.use('/profile/*', authenticate);

Testing Nitric Applications with Claude Code

Claude Code can generate comprehensive tests for your Nitric functions. The key is to use Nitric’s testing utilities:

import { test, beforeEach, mock } from 'vitest';
import { createMockContext } from '@nitric/test';
import { documentsApi } from '../../src/api/documents';

beforeEach(() => {
  // Reset all mocks
  mock.reset();
});

test('POST /documents returns 201 on success', async () => {
  const ctx = createMockContext({
    method: 'POST',
    path: '/documents',
    files: [{ 
      name: 'test.pdf', 
      content: Buffer.from('test content') 
    }]
  });
  
  // Mock bucket operations
  mock('bucket').toReturn({
    write: mock().mockResolvedValue(undefined)
  });
  
  const result = await documentsApi(ctx);
  
  expect(result.res.status).toBe(201);
});

test('POST /documents returns 415 for invalid file type', async () => {
  const ctx = createMockContext({
    method: 'POST',
    path: '/documents',
    files: [{ 
      name: 'test.exe', 
      content: Buffer.from('malware') 
    }]
  });
  
  const result = await documentsApi(ctx);
  
  expect(result.res.status).toBe(415);
  expect(result.res.body).toContain('Invalid file type');
});

Actionable Advice: Write tests alongside your implementation. Claude Code can generate these test cases, but you need to ensure the mocking accurately reflects Nitric’s runtime behavior.

Deployment Workflows with Claude Code

When you’re ready to deploy, Claude Code helps you navigate the multi-cloud deployment process:

# Prompt: "What's the correct command to deploy to AWS in production?"
nitric stack new production --provider aws
nitric deploy --stack production

Claude understands Nitric’s stack system and can guide you through:

Best Practices for Claude-Nitric Workflow

  1. Use TypeScript: Claude Code has better type inference with TypeScript, leading to more accurate suggestions. Nitric’s TypeScript support is excellent.

  2. Keep resources declarative: Define your Nitric resources (buckets, queues, APIs) in dedicated files. This helps Claude understand your infrastructure at a glance.

  3. Leverage middleware: Create reusable middleware for cross-cutting concerns. Claude can then suggest where to apply it across your API.

  4. Document cloud-specific quirks: If you encounter provider-specific behavior, add notes to your CLAUDE.md. Future Claude sessions will benefit from this context.

  5. Use the Nitric CLI for scaffolding: Let nitric new create your project structure, then have Claude Code populate the implementation details.

Conclusion

Claude Code and Nitric form a powerful combination for modern cloud development. Nitric’s declarative approach to infrastructure pairs naturally with Claude Code’s ability to understand and generate contextual code. By setting up proper project context, using Claude for route generation and testing, and maintaining cloud-agnostic patterns, you’ll accelerate your serverless development significantly.

The key is treating Claude not just as a code generator, but as a development partner that understands your framework choices. With the right context and patterns, your Nitric workflow becomes significantly more productive.

Built by theluckystrike — More at zovo.one