Skip to content

Environment Variables

The starter reads these variables from .env through the files in config/. The Default column is what the config uses when the variable is not set. .env.example sets some of them to different values for local development.

Laravel’s own configuration files read many more variables than this page lists: the long tail in config/database.php, config/cache.php, config/session.php, config/logging.php, config/mail.php, config/queue.php and config/broadcasting.php. This page lists only those in .env.example or added by the starter. See Laravel’s configuration documentation and the config file itself for the rest.

VariableDefaultDescription
APP_NAMELaravelApplication name, shown in the header, emails and the browser title
APP_ENVproductionEnvironment name. The starter recognizes local, testing, ci, develop, qa, staging and production
APP_KEYnullEncryption key. Generate it with php artisan key:generate
APP_DEBUGfalseShow detailed error pages. Never true in production
APP_URLhttp://localhostBase URL of this environment
PRODUCTION_URLhttps://northwestern.eduURL of the production environment, linked from the lockdown page in other environments
APP_LOCALEenDefault locale
APP_FALLBACK_LOCALEenLocale used when a translation is missing
APP_FAKER_LOCALEen_USLocale for factory data
APP_MAINTENANCE_DRIVERfileWhere maintenance mode is stored (file or cache)
APP_MAINTENANCE_STOREdatabaseCache store for maintenance mode when the driver is cache
BCRYPT_ROUNDS12Password hashing cost
DEFAULT_USER_TIMEZONEAmerica/ChicagoTimezone given to users that Directory Search creates, and the users.timezone column’s default, set when the migration runs. Changing it later doesn’t change existing users or the column
AUDITING_ENABLEDtrueRecord model changes. See Audit Logging
LOG_CHANNELstackDefault log channel
LOG_STACKsingleComma-separated channels the stack channel writes to
LOG_DEPRECATIONS_CHANNELnullChannel for PHP and library deprecation warnings
LOG_LEVELdebugMinimum level written to the logs
VariableDefaultDescription
DB_CONNECTIONpgsqlDefault database connection
DB_HOST127.0.0.1PostgreSQL host
DB_PORT5432PostgreSQL port
DB_DATABASEnullDatabase name
DB_USERNAMErootDatabase user
DB_PASSWORD''Database password
DB_PHPUNIT_DATABASEnullSeparate database for the phpunit connection, which phpunit.xml selects, so tests never touch the main database
REDIS_HOST127.0.0.1Redis host
REDIS_PASSWORDnullRedis password
REDIS_PORT6379Redis port
FILESYSTEM_DISKs3Default filesystem disk
AWS_ACCESS_KEY_IDnullS3 access key. Also used by SES mail and the SQS and DynamoDB drivers
AWS_SECRET_ACCESS_KEYnullS3 secret key
AWS_DEFAULT_REGIONnullS3 region
AWS_BUCKETnullS3 bucket name
AWS_URLnullPublic URL of the bucket
AWS_ENDPOINTnullCustom S3 endpoint, such as a local RustFS server
AWS_USE_PATH_STYLE_ENDPOINTfalseUse path-style bucket URLs. Required for RustFS
AWS_BUCKET_KMS_KEY_ARNnullKMS key for server-side encryption. When set, uploads are encrypted with it
AWS_BUCKET_ENCRYPTION_ALGORITHMaws:kmsServer-side encryption algorithm, used only when AWS_BUCKET_KMS_KEY_ARN is set
AWS_SSL_VERIFYtrueVerify the S3 endpoint’s TLS certificate
S3_STREAM_READStrueStream S3 reads instead of loading whole files into memory. .env.example sets false; see its comment for the local HTTPS caveat
VariableDefaultDescription
SESSION_DRIVERdatabaseSession storage
SESSION_LIFETIME120Minutes of inactivity before a session expires. .env.example sets 480
SESSION_ENCRYPTtrueEncrypt session data
SESSION_SECURE_COOKIEtrue, or false in local when APP_URL is http://Send the session cookie over HTTPS only
SESSION_PATH/Session cookie path
SESSION_DOMAINnullSession cookie domain
CACHE_STOREfileDefault cache store
QUEUE_CONNECTIONsyncDefault queue connection. .env.example sets redis
BROADCAST_CONNECTIONnullDefault broadcaster
PUSHER_APP_IDnullPusher app ID, for the pusher broadcaster
PUSHER_APP_KEYnullPusher app key
PUSHER_APP_SECRETnullPusher app secret
PUSHER_APP_CLUSTERnullPusher cluster
VariableDefaultDescription
MAIL_MAILERlogDefault mailer. .env.example sets smtp
MAIL_HOST127.0.0.1SMTP host
MAIL_PORT2525SMTP port
MAIL_USERNAMEnullSMTP username
MAIL_PASSWORDnullSMTP password
MAIL_FROM_ADDRESSno-reply@northwestern.eduSender address for all mail, including health check alerts
MAIL_FROM_NAMENorthwestern UniversitySender name. .env.example sets it to APP_NAME
AWS_SES_EMAIL_REGIONus-east-1SES region, separate from AWS_DEFAULT_REGION

