monostack.config.json
Every derived app has a monostack.config.json at its root that tracks its relationship to a parent app. Both migrate and update rely on this file to determine what's changed and what to sync.
Schema
{
"parentCommit": "abc123...",
"parentApp": "boiler",
"excludedFiles": [
"src/routes/(website)/**"
]
}
Fields
| Field | Required | Default | Description |
|---|---|---|---|
parentCommit | Yes | — | SHA of the last synced commit from the parent app. Used by update and migrate to determine which changes are new. |
parentApp | No | "boiler" | Name of the parent app directory. Determines which apps/ folder to diff against. |
excludedFiles | No | [] | Glob patterns for files to skip during sync. Paths are relative to the app root. |
excludedFiles
Use excludedFiles to permanently skip files that only belong to the parent app or that your app has completely replaced.
{
"parentCommit": "0a2c73f...",
"excludedFiles": [
"src/routes/(website)/**",
"src/lib/domains/billing/"
]
}
These patterns are checked in addition to the built-in exclusions:
src/routes/(admin)/example-models/src/lib/domains/exampleModels/monostack.config.jsondrizzle/src/locales/.env- All patterns from the root
.gitignore
Files matching any of these patterns are silently skipped — they won't appear in merge reports or conflict prompts.
How it's used
mono updateandmono migratereadparentCommitto find new commits, then update it after applying changes (unless--no-updateis passed).mono scaffold appcreates this file automatically with the current HEAD commit and parent name.- The config file itself is always excluded from syncs so it's never overwritten by the parent.
Examples
Minimal config (inherits from boiler):
{
"parentCommit": "ff8f46d11e89912f8eca9fff9a3f3e4a07b08d57"
}
Custom parent app:
{
"parentCommit": "6168e674329d2b2e8e5c791a69dbec8a1d2296ff",
"parentApp": "boiler-st"
}
With excluded files:
{
"parentCommit": "0a2c73ffe2991b40ad3b17b1d7e3b30b91ce68dd",
"excludedFiles": [
"src/routes/(website)/**"
]
}