Skip to main content
PercherPercher

percher.toml — full reference

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
← PrevPocketBase — database, auth & filesNext →MCP tools for AI assistants
Percher — AI-native app hosting