See Authentication and WebSSO. None of these are needed in the local environment, which offers Sign In As for the seeded demo users; deployed environments need a NetID provider.

VariableDefaultDescription
SUPER_ADMIN_NETIDS''Comma-separated NetIDs given the Super Administrator role by StakeholderSeeder, which deployments run (not db:rebuild). See Super Administrator Accounts
AZURE_CLIENT_IDnullEntra ID application ID. Entra ID sign-in is available when this and AZURE_CLIENT_SECRET are set
AZURE_CLIENT_SECRETnullEntra ID client secret
WEBSSO_API_KEYnullApigee key for Online Passport. Setting it switches sign-in from Entra ID to Online Passport
WEBSSO_STRATEGYapigeeOnline Passport strategy: apigee or forgerock-direct. forgerock-direct also enables Online Passport
WEBSSO_URL_BASEhttps://uat-nusso.it.northwestern.eduForgeRock base URL. Production uses https://prd-nusso.it.northwestern.edu
WEBSSO_API_URL_BASEhttps://northwestern-prod.apigee.net/agentless-webssoAgentless WebSSO API base URL
WEBSSO_REALMnorthwesternForgeRock realm
WEBSSO_TREEldap-and-duo when DUO_ENABLED is true, otherwise ldap-registryForgeRock authentication tree
WEBSSO_COOKIE_NAMEnussoName of the SSO session cookie
DUO_ENABLEDfalseRequire Duo multi-factor authentication, by selecting the ldap-and-duo tree

These configure passwordless verification codes for users without a NetID.

VariableDefaultDescription
LOCAL_AUTH_ENABLEDtrueAllow sign-in with a code sent by email
LOCAL_AUTH_USE_FIXED_CODEfalseIssue a predictable code (123456 for six digits). Throws in production, develop and qa
LOCAL_AUTH_RATE_LIMIT_PER_HOUR10Code requests per email address per hour
LOCAL_AUTH_RATE_LIMIT_PER_IP_PER_HOUR20Code requests per IP address per hour
LOCAL_AUTH_CODE_DIGITS6Digits in a code
LOCAL_AUTH_CODE_EXPIRES_MINUTES10Minutes before a code expires
LOCAL_AUTH_CODE_MAX_ATTEMPTS8Failed attempts before the challenge locks
LOCAL_AUTH_CODE_LOCK_MINUTES15Minutes a locked challenge stays locked
LOCAL_AUTH_CODE_RESEND_COOLDOWN30Seconds before another code can be sent

See API.

VariableDefaultDescription
API_ENABLEDtrueWhen false, every API route responds 404, and no token is issued or refreshed for service clients or connected applications
API_REQUEST_LOGGING_ENABLEDtrueLog API requests. See Request Logging
API_REQUEST_LOGGING_SLOW_THRESHOLD_MS500Milliseconds after which a logged request counts as slow
API_REQUEST_LOGGING_SAMPLING_ENABLEDfalseLog only a sample of successful requests. Failed requests are always logged
API_REQUEST_LOGGING_SAMPLE_RATE1.0Share of successful requests logged when sampling is on, from 0.0 to 1.0
API_CLIENT_SECRET_EXPIRATION_NOTIFICATIONS_ENABLEDtrueEmail API users’ contact addresses before a client secret expires. See Secret Expiration Notifications
API_PERSONAL_ACCESS_TOKEN_EXPIRATION_NOTIFICATIONS_ENABLEDtrueEmail people before their personal access tokens expire, unless they turned it off on their Preferences page
API_PERSONAL_ACCESS_TOKEN_MAX_LIFETIME_DAYS365The longest a personal access token may last. See Personal Access Tokens
API_PERSONAL_ACCESS_TOKEN_MAX_ACTIVE10How many working personal access tokens a person may hold at once
PASSPORT_PRIVATE_KEYnullThe RSA private key that signs access tokens. Set in deployed environments; locally, db:rebuild generates key files. See Signing Keys
PASSPORT_PUBLIC_KEYnullThe matching public key
PASSPORT_CONNECTIONnullDatabase connection for Passport’s tables; the default connection when unset
CORS_ALLOWED_ORIGINSemptyBrowser origins allowed to call the API, comma-separated. See Browser Access

See MCP Server.

