{"id":50041334,"url":"https://github.com/ryan-prayoga/brunogen","last_synced_at":"2026-05-21T03:08:08.334Z","repository":{"id":346777438,"uuid":"1191460864","full_name":"ryan-prayoga/brunogen","owner":"ryan-prayoga","description":"Generate Bruno collections from Laravel, Express.js, and Go API codebases by inferring OpenAPI from source code.","archived":false,"fork":false,"pushed_at":"2026-05-13T18:31:05.000Z","size":1060,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-13T20:26:34.704Z","etag":null,"topics":["api","bruno","cli","codegen","express","golang","laravel","openapi"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/brunogen","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ryan-prayoga.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-25T09:11:24.000Z","updated_at":"2026-05-13T18:31:17.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ryan-prayoga/brunogen","commit_stats":null,"previous_names":["ryan-prayoga/burnogen"],"tags_count":16,"template":false,"template_full_name":null,"purl":"pkg:github/ryan-prayoga/brunogen","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-prayoga%2Fbrunogen","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-prayoga%2Fbrunogen/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-prayoga%2Fbrunogen/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-prayoga%2Fbrunogen/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ryan-prayoga","download_url":"https://codeload.github.com/ryan-prayoga/brunogen/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ryan-prayoga%2Fbrunogen/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33286779,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-21T02:57:32.698Z","status":"ssl_error","status_checked_at":"2026-05-21T02:57:31.990Z","response_time":62,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","bruno","cli","codegen","express","golang","laravel","openapi"],"created_at":"2026-05-21T03:08:04.540Z","updated_at":"2026-05-21T03:08:08.328Z","avatar_url":"https://github.com/ryan-prayoga.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# brunogen\n\n[![npm version](https://img.shields.io/npm/v/brunogen)](https://www.npmjs.com/package/brunogen)\n[![node \u003e=20](https://img.shields.io/badge/node-%3E%3D20-2f855a)](https://nodejs.org/)\n[![CI](https://github.com/ryan-prayoga/brunogen/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/ryan-prayoga/brunogen/actions/workflows/ci.yml)\n\nBrunogen scans a Laravel, Express.js, or Go API codebase, normalizes what it finds into OpenAPI, and emits a Bruno collection you can try immediately.\n\nLaravel is the strongest path today, with materially richer request and response inference. Express.js and Go support are already usable for conventional codebases, but they remain more heuristic.\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\" valign=\"top\"\u003e\n      \u003cstrong\u003eLaravel\u003c/strong\u003e\u003cbr /\u003e\n      \u003ca href=\"https://github.com/ryan-prayoga/brunogen/blob/main/docs/assets/preview-laravel.png\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/ryan-prayoga/brunogen/main/docs/assets/preview-laravel.png\" alt=\"Laravel output preview\" width=\"240\" /\u003e\n      \u003c/a\u003e\u003cbr /\u003e\n      \u003csub\u003eFormRequest + Resource response\u003c/sub\u003e\u003cbr /\u003e\n      \u003csub\u003e\u003ca href=\"https://github.com/ryan-prayoga/brunogen/blob/main/docs/demo/laravel-happy-path/README.md\"\u003eOpen Laravel demo\u003c/a\u003e\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" valign=\"top\"\u003e\n      \u003cstrong\u003eExpress\u003c/strong\u003e\u003cbr /\u003e\n      \u003ca href=\"https://github.com/ryan-prayoga/brunogen/blob/main/docs/assets/preview-express.png\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/ryan-prayoga/brunogen/main/docs/assets/preview-express.png\" alt=\"Express output preview\" width=\"240\" /\u003e\n      \u003c/a\u003e\u003cbr /\u003e\n      \u003csub\u003eMounted router + local response helper\u003c/sub\u003e\u003cbr /\u003e\n      \u003csub\u003e\u003ca href=\"https://github.com/ryan-prayoga/brunogen/blob/main/docs/demo/express-happy-path/README.md\"\u003eOpen Express demo\u003c/a\u003e\u003c/sub\u003e\n    \u003c/td\u003e\n    \u003ctd align=\"center\" valign=\"top\"\u003e\n      \u003cstrong\u003eGo\u003c/strong\u003e\u003cbr /\u003e\n      \u003ca href=\"https://github.com/ryan-prayoga/brunogen/blob/main/docs/assets/preview-go.png\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/ryan-prayoga/brunogen/main/docs/assets/preview-go.png\" alt=\"Go output preview\" width=\"240\" /\u003e\n      \u003c/a\u003e\u003cbr /\u003e\n      \u003csub\u003eGin bind + direct JSON response\u003c/sub\u003e\u003cbr /\u003e\n      \u003csub\u003e\u003ca href=\"https://github.com/ryan-prayoga/brunogen/blob/main/docs/demo/go-happy-path/README.md\"\u003eOpen Go demo\u003c/a\u003e\u003c/sub\u003e\n    \u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## Quick Start\n\nBest first run: start with Laravel if you want the most complete inference path in under a minute.\n\n```bash\nnpm i -g brunogen\nbrunogen init\nbrunogen generate\n```\n\nDefault output:\n\n- `.brunogen/openapi.yaml`\n- `.brunogen/bruno/`\n\nIf you are testing from this repository checkout instead of an installed package, run `npm install`, `npm run build`, and `npm link` once from the repository root first.\n\n## What You Get\n\n- `openapi.yaml` generated directly from routes, handlers, controllers, and request/response patterns\n- A ready-to-open Bruno collection under `.brunogen/bruno/`\n- Warnings for patterns Brunogen could not infer confidently\n\n## Framework Paths\n\n| Framework | Current fit | First place to try | Demo |\n| --- | --- | --- | --- |\n| Laravel | Strongest path today | `cd tests/fixtures/laravel \u0026\u0026 brunogen init \u0026\u0026 brunogen generate` | [Laravel demo](https://github.com/ryan-prayoga/brunogen/blob/main/docs/demo/laravel-happy-path/README.md) |\n| Express | Useful, still heuristic | `cd tests/fixtures/express \u0026\u0026 brunogen init \u0026\u0026 brunogen generate` | [Express demo](https://github.com/ryan-prayoga/brunogen/blob/main/docs/demo/express-happy-path/README.md) |\n| Go | Experimental | `cd tests/fixtures/gin \u0026\u0026 brunogen init \u0026\u0026 brunogen generate` | [Go demo](https://github.com/ryan-prayoga/brunogen/blob/main/docs/demo/go-happy-path/README.md) |\n\nTo refresh the checked-in demo snapshots after an intentional output change:\n\n```bash\nnpm run demo:laravel\nnpm run demo:express\nnpm run demo:go\n```\n\n## Commands\n\n- `init` creates a starter config in the current directory\n- `generate` scans the current project and writes OpenAPI plus a Bruno collection\n- `watch` regenerates when supported source files change\n- `validate` checks generated OpenAPI output\n- `doctor` shows environment and framework detection details\n\n## Works Best Today\n\n- Laravel route scanning from `routes/*.php`, including groups, prefixes, middleware hints, and `apiResource`\n- Laravel request inference from FormRequest rules, inline validation, and common manual accessors such as `query`, `header`, typed accessors, `has`, `filled`, `safe()-\u003eonly(...)`, and `enum(...)`\n- Laravel response inference for direct arrays, `response()-\u003ejson(...)`, `noContent()`, same-controller helpers, `JsonResource`, `-\u003eadditional(...)`, and common abort/error/not-found paths\n- Express scanning for mounted routers, straightforward request access patterns, and local response helpers\n- Go Gin, Fiber, and Echo scanning for conventional route registration and direct JSON responses\n- Bruno export with environments, baseline auth support, and native response `example {}` blocks\n\n## How It Works\n\n```text\nsource code\n  -\u003e framework adapter\n  -\u003e normalized endpoint model\n  -\u003e openapi.yaml\n  -\u003e Bruno collection\n```\n\nOpenAPI becomes the internal source of truth after scanning. Bruno is the output target.\n\n## Read More\n\n- [Detailed reference, examples, config, and support matrix](https://github.com/ryan-prayoga/brunogen/blob/main/docs/reference.md)\n- [CHANGELOG.md](https://github.com/ryan-prayoga/brunogen/blob/main/CHANGELOG.md)\n- [CONTRIBUTING.md](https://github.com/ryan-prayoga/brunogen/blob/main/CONTRIBUTING.md)\n- [docs/release-checklist.md](https://github.com/ryan-prayoga/brunogen/blob/main/docs/release-checklist.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryan-prayoga%2Fbrunogen","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fryan-prayoga%2Fbrunogen","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fryan-prayoga%2Fbrunogen/lists"}