Eject
Permanently sever every GenerateSaaS tie - heartbeat, manifest, license route, and update tooling.
generatesaas eject (packages/cli/src/commands/eject.ts) is the permanent, supported opt-out from the license heartbeat. It deletes the CLI's connective tissue so the project becomes fully standalone - your application code and @repo/config flags keep working unchanged.
This is irreversible and requires typing eject to confirm. Commit first so the diff is reviewable, and note you lose generatesaas update for good.
Before removing anything, eject sends one final, disclosed opt-out event to generatesaas.com (the same endpoint as the daily heartbeat, marked event: "eject"). It exists so a legitimately ejected project is distinguishable from an unlicensed copy. It is best-effort - ejecting works offline too - and nothing is ever sent again afterwards.
What it removes
Run from the project root (it aborts if .generatesaas/manifest.json is missing).
| Target | Action |
|---|---|
packages/api/src/functions/maintenance/license-heartbeat.ts | Deleted - the daily heartbeat cron |
packages/api/src/lib/manifest.ts | Deleted - the build-time manifest reader |
packages/api/src/routes/internal/license.ts | Deleted - the internal /license route |
.generatesaas/ | Deleted - manifest dir (license token, version) |
generatesaas-update skill dirs | Deleted - installed AI update skills |
packages/api/src/routes/inngest.ts | Modified - strips heartbeat import + registration |
packages/api/src/routes/internal/index.ts | Modified - strips license route import + .route() |
.gitignore | Modified - removes .generatesaas entries |
Skill dirs are resolved from the manifest's aiTools; if none are recorded, all known roots are cleaned. Each delete is no-op-safe - missing targets are skipped, not errored.
How it runs
.generatesaas/manifest.json; cancels with a non-zero exit if absent or unparseable.eject exactly; anything else (or Ctrl+C) cancels..generatesaas/ directory..gitignore.If a barrel can't be auto-modified (its lines shifted), eject logs a warning naming the file so you can remove the references manually - it never fails silently.
What survives, what's lost
| Survives | Lost |
|---|---|
| All product code, pages, components | The daily heartbeat cron |
Every @repo/config flag + the features it gates | The dormant license layer (/license route, manifest reader) |
| Database, billing, auth, every backend package | generatesaas update - no more CLI-delivered version diffs |
Frequently asked questions
Can I undo an eject?
No. The deletions are real filesystem changes with no restore path. Recovery means git revert / git checkout of the commit - which is why you commit before running it.
Will my app break after ejecting? No. The removed files are GenerateSaaS infrastructure, not application logic; the manifest reader already goes dormant when the token is empty, so nothing user-facing depends on it.
Do I have to eject to stop the heartbeat? Only if you want it gone permanently. The heartbeat validates your install and sends no application or user data - eject is the clean, supported removal, not a workaround.
Licensing & Heartbeat
Learn how the license manifest and daily heartbeat validate your installation, what data the cron sends, and how to opt out permanently with eject.
Customization
Rebrand the boilerplate by editing branding, logo, social, and SEO fields in @repo/config plus your English i18n copy - one source of truth per surface.