Configuration reference
Find environment fields, source settings and the steps needed to apply a change.
Use this reference when you need to look up a setting or change an installed app. For your first installation, start with Configuration, which walks through the choices to make before Kickstart.
Three places to configure behavior
Root .env holds installation inputs and generated runtime values. config/ holds source-controlled product choices. Provider-owned resources hold state such as the initialized Stripe catalog. Choose the existing source of truth rather than creating another editable copy.
Keep one assignment per environment name. Kickstart reads root .env; do not add conflicting .env.local values. A local file change does not automatically update deployed variables or hosted Auth/function settings. The action column below explains the next step.
Source configuration
| File | Responsibility |
|---|---|
config/site.ts | Brand name and base description |
config/marketing.ts | Public positioning and marketing content |
config/seo.ts | Real public pages, language/locale and social image |
config/billing-seed.json | Initial missing catalog seed |
config/integrations.json | REST/MCP/OAuth switches and enabled workspace operations |
config/deployment.json | Explicit source-export roots |
lib/ai/config.mjs | AI example model/context/cost policy |
lib/onboarding.ts | Survey choices and validation |
Start with the file responsible for the behavior you want to change. For example, editing a page's marketing copy belongs in source; changing an API key belongs in the private environment; changing an initialized subscription price follows the Stripe catalog workflow.
Change the product name and description
Set your product name in the existing root .env entry:
APP_NAME=FieldnotesThe complete config/site.ts module can then keep that environment override and supply your product description:
export const site = {
name: process.env.APP_NAME || 'Fieldnotes',
description: 'Shared project notes for teams that work with customers.',
}Restart the development server after changing the environment and verify the header and public metadata. Update the page copy in config/marketing.ts, logos, social artwork and email wording as part of branding. APP_NAME is not a global search-and-replace tool and does not rename provider resources that already exist.
Choose the integration surface
config/integrations.json owns the supported REST/MCP switches. This complete example keeps the REST API available and disables MCP and its OAuth connection flow:
{
"apiEnabled": true,
"mcpEnabled": false,
"oauthEnabled": false,
"operations": ["get_workspace", "rename_workspace"]
}Use the existing operation names; adding a string does not implement a new endpoint or permission. Check the server routes and connection UI after the change, and review issued credentials before retiring an integration. REST API and MCP explain the shared contracts.
Common configuration tasks
| You want to… | Change | Then verify |
|---|---|---|
| Brand the app | APP_NAME, config/site.ts, config/marketing.ts and shared assets | Header, page copy, metadata and emails |
| Require email verification | AUTH_EMAIL_VERIFICATION=true | Reconcile Auth through kickstart, then test a new signup and inbox link |
| Enable the AI example | AI_ENABLED, OPENROUTER_API_KEY, AI_MODEL | Follow the scoped AI installation and response checks |
| Edit prices | config/billing-seed.json before initialization; owned Stripe test catalog afterward | Catalog synchronization, checkout and subscription events |
| Publish discoverable pages | Real page entries in config/seo.ts, then SEO_INDEXABLE=true at launch | Production canonicals, robots, sitemap and public content |
| Change the app's origin | Active APP_URL plus the documented origin workflow | Auth redirects, email links and MCP/OAuth callbacks |
The sections below list the exact environment fields, including generated values you should preserve. They are a reference for your installed project; you only need the three credentials from Accounts for the first installation.
Application and Supabase values
| Field | Initial/default | Visibility and consumer | Change action |
|---|---|---|---|
APP_NAME | Forma; optional input | Site branding and setup naming | Restart/rebuild; review sample copy and email templates |
APP_URL | http://localhost:3000 | Active runtime/setup origin | Reconcile Auth/email/MCP and rebuild; follow origin guards |
APP_URL_DEV | http://127.0.0.1:3000 | Saved reference only | Editing alone changes no active origin |
APP_URL_LIVE | Generated; optional custom-domain input | Saved production reference; deployment uses it | Verify domain, then reconcile production |
SEO_INDEXABLE | false | Public discovery policy at build/runtime | Rebuild after deliberate launch choice |
SUPABASE_ACCESS_TOKEN | Required local input | Setup-only Management API | Check same account/target; never deploy as runtime |
AUTH_EMAIL_VERIFICATION | false | Hosted Auth and server behavior | Run kickstart for selected active origin |
HOSTED_TEST_PROJECT_REF | Blank; opt-in test target | Test runner guard | Set only to the explicitly authorized test reference |
SUPABASE_PROJECT_REF | Generated | Setup/recovery target identity | Preserve; changing target is a new installation decision |
NEXT_PUBLIC_SUPABASE_URL | Generated | Public browser/server project URL | Keep consistent with saved reference |
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Generated | Intentionally public browser/server key | Rebuild clients after an intentional provider rotation |
SUPABASE_SECRET_KEY | Generated | Server-only privileged operations | Coordinate private runtime updates and verify narrow consumers |
SUPABASE_EMAIL_HOOK_SECRET | Generated | Signed hosted Auth email hook | Coordinated hook/runtime reconciliation; never browser code |
SUPABASE_ORGANIZATION_SLUG and SUPABASE_REGION are optional bootstrap overrides accepted by the parser even though the example file only links to them in comments. Organization selection uses the real slug. A region override must be available. Neither is another credential.
Email values
| Field | Initial/default | Consumer | Change action |
|---|---|---|---|
RESEND_API_KEY | Required Full access input | Setup and server email | Preserve account; publish/reconcile and update runtime on rotation |
RESEND_FROM_EMAIL | Blank → sender discovery | Setup, hosted hook and server sends | Verify domain, reconcile, restart/redeploy |
RESEND_TEST_MODE | Blank → discovery | Recipient restrictions | false requires a verified sender |
CONTACT_TO_EMAIL | Blank; optional input | Public contact delivery recipient | Set monitored inbox and redeploy runtime |
RESEND_TEMPLATE_WELCOME_ID | Generated | Welcome delivery | Preserve installer ownership |
RESEND_TEMPLATE_VERIFICATION_ID | Generated | Hosted Auth email hook | Publish template changes through setup |
RESEND_TEMPLATE_PASSWORD_RESET_ID | Generated | Hosted recovery email hook | Publish/reconcile |
RESEND_TEMPLATE_MAGIC_LINK_ID | Generated | Hosted magic-link email hook | Publish/reconcile |
RESEND_TEMPLATE_WORKSPACE_INVITATION_ID | Generated | Server invitation delivery | Publish/reconcile |
These IDs identify published templates; they are not interchangeable with API keys. Source HTML and installer variable definitions must stay aligned. See email delivery.
Billing and AI values
| Field | Initial/default | Consumer | Change action |
|---|---|---|---|
STRIPE_TEST_SECRET_KEY | Required when billing enabled | Test setup/server billing | Check mode/account; reconcile after rotation |
STRIPE_LIVE_SECRET_KEY | Deployment input when billing enabled | Live setup/production billing | Update production privately and verify payment flow |
STRIPE_TEST_WEBHOOK_SECRET | Generated | Hosted test signature verification | Restore/rotate only for matching endpoint |
STRIPE_LIVE_WEBHOOK_SECRET | Generated | Hosted live signature verification | Coordinate endpoint/function state |
STRIPE_TEST_PRODUCT_ID_STARTER | Generated | Test catalog identity | Preserve |
STRIPE_TEST_PRODUCT_ID_PRO | Generated | Test catalog identity | Preserve |
STRIPE_TEST_PRODUCT_ID_GROWTH | Generated | Test catalog identity | Preserve |
STRIPE_LIVE_PRODUCT_ID_STARTER | Generated | Live catalog identity | Preserve |
STRIPE_LIVE_PRODUCT_ID_PRO | Generated | Live catalog identity | Preserve |
STRIPE_LIVE_PRODUCT_ID_GROWTH | Generated | Live catalog identity | Preserve |
AI_ENABLED | false | Server/UI feature availability | Supply model/key, install AI, restart/redeploy |
OPENROUTER_API_KEY | Optional server-only input | AI requests | Verify provider access/funding; update runtime privately |
AI_MODEL | openai/gpt-4.1-mini | AI server/provider configuration | Check supported model; restart/redeploy |
Prices and seat/usage limits are not extra environment variables. Initial prices come from config/billing-seed.json; after initialization, the owned Stripe test catalog becomes the authoring source. This table deliberately does not reproduce an editable catalog. Workspace AI credits are one-time and independent of subscription prices.
GitHub and Vercel values
| Field | Initial/default | Consumer | Change action |
|---|---|---|---|
GITHUB_TOKEN | Deployment input | Setup-only source publication | Rotate for same owner/repository; run check |
GITHUB_OWNER | Discovered; optional override | Repository ownership | Deliberately choose before first provisioning |
GITHUB_REPO_NAME | Derived; optional override | Repository name | Keep receipt/provider identity consistent |
GITHUB_REPO_ID | Generated or verified empty-repo input | Recovery identity | Preserve numeric ID |
GITHUB_REPOSITORY | Generated | Saved owner/name reference | Preserve |
VERCEL_TOKEN | Deployment input | Setup-only project management | Rotate for same intended team |
VERCEL_TEAM_ID | Discovered; optional override | Team identity | Use actual team_ ID when needed |
VERCEL_PROJECT_NAME | Derived; optional override | Initial project name | Set before creation; generated state then preserved |
VERCEL_PROJECT_ID | Generated | Recovery identity | Preserve prj_ ID |
Google OAuth client ID and secret are configured only in hosted Supabase. Do not add them to this table's runtime environment. The production allowlist is productionEnvironment() in scripts/kickstart/deploy-config.mjs; it is the authoritative code for values that leave the setup computer.
Apply a feature switch
To enable AI on an installed, authorized target, set AI_ENABLED=true, fill OPENROUTER_API_KEY, retain a supported AI_MODEL, and use the scoped AI install procedure. Restart Next.js and verify a real response separately. Changing the visible menu is not equivalent to installing the schema.
For integration switches, disable the corresponding server route and consent surface as defined by the shared config, not only a sidebar item. Database grants and issued credentials still deserve a review when removing a capability. Billing removal similarly requires handling existing subscriptions rather than hiding the Billing tab.
Active and saved URLs
APP_URL drives active application behavior. The two saved references do not create independent local/live Supabase environments. Once deployed, shared Auth/email/MCP settings use production and ordinary local setup stops to prevent accidental reversal. Read origin recovery before changing them.
Validate a configuration change
Identify its consumer, update one source of truth, run the relevant read-only check, then perform only the authorized provisioning/runtime action. Verify the actual UI and failure state. Keep generated identifiers and private receipts. A successful parser or TypeScript check proves neither permissions to write provider resources nor the availability of a configured model or sender.
Template 0.0.1 · September 2026 source snapshot