bun-api-starter
v1.0.1
Published
Scaffold a modern Bun + Elysia REST API with one command. Type-safe routes, zero configuration.
Downloads
290
Maintainers
Readme
bun-api-starter
create-bun-api my-api
|
v
.env ──> PORT ──> Elysia ──> / ( service info )
| └──> /health ( health check )
|
bun --watch src/server.tsOne-command scaffold for a type-safe Bun + Elysia REST API.
start an api
bunx create-bun-api my-api
cd my-api
bun install
bun run devBanner appears on http://localhost:5000. Port comes from .env.
what lands in the folder
my-api
|-- package.json # elysia 1, dotenvx, bun scripts
|-- tsconfig.json # strict, bundler resolution
|-- biome.json # formatting + linting
|-- .env.example # PORT=5000
|-- src
| |-- server.ts # app, routes, listen
| `-- routes
| `-- health.ts # example route module
`-- README.md # scaffolded with your nameroutes it ships with
| method | path | response |
| ------ | ---- | -------- |
| GET | / | { "name": "<project>", "status": "online" } |
| GET | /health | { "ok": true } |
add a route
// src/routes/echo.ts
import { Elysia } from "elysia";
export const echo = new Elysia().post("/echo", ({ body }) => body, {
body: { message: String },
});// src/server.ts
import { echo } from "./routes/echo";
// ...
const app = new Elysia().get("/", () => ({ status: "online" })).use(echo);Every route module is just an Elysia instance - compose them with .use().
why this over wrestling setup
| pain | solution |
| ---- | -------- |
| Elysia + Bun handshake | pre-wired in server.ts |
| .env never loads | dotenvx imported up top |
| no lint/format baseline | pinned biome.json |
| route files with no pattern | src/routes/*.ts + .use() |
details
- Elysia serves OpenAPI at
/swaggerwhen running withBUN_RUNTIME_TRANSPILER=1- see Elysia docs for the recipe. bun run devhot-reloads on save.
development of this package
git clone https://github.com/knownasrazi/bun-api-starter.git
cd bun-api-starter
bun install
bun run releaselicense
one command in. an api answering requests.
