How-to

Practical guides for working with APIs

One problem per page: the shortest answer that works, the approaches worth comparing, and what goes wrong. Every output block on every page is the real stdout of the command above it, checked again whenever the page or its code changes.

Browse the 17 sections

136 guides in 17 sections, with code in JavaScript, PHP, Python, Ruby and TypeScript. Each section splits into topics, and each topic holds the guides.

6 guides in 2 topics

Get a valid credential onto every request and keep it valid: keys, tokens, OAuth and OIDC flows, signatures and mTLS, from both the client and the producer side.

Send API keys and bearer tokens 5 guides

Static credentials and short-lived tokens on plain HTTP from the client side: header versus query placement, key rotation without dropped requests, per-environment keys, token refresh without a race, scoping to least privilege, detecting leaked keys.

TypeScript, JavaScript · Beginner

Add a bearer token to fetch without a client library

Wrap fetch in one function that sets Authorization for a single API origin, so no call site forgets the token and no redirect carries it to another host.

AuthenticationAPI keysSecurity

TypeScript · Intermediate

Call a keyed API from a browser without shipping the key

Put the provider's key on a route you control, refuse that route to other sites, and search the bundle for the secret before every release.

API keysCredentials and secretsSecurityEdge and serverless

TypeScript, JavaScript · Intermediate

Diagnose a 401 or a 403 from a credential

Read the WWW-Authenticate challenge rather than the status code, so a client can tell the credential failures apart and take the action that fixes each.

AuthenticationDebuggingError handlingOAuth and OIDC

TypeScript, JavaScript · Beginner

Keep test and live API keys from crossing environments

Put the environment in the key itself and check it at process start, so a staging deployment holding a production credential refuses to run.

API keysCredentials and secretsConfigurationSecurity

TypeScript, JavaScript · Advanced

Refresh an access token once under concurrent requests

Hold the refresh in a single promise so concurrent callers await the same request, and callers that all see an expired token make one call to the token endpoint.

AuthenticationOAuth and OIDCCredentials and secrets

Run OAuth 2.1 and OIDC flows 1 guide

Choosing and implementing the flow from the client side: authorization code with PKCE, client credentials, device code, refresh-token rotation, token introspection, OIDC discovery, and why the implicit and password grants are gone.

TypeScript · Intermediate

Run authorization code with PKCE in a single-page app

Log a user into a browser-only app with PKCE, keep the tokens in memory, renew them silently after a reload, and prove nothing is ever written to local storage.

OAuth and OIDCAuthenticationSecurity

14 guides in 5 topics

Timeouts, retries, backoff, rate limits, idempotency, caching and error handling, on the client and server side of any API. These branches own the behavior; an SDK feature that implements it is one option here.

Set retries and timeouts 4 guides

Deadline and retry policy for outbound calls: connect versus read timeouts, exponential backoff with jitter, retry budgets, which status codes and transport errors are retryable, retrying streaming and non-idempotent calls, circuit breakers, and adding the behavior to an SDK you ship.

TypeScript, JavaScript · Intermediate

Add a circuit breaker to an outbound HTTP client

Stop calling a failing dependency, try one request after a cool-off, and close the circuit only if it succeeds, so an outage costs one timeout not thousands.

Resilience patternsRetries and backoffTimeoutsError handling

TypeScript, JavaScript · Intermediate

Enforce one total deadline across all retry attempts

Create the deadline once before the first attempt and compose it with each per-attempt timeout, so retries and their waits come out of one budget.

TimeoutsRetries and backoff

TypeScript, JavaScript · Beginner

Retry fetch calls with exponential backoff in Node.js

Retry only the statuses the server meant as temporary, back off with full jitter, and honor Retry-After, so a shared outage does not become a stampede.

Retries and backoffRate limitsError handling

TypeScript, JavaScript · Intermediate

Time out fetch calls with AbortSignal in Node.js

Put a hard deadline on every fetch call with AbortSignal.timeout, merge it with a caller's own signal, and tell a deadline apart from a cancellation.

TimeoutsError handling

Set and respect rate limits 1 guide

Both sides of a quota: publishing RateLimit header fields (IETF draft) and Retry-After, 429 versus 503, per-key and per-tenant limits, burst allowances; and on the client, reading the headers, client-side token buckets, shared limiters in Redis for many workers, concurrency limits, queueing for bursty agent traffic.

TypeScript, JavaScript · Intermediate

Rate limit by API key and tenant, not client IP

Enforce one limit per API key and a larger one per tenant, so a noisy key cannot spend a customer's whole allowance and one customer cannot spend yours.

Rate limitsAPI keysAuthentication

Make writes safe to retry 1 guide

Making a retried write safe on both sides: the Idempotency-Key header (IETF draft), key generation and storage, fingerprinting request bodies, server-side replay windows, conflicts on mismatched payloads, and at-least-once delivery semantics.

TypeScript, JavaScript · Intermediate

Make queue consumer writes safe under redelivery

Derive an idempotency key from the message rather than from the attempt, so a broker that delivers at least once cannot charge a customer twice.

IdempotencyEvents and messaging

Cache API responses 2 guides

Client and server caching: ETag and If-None-Match, Cache-Control, stale-while-revalidate, TTL caches, cache keys that include auth, invalidation on write, CDN caching of API responses.

TypeScript, Python · Intermediate

Share an API response cache across many workers with Redis

Move a per-process response cache into Redis so forty workers pay one miss per key, with a lock on the miss and a policy that keeps cookies out of the shared store.

CachingServices and architecture

Handle and design API errors 6 guides

Errors a client and an agent can act on, from both sides: RFC 9457 problem details, stable error codes, field-level validation errors, retryable versus terminal taxonomies, partial failures in batches, mapping HTTP status to typed errors per language, and fail-safe semantics for autonomous callers (no vague 500s, 429 always with Retry-After).

Advanced

Design error responses an autonomous agent can act on

Give an LLM caller a stable code, the parameter at fault, a next step, and a structured delay, so it fixes, waits, or stops instead of retrying a 500 forever.

Error handlingAPI designRetries and backoff

Advanced

Evolve an error contract without breaking clients

Add codes, retire codes and reword messages while clients in production keep working, with a catalog diff that fails the build on the changes that break them.

Error handlingVersioning and deprecationCI and automation

Intermediate

Report partial failure in a batch endpoint

Return one outcome per item when a batch of writes half succeeds, name each failed item by the id the client sent, and never answer 200 when nothing was written.

Error handlingAPI design

TypeScript, JavaScript · Intermediate

Return validation errors a client can map to a form

Answer a bad request with an RFC 9457 problem document carrying one JSON Pointer entry per failing field, so a client can attach each message to an input.

Error handlingValidationAPI design

Advanced

Translate upstream API errors behind your own API

Decide what your API returns when a provider it depends on fails, without leaking the provider's status codes, messages, or credential problems to callers.

