API Designer
Jeffallan/claude-skills
Designs REST and GraphQL APIs from resource modeling to an OpenAPI 3.1 contract, with versioning, pagination and RFC 7807 error handling.
Reviews or designs an HTTP/JSON API's endpoints, auth, pagination, versioning and deprecations, guarding against inventing a bespoke interface or silently breaking consumers.
$ npx skills add AmazingAng/old-coder --skill old-coder-api -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install AmazingAng/old-coder old-coder-api --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/AmazingAng/old-coder.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/old-coder-api .claude/skills/old-coder-api && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "old-coder-api" agent skill from https://github.com/AmazingAng/old-coder/tree/main/skills/old-coder-api into .claude/skills/old-coder-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "old-coder-api", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/AmazingAng/old-coder/tree/main/skills/old-coder-apiType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add AmazingAng/old-coder --skill old-coder-api -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install AmazingAng/old-coder old-coder-api --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmazingAng/old-coder.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/old-coder-api .agents/skills/old-coder-api && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "old-coder-api" agent skill from https://github.com/AmazingAng/old-coder/tree/main/skills/old-coder-api into .agents/skills/old-coder-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "old-coder-api", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AmazingAng/old-coder --skill old-coder-api -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install AmazingAng/old-coder old-coder-api --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmazingAng/old-coder.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/old-coder-api .cursor/skills/old-coder-api && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "old-coder-api" agent skill from https://github.com/AmazingAng/old-coder/tree/main/skills/old-coder-api into .cursor/skills/old-coder-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "old-coder-api", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/AmazingAng/old-coder.git --path skills/old-coder-api--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add AmazingAng/old-coder --skill old-coder-api -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install AmazingAng/old-coder old-coder-api --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmazingAng/old-coder.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/old-coder-api .gemini/skills/old-coder-api && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "old-coder-api" agent skill from https://github.com/AmazingAng/old-coder/tree/main/skills/old-coder-api into .gemini/skills/old-coder-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "old-coder-api", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install AmazingAng/old-coder old-coder-apiInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add AmazingAng/old-coder --skill old-coder-api -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/AmazingAng/old-coder.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/old-coder-api .github/skills/old-coder-api && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "old-coder-api" agent skill from https://github.com/AmazingAng/old-coder/tree/main/skills/old-coder-api into .github/skills/old-coder-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "old-coder-api", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add AmazingAng/old-coder --skill old-coder-api -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install AmazingAng/old-coder old-coder-api --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/AmazingAng/old-coder.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/old-coder-api .opencode/skills/old-coder-api && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "old-coder-api" agent skill from https://github.com/AmazingAng/old-coder/tree/main/skills/old-coder-api into .opencode/skills/old-coder-api/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "old-coder-api", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
old-coder-apiReviews or designs an HTTP/JSON API's endpoints, auth, pagination, versioning and deprecations, guarding against inventing a bespoke interface or silently breaking consumers.
Before designing anything, the skill has the agent answer three scoping questions out loud: whether the API is public or internal, since internal APIs can tolerate breaking changes that public ones cannot; whether it is an existing surface or greenfield, since an existing surface must run the breaking-changes reference first because compatibility outranks every other improvement; and whether the product's resource model actually supports the shape being proposed, naming an awkward underlying resource model instead of papering over it.
Its stated purpose is to stop two default failure modes: inventing a clever bespoke interface where a boring conventional one would serve consumers better, and breaking downstream callers by renaming or restructuring a field because it reads better now. Reference files cover breaking-change rules, example request and response shapes, and general design patterns. For review-only requests with no implementation planned, the skill's review format is used directly rather than manufacturing a development loop, and when composed with a separate old-coder skill, this one owns the HTTP and JSON contract while the other owns workflow order and evidence.
Read from SKILL.md and the folder at commit a0eb529. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Old Coder API Design loads about 3.4k tokens when it runs, and up to ~7.8k if it reads all its reference files. Until then it costs about 120 tokens; SKILL.md has 1,793 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from AmazingAng/old-coder at commit a0eb529, republished under its MIT licence (© AmazingAng). 1,793 words, ~3,383 tokens.
.claude/skills/old-coder-api/SKILL.md (or your agent's skills folder). This skill also uses 3 other files; get the full folder from GitHub.Inspired by Sean Goedecke, Everything I know about good API design (2025-08-24).
This skill covers HTTP/JSON contract and operability concerns. Its compatibility rules assume JSON consumers. For gRPC/protobuf, GraphQL, WebSockets, or another protocol, apply the transport-independent principles only alongside that protocol's own compatibility rules. This is not a substitute for a full application-security review.
Good APIs are boring. For the people who build them, an API is a product. For the people who use them, it is a tool in the way of something else. Every minute a consumer spends thinking about your API instead of their goal is waste. An interesting API is a bad API — or would be a better one if it were less interesting.
Two failure modes an agent falls into by default, and this skill exists to stop both:
Composition with old-coder: when both skills apply, this skill owns the
HTTP/JSON contract while old-coder owns workflow order, SPEC approval, the
gauntlet, and EVIDENCE. Run Step 0 and the gates before SPEC approval; put the
surviving API constraints and risks into SPEC and verify them through the
gauntlet. For review-only work with no implementation, use this skill's review
format without manufacturing a development loop.
Answer these three, out loud, before writing a route:
| Question | Why it changes the work |
|---|---|
| Public or internal? Can you ship code for every consumer? | Internal: breaking changes are affordable, complex authentication is fine, non-engineer ergonomics don't matter. Public: none of that holds. |
| Existing surface or greenfield? | Existing → run references/breaking-changes.md first; compatibility outranks every improvement below. |
| Does the product's resource model support this API? | API design tracks the product's basic resources. If the resources are awkward (state machines with no name, records that only exist inside a job, parent/child relations that aren't modeled), the API will be awkward no matter how carefully you design it. Say so instead of papering over it. |
Honesty rule for step 0: when the ugliness comes from the underlying model, name it and propose the model fix as the real option. A background-job-polling interface bolted onto a read that should be a read is how the worst APIs happen — technical constraints that the UI hides get laid bare in the API, forcing consumers to understand far more of your system than they should have to.
Run every gate. Use ✓ only for a verified pass, ✗ + concrete fix for a verified failure, N/A + reason only when the gate truly does not apply, and ? + reason when it remains unverified. Never skip silently.
A competent consumer should be able to guess this endpoint before reading any docs.
/issues, /projects, /users), plural, stable.400 for a general client error; use 422 only when the content type and syntax are valid but the contained instructions cannot be processed. Use 404 for missing and 429 for rate-limited.id, created_at, next_page, url. Match the names the rest of this API already uses — internal consistency beats external convention when they conflict.Applies only to changes on an existing surface. Full matrix in references/breaking-changes.md.
user.address → user.details.address), narrowing an enum, or tightening validation is a break. Don't, even if it's neater. The HTTP referer header is a misspelling and it is still there.Many server-to-server integrations start life as a curl or a 20-line script. For developer-facing server-to-server APIs, default to simple, scoped, revocable API keys.
Authentication identifies a caller; it does not authorize an action. For every endpoint, identify the actor, action, resource, and tenant boundary.
tenant_id, owner ID, role, or scope without checking it against the authenticated principal.A 500 or a timeout tells the caller nothing about whether the action happened. Without an idempotency key, the caller must choose between a lost operation and a duplicate one.
DELETE /comments/32 (the ID is the key — the retry just 404s). Exception: non-ID-scoped operations like "delete the most recent".references/patterns.md.UI users are limited by the speed of their hands. Anything you expose via API is called at the speed of code, forever, in a loop, by someone who read no docs.
while true loop costs you. Fan-outs, /index endpoints, bulk imports, and anything doing per-record work in a request are the dangerous ones.X-RateLimit-Remaining and Retry-After so well-behaved clients can back off — that metadata is what lets you set stricter limits than you otherwise could.WHERE id > :cursor ORDER BY id LIMIT :n stays fast at record one million; OFFSET gets slower every page and the migration away from it later is expensive.next_page (URL or cursor) so consumers don't compute it.If a field needs an extra service call, a join over a big table, or a computation, don't put it in the default response.
?include=subscription / an includes[] array; keep the default response cheap and constant-cost.Read the response as a stranger. Does using it correctly require knowing how you store things?
next_comment_id chains the client must walk; a POST /fetch_job + poll dance for what should be a GET; internal enum values; internal table IDs; pagination whose page size depends on your shard layout.Guard against over-design as hard as under-design:
/v1/ prefix is itself a public product choice, not a free placeholder. Adopt path or header versioning only when the product's compatibility policy calls for it; do not build multi-version negotiation before a second version exists.includes or cursors to internal endpoints with one caller and a bounded result set. The Pagination and Expensive fields gates are about potentially large or expensive responses. For Idempotency, caller count does not remove retry risk: omit it only when the operation is already idempotent or duplicate effects are explicitly acceptable.When reviewing rather than writing, report only findings that survive verification and skip taste. For repository code, specs, and diffs, cite file:line. For published contracts outside the repository, cite a stable URL and exact section; source-code evidence must use an immutable commit permalink, not a moving branch. A missing public guarantee means consumers cannot rely on the behavior; it does not prove that the backend lacks an undocumented implementation. Give a gate ✓ only when the reviewed evidence supports it. When repository context is available, inspect beyond the diff instead of treating silence as a pass. If the input is intentionally limited and further evidence is unavailable, use ? (unverified: <reason>); reserve N/A for a gate that truly does not apply. Gate summaries evaluate the artifact under review, not the hypothetical state after suggested fixes. Order: breaks first, security boundaries second, incidents third, ergonomics last.
## API review: <surface>
Scope: public|internal · greenfield|existing
### Breaking changes (blocking)
- <field/endpoint> — <what breaks for a consumer doing X> — file:line
Fix: <additive alternative>
### Security boundary
- <authentication/authorization finding> — <credential or unauthorized action/resource> — file:line
### Incident risk
- <idempotency/blast-radius finding> — <the loop or retry that hurts> — file:line
### Ergonomics
- <boring/pagination/field-cost/implementation-leak finding> — file:line
### Gates: Boring <status> · Compatibility <status> · Authentication <status> · Authorization <status> · Idempotency <status> · Blast radius <status> · Pagination <status> · Expensive fields <status> · No implementation leakage <status>If nothing survives, say so plainly — an empty review is a valid result.
references/breaking-changes.md — compatibility matrix, versioning playbook, deprecation sequence. Read before changing any existing endpoint.references/patterns.md — implementation recipes: idempotency keys, cursor pagination, rate-limit headers, includes.references/examples.md — three compact, local examples: an existing route/spec diff, a greenfield proposal, and an established HTTP RPC route. Read only when a concrete calibration example is useful.© AmazingAng, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 3 other files (references) in skills/old-coder-api of AmazingAng/old-coder.
Open the folder on GitHubat commit a0eb529
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in AmazingAng/old-coder, which our catalogue first saw on October 7, 2026.
Old Coder API Design next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Old Coder API Design this skillAmazingAng/old-coder | 749 | 1 repos | ~3.4k | Automated safety check: Pass | MIT | |
| API DesignerJeffallan/claude-skills | 12k | 2 repos | ~2k | Automated safety check: Pass | MIT | |
| OpenAPI Spec Generationwshobson/agents | 40k | 9 repos | ~511 | Automated safety check: Pass | MIT | |
| API Design Patternsrohitg00/awesome-claude-code-toolkit | 2.7k | — | ~1.2k | Automated safety check: Pass | Apache-2.0 | |
| API DesignWrongStack/WrongStack | 368 | — | ~1.3k | Automated safety check: Pass | MIT | |
| API Contract Designrsmdt/the-startup | 536 | — | ~1.1k | Automated safety check: Pass | MIT |
Jeffallan/claude-skills
Designs REST and GraphQL APIs from resource modeling to an OpenAPI 3.1 contract, with versioning, pagination and RFC 7807 error handling.
wshobson/agents
Create, validate and maintain OpenAPI 3.1 specs for REST APIs, whether designed first or generated from existing code, and use them for docs and client SDKs.
rohitg00/awesome-claude-code-toolkit
REST API design with resource naming, pagination, versioning, and OpenAPI spec generation
WrongStack/WrongStack
A skill your agent uses when designing, implementing, or reviewing an HTTP API — endpoints, request and response shapes, errors, pagination, versioning, and authorization.
rsmdt/the-startup
REST and GraphQL API design patterns, OpenAPI/Swagger specifications, versioning strategies, and authentication patterns.
epam/ai-dial-chat
Design, review, or change HTTP API contracts for AI DIAL Chat.
AmazingAng/old-coder
Replaces line-by-line code review with an approved executable spec and a gauntlet of tests, types, coverage, and mutation checks the code must survive.
Works with
Categories
Reviews or designs an HTTP/JSON API's endpoints, auth, pagination, versioning and deprecations, guarding against inventing a bespoke interface or silently breaking consumers. Before designing anything, the skill has the agent answer three scoping questions out loud: whether the API is public or internal, since internal APIs can tolerate breaking changes that public ones cannot; whether it is an existing surface or greenfield, since an existing surface must run the breaking-changes reference first because compatibility outranks every other improvement; and whether the product's resource model actually supports the shape being proposed, naming an awkward underlying resource model instead of papering over it.
Old Coder API Design fits situations like: adding or changing an HTTP endpoint; reviewing an OpenAPI spec or a route diff for breaking changes; deciding whether an API change is safe to ship without warning consumers.
Run `npx skills add AmazingAng/old-coder --skill old-coder-api -a claude-code`. Or copy the skill folder (skills/old-coder-api in AmazingAng/old-coder) into .claude/skills/old-coder-api in your project. Claude Code loads it when a task matches its description.
Run `npx skills add AmazingAng/old-coder --skill old-coder-api -a codex`. Or copy the skill folder (skills/old-coder-api in AmazingAng/old-coder) into .agents/skills/old-coder-api in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add AmazingAng/old-coder --skill old-coder-api -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/old-coder-api, .gemini/skills/old-coder-api, .github/skills/old-coder-api and .opencode/skills/old-coder-api in your project.
SKILL.md names no scripts, command-line tools or credentials: Old Coder API Design is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Old Coder API Design is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 4.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Old Coder API Design: API Designer (Jeffallan/claude-skills, 12k stars), OpenAPI Spec Generation (wshobson/agents, 40k stars), API Design Patterns (rohitg00/awesome-claude-code-toolkit, 2.7k stars) and API Design (WrongStack/WrongStack, 368 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
AmazingAng (a GitHub user) maintains it in AmazingAng/old-coder, which has 749 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on August 18, 2026.
Source: AmazingAng/old-coder on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.