Every field and allowed value
[app]
name = "my-app" # 3-40 chars, lowercase, a-z 0-9 and hyphens
runtime = "node" # node | bun | python | static | docker
framework = "nextjs" # optional: nextjs, sveltekit, astro, remix,
# nuxt, vite, express, fastify, hono, elysia,
# fastapi, flask, django, docker
[build]
command = "bun run build" # custom build command (optional)
output = ".next" # build output directory (optional)
pass_env = [ # opt-in: expose these env vars at BUILD time
"NEXT_PUBLIC_API_URL", # (Vite/Next/Astro/Expo bake *_PUBLIC_* into
"VITE_PB_URL", # the bundle, so they need build-time access)
] # Values come from "percher env set", never
# from this TOML — only key names live here.
[web]
port = 3000 # port your app listens on (1024-65535)
health = "/health" # health check endpoint (default: /)
password = true # optional: password-gate via SITE_PASSWORD env
[resources]
memory = "512mb" # 128mb | 256mb | 512mb | 1gb | 2gb
cpu = 0.5 # 0.25 - 2.0
instances = 2 # Phase 6.1 — static N containers. Plan-gated
# (free=1, starter=1, maker=2, pro=4).
# Mutually exclusive with [resources.autoscale].
# Or: CPU-based autoscaling (Phase 6.3)
[resources.autoscale]
min = 1 # initial + floor (plan-clamped)
max = 4 # ceiling (plan-clamped)
# Optional fine-tuning. Most users leave these at defaults:
# scale_up_cpu_percent = 80
# scale_up_sustain_seconds = 120
# scale_down_cpu_percent = 20
# scale_down_sustain_seconds = 600
# cooldown_seconds = 180
[data]
mode = "pocketbase" # pocketbase | convex | supabase | external | none
# mode = "convex"
# convex.deployment_url = "https://your-project.convex.cloud"
# mode = "supabase"
# supabase.url = "https://your-project.supabase.co"
# supabase.anon_key = "eyJ..."
[domain]
custom = "myapp.com" # custom domain (requires DNS setup)
[env]
STRIPE_KEY = "sk_live_..." # environment variables
API_SECRET = "..."
[crons]
cleanup = { schedule = "0 3 * * *", command = "node cleanup.js" }
report = { schedule = "*/15 * * * *", command = "python report.py" }
[dev]
ignore = ["*.log", "tmp/"] # files to ignore in dev mode
debounce = 300 # ms to wait before rebuilding (100-10000)
[required_env]
STRIPE_KEY = "secret" # must be set before deploy
DATABASE_URL = "url" # validates URL format
APP_NAME = "string" # any non-empty string