Error handlingAPI designSecurity

TypeScript, JavaScript · Intermediate

Verify every error response matches one schema

Prove that no endpoint can return an error body outside your problem schema, using a lint over the description and a runtime check against the running service.

Error handlingLinting and governanceTestingOpenAPI

13 guides in 3 topics

Reading collections page by page, streaming, bulk jobs, file transfer, loading API data into notebooks, and scheduled pipelines that keep a copy in sync.

Paginate collections 9 guides

Cursor versus offset versus keyset versus Link header (RFC 8288) pagination, on both sides: designing a list endpoint that survives inserts and deletes, page-size negotiation, stable ordering, total counts, backwards paging; and on the client, auto-pagination iterators, parallel page fetching with backpressure, paging over GraphQL connections.

TypeScript, JavaScript · Beginner

Advertise next and previous pages with Link headers

Send the next, previous, first and last page URLs in a Link header, so clients follow links you build rather than assembling query strings themselves.

PaginationAPI design

TypeScript, JavaScript · Beginner

Choose a pagination style for a list endpoint

Compare the four ways to page a list on what decides it: whether a caller can miss a row when the data shifts, and what the query costs at page 900.

PaginationAPI design

TypeScript, JavaScript · Intermediate

Describe pagination so generators can follow it

Put enough in the OpenAPI document that a generated client can walk a collection by itself, instead of handing every consumer a single-page call.

PaginationOpenAPISDK generation

TypeScript, JavaScript · Intermediate

Encode and sign opaque pagination cursors

Encode the page position as base64url JSON and sign it with HMAC, so callers carry a cursor without reading it and a tampered one never reaches your query.

PaginationRequest signingSecurity

TypeScript, JavaScript · Beginner

Loop over every page of a REST collection

Walk a paginated list endpoint to the end, read the three stop signals APIs actually send, and refuse to loop forever when a server repeats its cursor.

PaginationSDK design

TypeScript, JavaScript · Intermediate

Migrate an API from offset to cursor pagination

Move a list endpoint from offset to cursor pagination without breaking the clients still sending an offset, and show why the change is worth making.

PaginationVersioning and deprecationAPI design

TypeScript, JavaScript · Beginner

Negotiate page size between an API and its clients

Clamp an over-large page size to your ceiling rather than rejecting it, say in the response what was served, and refuse only values that are not sizes.

PaginationAPI design

Ruby · Intermediate

Paginate an API with a Ruby enumerator

Wrap a paged list in an Enumerator that fetches pages as rows are pulled, so first(50) stays cheap, lazy.select stops early, and a 503 surfaces where you iterate.

PaginationSDK design

PHP · Intermediate

Paginate an API with PHP generators

Walk a paginated collection with a generator, so a caller writes one foreach, pages are fetched only as they are consumed, and an early break costs nothing.

PaginationSDK design

Stream responses and subscriptions 2 guides

Server-Sent Events, WebSockets, chunked and NDJSON responses, long polling, resumable streams with last-event ids, backpressure, reconnection, and streaming LLM tokens to a client, from both the producer and consumer side.

TypeScript, JavaScript · Advanced

Add backpressure to a WebSocket consumer

Keep a slow sink from being overrun by a fast WebSocket feed: pause the socket in Node, read a WebSocketStream where it exists, or window acknowledgements.

StreamingResilience patterns

TypeScript, JavaScript · Intermediate

Consume Server-Sent Events with fetch and custom headers

Read an SSE endpoint that needs a bearer token or a POST body, which EventSource cannot send, and own reconnection, the retry field and Last-Event-ID yourself.

StreamingAuthenticationRetries and backoff

Run bulk jobs and move files 2 guides

Bulk import and export, batch endpoints, async jobs with status polling, multipart and resumable uploads (tus, S3 multipart), presigned URLs, and large downloads.

Python · Beginner

Poll a job status endpoint with backoff

Poll a job until it reaches a terminal state: honor Retry-After, back off with jitter when the server sends none, and stop at a deadline with the job id in hand.

Long-running jobsRetries and backoffTimeouts

TypeScript, Python · Intermediate

Upload a large file with resumable chunks

Resume an upload from the last byte the server confirmed after a dropped connection or a closed tab, with tus, S3 multipart, Google resumable uploads, or your own.

File transferResilience patterns

5 guides in 4 topics

GraphQL, gRPC and protobuf, webhooks, and event streams, alongside or instead of REST, from both the producer and consumer side.

Integrate with GraphQL 2 guides

Consuming and exposing GraphQL: typed clients (graphql-codegen, Apollo, urql, graphql-request, gqlgen, Ariadne, Strawberry), persisted queries, connections pagination, batching and the N+1 problem, federation, REST-to-GraphQL gateways, and when to add a GraphQL layer at all.

TypeScript, JavaScript · Intermediate

Implement Relay connections in a GraphQL schema

Build the edges, cursors, and pageInfo a Relay-style connection promises, and get the page flags right rather than guessing them.

GraphQLPagination

Intermediate

Retire a GraphQL field without versioning the schema

Deprecate the field with a reason naming its replacement, count per-client usage over a release cycle, and let a CI gate hold the removal until the window passes.

GraphQLVersioning and deprecationCI and automation

Integrate with gRPC and protobuf 1 guide

Protobuf IDL, buf and protoc codegen, gRPC-Web and Connect, grpc-gateway REST transcoding, streaming RPCs, deadlines and metadata, buf breaking for .proto versioning.

Beginner

Define a gRPC service in a proto3 file

Write a proto3 file with a versioned package, two messages, a unary service, and reserved numbers, then compile it with buf and lint it two ways.

gRPC and protobufLinting and governanceVersioning and deprecation

Receive and send webhooks 1 guide

Both sides of a webhook: signature verification (Standard Webhooks, Stripe, GitHub, Slack), replay protection, queue-first ingestion, idempotent handlers, retries with backoff and dead-letter queues, ordering, fan-out, describing webhooks in OpenAPI 3.1, local tunnels (ngrok, cloudflared), and testing (Svix Play, Hookdeck, recorded payloads).

PHP · Intermediate

Verify a Standard Webhooks signature in PHP

Check the signature, the timestamp and the raw body of an incoming webhook in PHP, and keep two secrets valid so a rotation costs nobody a delivery.

WebhooksRequest signingCredentials and secrets

Consume and publish events 1 guide

Event-driven integration: AsyncAPI descriptions, Kafka, NATS, SQS and SNS, CloudEvents, the outbox pattern, consumer groups, schema registries, at-least-once versus exactly-once.

Beginner

Describe a Kafka topic with AsyncAPI

Describe one Kafka topic in AsyncAPI 3.0, from the SASL server to the keyed message, then validate it, lint it and pin which way each application faces.

Events and messagingAPI designLinting and governance

Section 5

Describe your API

7 guides in 6 topics

