Start from your inputs
Use the OpenAPI spec and Stainless-style config that already define your SDK.
Opensteel generates Stainless-compatible TypeScript SDKs from your OpenAPI spec and stainless.yml-style config. For supported SDK shapes, it targets near byte-identical output so teams can keep shipping after the hosted Stainless generator is no longer available.
$ npx opensteel generate \
--openapi openapi.yaml \
--config stainless.yml \
--out ./my-sdk
# emits a Stainless-compatible TypeScript SDK
./my-sdk/src/client.ts
./my-sdk/src/resources/
./my-sdk/src/internal/
$ npx opensteel init \
--config stainless.yml \
--out ./my-sdk
# adds the publishable wrapper
package.json
release-please-config.json
.github/workflows/generate.yml
Stainless continuity
If you already have a Stainless-generated TypeScript SDK, Opensteel is designed to keep that shape stable. Your spec, config, generated source, build scripts, and release workflow can all live in Git.
Use the OpenAPI spec and Stainless-style config that already define your SDK.
Target the same TypeScript project shape, resources, runtime layout, and exported types.
Measure byte-level drift against known Stainless output and drive it down fixture by fixture.
Ship with standard npm, release-please, and GitHub Actions tooling.
Why Opensteel
For supported SDK shapes, Opensteel targets output close enough to preserve existing imports, docs, tests, and release workflows — and publishes the diff against real packages rather than asserting it.
Use Opensteel as a continuity layer when your SDK already depends on Stainless conventions.
Generation is driven by OpenAPI plus config. Compatibility is measured by diffing against reference SDKs, not by using Stainless backend code.
Development has focused on public, MIT-licensed SDK outputs and a repo-owned generator you can inspect.
Compatibility coverage
Every change to the generator is measured against a corpus of real Stainless-generated SDKs. Each one is regenerated from its spec and config, then diffed against the package Stainless actually shipped.
Measured by regenerating each SDK from its OpenAPI spec and config alone, then diffing against the real Stainless-generated package. Diffs normalize comments and blank lines and exclude hand-written custom code, which no generator can derive from a spec. Across the corpus 89.5% of all reference-SDK code is reproduced exactly, and the median SDK reaches 96.4%; 57 are reproduced in full, with 16 more within a few lines. 220 of 289 typecheck clean.
Current scope
Both targets run through the same front end and the same diff harness, so a compatibility fix is proven against real shipped SDKs rather than asserted. The residual is concentrated in a handful of very large SDKs; most of the corpus is already close.
A CLI-first continuity tool for teams with Stainless-generated TypeScript SDKs who need to keep generating compatible code from files they control.
Not a legal opinion and not a full Stainless product replacement — no docs sites, MCP servers, or hosted workflows. It generates TypeScript and Python SDKs; other Stainless languages are not supported.
Start generating
Opensteel requires Node.js 20 or newer and generates TypeScript and Python packages.
$ npm install -g opensteel
$ opensteel generate \
--openapi openapi.yaml \
--config stainless.yml \
--out ./sdk