Developer tool · v0.1.0 on npm
steadysdk
Built for the hundredth regeneration.
Most OpenAPI generators rewrite everything on each run, deleting custom code and renaming methods when the spec shifts. steadysdk turns an OpenAPI 3.0/3.1 spec into a dependency-free, fully typed TypeScript client and keeps it maintainable as the API evolves.
- Platform
- OpenAPI → TypeScript SDK generator · CLI and GitHub Action
- What we did
- CLI and code generator · GitHub Action · Test suite on real APIs
- Stack
- TypeScript · Node.js · Vitest · GitHub Actions
Walkthrough
Pick a step, or let it play. Hover or focus pauses it.
Why it exists
Most OpenAPI generators are “generate once and forget”: re-running them overwrites everything, wipes out hand-written helpers, and silently renames methods when the spec shifts. steadysdk is built for the second, tenth and hundredth generation.
| Situation | Typical generator | steadysdk |
|---|---|---|
| API adds an endpoint | Rewrites everything | Adds the new method; every other file is untouched |
| You wrote a custom helper | Gets deleted | Lives in your own file or a custom region; kept on every run |
| Someone hand-edits generated code | Silently overwritten | Detected; regeneration stops and tells you |
An operationId is renamed upstream | Your method is renamed (breaking) | Name pinned by the lock file until you opt in |
| The API changes | You diff the YAML by hand | steadysdk diff lists every change and marks the breaking ones |
| Release notes | Written by hand | steadysdk changelog writes them as Markdown or JSON |
| You are editing the spec | Re-run the generator by hand | steadysdk watch regenerates on every save |
| CI | — | A GitHub Action fails when the SDK is stale, or on breaking changes without a major version bump |
Built to be regenerated
Your code lives next to the generated code
client.tsandindex.tsare scaffolded once and never touched again, so helpers you add there survive every run.Or inside it, in custom regions
Generated files have named regions. Code between the markers is carried into every new version of the file, and generation stops rather than drop it.
Hand edits are detected, never lost
The manifest records a hash of every file steadysdk wrote. If one changed outside its regions,
generatestops and lists it.Names stay put
Every assigned name is recorded in
names.lock.json. A renamedoperationIdkeeps your method's name until you rungenerate --relock.
// sdk/generated/api/pets.ts
export class PetsApi {
// ...generated methods...
// <steadysdk:custom members>
async findAvailablePet(name: string, options?: RequestOptions): Promise<Pet | undefined> {
const pets = await this.listPets({ status: ['available'] }, options);
return pets.find((pet) => pet.name === name);
}
// </steadysdk:custom>
}
Tested on real APIs
Every SDK below is generated from the provider's published spec, pinned to a commit, and type-checked under the strictest compiler settings. A weekly workflow re-runs it.
| API | Operations | Schemas | Generate | Strict type-check |
|---|---|---|---|---|
| GitHub (OpenAPI 3.0) | 1,232 | 994 | 1.8 s | 0 errors |
| GitHub (OpenAPI 3.1, 274 webhooks) | 1,232 | 973 | 2.1 s | 0 errors |
| Stripe | 612 | 1,538 | 1.2 s | 0 errors |
| OpenAI | 359 | 2,048 | 0.9 s | 0 errors |
| Twilio | 197 | 150 | 0.4 s | 0 errors |
| Kubernetes (Swagger 2.0) | 1,158 | 816 | 1.1 s | 0 errors |
Under the hood
npm install --save-dev @steadysdk/cli
npx steadysdk init # writes .steadysdkrc.yml
npx steadysdk generate # writes ./sdk
Stack
- TypeScript 7 and ESM
- Node.js 22.19+
- npm workspaces: an engine package and a CLI
- Vitest
- GitHub Actions
199 tests cover
- Six real-world specs, regenerated by a weekly workflow
- Golden snapshots of the example SDK and its changelog
- Type-checks of the output under the strictest compiler flags
- The runtime against a live local HTTP server
- Watch mode and the GitHub Action against real repositories
Supported OpenAPI
- OpenAPI 3.0 and 3.1, and Swagger 2.0; YAML or JSON
- Files, URLs or git revisions
- 3.1 webhooks
- JSON, form, multipart, text and binary bodies
- Bearer, basic, API keys, OAuth2 and OpenID Connect
Let's merge.
Have something like this in mind? A free 30-minute call gets you a rough scope and an honest estimate.