Authoring, linting, modelling and versioning the description that SDKs, docs and agent surfaces are generated from, including letting a coding agent draft or repair it.

Write an OpenAPI description 2 guides

Writing OpenAPI 3.1 that tools can use: operationIds (snake_case, unique, verb plus noun, one page on ids that generate clean SDK method names), tags, components and $ref reuse, discriminators, nullable versus unions, examples, security schemes, servers, webhooks and callbacks, uploads, bundling and splitting, Swagger 2 to 3.1 migration, design-first versus code-first (FastAPI, NestJS Swagger, springdoc, swag, zod-openapi, Huma, tsoa).

TypeScript, JavaScript · Intermediate

Model a polymorphic response with a discriminator

Describe a response that comes in several shapes so a generator emits a tagged union rather than a bag of optional fields, using oneOf with a discriminator.

OpenAPIValidationSDK generation

Intermediate

Split and bundle a large OpenAPI document

Break a multi-thousand-line description into per-resource files, then produce the single bundled document most generators expect, without losing component names.

OpenAPICI and automation

Author or repair a spec with a coding agent 1 guide

The spec as an output of AI, not only an input: drafting an OpenAPI description with Claude Code, Cursor or Copilot from route handlers, from HAR captures, from prose docs or a Postman collection; filling missing schemas and examples; repairing a spec that a generator rejects; validating the result with Spectral, Schemathesis and a mock server; keeping the agent-written spec in sync with code in CI.

Intermediate

Fill missing schemas and examples with a coding agent

List every response with no schema or example with two Spectral rules, hand the gaps and fixtures to a coding agent, and validate every example after every batch.

OpenAPICoding agentsLinting and governance

Lint and govern API specs 1 guide

Style rules and governance: Spectral rulesets and custom functions, Redocly lint, Stoplight style guides, vacuum, CI gates, checks that generated SDKs will be usable (every operation has an id, every response has a schema), conventions across many services.

Advanced

Enforce a naming convention across 40 microservice specs

Run one naming ruleset in every repository, then compare terms across specs, because no per-document linter sees that billing says customer and CRM says client.

Linting and governanceOpenAPISemantic modelAPI design

Model resources, relations and actions 1 guide

Designing the resource model before or beside the spec: resource naming, id formats, sub-resources versus links, non-CRUD actions such as cancel or approve, filtering and sorting, field selection, relationships, deciding when an endpoint is an entity operation and when it is a standalone action.

Extract a semantic model from a spec 1 guide

Turning endpoints into entities, attributes and operations: classification heuristics (which path is a list, load, create, update or remove), handling endpoints that map to no entity (direct and prepare escape hatches), flows, inconsistent specs, diffing two models from successive spec versions, publishing the model as JSON beside OpenAPI, and verifying that SDK, CLI and MCP server were generated from the same model version.

Version and retire APIs 1 guide

Versioning strategies (path, header, date-based as Stripe does), additive change rules, breaking-change detection in CI (oasdiff, openapi-diff, Optic, and aontu breaking and subsume as one option for model files), Sunset and Deprecation headers, deprecation calendars, compatibility tests, and tying SDK versions to API versions (the sdkgen api-versioning design note as one approach beside Stainless and Speakeasy).

TypeScript, JavaScript · Intermediate

Pin an API version from a client

Send the API version you were built against on every request, and refuse a response that came back under a different one.

Versioning and deprecationSDK design

Section 6

Ship an SDK

10 guides in 6 topics

Choosing how to produce client libraries, generating them, making them idiomatic, composing runtime features, customizing a generator without forking, adding languages, and regenerating safely.

Choose a generator and generate an SDK 3 guides

Deciding and doing: a repeatable rubric for hand-written versus generated versus AI-written versus SaaS-generated SDKs (total cost of ownership, per-seat pricing, determinism measured across two runs, entity-shaped versus endpoint-shaped output measured rather than asserted), then running OpenAPI Generator, Swagger Codegen, Kiota, Speakeasy, Stainless, Fern, liblab, oapi-codegen, openapi-typescript with openapi-fetch, orval, Hey API, openapi-python-client, NSwag, AutoRest, Smithy, and sdkgen (npm create @voxgig/sdkgen, target add, --only, --dryrun), judging the output (the voxgig-solardemo-sdk Go reference and the elementdemo repo as things to read before choosing), and migrating from one generator to another while keeping package names and semver continuity.

TypeScript, JavaScript · Beginner

Decide between generating and hand-writing a client

Count the operations, schemas and parameters you would maintain, then decide between a generated client and one you write on the numbers rather than on taste.

SDK generationSDK designCoding agents

TypeScript · Beginner

Generate your first SDK with sdkgen

Scaffold a project from your OpenAPI document with one non-interactive command, generate a TypeScript SDK, and read what the model made of your endpoints.

SDK generationSemantic modelOpenAPI

TypeScript, JavaScript · Intermediate

Tell an entity-shaped SDK from an endpoint-shaped one

Count the nouns, the operations per noun, and how many names start with a verb, so a claim about SDK shape is a measurement rather than a preference.

SDK generationSDK designSemantic model

Design SDK ergonomics per language 1 guide

What makes an SDK feel native: entities versus endpoint wrappers, constructor and configuration, method naming, options objects versus builders, sync and async variants, cancellation (context.Context, AbortSignal), typed errors, nullable handling, response envelopes, ESM and CJS dual builds, and escape hatches for raw requests (sdkgen direct and prepare, Stainless raw responses, OpenAPI Generator withHttpInfo).

Compose runtime features in an SDK 2 guides

How cross-cutting behaviors fit together inside one client, plus the behaviors that have no protocol branch of their own.

TypeScript, JavaScript · Intermediate

Tag SDK calls with session and request ids

Send three identifiers with three lifetimes, so a support question about one call can be answered from the service's own logs.

ObservabilitySDK designDebugging

Python · Intermediate

Wrap an SDK transport in a middleware chain

Compose retry, caching, authentication and tracing as layers around one transport, so each concern is written once and the order is declared rather than implied.

SDK designRetries and backoffCachingObservability

Customize a generator without forking 2 guides

Bending generated output without a fork, with every page showing the same customization in at least one other generator: OpenAPI Generator custom templates and .openapi-generator-ignore, Speakeasy overlays and hooks, Fern custom code, Kiota, and the six sdkgen levers (model .aon files with project.aon never overwritten, templates in .sdk/tm, TypeScript components in .sdk/src/cmp, custom features with per-stage hooks, custom targets, and sdkgen packages with package add, check, list, update), plus docs add, the flags --only, --alias, --force, --dryrun and --debug, typed models, doctor in CI, installing a third-party sdkgen package such as @voxgig/sdkgen-haskell or sdkgen-station, propagating template changes, migrating a bundled target out of tree, driving generation from a script with the programmatic API, and debugging generation.

TypeScript, JavaScript · Advanced

Fail a build when a generator customization becomes a fork

