Scaffold a darkroom.engineering project:
bun create darkroom my-project
# or
npm create darkroom@latest my-projectYou'll be asked which starter to use and — for satus — which integrations to keep:
- satus — Next.js 16, React 19, Tailwind v4. Integrations: Sanity, Shopify, HubSpot, Mailchimp, WebGL, Theatre.js.
- novus — React Router 7 (framework mode), React 19, Tailwind v4, Vite 8.
The CLI is a thin orchestrator. It clones the starter you pick, installs dependencies, then hands off to the starter's own setup:project script for integration selection — all integration knowledge lives (and is tested) in each starter repo, so this package rarely needs updating.
On top of the clone it does three things:
- Rewrites
package.json— sets your project name, resets the version to0.1.0, marks itprivate, and retains an emptydescriptionstring so metadata consumers keep the field without inheriting starter copy. - Deletes the starter's own repo metadata —
.github/FUNDING.yml, the Lighthouse-to-Slack and Dependabot auto-merge workflows,CHANGELOG.md, andplans/. The starter's CI, Dependabot config and PR template are kept. - Replaces the clone's git history with a fresh
git init+ initial commit.
LICENSE is kept on purpose: the starters are MIT and the notice has to travel with the code. Replace it if your project ships under different terms.
bun create darkroom [name] [options]
--starter <satus|novus> Skip the starter prompt
--ref <branch|tag> Clone a specific ref (default: main)
--preset <key> Non-interactive: use a satus preset
--keep <id,id,...> Non-interactive: keep an explicit integration set ('' = lean)
--clean-homepage Replace the satus landing page with a blank homepage
--skip-setup Clone + install only; run `bun run setup:project` later
--skip-install Skip dependency installation (implies --skip-setup)
--preset and --keep are mutually exclusive. --preset, --keep and --clean-homepage are satus-only — novus ships no integration picker, and passing them with --starter novus is an error rather than a silent no-op.
--preset |
Keeps |
|---|---|
editorial |
sanity, hubspot, mailchimp |
boutique |
shopify, hubspot, mailchimp |
studio |
everything |
gallery |
everything |
blank |
nothing |
Valid --keep ids: sanity, shopify, hubspot, mailchimp, webgl, theatre. Keeping theatre also keeps webgl, which it depends on.
Non-interactive example (CI):
bun create darkroom my-project --starter satus --keep sanity,shopify --clean-homepagePin a starter release instead of tracking main:
bun create darkroom my-project --starter satus --ref v2.0.1- satus —
bun dev. Choose integrations during scaffolding; successful setup removes its own setup machinery. If you used--skip-setup, runbun run setup:projectbefore starting project work. - novus —
bun devserves the bundledexample/marketing site. PointappDirectoryatapp/inreact-router.config.tsand deleteexample/to start on your own routes.
Before deploying, follow the project deployment checklist for GitHub ownership, shared CI, dependency policy and Vercel checks. CI is retained, but merge automation requires explicit project adoption.
- bun ≥ 1.3.5 for this generator; match the selected starter's exact
packageManagerpin for installation and checks - git
- Node ≥ 22 for this generator, including
npm create; generated projects follow their own.node-versionandenginesrequirements