Create a Next.js or TanStack Start app from Clubedge Starter with one command, with only the modules you need: auth, storage, cache, email, payments, jobs, observability, deployment. Add, remove, or upgrade modules later with a three-way merge that keeps your edits. Every release pins a verified Starter version.
See the codeCreate a production-ready Next.js or TanStack Start app with one command, and keep it up to date.
Pick only the modules you need: auth, storage, email, payments, jobs, observability, deployment.
Add, remove, or upgrade them later without losing your own changes.
Website · Clubedge Starter · Changelog · Roadmap · Contributing
pnpm dlx @clubedge/create-clubedge-app my-app
Copying a starter is easy; living with it is not. You delete the services you don't use by hand, and once you've changed the code, every later improvement to the starter has to be copied over by hand too.
create-clubedge-app generates a project from a tested release of Clubedge Starter with only the modules you choose. A module you leave out is removed completely: its package, its provider SDK, its environment variables, its documentation, and its lockfile entries. The project records exactly what it was generated from, so later the CLI can add a module, remove one, or upgrade to a newer Starter release by merging the change into your code. Files you never touched are updated; your edits are kept.
Every CLI release is pinned to one Starter release and verified against it, so the same command always produces the same project.
You need Node.js 22.12 or newer and pnpm 10.9.0 or newer. Git is used for the default repository initialization.
pnpm dlx @clubedge/create-clubedge-app my-app
cd my-app
pnpm dev
Or start it with npm: npx @clubedge/create-clubedge-app my-app. The generated project is a pnpm workspace, so dependencies are installed with pnpm either way; the CLI falls back to corepack pnpm when pnpm is not on your path. Without a destination, the CLI asks where to create the project.
The generated project includes apps/web/.env.local, created from the example and pointing at the local services you chose. Its SETUP.md describes every variable and provider. The root route is a landing page named after your project, and the dashboard is at /dashboard.
The default Starter release ships inside the CLI package, so GitHub is only contacted when you pass --ref. Internet access is needed to install dependencies.
The Starter ships the same application for two React frameworks. Next.js is the default; pick TanStack Start with --framework, or choose interactively:
pnpm dlx @clubedge/create-clubedge-app my-app --framework tanstack-start
--framework | App | Production output |
|---|---|---|
next | Next.js App Router | Next.js standalone build |
tanstack-start | TanStack Start with Vite | Nitro .output server bundle |
Either way, the app lives in apps/web and uses the same shared packages, so the project layout, root scripts, and Docker commands are identical.
Authentication, file storage, caching, email, payments, background jobs, observability, local infrastructure, and deployment are modules. Each has a default, and anything you leave out is removed completely. The Starter's clubedge.template.json defines the modules, so a module a newer Starter adds gets its --<module> flag without a CLI change; --help lists the modules of the Starter this CLI release creates.
| Flag | Options | Default |
|---|---|---|
--auth | supabase, better-auth, none | supabase |
--storage | s3, supabase (needs Supabase Auth), none | s3 |
--cache | redis (falls back to memory without REDIS_URL), memory | redis |
--email | smtp (any provider, or a local inbox), resend, none | smtp |
--payments | stripe, none (needs an auth module) | none |
--jobs | pg-boss, none | none |
--observability | otel (OpenTelemetry, to any OTLP collector), sentry, none | none |
--deploy | docker (any container host), fly, railway, render, vercel, netlify | docker |
--infra | docker (Docker Compose), supabase (Supabase CLI), local (no Docker: PGlite and a local folder), none | docker |
# Only the monorepo, UI, database, and tooling
pnpm dlx @clubedge/create-clubedge-app my-app --auth none --storage none --cache memory --email none
# A SaaS starting point: your own auth, payments, and background jobs, no Docker needed
pnpm dlx @clubedge/create-clubedge-app my-app --auth better-auth --payments stripe --jobs pg-boss --infra local
Interactive runs ask whether to customize these after the framework question.
Usage:
pnpm dlx @clubedge/create-clubedge-app [project-directory] [options]
pnpm dlx @clubedge/create-clubedge-app add [module option]... (inside a project)
pnpm dlx @clubedge/create-clubedge-app remove [module]... (inside a project)
pnpm dlx @clubedge/create-clubedge-app upgrade [--ref <tag>] (inside a project)
Options:
--framework <id> App framework, such as next or tanstack-start
--<module> <option> A module option, such as --auth none; the Starter lists its modules
--ref <ref> Download this Starter tag, branch, or commit from GitHub instead
(upgrade: the Starter to upgrade to)
--template-dir <path> Scaffold from a local Starter checkout (for Starter development)
--dry-run Show what would be created or changed without writing anything
--force add/remove: change a project with uncommitted changes or without Git
-y, --yes Accept defaults and never prompt (default directory: my-app)
--no-install Skip dependency installation
--no-git Skip Git repository initialization
-h, --help Show this help
-v, --version Show the CLI version
The target directory must be empty or not exist. The CLI never deletes or overwrites existing files, and if scaffolding fails it removes whatever it wrote, so a failed run leaves nothing behind.
# Preview the files and edits without writing anything
pnpm dlx @clubedge/create-clubedge-app my-app --dry-run
# Non-interactive, for scripts and CI
pnpm dlx @clubedge/create-clubedge-app my-app --yes --no-git --framework tanstack-start
# Try an unreleased Starter change
pnpm dlx @clubedge/create-clubedge-app my-app --ref main
# Reproduce a specific Starter release or commit
pnpm dlx @clubedge/create-clubedge-app my-app --ref v0.14.0
pnpm dlx @clubedge/create-clubedge-app my-app --ref <commit-sha>
# Test local Starter changes before releasing them
pnpm dlx @clubedge/create-clubedge-app my-app --template-dir ../clubedge-starter
Inside a project created by the CLI, add and remove change modules, and upgrade moves the project to a newer Starter release. Projects from Starter v0.8.0 on have a clubedge script, so pnpm clubedge add cache redis works too. Without a module or option, add and remove ask for them:
pnpm clubedge add # choose a module and option from a list
pnpm dlx @clubedge/create-clubedge-app add cache redis # or switch: add auth better-auth
pnpm dlx @clubedge/create-clubedge-app remove storage
pnpm clubedge add email resend payments stripe # several modules as one change
pnpm clubedge remove storage payments
pnpm dlx @clubedge/create-clubedge-app add infra local --dry-run
pnpm dlx @clubedge/create-clubedge-app@latest upgrade # to the newest CLI's Starter release
pnpm dlx @clubedge/create-clubedge-app upgrade --ref v0.14.0 # or a specific tag, branch, or commit
The CLI renders the project twice, from the Starter commit and modules recorded in your package.json and from the new state, and merges the difference into your project. The new state has other modules for add and remove, and the newer Starter with the same modules for upgrade. Modules a newer Starter introduces start as none where possible, so an upgrade never adds a service on its own.
<<<<<<< yours ... >>>>>>> clubedge) for you to resolve.apps/web/.env.local keeps your values. Values still at their generated defaults follow the new selection, and new variables are added.pnpm-lock.yaml is replaced if you never changed your dependencies; otherwise pnpm install reconciles it.Several modules in one command are applied as one change, and their requirements are checked together, so add auth supabase storage supabase works even though Supabase Storage needs Supabase Auth. When lines conflict, the CLI lists each file with its number of conflict blocks. Before an upgrade, it lists the Starter releases it crosses with the sections of their release notes, such as v0.13.0 Observability, Tests, Also.
The project must be a Git repository without uncommitted changes, so you can review the result with git diff and undo it. Pass --force to skip this check. Add --no-install to skip pnpm install. Afterward, run pnpm db:migrate and pnpm check:services if the change added tables or services.
Two read-only commands help you keep a project healthy:
pnpm clubedge status # Starter release, modules, Git state, and whether a newer Starter exists
pnpm clubedge doctor # Node.js, pnpm, dependencies, lockfile, env file, and pnpm check:services
status ends with the command to run next, such as pnpm clubedge upgrade when a newer Starter release is available; it asks npm for the newest CLI and still works offline. doctor checks that Node.js and pnpm meet the project's versions, that dependencies are installed, that pnpm-lock.yaml matches every package.json, and that apps/web/.env.local has every variable in .env.example, then runs pnpm check:services (skip it with --no-services). It exits with an error when a check fails, so it also works in CI.
Each CLI release is tested against one specific Starter release:
create-clubedge-app v0.16.0
|
v
Clubedge Starter v0.14.0
commit 2219a21c2eb237b7d8ee004ea8bbeb098b70106e
The current relationship is:
| CLI release | Default Starter release | Meaning |
|---|---|---|
create-clubedge-app@0.16.0 | clubedge-starter@v0.14.0 | The CLI's required, tested default |
This means the same CLI version always scaffolds the same Starter revision by default. The CLI does not silently follow Starter main.
The v0.14.0 tag is expected to resolve to commit
2219a21c2eb237b7d8ee004ea8bbeb098b70106e. The CLI verifies this before
scaffolding with the default reference and fails rather than silently using a
moved tag.
When the Starter changes, its maintainers first publish a new versioned release, such as v0.14.0. The CLI is then updated to use that release, all generated-project checks must pass, and a new CLI version is published. This keeps Starter and CLI releases independently versioned while preserving a tested compatibility relationship.
Every generated project records its CLI version, Starter repository, Starter ref, Starter commit, framework, and modules in package.json and README.md.
Each CLI release bundles one Starter release. When the release is built, scripts/bundle-template.mjs clones the pinned Starter tag, verifies that it resolves to the pinned commit, and copies its tracked files into the package (template/ and template.lock.json). Running the CLI then needs no GitHub access for the default Starter.
The Starter describes itself in clubedge.template.json: its app directory, site config, environment files, Docker image name, and files that stay out of generated projects. Schema 2 manifests also list each framework's app directory, environment example, and Dockerfile. The CLI moves the selected framework's app to apps/web (renaming its package to @clubedge/web), moves its environment example and Dockerfile to the project root, leaves the other frameworks out, and removes their entries from pnpm-lock.yaml so pnpm install --frozen-lockfile keeps working. Schema 3 adds modules: for each option, the workspace packages it uses, the files it owns, the variant files that replace defaults, the root package.json scripts it sets, and the options it requires. Files listed under conditional contain clubedge:if <condition> / clubedge:end blocks (in #, //, <!-- -->, or JSX comments) that the CLI keeps or drops for the selection, always removing the markers; clubedge:if starter-repository marks sections for Starter maintainers only. The CLI refuses a Starter whose manifest schema is newer than it understands and asks you to update. Starters before v0.3.0 have no manifest and use the previous layout.
The CLI first builds a plan (the files to copy and the edits to make), which --dry-run prints, and then applies it. The source is organized the same way:
src/
cli/ argument parsing and terminal output
core/ manifest, template sources, customizations, planning, merging, and execution
steps/ Git initialization and dependency installation
utils/ file listing and copying, processes, and naming
| I want to | Read |
|---|---|
| Configure a generated project | Its SETUP.md, also in the Starter repository |
| Change modules or upgrade a project | Change an existing project |
| See where a project stands, or why it does not run | Check a project |
| Reproduce an exact Starter version | Version relationship |
| See what changed in each release | CHANGELOG.md |
| See what is planned next | ROADMAP.md |
| Contribute code | CONTRIBUTING.md |
| Report a security problem | SECURITY.md |
corepack enable
pnpm install
pnpm check # type-check sources and tests
pnpm test # unit and scaffolding tests
pnpm build # compile src/ to dist/
node ./bin/create.mjs my-app --template-dir ../clubedge-starter --dry-run
Without a bundled template, a local build downloads the pinned Starter release from GitHub and verifies its commit. Run pnpm bundle-template to bundle it, or pnpm bundle-template --from ../clubedge-starter to bundle a local checkout.
CI packs the CLI with npm pack, scaffolds clean projects from the packed tarball, installs their dependencies, runs linting, typechecking, unit tests, browser checks, and a production build, then starts each generated app and checks the landing page, sign-up page, dashboard, health endpoint, logo, and favicon. It also adds and removes modules in an existing project and upgrades a project from an older Starter. A scheduled, non-blocking compatibility job checks Starter main.
clubedge-starter.main, create a release tag such as v0.14.0, and publish the Starter release.clubedge.starterRef and clubedge.starterCommit in package.json to the new tested Starter tag, and bump version.The required CI job always tests the pinned default. The scheduled compatibility job tests Starter main early, but unreleased Starter changes must not change the stable CLI default.
Each phase ends with a Starter release and a CLI release pinned to it. The full plan is in ROADMAP.md.
| CLI release | Starter release | Theme |
|---|---|---|
| 0.5.0 to 0.9.0 | v0.5.0 to v0.8.0 | Optional modules, local services, add, remove, and upgrade |
| 0.10.0 | v0.9.0 | Module flags from the Starter's manifest, and email |
| 0.11.0 | v0.10.0 | Deployment |
| 0.12.0 | v0.11.0 | Payments |
| 0.13.0 | v0.12.0 | Background jobs |
| 0.14.0 | v0.13.0 | Observability |
| 0.15.0 | v0.13.1 | status and doctor, several modules in one change, conflict and upgrade summaries, macOS CI |
| 0.16.0 | v0.14.0 | Account settings page, browser error reporting and Sentry source maps, auth emails through the jobs queue |
| next | Show the Starter's version of a conflicted file next to yours |
Everyone taking part is expected to follow the code of conduct.
Copyright 2026 Clubedge Digital Systems. Licensed under the Apache License, Version 2.0. See LICENSE and NOTICE.
Create a Next.js or TanStack Start app from Clubedge Starter with one command, with only the modules you need: auth, storage, cache, email, payments, jobs, observability, deployment. Add, remove, or upgrade modules later with a three-way merge that keeps your edits. Every release pins a verified Starter version.
See the codeCreate a production-ready Next.js or TanStack Start app with one command, and keep it up to date.
Pick only the modules you need: auth, storage, email, payments, jobs, observability, deployment.
Add, remove, or upgrade them later without losing your own changes.
Website · Clubedge Starter · Changelog · Roadmap · Contributing
pnpm dlx @clubedge/create-clubedge-app my-app
Copying a starter is easy; living with it is not. You delete the services you don't use by hand, and once you've changed the code, every later improvement to the starter has to be copied over by hand too.
create-clubedge-app generates a project from a tested release of Clubedge Starter with only the modules you choose. A module you leave out is removed completely: its package, its provider SDK, its environment variables, its documentation, and its lockfile entries. The project records exactly what it was generated from, so later the CLI can add a module, remove one, or upgrade to a newer Starter release by merging the change into your code. Files you never touched are updated; your edits are kept.
Every CLI release is pinned to one Starter release and verified against it, so the same command always produces the same project.
You need Node.js 22.12 or newer and pnpm 10.9.0 or newer. Git is used for the default repository initialization.
pnpm dlx @clubedge/create-clubedge-app my-app
cd my-app
pnpm dev
Or start it with npm: npx @clubedge/create-clubedge-app my-app. The generated project is a pnpm workspace, so dependencies are installed with pnpm either way; the CLI falls back to corepack pnpm when pnpm is not on your path. Without a destination, the CLI asks where to create the project.
The generated project includes apps/web/.env.local, created from the example and pointing at the local services you chose. Its SETUP.md describes every variable and provider. The root route is a landing page named after your project, and the dashboard is at /dashboard.
The default Starter release ships inside the CLI package, so GitHub is only contacted when you pass --ref. Internet access is needed to install dependencies.
The Starter ships the same application for two React frameworks. Next.js is the default; pick TanStack Start with --framework, or choose interactively:
pnpm dlx @clubedge/create-clubedge-app my-app --framework tanstack-start
--framework | App | Production output |
|---|---|---|
next | Next.js App Router | Next.js standalone build |
tanstack-start | TanStack Start with Vite | Nitro .output server bundle |
Either way, the app lives in apps/web and uses the same shared packages, so the project layout, root scripts, and Docker commands are identical.
Authentication, file storage, caching, email, payments, background jobs, observability, local infrastructure, and deployment are modules. Each has a default, and anything you leave out is removed completely. The Starter's clubedge.template.json defines the modules, so a module a newer Starter adds gets its --<module> flag without a CLI change; --help lists the modules of the Starter this CLI release creates.
| Flag | Options | Default |
|---|---|---|
--auth | supabase, better-auth, none | supabase |
--storage | s3, supabase (needs Supabase Auth), none | s3 |
--cache | redis (falls back to memory without REDIS_URL), memory | redis |
--email | smtp (any provider, or a local inbox), resend, none | smtp |
--payments | stripe, none (needs an auth module) | none |
--jobs | pg-boss, none | none |
--observability | otel (OpenTelemetry, to any OTLP collector), sentry, none | none |
--deploy | docker (any container host), fly, railway, render, vercel, netlify | docker |
--infra | docker (Docker Compose), supabase (Supabase CLI), local (no Docker: PGlite and a local folder), none | docker |
# Only the monorepo, UI, database, and tooling
pnpm dlx @clubedge/create-clubedge-app my-app --auth none --storage none --cache memory --email none
# A SaaS starting point: your own auth, payments, and background jobs, no Docker needed
pnpm dlx @clubedge/create-clubedge-app my-app --auth better-auth --payments stripe --jobs pg-boss --infra local
Interactive runs ask whether to customize these after the framework question.
Usage:
pnpm dlx @clubedge/create-clubedge-app [project-directory] [options]
pnpm dlx @clubedge/create-clubedge-app add [module option]... (inside a project)
pnpm dlx @clubedge/create-clubedge-app remove [module]... (inside a project)
pnpm dlx @clubedge/create-clubedge-app upgrade [--ref <tag>] (inside a project)
Options:
--framework <id> App framework, such as next or tanstack-start
--<module> <option> A module option, such as --auth none; the Starter lists its modules
--ref <ref> Download this Starter tag, branch, or commit from GitHub instead
(upgrade: the Starter to upgrade to)
--template-dir <path> Scaffold from a local Starter checkout (for Starter development)
--dry-run Show what would be created or changed without writing anything
--force add/remove: change a project with uncommitted changes or without Git
-y, --yes Accept defaults and never prompt (default directory: my-app)
--no-install Skip dependency installation
--no-git Skip Git repository initialization
-h, --help Show this help
-v, --version Show the CLI version
The target directory must be empty or not exist. The CLI never deletes or overwrites existing files, and if scaffolding fails it removes whatever it wrote, so a failed run leaves nothing behind.
# Preview the files and edits without writing anything
pnpm dlx @clubedge/create-clubedge-app my-app --dry-run
# Non-interactive, for scripts and CI
pnpm dlx @clubedge/create-clubedge-app my-app --yes --no-git --framework tanstack-start
# Try an unreleased Starter change
pnpm dlx @clubedge/create-clubedge-app my-app --ref main
# Reproduce a specific Starter release or commit
pnpm dlx @clubedge/create-clubedge-app my-app --ref v0.14.0
pnpm dlx @clubedge/create-clubedge-app my-app --ref <commit-sha>
# Test local Starter changes before releasing them
pnpm dlx @clubedge/create-clubedge-app my-app --template-dir ../clubedge-starter
Inside a project created by the CLI, add and remove change modules, and upgrade moves the project to a newer Starter release. Projects from Starter v0.8.0 on have a clubedge script, so pnpm clubedge add cache redis works too. Without a module or option, add and remove ask for them:
pnpm clubedge add # choose a module and option from a list
pnpm dlx @clubedge/create-clubedge-app add cache redis # or switch: add auth better-auth
pnpm dlx @clubedge/create-clubedge-app remove storage
pnpm clubedge add email resend payments stripe # several modules as one change
pnpm clubedge remove storage payments
pnpm dlx @clubedge/create-clubedge-app add infra local --dry-run
pnpm dlx @clubedge/create-clubedge-app@latest upgrade # to the newest CLI's Starter release
pnpm dlx @clubedge/create-clubedge-app upgrade --ref v0.14.0 # or a specific tag, branch, or commit
The CLI renders the project twice, from the Starter commit and modules recorded in your package.json and from the new state, and merges the difference into your project. The new state has other modules for add and remove, and the newer Starter with the same modules for upgrade. Modules a newer Starter introduces start as none where possible, so an upgrade never adds a service on its own.
<<<<<<< yours ... >>>>>>> clubedge) for you to resolve.apps/web/.env.local keeps your values. Values still at their generated defaults follow the new selection, and new variables are added.pnpm-lock.yaml is replaced if you never changed your dependencies; otherwise pnpm install reconciles it.Several modules in one command are applied as one change, and their requirements are checked together, so add auth supabase storage supabase works even though Supabase Storage needs Supabase Auth. When lines conflict, the CLI lists each file with its number of conflict blocks. Before an upgrade, it lists the Starter releases it crosses with the sections of their release notes, such as v0.13.0 Observability, Tests, Also.
The project must be a Git repository without uncommitted changes, so you can review the result with git diff and undo it. Pass --force to skip this check. Add --no-install to skip pnpm install. Afterward, run pnpm db:migrate and pnpm check:services if the change added tables or services.
Two read-only commands help you keep a project healthy:
pnpm clubedge status # Starter release, modules, Git state, and whether a newer Starter exists
pnpm clubedge doctor # Node.js, pnpm, dependencies, lockfile, env file, and pnpm check:services
status ends with the command to run next, such as pnpm clubedge upgrade when a newer Starter release is available; it asks npm for the newest CLI and still works offline. doctor checks that Node.js and pnpm meet the project's versions, that dependencies are installed, that pnpm-lock.yaml matches every package.json, and that apps/web/.env.local has every variable in .env.example, then runs pnpm check:services (skip it with --no-services). It exits with an error when a check fails, so it also works in CI.
Each CLI release is tested against one specific Starter release:
create-clubedge-app v0.16.0
|
v
Clubedge Starter v0.14.0
commit 2219a21c2eb237b7d8ee004ea8bbeb098b70106e
The current relationship is:
| CLI release | Default Starter release | Meaning |
|---|---|---|
create-clubedge-app@0.16.0 | clubedge-starter@v0.14.0 | The CLI's required, tested default |
This means the same CLI version always scaffolds the same Starter revision by default. The CLI does not silently follow Starter main.
The v0.14.0 tag is expected to resolve to commit
2219a21c2eb237b7d8ee004ea8bbeb098b70106e. The CLI verifies this before
scaffolding with the default reference and fails rather than silently using a
moved tag.
When the Starter changes, its maintainers first publish a new versioned release, such as v0.14.0. The CLI is then updated to use that release, all generated-project checks must pass, and a new CLI version is published. This keeps Starter and CLI releases independently versioned while preserving a tested compatibility relationship.
Every generated project records its CLI version, Starter repository, Starter ref, Starter commit, framework, and modules in package.json and README.md.
Each CLI release bundles one Starter release. When the release is built, scripts/bundle-template.mjs clones the pinned Starter tag, verifies that it resolves to the pinned commit, and copies its tracked files into the package (template/ and template.lock.json). Running the CLI then needs no GitHub access for the default Starter.
The Starter describes itself in clubedge.template.json: its app directory, site config, environment files, Docker image name, and files that stay out of generated projects. Schema 2 manifests also list each framework's app directory, environment example, and Dockerfile. The CLI moves the selected framework's app to apps/web (renaming its package to @clubedge/web), moves its environment example and Dockerfile to the project root, leaves the other frameworks out, and removes their entries from pnpm-lock.yaml so pnpm install --frozen-lockfile keeps working. Schema 3 adds modules: for each option, the workspace packages it uses, the files it owns, the variant files that replace defaults, the root package.json scripts it sets, and the options it requires. Files listed under conditional contain clubedge:if <condition> / clubedge:end blocks (in #, //, <!-- -->, or JSX comments) that the CLI keeps or drops for the selection, always removing the markers; clubedge:if starter-repository marks sections for Starter maintainers only. The CLI refuses a Starter whose manifest schema is newer than it understands and asks you to update. Starters before v0.3.0 have no manifest and use the previous layout.
The CLI first builds a plan (the files to copy and the edits to make), which --dry-run prints, and then applies it. The source is organized the same way:
src/
cli/ argument parsing and terminal output
core/ manifest, template sources, customizations, planning, merging, and execution
steps/ Git initialization and dependency installation
utils/ file listing and copying, processes, and naming
| I want to | Read |
|---|---|
| Configure a generated project | Its SETUP.md, also in the Starter repository |
| Change modules or upgrade a project | Change an existing project |
| See where a project stands, or why it does not run | Check a project |
| Reproduce an exact Starter version | Version relationship |
| See what changed in each release | CHANGELOG.md |
| See what is planned next | ROADMAP.md |
| Contribute code | CONTRIBUTING.md |
| Report a security problem | SECURITY.md |
corepack enable
pnpm install
pnpm check # type-check sources and tests
pnpm test # unit and scaffolding tests
pnpm build # compile src/ to dist/
node ./bin/create.mjs my-app --template-dir ../clubedge-starter --dry-run
Without a bundled template, a local build downloads the pinned Starter release from GitHub and verifies its commit. Run pnpm bundle-template to bundle it, or pnpm bundle-template --from ../clubedge-starter to bundle a local checkout.
CI packs the CLI with npm pack, scaffolds clean projects from the packed tarball, installs their dependencies, runs linting, typechecking, unit tests, browser checks, and a production build, then starts each generated app and checks the landing page, sign-up page, dashboard, health endpoint, logo, and favicon. It also adds and removes modules in an existing project and upgrades a project from an older Starter. A scheduled, non-blocking compatibility job checks Starter main.
clubedge-starter.main, create a release tag such as v0.14.0, and publish the Starter release.clubedge.starterRef and clubedge.starterCommit in package.json to the new tested Starter tag, and bump version.The required CI job always tests the pinned default. The scheduled compatibility job tests Starter main early, but unreleased Starter changes must not change the stable CLI default.
Each phase ends with a Starter release and a CLI release pinned to it. The full plan is in ROADMAP.md.
| CLI release | Starter release | Theme |
|---|---|---|
| 0.5.0 to 0.9.0 | v0.5.0 to v0.8.0 | Optional modules, local services, add, remove, and upgrade |
| 0.10.0 | v0.9.0 | Module flags from the Starter's manifest, and email |
| 0.11.0 | v0.10.0 | Deployment |
| 0.12.0 | v0.11.0 | Payments |
| 0.13.0 | v0.12.0 | Background jobs |
| 0.14.0 | v0.13.0 | Observability |
| 0.15.0 | v0.13.1 | status and doctor, several modules in one change, conflict and upgrade summaries, macOS CI |
| 0.16.0 | v0.14.0 | Account settings page, browser error reporting and Sentry source maps, auth emails through the jobs queue |
| next | Show the Starter's version of a conflicted file next to yours |
Everyone taking part is expected to follow the code of conduct.
Copyright 2026 Clubedge Digital Systems. Licensed under the Apache License, Version 2.0. See LICENSE and NOTICE.