AdopenAPI reads your AdonisJS routes and TypeScript Abstract Syntax Tree to generate a complete OpenAPI 3.1.0 spec — automatically. No decorators. No comments. No manual schemas. Ever.
One-time payment · Lifetime access · No subscription
export default class UsersController { async index(): Promise<User[]> { return User.all() } async show({ params }: HttpContext): Promise<User> { return User.findOrFail(params.id) } } // ↑ That's literally all you write. // AdopenAPI generates the full spec below ↓
Every type annotation you write is documentation waiting to be published. AdopenAPI reads it so you don't have to repeat yourself.
// 🔴 You write all of this BY HAND const userSchema = { type: 'object', properties: { id: { type: 'number' }, name: { type: 'string' }, email: { type: 'string', format: 'email' }, } } const spec = { paths: { '/users': { get: { responses: { '200': { content: { 'application/json': { schema: { type: 'array', items: { $ref: '#/components/schemas/User' } } } } } } } } } }
// ✅ Just write your controller normally export default class UsersController { async index(): Promise<User[]> { return User.all() } async show({ params }: HttpContext): Promise<User> { return User.findOrFail(params.id) } } // AdopenAPI reads `: Promise<User[]>` // → introspects the User model fields // → generates the full OpenAPI spec // → serves it at /api/docs
AdopenAPI is surgical — it does one thing exceptionally well and integrates into your existing AdonisJS workflow without friction.
Parses your TypeScript source files using a full AST parser — not regex hacks. It understands generics, intersections, unions, and complex type hierarchies.
Reads your AdonisJS router config to discover all endpoints, their HTTP verbs, path parameters, and controller method bindings automatically.
Introspects your controller method return types — including Lucid models, custom interfaces, and utility types — and converts them to JSON Schema automatically.
Generates spec that fully conforms to the OpenAPI 3.1.0 standard, including proper $ref usage, component schemas, and JSON Schema vocabulary.
Because the spec is generated from your actual code, it can never drift out of date. Change a model field and the spec reflects it on the next request.
Spec generation happens at startup or on-demand. Your production request path is completely unaffected — no middleware, no reflection, no performance cost.
If you use VineJS for request validation, AdopenAPI reads your validators and maps them to OpenAPI request body schemas and query parameter definitions.
Serves a beautiful Swagger UI documentation explorer out of the box. Your team gets a live, interactive API reference the moment they open the browser.
Override generated schemas, add metadata, exclude routes, or extend with custom transformers — full control when you need it, sensible defaults when you don't.
AdopenAPI plugs into your AdonisJS project with a single install. No config file needed to get started.
Install AdopenAPI via npm and configure it with the built-in Ace command. It registers itself as an AdonisJS provider automatically.
$ node ace add @melchyore/adonis-open-api
No changes to your workflow. Write your AdonisJS controllers with proper TypeScript return types — which you should be doing anyway. AdopenAPI does the rest.
// app/controllers/posts_controller.ts export default class PostsController { async index(): Promise<Post[]> { return Post.query().preload('author') } async store({ request }: HttpContext): Promise<Post> { const data = await request.validateUsing(createPostValidator) return Post.create(data) } }
/api/docs
Start your AdonisJS server and navigate to
/api/docs. A fully interactive Swagger UI powered
by your live OpenAPI 3.1.0 spec is ready for your team, clients,
or CI pipeline.
$ node ace serve --hmr # → Routes analyzed: 24 # → Schemas generated: 8 # → OpenAPI spec ready at /api/docs # → Swagger UI at /api/docs/ui
Multiple ways to get help — from instant self-service docs to direct personal support from the author.
Got a bug, a specific use case, or something that doesn't work as expected? Email us directly and get a personal response from the author — not a bot.
support@adopenapi.devComprehensive guides covering installation, configuration, type support, VineJS integration, advanced overrides, and real-world examples. Updated with every release.
Read the docsFound a bug? Have a feature request? Open an issue on GitHub. The repository is publicly tracked so you can follow fixes and improvements in real time.
Open an issueJoin the AdonisJS community Discord server. Ask questions, share your setup, and get help from other AdopenAPI users and the broader AdonisJS ecosystem.
Join DiscordNo subscriptions. No per-seat fees. No license renewals. Pay once and use AdopenAPI on every project you'll ever build.
One-time payment · No recurring fees
Secure payment via Paddle · Instant delivery
Promise<T>,
Paginator<T>), union types, intersection
types, and optional properties. The AST parser gives it a deep
understanding of TypeScript's type system.
Your TypeScript types already describe your API. It's time your documentation reflected that.
14-day money-back guarantee · Instant delivery · No subscription
What developers are saying
Early adopters who made the switch from manual schema writing.
"We had 40+ endpoints with hand-written swagger. The schemas were always wrong. AdopenAPI replaced all of it in an afternoon and our docs are finally accurate."
"The AST-based approach is brilliant. It actually understands my TypeScript types — not just simple primitives but generics, unions, everything. Absolutely worth the price."
"The VineJS integration alone saved us hours. Our request body schemas are generated directly from our validators. No duplication, no drift, no maintenance."