VariableDefaultDescription
MCP_ENABLEDfalseTurns on the MCP server at /mcp, its OAuth discovery documents and client registration. When false, all of them respond 404
MCP_CUSTOM_SCHEMESemptyURI schemes desktop clients may redirect to after sign-in, comma-separated
MCP_REGISTRATIONS_PER_HOUR20Client registrations allowed per IP address per hour
MCP_TOOL_CALLS_PER_MINUTE60Tool calls allowed per person per minute
MCP_AUTHORIZATION_SERVERthe application URLThe OAuth issuer the discovery documents name
VariableDefaultDescription
DIRECTORY_SEARCH_API_KEYnullApigee key for Directory Search. Optional in local; required in deployed environments
DIRECTORY_SEARCH_URLhttps://northwestern-prod.apigee.net/directory-searchDirectory Search API base URL
DIRECTORY_SEARCH_HEALTH_CHECK_NETIDswd2981NetID the Directory Search health check looks up
EVENT_HUB_MOCK_ENABLEDtrue when APP_ENV is local, otherwise falseMock EventHub instead of calling it
EVENT_HUB_BASE_URLnullEventHub API base URL
EVENT_HUB_API_KEYnullApigee key for EventHub
EVENT_HUB_HMAC_VERIFICATION_SHARED_SECRETnullShared secret for verifying webhook signatures
EVENT_HUB_HMAC_VERIFICATION_HEADERX-HMAC-SignatureHeader that carries the webhook signature
EVENT_HUB_HMAC_VERIFICATION_ALGORITHM_TYPE_REGISTRATIONHmacSHA256Algorithm name sent to EventHub when registering the webhook
EVENT_HUB_HMAC_VERIFICATION_ALGORITHM_TYPE_PHPsha256Matching algorithm name passed to hash_hmac()
WILDCARD_PHOTO_SYNC_ENABLEDfalseDownload users’ Wildcard photos to S3 at sign-in

See Support Tickets.

VariableDefaultDescription
SUPPORT_ENABLEDfalseRegister the contact form and its routes
SUPPORT_DOCUMENTATION_URLnullUser documentation linked from the Help menu. The link is hidden while empty, whether or not support is enabled
SUPPORT_LIMITED_WARNINGtrue outside production, false in productionShow a limited-support warning on the contact form
SUPPORT_DRIVERmailTicket backend: mail or team-dynamix
SUPPORT_MAIL_TOyour-team@northwestern.eduRecipient of tickets from the mail driver and of the fallback email
SUPPORT_REFERENCE_PREFIXSUPPrefix of mail ticket references, such as SUP-47

Used only when SUPPORT_DRIVER is team-dynamix. See TeamDynamix Gateway.

VariableDefaultDescription
TDX_API_BASE_URLnullTeamDynamix web API base URL, such as https://services.northwestern.edu/TDWebApi
TDX_USERNAMEnullAPI username
TDX_PASSWORDnullAPI password
TDX_TICKET_APP_NAMEnullTDTickets application where tickets are created
TDX_CLIENT_APP_NAMEnullTDClient application where services are managed
TDX_ASSIGNEE_IDnullGroup that new tickets are assigned to
TDX_TICKET_TYPEDefaultTicket type
TDX_FORM_TYPENU Base Service RequestTicket form
TDX_TICKET_STATUSNewStatus of new tickets
TDX_TICKET_PRIORITYLow (P4)Priority of new tickets
TDX_SERVICEfrom APP_NAMEService the tickets are filed under

See Changelog.

VariableDefaultDescription
CHANGELOG_ENABLEDfalseRegister the changelog routes and navigation item
JIRA_URLhttps://nuitadminsystems.atlassian.netJira instance that issue references link to
JIRA_ISSUE_IDENTIFIERnullJira project key, such as GSTS. Issue references are linked only when this is set

These fill the unit lockup and the footer that the Web Style Guide requires. See Branding and Mail.

VariableDefaultDescription
NU_LOCKUPnullUnit lockup shown as every panel’s logo, as a URL or a path in public/. The Northwestern wordmark is used when unset
NU_UNIT_NAMEnullUnit name in the footer
NU_UNIT_ADDRESSnullStreet address
NU_UNIT_CITYnullCity, state and ZIP code
NU_UNIT_PHONEnullPhone number
NU_UNIT_FAXnullFax number
NU_UNIT_EMAILnullEmail address

A null unit field shows Information Technology’s details. An empty value hides that field.

Days to keep each kind of record before the daily model:prune deletes it. null or an empty value keeps records forever. See Data Retention.

VariableDefaultDescription
AUDIT_RETENTION_DAYSnull (kept forever)Audit logs
LOGIN_RECORD_RETENTION_DAYS365Sign-in records
IMPERSONATION_LOG_RETENTION_DAYSnull (kept forever)Impersonation logs
LOGIN_CHALLENGE_RETENTION_DAYS30Email verification code challenges
API_REQUEST_LOG_RETENTION_DAYS90API request logs

See Environment Lockdown.

VariableDefaultDescription
ENVIRONMENT_LOCKDOWN_ENABLEDfalse when APP_ENV is production, local, testing or ci, otherwise trueShow the lockdown page to users who have only the default role

