Skip to content

app.json Schema

app.json is an optional manifest at the root of your repo that tells Watasu how to bootstrap an app. It’s the source of truth for review apps, and useful anywhere you want repeatable provisioning.

FieldTypePurpose
namestringDisplay name.
descriptionstringShort summary.
logostring (URL)Logo image.
websitestring (URL)Project website.
repositorystring (URL)Source repo URL.
keywordsarray of stringsCategorization keywords.
success_urlstringPath to redirect to after a successful bootstrap.
envobjectDefault config vars (see env).
addonsarrayAdd-ons to provision (see addons).
formationobjectProcess formation defaults (see formation).
scriptsobjectLifecycle scripts (see scripts).

Each entry sets a config var on bootstrap.

"env": {
"RAILS_ENV": { "value": "production" },
"SECRET_KEY": { "generator": "secret" },
"API_BASE": { "required": true, "description": "External API base URL" }
}
KeyPurpose
valueLiteral value to set.
generatorGenerator to use (e.g. secret for a random string).
requiredIf true, bootstrap fails unless the user supplies a value.
descriptionHuman-readable hint shown to the user during bootstrap.

Each entry provisions and attaches an add-on. You can use a plain string for the default plan or service:plan for a specific tier.

"addons": [
"postgresql",
"postgresql:standard-0",
"valkey:hobby-1",
"object-storage"
]

For the full plan catalog, see Add-on Plans.

Sets initial replica counts and pod sizes per process type.

"formation": {
"web": { "quantity": 1, "size": "standard-1x" },
"worker": { "quantity": 1, "size": "standard-1x" }
}
KeyPurpose
quantityReplica count.
sizePod size (standard-1xstandard-16x). See Pod Sizes.

Lifecycle scripts that Watasu runs at specific points.

"scripts": {
"postdeploy": "bundle exec rails db:prepare && bundle exec rails db:seed",
"pr-predestroy": "bundle exec rails app:cleanup"
}
ScriptWhen it runs
postdeployOnce after the first successful deploy. Use for migrations and seeding.
pr-predestroyBefore a review app is torn down. Use for external cleanup.

Keep both scripts idempotent — they may run more than once over an app’s lifetime, especially postdeploy.

{
"name": "Example App",
"description": "A Watasu app with a database, cache, and review-app setup",
"repository": "https://github.com/example/example-app",
"keywords": ["rails", "example"],
"env": {
"RAILS_ENV": { "value": "production" },
"RAILS_MASTER_KEY": { "required": true, "description": "Rails encrypted credentials key" },
"SECRET_KEY_BASE": { "generator": "secret" }
},
"addons": [
"postgresql:hobby-0",
"valkey:hobby-1"
],
"formation": {
"web": { "quantity": 1, "size": "standard-1x" },
"worker": { "quantity": 1, "size": "standard-1x" }
},
"scripts": {
"postdeploy": "bundle exec rails db:prepare",
"pr-predestroy": "bundle exec rails app:cleanup"
}
}
  • Don’t put real secrets in app.json. Use generator: secret or required: true instead.
  • For review apps, lean on small plans (postgresql:hobby-0, valkey:hobby-0) — they don’t need production sizing.
  • Test the file with a real PR. Most issues only surface when an actual review app spins up.