Record what the generator shipped, compare the project against it on every build, and separate a file you forked from a file you added.

CustomizationSDK generationCI and automationGit and repositories

TypeScript · Advanced

Generate a code section with code instead of a template

Write a client's computed parts, a dispatch table and an overload matrix, as a function over the typed model, and hold its output to a formatted fixture.

Code generationTemplatesCustomizationSDK generation

Target another language 1 guide

Adding a language to an SDK programme: how to grade targets yourself when the generator does not (sdkgen publishes 22 bundled targets plus package-delivered ones such as Haskell, and grades none of them; OpenAPI Generator labels each generator's stability; Speakeasy publishes a supported-language list), what less polished should mean to you, packaging expectations per ecosystem, and authoring a new target (sdkgen author-a-new-language, OpenAPI Generator new-generator scaffolding, the Fern generator API).

Advanced

Evaluate a third-tier SDK target before you ship it

Run one fixed evaluation on a candidate language target, record what you measured beside the generator's claims, and decide who supports it before it ships.

SDK generationPortingTestingPublishing and releases

Regenerate without losing edits 1 guide

Regeneration as a routine operation: three-way merge against the last generation, preserve and protect markers, diff mode, overwrite policies, reviewing a regeneration diff, failing CI when a regenerated SDK differs from the committed one, vendoring and upgrade migration, keeping hand edits in separate files.

TypeScript, JavaScript · Intermediate

Preview a regeneration as a diff before writing files

See exactly what a generator would change before it changes anything, with a dry run that reports creates, replacements, and the files its mode protects.

SDK generationCode generationGit and repositoriesCustomization

Section 7

Ship a CLI or REPL

7 guides in 4 topics

Command-line and interactive surfaces over an API, for humans, scripts and agents: building, making usable, distributing, and exploring an API before writing code.

Build a CLI over an API 2 guides

Generating or hand-writing a CLI: restish over any OpenAPI document, the go-cli target generated from a semantic model, oclif and commander, cobra, click and typer, clap, Thor, Symfony Console, and a gh-style resource-shaped command tree; mapping operationIds to commands, flags and auth, and curl plus jq or HTTPie as the do-nothing baseline.

Intermediate

Map API parameters to CLI arguments and flags

Extend the command map with a parameter map: path parameters as positional arguments, query and header parameters as flags, and one input style for request bodies.

CLIOpenAPIValidation

Make a CLI usable by people, scripts and agents 2 guides

Output formats (table, JSON, YAML, --jq), stable exit codes, TTY detection and color, paging, progress, shell completion, help text, config files and profiles, environment variable precedence, keychain token storage after a device-flow login, and designing a CLI that a coding agent can drive.

TypeScript, JavaScript · Intermediate

Design a CLI a coding agent can drive

Give a CLI machine-readable output, exit codes that mean one thing each, and a confirmation rule that never depends on a terminal being attached.

CLICoding agentsError handling

TypeScript, JavaScript · Beginner

Write CLI help that people and agents can both use

Describe the command surface once, render it as text and as data, and lint the result so a command cannot ship with an example that does not run.

CLIDocumentationLinting and governanceCoding agents

Test, package and distribute a CLI 1 guide

Golden-file and snapshot tests across operating systems, end-to-end tests against a mock API, then distribution with goreleaser, Homebrew taps, Scoop, npm, pipx, Docker images, code signing and notarization, and update checks.

Explore an API interactively 2 guides

Trying calls before writing code: language REPLs with an SDK loaded and tab completion from the model, generated REPL surfaces (the sdkgen REPL as in the existing blog post, seneca-repl), prompt_toolkit and IPython shells, Postman, Bruno, Insomnia and Hoppscotch collections generated from OpenAPI and kept in git, GraphiQL, Swagger UI try-it, HTTPie sessions, and a keyboard-first command bar over an API's operations (cmdk, kbar, voxgig-ui as options).

TypeScript, JavaScript · Beginner

Preload a generated client into a Node REPL

Start a REPL with the client already built and its entities named, so exploring an API is one command rather than six lines of setup typed from memory.

REPLSDK generation

TypeScript, JavaScript · Beginner

Turn an exploratory REPL session into a script

Convert a REPL history into a script that runs, by dropping the lines that threw, the expressions typed to look at a value, and the REPL's own commands.

REPLCLI

11 guides in 5 topics

MCP servers, tool schemas, hosting and server-side policy, agent skills and instruction files, and making a site and its docs usable by autonomous callers.

Build an MCP server 3 guides

Building an MCP server for an API, generated or by hand: openapi-mcp and openapi-mcp-generator, Speakeasy Gram, Stainless MCP, Mintlify, Zapier MCP, Composio, Cloudflare MCP, the go-mcp target generated from a semantic model (SDK Catalog servers, aontu-mcp and the tabnas mcp server as worked examples), and the official MCP SDKs (TypeScript, Python, Go, Java, C#, Rust, Kotlin, Swift) plus FastMCP; tools, resources, prompts, elicitation, wrapping an existing SDK as tools, pruning a generated server to a small tool set, regenerating when the spec changes without losing custom tools.

TypeScript, Python · Advanced

Upgrade an MCP server to a newer protocol revision

Move a server from a handshake-era revision to 2026-07-28 by upgrading the SDK, then prove every client you support still connects with one scripted matrix run.

MCPVersioning and deprecation

Design tool schemas agents can use 1 guide

Tools an agent can reason about: naming, descriptions, argument schemas, enums over free text, result shapes, errors as data that tell the agent what to do next, pagination inside a tool result without overflowing context, tool granularity (one tool per entity operation versus one search tool), annotations (readOnlyHint, destructiveHint, idempotentHint), versioning a tool set, and MCP schemas versus OpenAI function schemas versus Claude tool definitions versus Gemini function declarations.

TypeScript, JavaScript · Intermediate

Name tools so an agent picks the right one from fifty

Give every tool a noun and a verb, a description long enough to choose on, and a warning on anything destructive, then measure how often two tools still look alike.

Tool schemasMCPEvals and observability

Host, transport and secure an MCP server 3 guides

The server side of running MCP in production: stdio versus Streamable HTTP versus legacy SSE, stateless design, OAuth 2.1 with protected resource metadata, per-agent keys and scopes per tool, rate limits shaped for bursty autonomous traffic, audit trails, deny lists, sanitizing tool results against injection, hosting on Cloudflare Workers, Vercel and containers, server cards at /.well-known/mcp/server-card.json, server.json registry entries, and testing with MCP Inspector and scripted clients.

Intermediate

List an MCP server in the official MCP registry

Publish a server.json to the official MCP registry, prove your namespace from CI with GitHub OIDC, and keep the listing level with each release.

MCPPublishing and releasesValidation

Write agent skills and instruction files 1 guide

Documents an agent reads before it writes code, at repo and package level: AGENTS.md, CLAUDE.md, Cursor rules, Copilot instructions, SKILL.md against the Anthropic Agent Skills spec with progressive disclosure and bundled scripts, generated skills from a semantic model (the sdkgen Agent Skills surface and aontu agentsmd as options, the tabnas skills repo as an example), what to include and keep out, stopping an agent editing generated files, testing whether Claude Code or Cursor actually uses a skill, keeping several formats in sync from one source, versioning with the code.

Intermediate

Organize agent skills across many related repositories

Keep one shared set of skills for the ecosystem, let each repository override what it needs, and report every shadowed name rather than letting one win in silence.

Agent skillsLinting and governanceGit and repositories

Make a docs site agent-ready 3 guides

A documentation or product site that agents can use: llms.txt and llms-full.txt, markdown twins and Accept: text/markdown negotiation, AGENTS.md at the site root, a published OpenAPI document at a stable URL, /.well-known/api-catalog (RFC 9727), MCP server cards, an agent-skills index, robots.txt rules per AI crawler, JSON-LD types, RFC 9457 errors on every route, a health endpoint, a docs-search MCP server, and validation tooling (Google Rich Results, the MCP registry CLI, schema linters); per-framework implementation pages for Astro, Docusaurus, Mintlify and Next.js.

TypeScript · Beginner

Add a health endpoint agents can poll

Return a status, a release id, and one line per dependency, cache it for seconds, and prove the endpoint goes red when a dependency goes down.

API designCachingObservability

Beginner

Set robots.txt rules for each AI crawler

Separate the crawlers that train models from the fetchers acting for a person right now, and check each rule against the matching algorithm before you ship it.

Crawlers and bot policyDocumentationEdge and serverless

12 guides in 6 topics

Coding agents, MCP clients, agent frameworks, structured output, evals, observability, cost and safety on the consuming side.

Write an integration with a coding agent 5 guides

Getting Claude Code, Cursor, Copilot, Codex CLI, Gemini CLI, Aider or Cline to write an API integration: prompting with the spec, feeding an SDK, a catalog SDK, a skill or the API's MCP server, stopping the agent inventing endpoints, reviewing generated code for missing retry and error handling, test-first loops, running the agent in a sandbox with a mock API, keeping generated files out of agent edits, and the experiments: measuring drift between two AI-written clients from one spec, comparing an AI-written client with generator output, and the hybrid workflow where an agent customizes a generated SDK without breaking regeneration.

TypeScript · Advanced

Let a coding agent customize a generated SDK safely

Point the agent at the levers under .sdk/, never at the generated tree, and prove with doctor and a regeneration diff that only the intended files move.

Coding agentsSDK generationCustomization

TypeScript, JavaScript · Intermediate

Measure drift between two AI-written clients

Compare two clients written from the same description and separate what one of them missed from what neither was told.

Coding agentsEvals and observabilityContract tests

Connect MCP clients to servers 2 guides

Wiring an MCP server into Claude Desktop, Claude Code, ChatGPT, Cursor, Cline, VS Code and custom clients: stdio versus remote configuration, OAuth in client config, restricting which tools an agent may call, running several servers at once, composing servers behind one gateway (mcp-proxy), running a stdio server as a subprocess from a Python agent, health checks, debugging with MCP Inspector, and using catalog MCP servers, aontu-mcp and the tabnas mcp server as ready-made examples.

Beginner

Connect a remote MCP server to Claude Desktop

Get a remote MCP server answering tool calls in Claude Desktop, as a custom connector or through a stdio bridge, and probe its transport before blaming the config.

MCPAuthenticationStreaming

TypeScript · Intermediate

Share one MCP server config across several editors

Keep Claude Code, Cursor, VS Code, and Cline on the same MCP servers by rendering four editor files from one source, and see why a copied file loads zero servers.

MCPConfigurationCredentials and secrets

Build an agent that calls APIs 1 guide

Agent loops and frameworks: Claude Agent SDK, OpenAI Agents SDK, LangGraph, Vercel AI SDK, Mastra, CrewAI; wrapping a typed SDK as tools, converting OpenAPI operations into function schemas, auth passthrough, pagination in tool results, parallel tool calls, long-running operations, streaming tool output, multi-step workflows (Arazzo as a description format), and calling SDKs directly versus through MCP.

TypeScript, Python · Intermediate

Wire an API client into the OpenAI Agents SDK

Register a typed client's operations as function tools, run the loop, hand off between two agents on one client, and keep a failed call from ending the run.

Agent frameworksTool schemasError handling

Constrain model output to a schema 1 guide

Making a model emit valid data: JSON Schema structured outputs, tool-call schemas used as output, GBNF and Lark grammars for constrained decoding (llama.cpp, vLLM, Outlines, guidance), repairing malformed or truncated JSON, validating with Zod, Pydantic or gubu and retrying, and generating grammars from a spec (the aontu GBNF and Lark output and the tabnas GBNF grammar as options).

TypeScript, JavaScript · Intermediate

Validate JSON model output before you use it

Get a typed value out of a model response that is only mostly JSON, and refuse the responses that are the wrong shape instead of letting them into your code.

Structured outputValidationParsing

Evaluate and observe agents 1 guide

Evals (promptfoo, Braintrust, Inspect, LangSmith, custom harnesses), golden traces, task success rates across model providers, regression suites for tool use recorded from real traffic, tracing with OpenTelemetry GenAI semantic conventions (Langfuse, Phoenix, Helicone, OpenLLMetry), token and cost accounting, per-task budgets as cutoffs versus hard caps (the sdkgen cost feature as one example with its limit stated), caching tool results across steps, prompt caching, model routing.

Python, TypeScript · Intermediate

Cut agent cost with provider prompt caching

Order the request so the stable prefix comes first and the growing conversation last, place the breakpoints, and measure cache reads against a baseline run.

CachingEvals and observabilityAgent frameworks

Guard agents and add approvals 2 guides

The agent side of safety: prompt injection defence for tool results, web pages and documents, isolating untrusted content, output filtering, allow lists, human-in-the-loop approval before destructive calls (this branch owns approval), MCP elicitation, dry-run modes, sandboxing, least privilege per tool, spend and blast-radius limits, guardrail libraries (OpenAI Agents SDK guardrails, Guardrails AI, NeMo Guardrails, Llama Guard), and testing against an injection corpus.

Python, TypeScript · Intermediate

Sandbox an agent's shell and code execution

Run what an agent executes inside a boundary with no credentials, a scratch filesystem and a closed network, in Docker, a sandbox service or an OS-level sandbox.

GuardrailsSecurityCoding agents

Python, TypeScript · Intermediate

Sanitize tool results before they re-enter the prompt

Extract readable text, strip zero-width characters, normalize to NFKC, cut to a byte budget, and wrap the result in a delimiter the system prompt names as data.

GuardrailsSecurityStructured output

7 guides in 2 topics

Mocks, record-and-replay, contract and spec-driven tests, and layered SDK test suites, for APIs you ship and APIs you do not own.

Mock an API 4 guides

Standing in for the real thing: Prism from an OpenAPI document, WireMock, MSW, nock, Mockoon, vendor sandboxes, record-and-replay (vcrpy, VCR, Polly.JS, go-vcr, responses, httptest), fault injection (Toxiproxy, chaos flags), and in-SDK mocks (the sdkgen test feature for an in-memory API and netsim for injected latency, 429s and outages as options).

TypeScript, JavaScript, Python · Intermediate

Mock a generated SDK in your application tests

Run one set of assertions about your code against a vendor SDK four ways, then bump the SDK a minor version and see which strategy noticed the change.

MockingTesting

TypeScript, JavaScript · Intermediate

Run an in-memory mock of your API inside SDK tests

Build the client in test mode, seed it with records, and let the generated SDK answer its own calls from memory instead of reaching the network.

MockingTestingSDK generation

TypeScript, JavaScript · Intermediate

Stub outbound HTTP calls in Node tests with nock

Intercept outbound requests in-process, assert on what your code sent as well as received, and turn off real network access so an unstubbed call fails.

MockingTesting

Run contract and spec tests 3 guides

Proving the implementation matches the description: Pact consumer-driven contracts (for an SDK consumer and for a vendor API you call), Schemathesis and Dredd property tests against a spec, Specmatic and Microcks, response validation middleware at runtime, and message contracts for service messages (seneca-msg-test as one option next to Pact message contracts).

TypeScript, JavaScript · Beginner

Choose consumer-driven or spec-driven contract tests

Pick a contract style by what it fails on: the fields one consumer reads, or everything the published document describes, including the unused parts.

Contract testsTestingOpenAPI

TypeScript, JavaScript · Intermediate

Contract test an API you do not own

Write down the fields your integration reads, check a recorded response against them, and run the same check against the live API on a schedule.

Contract testsTestingMocking

11 guides in 5 topics

Reference docs, guides, docs that ship inside packages, question answering over docs, developer relations, and measuring your own developer experience.

Publish reference docs 2 guides

Reference from the spec and the code: Redoc, Scalar, Swagger UI, Mintlify, ReadMe, Stoplight Elements, mkdocs-material (the docgen apidocs target as one generator option), per-language API references (typedoc, pkg.go.dev, Sphinx, phpDocumentor, YARD), try-it consoles, versioned docs, diagrams (Mermaid, the Voxgig diagram utility), and hosting where each language looks.

Beginner

Add sequence diagrams to reference docs with Mermaid

Write an OAuth exchange or a webhook round trip as a Mermaid sequence diagram beside the reference page, check it against the spec in CI, and render it in dark mode.

DocumentationOpenAPICI and automation

Ship docs with the code 3 guides

README conventions per registry (npm, pkg.go.dev doc comments, PyPI long description, Packagist, RubyGems, LuaRocks), docstrings and typed signatures generated from the spec, a CHANGELOG inside the package, examples directories that run in CI, and generated READMEs (the sdkgen docs add target and seneca-doc as options against hand-written templates).

JavaScript, TypeScript · Intermediate

Document Seneca plugin message patterns inside the repo

Generate the pattern reference from the running plugin with seneca-doc, ship it in the README, and diff it against seneca.list() to catch messages an option adds.

DocumentationServices and architecturePlugin systems

TypeScript, JavaScript · Beginner

Ship a changelog inside your published package

Put the changelog in the published artifact, and check in CI that it ships and that its newest entry matches the version being released.

Publishing and releasesDocumentationCI and automation

Answer questions over your docs 3 guides

RAG and search over docs, specs and transcripts: chunking an OpenAPI document so retrieval returns whole operations, embeddings, hybrid search, citations, evaluation against real support tickets, and hosting (podmind as one production example beside LlamaIndex, LangChain, Cloudflare Vectorize, pgvector, Algolia DocSearch, Inkeep, Kapa).

TypeScript, JavaScript · Intermediate

Chunk an OpenAPI document for retrieval

Cut an OpenAPI description into retrieval chunks that are each one complete operation, so a top hit carries the whole parameter table rather than half a schema.

DocumentationOpenAPISemantic model

TypeScript · Intermediate

Host docs question answering on Cloudflare Workers

Embed the question with Workers AI, query a Vectorize index filtered to one docs version, and stream the answer with its sources over Server-Sent Events.

DocumentationEdge and serverlessStreaming

TypeScript, JavaScript · Intermediate

Re-index docs on release without serving stale answers

Build a new documentation index per release, promote it in one write, and fail a check whenever the live index was built from an older version than the docs.

DocumentationPublishing and releasesCI and automation

Run developer relations 2 guides

Practitioner DevRel: community forums and office hours, changelog communication, sample apps, content calendars with non-vanity metrics, conference talks and speaker coaching (agenda tooling such as conf-agenda as one option), a technical podcast with editorial independence (Fireside as one example beside Software Engineering Daily and The Changelog), DevRel programme set-up and audit, and fractional CTO and developer management routines.

Advanced

Audit a DevRel program in one week

List every DevRel activity on Monday, replace each count with an outcome from evidence by Thursday, and present a scored report with three changes on Friday.

Developer relationsDeveloper experience

Beginner

Choose a developer community platform for year one

Score Discord, Discourse, GitHub Discussions, Slack, and Zulip on search, moderation, identity, cost, and export, then commit to one platform for a year.

Developer relationsDeveloper experience

Measure and audit developer experience 1 guide

DX as a measured thing: time to first successful call, install friction, SDK adoption per language, error rates by endpoint, support ticket taxonomy, scoring error messages with a rubric, running a DX audit of your own SDK (the checklist a Developer Experience consultancy would use, written for you to run), and production-readiness reviews before a launch.

7 guides in 3 topics

Publishing to registries, versioning and release automation, supply-chain integrity, and hardening clients and servers.

Version, changelog and automate releases 1 guide

Semver for SDKs, deciding whether a regenerated SDK is a minor or major release, conventional commits, CHANGELOG generation, release candidates, human-gated production releases, deprecation policy and long-term support, scheduled live suites, regenerating SDKs in CI (the Speakeasy action, Fern CI, sdkgen doctor and release-and-tag as options).

Beginner

Generate a changelog from conventional commits

Turn a commit range into CHANGELOG.md sections grouped by release, with dependency bumps and regeneration noise filtered out rather than published.

Publishing and releasesGit and repositoriesDocumentation

Secure the supply chain 1 guide

SLSA levels, Sigstore signing and cosign, SBOMs (CycloneDX, SPDX), provenance attestations, dependency pinning and lockfiles, Dependabot and Renovate, Socket, secret scanning, CVE runbooks, reproducible builds as a security property, and the trade-offs of a zero-dependency policy (the Voxgig multi-language libraries as one example of that policy).

Harden clients and servers 5 guides

Runtime security for integrations: the OWASP API Security Top 10, TLS pinning, SSRF defence for user-supplied URLs, input validation at the boundary, mass assignment, security.txt (RFC 9116, this branch owns it), secret redaction in logs and debug output, least-privilege tokens, dependency isolation, server-side key rotation.

Beginner

Publish security.txt for an API

Serve an RFC 9116 security.txt so a researcher who finds a bug in your API knows where to send it, and add the expiry check that stops the file going stale.

SecurityCI and automation

TypeScript, JavaScript · Intermediate

Rotate API keys without breaking your clients

Run two keys at once, watch which one each caller uses, and retire the old one on evidence rather than on a date somebody picked.

API keysCredentials and secretsSecurity

TypeScript, JavaScript · Advanced

Test an API for broken object level authorization

Try every identifier with every credential and assert that a caller who does not own a resource gets the same answer as one asking for something that does not exist.

AuthorizationSecurityTesting

7 guides in 4 topics

For the team with many third-party APIs in production: choosing and upgrading SDKs, credentials, telemetry and metering, one control surface for outbound calls, and debugging what went over the wire.

Evaluate, adopt and upgrade SDKs 2 guides

Assessing an official, community or generated SDK before you depend on it (license, retry behavior, release cadence, transport control), wrapping it behind your own interface, pinning and vendoring, upgrading across a major with jscodeshift and ts-morph codemods, responding to Sunset headers, and using SDK Catalog packages for public APIs (install per language, offline test mode, the paired Go CLI, REPL and MCP server, direct and prepare for unmodelled endpoints, what unofficial means, and when Octokit or plain fetch is the better call).

TypeScript · Intermediate

Audit SDK retry and timeout defaults before adoption

Point a candidate client at a local stub that fails and hangs, then read its real retry count and tail latency off the stub instead of trusting its README.

Retries and backoffTimeoutsSDK design

Load credentials and secrets 1 guide

Where the secret lives and how code reaches it: environment variables and dotenv, Vault (agent and API), AWS Secrets Manager and Parameter Store, GCP Secret Manager, Azure Key Vault, 1Password Connect and CLI, Doppler, Infisical, SOPS, the external-secrets operator; rotation without downtime, local development, CI, serverless, failing fast on a missing secret, keeping secrets out of CI logs.

TypeScript, Python · Intermediate

Load secrets in Lambda without a fetch per invocation

Read an API key from Secrets Manager once per execution environment, not per invocation, through the extension, the SDK, or sekreto, and count the calls.

Credentials and secretsEdge and serverlessCaching

Instrument and meter API calls 2 guides

OpenTelemetry traces and metrics for API clients (this branch owns the plumbing), trace context propagation from SDK through gateway to service, request ids and correlation, audit logs, cost attribution per call and per tenant, sampling, client identification headers, dashboards (Grafana, Honeycomb, Datadog), and SDK-level telemetry, metrics, audit, cost and clienttrack features (sdkgen) as one option against OpenTelemetry auto-instrumentation and gateway analytics.

TypeScript, Python · Intermediate

Export outbound call spans from a serverless function

Get the span for the API call your function made to the collector before the environment freezes: flush it, hand it to a runtime task, or let a sidecar drain it.

ObservabilityEdge and serverless

Advanced

Set an SLO for a third party API you depend on

Set an objective for a dependency you do not run, measured from your client, with burn-rate alerts that page when the provider degrades, not when you ship a bug.

ObservabilityError handling

Control outbound integrations from one place 2 guides

One place to see and police every outbound call: API gateways used for egress (Kong, Envoy, Tyk), egress proxies, service-mesh egress, unified-API vendors (Merge, Nango, Paragon), automation platforms (Zapier, Make, n8n), feature flags and kill switches, and station (each SDK registered as a plugin; config, credential routing via sekreto, observe, police with allow, deny and budget, debug; reading the station-errors reference when a policy denies a call; the sdkgen-station feature package, station-view, seneca-station).

TypeScript, JavaScript · Advanced

Route outbound API calls through an egress proxy

Send every outbound call through one proxy that holds the credentials, enforces a per-vendor policy, and logs every decision it makes.

Outbound controlCredentials and secretsSecurityObservability

6 guides in 4 topics

The services behind an API: choosing an architecture, message-based services and pattern routing, entity persistence, providers for external APIs, and HTTP or edge exposure, with Seneca as one option beside NestJS, Moleculer, tRPC, NATS, Temporal and Hono.

Build message-based services 2 guides

Services where everything is a message: Seneca (actions by pattern, plugins and priors, transports and seneca-mesh, this branch owns transports, seneca-user, seneca-petition, structured message tracing, seneca-msg-test, seneca-doc, seneca-repl), @voxgig/system and create-system (services loaded by convention, model-driven CLI adding entity, srv, msg, field, env), and ordu for ordered task pipelines, against NestJS modules, Moleculer actions, tRPC routers, Fastify plus a message bus, NATS services and Temporal.

TypeScript, JavaScript · Advanced

Limit concurrency in a message worker

Stop a worker pulling more messages than it can process, so a burst waits at the broker where an operator can see it instead of inside your process.

Events and messagingServices and architecture

TypeScript, JavaScript · Intermediate

Run service startup steps in a fixed order

Turn an improvised startup function into an ordered list of named steps that can stop the boot and say why, and pin readiness to the store actually being open.

Services and architecturePlugin systems

Route messages by pattern 2 guides

Dispatch by matching properties inside a service: patrun (most-specific match wins, trie keyed by sorted property names, gex globs, add, find, list, remove), bloomrun, router libraries, rules engines (json-rules-engine, Drools), decision tables (the decide utility) and plain switch or if chains, with benchmarks for your message mix.

TypeScript · Beginner

Dispatch messages to handlers with a Map keyed by type

Replace a switch on message.type with a Map of handlers, so that adding one is a registration call, unknown types reach a fallback, and prototype keys stay out.

Services and architectureEvents and messaging

Python · Intermediate

Dispatch messages with pattern matching in Python

Route messages in a Python worker with the match statement, using mapping and class patterns, guards, and a fallback, tested over a table of messages.

Services and architectureEvents and messaging

Persist entities in services 1 guide

Entity data in services: seneca-entity and its store plugins (Postgres, Mongo, DynamoDB, seneca-d1-store on Cloudflare) against Prisma, Drizzle, TypeORM, Knex and raw drivers; the repository pattern, store-agnostic tests, migrations, multi-store setups.

TypeScript · Beginner

Choose an id scheme for service entities

Decide who mints an entity id, the service or the database, then choose a sequence, UUIDv4, UUIDv7, ULID, or nanoid by measuring index locality and order.

PersistenceServices and architecture

Expose services over HTTP and at the edge 1 guide

HTTP and edge fronts for message services: seneca-gateway-* (including seneca-gateway-cloudflare) and seneca-web-adapter-express against Hono on Cloudflare Workers, Express and Fastify routers, API gateways (Kong, APISIX) and serverless adapters; auth at the gateway, running the same service locally and at the edge.

TypeScript, JavaScript · Advanced

Run one service locally and at the edge without forking it

Write the HTTP front once in the fetch shape, give Node a twenty-line adapter, and run one request suite against both fronts and a stand-in that has no Node globals.

Edge and serverlessServices and architectureTesting

7 guides in 4 topics

Reading the formats integrations depend on, building parsers from grammars, validating shapes at boundaries, and transforming nested data.

Parse config and data formats 2 guides

One page per format decision: JSON, JSONC, JSON5, jsonic (unquoted keys, comments, implicit top level, plugins, jsonic-cli), YAML, TOML, INI, CSV (RFC 4180, headers, custom separators, streaming, strict and lenient modes), XML, Markdown, CSS, JSON Lines, Atom and RSS feeds, protobuf IDL and Zon; error positions, streaming large files, when lenient input is the wrong choice.

TypeScript · Intermediate

Decide when lenient parsing is the wrong choice

Give a lenient parser to files people edit and a strict one to bodies programs send, keep the loaders apart, and let a test refuse a lenient import at the boundary.

ParsingValidationSecurity

Write a grammar and parser 2 guides

Building a parser for your own format: ABNF (RFC 5234) compiled to a rule table with @tabnas/abnf (a state machine as data, not generated parser code), attaching behavior by rule name, extending an existing grammar without forking, inspecting with @tabnas/debug, railroad diagrams, the support libraries (expr, path, directive, hoover, multisource), an LSP and playground for your format, benchmarking with measure, and emitting GBNF for constrained decoding; against peggy, ohm, chevrotain, nearley, ANTLR, tree-sitter, Lark and hand-written recursive descent.

TypeScript, Python · Intermediate

Attach parse actions to grammar rules by name

Keep the grammar as plain ABNF, bind behavior to the rule names the compiler assigns, and test that every handler still names a rule and fires after a rename.

GrammarsParsing

TypeScript · Intermediate

Remove left recursion from a PEG grammar

Rewrite a left-recursive rule so peggy accepts it, fold the action from the left to keep subtraction left-associative, and compare with ohm-js and nearley.

GrammarsParsing

Validate data shapes 1 guide

Runtime validation of inputs, config and SDK responses, and exporting JSON Schema from a validator (this branch owns export, for tool definitions and OpenAPI alike): Zod, Joi, Yup, Valibot, ArkType, io-ts, AJV with JSON Schema, Pydantic, go-playground/validator, and gubu (a schema that looks like the data, Required, Optional, Default, Min, Max, One, Exact, Check, Coerce, Email, Url, Uuid, JSON Schema export, TypeScript and Go).

TypeScript, JavaScript · Beginner

Write a validator whose schema looks like the data

Write the schema as an example of an accepted value, with constructors for types and literals for defaults, so schema and sample read side by side.

ValidationConfiguration

Transform nested data 2 guides

Getting, setting, merging, walking, injecting and transforming nested structures, and flattening API responses for analysis: lodash, ramda, immer, jq, JSONPath, JSON Pointer, json-patch, deepmerge, pandas.json_normalize, and struct (getpath, setpath, merge, walk, inject, transform, validate, flatten, ported to 23 languages at parity).

TypeScript, JavaScript · Beginner

Merge nested config objects with predictable precedence

Layer defaults, file, environment and flags with a deep merge so a later source overrides only the keys it sets, and clone first because merge mutates.

Data transformationConfiguration

TypeScript, JavaScript · Beginner

Read a value at a nested path without null checks

Read a deep value by a path held as a string, so a response mapper is a table of paths rather than a chain of optional accesses written out once per field.

Data transformationConfiguration

3 guides in 2 topics

Spec languages for configuration, environment overlays, application models that generate artifacts, project generators, and templates that produce deterministic code.

Generate code and projects 2 guides

Scaffolding and repeatable generation: jostraca (component tree of Project, Folder, File, Content, Fragment, Slot, Inject, Copy; define then build; in-memory generation for tests; byte-identical TypeScript and Go implementations; inks interpolation) against Yeoman, Plop, Hygen, Cookiecutter, Copier, Nx generators, Projen and Rails generators; plus pushing one template change to hundreds of repositories (repo-manager, the gh CLI, the Terraform GitHub provider, Renovate presets).

Engineer templates and AST transforms 1 guide

Deterministic generated code without a Voxgig tool: EJS, Handlebars, Mustache, Jinja and Go templates; AST-based generation with ts-morph, jscodeshift and go/ast; codemods across generated files; formatting after generation; golden-file and snapshot tests of generated output; stable ordering and no timestamps.

3 guides in 3 topics

For library maintainers: porting with parity, one test corpus for every port, plugin systems that work the same everywhere, and the small utilities that recur.

Test once, run in every language 1 guide

One spec, many languages: JSON test corpora authored once and run by a per-language runner, omni (24 languages, zero runtime dependencies), the corpora behind struct, jostraca, aontu and the sdkgen .sdk/test/feature files, compared with Cucumber and Gherkin, JSON fixtures with hand-written runners, property-based testing (fast-check, Hypothesis, gopter) and Pact; corpus design, golden files, marking a case as expected to differ in one language, reporting parity gaps.

Design a plugin system 1 guide

Extending an application or library without forking it: @voxgig/plugin (definition, instance, declared, loaded and live lifecycle, reversible activation, 17 languages), the ESLint, Vite and Rollup plugin models, pluggy, the Go plugin package and hashicorp/go-plugin, OSGi, Ruby gem hooks, sandboxing third-party plugins, and sdkgen packages as an applied example.

TypeScript, JavaScript · Intermediate

Test a plugin through every lifecycle stage

Drive one plugin from registration through activation to deactivation inside a test, and assert what it released, without touching a real network.

Plugin systemsTesting

Choose and build small utilities 1 guide

The small libraries that recur in integration code, each against its mainstream peer: nid against uuid, nanoid and ulid (for idempotency keys and request ids); eraro against VError, Error.cause and Error subclasses; gex against minimatch and picomatch; inks against template literals and Mustache; ordu against p-series and a task queue; norma for argument normalization; and when to write your own versus depend.

TypeScript, JavaScript · Intermediate

Accept optional and reordered function arguments

Match a call's arguments against a pattern of names and types, so one function accepts several shapes without a chain of typeof checks.

SDK designValidation

Stop writing the same client twice#

Every guide here solves a problem a generated SDK already handles. Voxgig reads your OpenAPI description and generates the client, the CLI and the MCP server from one model.

Get the Voxgig dispatch

Short notes on building SDKs, CLIs, REPLs, and MCPs for API-first teams, plus the occasional Fireside episode pick.

By signing up you agree to our Terms and Conditions.