All limits count requests. See the rate limiting sections of Authentication, API and Support Tickets.

VariableDefaultDescription
RATE_LIMIT_API_PER_MINUTE1800Authenticated requests per minute, per service client for client credentials tokens and per person for every other token
RATE_LIMIT_API_PER_IP_PER_MINUTE3600Requests per minute from one IP address to the API and Passport’s /oauth/* routes, counted before authentication
RATE_LIMIT_AUTH_LOGIN_CODE_REQUEST_PER_MINUTE5Verification code requests per IP per minute
RATE_LIMIT_AUTH_LOGIN_CODE_REQUEST_PER_EMAIL_PER_MINUTE3Verification code requests per email address per minute
RATE_LIMIT_AUTH_LOGIN_CODE_VERIFY_PER_MINUTE10Code verification attempts per IP per minute
RATE_LIMIT_AUTH_LOGIN_CODE_VERIFY_PER_CHALLENGE_PER_MINUTE5Code verification attempts per challenge per minute
RATE_LIMIT_AUTH_IMPERSONATE_PER_MINUTE10Impersonation starts per user per minute
RATE_LIMIT_SUPPORT_CONTACT_PER_MINUTE2Contact form submissions per user (or IP) per minute
RATE_LIMIT_SUPPORT_CONTACT_PER_HOUR5Contact form submissions per user (or IP) per hour
RATE_LIMIT_SUPPORT_CONTACT_PER_DAY10Contact form submissions per user (or IP) per day

See Health Checks.

VariableDefaultDescription
HEALTH_SECRET_TOKENnullToken required in the X-Secret-Token header of GET /api/health. The endpoint refuses every request with 403 until it is set
HEALTH_NOTIFICATIONS_ENABLEDfalseEmail when a check fails
HEALTH_NOTIFICATION_EMAILnullRecipient of failure emails
HEALTH_DB_CONNECTIONfrom DB_CONNECTIONConnection that stores check results
SCHEDULE_HEARTBEAT_URLnullURL pinged when the Schedule check passes

See Sentry.

VariableDefaultDescription
SENTRY_LARAVEL_DSNfrom SENTRY_DSNProject DSN. PHP and browser reporting are off while it is empty
SENTRY_DSNnullFallback for SENTRY_LARAVEL_DSN
SENTRY_ENVIRONMENTnull (uses APP_ENV)Environment name PHP reports to Sentry. The browser SDK always reports APP_ENV, so setting this splits PHP and JavaScript events
SENTRY_SAMPLE_RATE1.0Share of errors sent
SENTRY_TRACES_SAMPLE_RATEnull (tracing off)Share of requests traced, in PHP and the browser
SENTRY_PROFILES_SAMPLE_RATEnull (profiling off)Share of traced requests profiled
SENTRY_SEND_DEFAULT_PIIfalseSend personally identifiable information by default
SENTRY_ENABLE_APM_FOR_JStrueLoad browser tracing in the JavaScript SDK
VAPOR_COMMIT_HASHnullRelease identifier for PHP events. Vapor sets it on deploys with --commit
SENTRY_AUTH_TOKENunsetBuild time. Enables the Vite plugin that uploads source maps; it is off without a token
SENTRY_ORGunsetBuild time. Sentry organization for source map uploads
SENTRY_PROJECTunsetBuild time. Sentry project for source map uploads
SENTRY_RELEASEunsetBuild time. Release name the source maps and the JavaScript bundle are tagged with. See Source Maps & Release Tracking

config/sentry.php also reads SENTRY_BREADCRUMBS_* and SENTRY_TRACE_* toggles for individual breadcrumb and tracing features. Their defaults are in the file.

VariableDefaultDescription
MAIL_CAPTURE_URLnullURL of MailPit or a similar mail catcher. When set, the administration panel shows a MailPit link under Developer Tools to users who can view Telescope
S3_CONSOLE_URLnullURL of the RustFS or S3 console. When set, the administration panel shows a link to it under Developer Tools, with the same visibility
TELESCOPE_ENABLEDtrueRecord requests, queries, jobs and more in Telescope
DEBUGBAR_ENABLEDnull (follows APP_DEBUG)Show Laravel Debugbar
RAY_ENABLEDtrue outside productionSend ray() output to the Ray app
PG_BIN_DIRECTORYnull (auto-detected)Directory containing pg_dump and psql, for the db:snapshot:* commands. See Database Snapshots

config/telescope.php and config/debugbar.php read many more TELESCOPE_* and DEBUGBAR_* variables. Their defaults are in those files.

phpunit.xml sets its own values for the PHP and browser tests, including APP_ENV=testing and DB_CONNECTION=phpunit. Browser tests run the application inside the test process, so they use the same values. See Testing.