bun create is optional — Bun works without any configuration. This command exists to make getting started faster.Template a new Bun project with
bun create. It creates a project from a React component, a create-<template> npm package, a GitHub repo, or a local template.
To create an empty project, use bun init.
From a React component
bun create ./MyComponent.tsx turns an existing React component into a complete dev environment with hot reload and production builds in one command.
🚀 Create React App Successor —
bun create <component> provides everything developers loved about Create React App, but with modern tooling, faster builds, and backend support.How this works
When you runbun create <component>, Bun:
- Uses Bun’s JavaScript bundler to analyze your module graph.
- Collects all the dependencies needed to run the component.
- Scans the exports of the entry point for a React component.
- Generates a
package.jsonfile with the dependencies and scripts needed to run the component. - Installs any missing dependencies using
bun install --only-missing. - Generates the following files:
${component}.html${component}.client.tsx(entry point for the frontend)${component}.css
- Starts a frontend dev server.
Using TailwindCSS with Bun
TailwindCSS is a utility-first CSS framework for styling web applications. When you runbun create <component>, Bun scans your JSX/TSX file for TailwindCSS class names (and any files it imports). If it detects TailwindCSS class names, it adds the following dependencies to your package.json:
package.json
bunfig.toml to use its TailwindCSS plugin with Bun.serve():
bunfig.toml
${component}.css file with @import "tailwindcss"; at the top:
MyComponent.css
Using shadcn/ui with Bun
shadcn/ui is a component library tool for building web applications.
bun create <component> scans for any shadcn/ui components imported from @/components/ui.
If it finds any, it runs:
terminal
shadcn/ui itself uses TailwindCSS, bun create also adds the TailwindCSS dependencies to your package.json and configures bunfig.toml to use Bun’s TailwindCSS plugin with Bun.serve(), as described earlier.
bun create also sets up:
tsconfig.jsonto alias"@/*"to"src/*"or.(depending on whether there is asrc/directory)components.jsonso that shadcn/ui knows it’s a shadcn/ui projectstyles/globals.cssfile that configures Tailwind v4 the way shadcn/ui expects${component}.build.tsfile that builds the component for production withbun-plugin-tailwindconfigured
bun create ./MyComponent.jsx to run code generated by LLMs like Claude or ChatGPT locally.
From npm
terminal
create-<template> package from npm. These two commands are equivalent:
terminal
create-<template> package’s documentation for usage instructions.
From GitHub
bun create <user>/<repo> downloads the contents of the GitHub repo to disk.
terminal
terminal
- Downloads the template
- Copies all template files into the destination folder
- Installs dependencies with
bun install - Initializes a fresh Git repo. Opt out with the
--no-gitflag. - Runs the template’s configured
startscript, if defined
By default Bun does not overwrite existing files. Use the
--force flag to overwrite them.From a local template
You can define custom templates on your local file system. Put them in one of the following directories:$HOME/.bun-create/<name>: global templates<project root>/.bun-create/<name>: project-specific templates
Set the
BUN_CREATE_DIR environment variable to change the global template path.$HOME/.bun-create named after your template.
package.json file in that directory with the following contents:
package.json
bun create foo elsewhere on your file system to verify that Bun finds your local template.
Setup logic
You can specify pre- and post-install setup scripts in the"bun-create" section of your local template’s package.json.
package.json
| Field | Description |
|---|---|
postinstall | runs after installing dependencies |
preinstall | runs before installing dependencies |
bun create removes the "bun-create" section from package.json before writing it to the destination folder.
Reference
CLI flags
| Flag | Description |
|---|---|
--force | Overwrite existing files |
--no-install | Skip installing node_modules & tasks |
--no-git | Don’t initialize a git repository |
--open | Start & open in-browser after finish |
Environment variables
| Name | Description |
|---|---|
GITHUB_API_DOMAIN | The GitHub domain Bun downloads from. Set this if you use GitHub Enterprise or a proxy |
GITHUB_TOKEN (or GITHUB_ACCESS_TOKEN) | Lets bun create access private repositories and avoid rate limits. GITHUB_TOKEN is chosen over GITHUB_ACCESS_TOKEN if both exist. |
How bun create works
How bun create works
When you run
bun create ${template} ${destination}, here’s what happens:IF remote template- GET
registry.npmjs.org/@bun-examples/${template}/latestand parse it - GET
registry.npmjs.org/@bun-examples/${template}/-/${template}-${latestVersion}.tgz - Decompress & extract
${template}-${latestVersion}.tgzinto${destination}- If files would be overwritten, warn and exit unless
--forceis passed
- If files would be overwritten, warn and exit unless
- Download the tarball from GitHub’s API
- Decompress & extract into
${destination}- If files would be overwritten, warn and exit unless
--forceis passed
- If files would be overwritten, warn and exit unless
- Open local template folder
- Delete destination directory recursively
-
Copy files recursively using the fastest system calls available (on macOS,
fcopyfile; on Linux,copy_file_range). Do not copy or traverse into thenode_modulesfolder if it exists (this alone makes it faster thancp) -
Parse the
package.json(again!), updatenameto be${basename(destination)}, remove thebun-createsection from thepackage.jsonand save the updatedpackage.jsonto disk.- IF Next.js is detected, add
bun-framework-nextto the list of dependencies - IF Create React App is detected, add the entry point in
/src/index.{js,jsx,ts,tsx}topublic/index.html - IF Relay is detected, add
bun-macro-relayso that Relay works
- IF Next.js is detected, add
-
Auto-detect the npm client, preferring
pnpm,yarn(v1), and lastlynpm -
Run any tasks defined in
"bun-create": { "preinstall" }with the npm client -
Run
${npmClient} installunless--no-installis passed OR no dependencies are in package.json -
Run any tasks defined in
"bun-create": { "postinstall" }with the npm client -
Run
git init; git add -A .; git commit -am "Initial Commit";- Rename
gitignoreto.gitignore. npm strips.gitignorefiles from published packages. - If there are dependencies, this runs in a separate thread concurrently while node_modules are being installed
- Using libgit2 if available was tested and performed 3x slower in microbenchmarks
- Rename