Skip to content
Documentation
Build your product

Configuration reference

Find environment fields, source settings and the steps needed to apply a change.

View Markdown

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

FileResponsibility
config/site.tsBrand name and base description
config/marketing.tsPublic positioning and marketing content
config/seo.tsReal public pages, language/locale and social image
config/billing-seed.jsonInitial missing catalog seed
config/integrations.jsonREST/MCP/OAuth switches and enabled workspace operations
config/deployment.jsonExplicit source-export roots
lib/ai/config.mjsAI example model/context/cost policy
lib/onboarding.tsSurvey 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=Fieldnotes

The complete config/site.ts module can then keep that environment override and supply your product description:

config/site.ts
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:

config/integrations.json
{
  "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…ChangeThen verify
Brand the appAPP_NAME, config/site.ts, config/marketing.ts and shared assetsHeader, page copy, metadata and emails
Require email verificationAUTH_EMAIL_VERIFICATION=trueReconcile Auth through kickstart, then test a new signup and inbox link
Enable the AI exampleAI_ENABLED, OPENROUTER_API_KEY, AI_MODELFollow the scoped AI installation and response checks
Edit pricesconfig/billing-seed.json before initialization; owned Stripe test catalog afterwardCatalog synchronization, checkout and subscription events
Publish discoverable pagesReal page entries in config/seo.ts, then SEO_INDEXABLE=true at launchProduction canonicals, robots, sitemap and public content
Change the app's originActive APP_URL plus the documented origin workflowAuth 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

FieldInitial/defaultVisibility and consumerChange action
APP_NAMEForma; optional inputSite branding and setup namingRestart/rebuild; review sample copy and email templates
APP_URLhttp://localhost:3000Active runtime/setup originReconcile Auth/email/MCP and rebuild; follow origin guards
APP_URL_DEVhttp://127.0.0.1:3000Saved reference onlyEditing alone changes no active origin
APP_URL_LIVEGenerated; optional custom-domain inputSaved production reference; deployment uses itVerify domain, then reconcile production
SEO_INDEXABLEfalsePublic discovery policy at build/runtimeRebuild after deliberate launch choice
SUPABASE_ACCESS_TOKENRequired local inputSetup-only Management APICheck same account/target; never deploy as runtime
AUTH_EMAIL_VERIFICATIONfalseHosted Auth and server behaviorRun kickstart for selected active origin
HOSTED_TEST_PROJECT_REFBlank; opt-in test targetTest runner guardSet only to the explicitly authorized test reference
SUPABASE_PROJECT_REFGeneratedSetup/recovery target identityPreserve; changing target is a new installation decision
NEXT_PUBLIC_SUPABASE_URLGeneratedPublic browser/server project URLKeep consistent with saved reference
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEYGeneratedIntentionally public browser/server keyRebuild clients after an intentional provider rotation
SUPABASE_SECRET_KEYGeneratedServer-only privileged operationsCoordinate private runtime updates and verify narrow consumers
SUPABASE_EMAIL_HOOK_SECRETGeneratedSigned hosted Auth email hookCoordinated 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

FieldInitial/defaultConsumerChange action
RESEND_API_KEYRequired Full access inputSetup and server emailPreserve account; publish/reconcile and update runtime on rotation
RESEND_FROM_EMAILBlank → sender discoverySetup, hosted hook and server sendsVerify domain, reconcile, restart/redeploy
RESEND_TEST_MODEBlank → discoveryRecipient restrictionsfalse requires a verified sender
CONTACT_TO_EMAILBlank; optional inputPublic contact delivery recipientSet monitored inbox and redeploy runtime
RESEND_TEMPLATE_WELCOME_IDGeneratedWelcome deliveryPreserve installer ownership
RESEND_TEMPLATE_VERIFICATION_IDGeneratedHosted Auth email hookPublish template changes through setup
RESEND_TEMPLATE_PASSWORD_RESET_IDGeneratedHosted recovery email hookPublish/reconcile
RESEND_TEMPLATE_MAGIC_LINK_IDGeneratedHosted magic-link email hookPublish/reconcile
RESEND_TEMPLATE_WORKSPACE_INVITATION_IDGeneratedServer invitation deliveryPublish/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

FieldInitial/defaultConsumerChange action
STRIPE_TEST_SECRET_KEYRequired when billing enabledTest setup/server billingCheck mode/account; reconcile after rotation
STRIPE_LIVE_SECRET_KEYDeployment input when billing enabledLive setup/production billingUpdate production privately and verify payment flow
STRIPE_TEST_WEBHOOK_SECRETGeneratedHosted test signature verificationRestore/rotate only for matching endpoint
STRIPE_LIVE_WEBHOOK_SECRETGeneratedHosted live signature verificationCoordinate endpoint/function state
STRIPE_TEST_PRODUCT_ID_STARTERGeneratedTest catalog identityPreserve
STRIPE_TEST_PRODUCT_ID_PROGeneratedTest catalog identityPreserve
STRIPE_TEST_PRODUCT_ID_GROWTHGeneratedTest catalog identityPreserve
STRIPE_LIVE_PRODUCT_ID_STARTERGeneratedLive catalog identityPreserve
STRIPE_LIVE_PRODUCT_ID_PROGeneratedLive catalog identityPreserve
STRIPE_LIVE_PRODUCT_ID_GROWTHGeneratedLive catalog identityPreserve
AI_ENABLEDfalseServer/UI feature availabilitySupply model/key, install AI, restart/redeploy
OPENROUTER_API_KEYOptional server-only inputAI requestsVerify provider access/funding; update runtime privately
AI_MODELopenai/gpt-4.1-miniAI server/provider configurationCheck 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

FieldInitial/defaultConsumerChange action
GITHUB_TOKENDeployment inputSetup-only source publicationRotate for same owner/repository; run check
GITHUB_OWNERDiscovered; optional overrideRepository ownershipDeliberately choose before first provisioning
GITHUB_REPO_NAMEDerived; optional overrideRepository nameKeep receipt/provider identity consistent
GITHUB_REPO_IDGenerated or verified empty-repo inputRecovery identityPreserve numeric ID
GITHUB_REPOSITORYGeneratedSaved owner/name referencePreserve
VERCEL_TOKENDeployment inputSetup-only project managementRotate for same intended team
VERCEL_TEAM_IDDiscovered; optional overrideTeam identityUse actual team_ ID when needed
VERCEL_PROJECT_NAMEDerived; optional overrideInitial project nameSet before creation; generated state then preserved
VERCEL_PROJECT_IDGeneratedRecovery identityPreserve 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