Skip to content

Environment variables

Generated from api/docs/enviromental-variables.md and env() calls in api/

The first part is api/docs/enviromental-variables.md; the second is built from the code. Front-end and service variables (ULAMS_* for front/web, REACT_APP_* for admin, VITE_APP_* for the legacy front, H5P and PDF service settings) are described in Self-hosting and the app READMEs under Reference.

Application is designed to be stateless - it is controlled by environmental variables

Each Variable that that has LARAVEL_ is converted nto variable set for .env file for Laravel Environment Configuration. Note that .env is ephemeral and created each time service restarts.

Example

Terminal window
LARAVEL_APP_NAME=Ulams
LARAVEL_APP_ENV=local

will be saved into .env as

Terminal window
APP_NAME=Ulams
APP_ENV=local

MULTI_DOMAINS List of domains and specic domain variable

Section titled “MULTI_DOMAINS List of domains and specic domain variable”

MULTI_DOMAINS has comma separated list of domains that will be used for init_multidomains.sh script

Each domain can have a specific Laravel Environment Configuration. Note that each domain .env is ephemeral and created each time service restarts.

Example

Terminal window
MULTI_DOMAINS=api17005.localhost,api16576.localhost,api22800.localhost
API17005_LOCALHOST_APP_NAME="App one"
API16576_LOCALHOST_APP_NAME="App two"
API22800_LOCALHOST_APP_NAME="App three"
API22800_LOCALHOST_INITIAL_USER_PASSWORD="password one"
API16576_LOCALHOST_INITIAL_USER_PASSWORD="password one"
API17005_LOCALHOST_INITIAL_USER_PASSWORD="password two"

Wil create three .env for each domain prefixed

Terminal window
#.env.api17005.localhost file
APP_NAME="App one"
INITIAL_USER_PASSWORD="password one"
Terminal window
#.env.api16576.localhost file
APP_NAME="App two"
INITIAL_USER_PASSWORD="password one"
Terminal window
#.env.api22800.localhost file
APP_NAME="App three"
INITIAL_USER_PASSWORD="password two"

Each

Variable name Description Default
LARAVEL_ prefix main Laravel Environment Configuration
${DOMAIN_KEY}_ prefix domain specific Laravel Environment Configuration
MULTI_DOMAINS Comma separated list of multidomains
DISABLE_PHP_FPM Disable PHP FPM Supervisor process false
DISABLE_HORIZON Disable Laravel Horizon Supervisor process false
ENABLE_HORIZON Start Horizon in lean workers mode (off there by default) false
ULAMS_WORKERS_MODE lean (one loop per kind, ulams:tenant:work-once) or per-tenant (long-lived process per tenant and queue); compose sets lean per-tenant
DISABLE_SCHEDULER Disable Laravel Scheduler Supervisor process false
JWT_PUBLIC_KEY_BASE64 Base64 encoded storage/oauth-public.key
JWT_PRIVATE_KEY_BASE64 Base64 encoded storage/oauth-private.key
${DOMAIN_KEY}_JWT_PUBLIC_KEY_BASE64 Base64 encoded storage/oauth-public.key for domain
${DOMAIN_KEY}_JWT_PRIVATE_KEY_BASE64 Base64 encoded storage/oauth-private.key for domain
DISABLE_DB_MIGRATE Disable Laravel Database migration on startup false
DISABLE_DB_SEED Disable Laravel Permissions Database Seed migration on startup false
DISABLE_QUEUE Disable the tenant/multidomain queue workers (queue.sh) false
DISABLE_TENANT_SYNC Skip ulams:tenant:sync-env on startup false
INITIAL_USER_PASSWORD Initial admin password
INITIAL_USER_FIRST_NAME Initial admin first name Root
INITIAL_USER_LAST_NAME Initial admin last name Admin
INITIAL_USER_EMAIL Initial admin email admin@ulams.app
${DOMAIN_KEY}_INITIAL_USER_PASSWORD Initial admin password for domain
${DOMAIN_KEY}_INITIAL_USER_FIRST_NAME Initial admin first name for domain Root
${DOMAIN_KEY}_INITIAL_USER_LAST_NAME Initial admin last name for domain Admin
${DOMAIN_KEY}_INITIAL_USER_EMAIL Initial admin email for domain admin@ulams.app

Every domain shares one Redis. Set by ulams:tenant:create for each tenant (ulams_<slug>_…); the platform uses the defaults.

Variable name Description Default
REDIS_PREFIX Prefix of every Redis key (queues, cache, locks) <slug of APP_NAME>_database_
CACHE_PREFIX Cache store prefix (inside REDIS_PREFIX) <slug of APP_NAME>_cache
HORIZON_PREFIX Horizon metadata prefix <slug of APP_NAME>_horizon:

Third-party package code runs on the content origin; where that origin is a subdomain of the app’s site the browser treats it as same-site, so the API hardens its cookies and checks the Origin of every state-changing request (see content-origin.md). No cookie ever carries a Domain attribute.

Variable name Description Default
SESSION_COOKIE_PREFIX Prefix of the session and XSRF-TOKEN cookie names. __Host- makes them Secure, Path=/ and host-only. Empty over plain http __Host- when APP_ENV=production, else empty
SESSION_COOKIE Full name of the session cookie (overrides the prefix and APP_NAME) <prefix><slug of APP_NAME>_session
SESSION_SECURE_COOKIE Secure attribute; must stay true while the prefix is __Host- true with a prefix, else false
ORIGIN_CHECK Refuse POST/PUT/PATCH/DELETE whose Origin is not one of the tenant’s own apps (403). Turn off only to debug true
TRUSTED_ORIGINS Comma separated extra origins allowed to call the API from a browser, besides FRONTEND_URL, ADMIN_URL and APP_URL; never content origins empty
ADMIN_URL Origin of the tenant’s admin panel (also trusted by the origin check); written by ulams:tenant:create empty

Outside production localhost and *.localhost (any port) are trusted too, so the development stack and the old front on :3000/:8000 keep working.

Read on the platform by ulams:tenant:*, see multidomain.md. {slug} is replaced with the tenant slug.

Variable name Description Default
TENANT_DEMO_PASSWORD Password of all demo users of new tenants. Development only secret
TENANCY_ENFORCE_HOSTS Answer 404 to hosts that are neither platform hosts nor provisioned tenants true
TENANCY_PLATFORM_HOSTS Comma separated hosts served by the platform .env (add k8s service/ingress hosts here) api.localhost,localhost,127.0.0.1,caddy,api
TENANCY_SCHEME Scheme of tenant URLs http
TENANCY_API_HOST Tenant API host {slug}.localhost
TENANCY_FRONT_HOST Tenant front host (global.frontURL, FRONTEND_URL) {slug}.app.localhost
TENANCY_ADMIN_HOST Tenant admin panel host {slug}.admin.localhost
TENANCY_CONTENT_HOST Tenant content origin host, written as CONTENT_ORIGIN (see content-origin.md) {slug}.content.localhost
TENANCY_EMAIL_DOMAIN Domain of demo user e-mails and MAIL_FROM_ADDRESS {slug}.ulams.app
TENANCY_DATABASE Tenant database and role name ulams_{slug}
TENANCY_BUCKET Tenant bucket ulams-{slug}
TENANCY_REDIS_PREFIX Tenant REDIS_PREFIX ulams_{slug}_
TENANCY_STORAGE_PUBLIC_URL Public object store URL; the tenant AWS_URL is this plus /<bucket> http://storage.localhost
TENANCY_S3_ENDPOINT Object store endpoint used to create buckets AWS_ENDPOINT
TENANCY_S3_KEY Object store access key used to create buckets AWS_ACCESS_KEY_ID
TENANCY_S3_SECRET Object store secret used to create buckets AWS_SECRET_ACCESS_KEY
TENANCY_S3_REGION Object store region AWS_DEFAULT_REGION
DB_ADMIN_HOST Host of the pgsql_admin connection (creates tenant roles and databases) DB_HOST
DB_ADMIN_PORT Port of the pgsql_admin connection DB_PORT
DB_ADMIN_DATABASE Database the pgsql_admin connection logs in to DB_DATABASE
DB_ADMIN_USERNAME Role with CREATEROLE and CREATEDB DB_USERNAME
DB_ADMIN_PASSWORD Its password DB_PASSWORD
TENANCY_PHP_BINARY PHP binary for tenant subprocesses current PHP binary
TENANCY_PROCESS_TIMEOUT Timeout of one tenant subprocess, seconds 900
TENANCY_SCHEDULER_LOCK Several scheduler replicas: only the one that takes the per-minute cache lock runs the tick (ADR 0068) true
TENANCY_DATABASE_PROVISIONER manual: the operator creates tenant databases (shared hosting, ADR 0091); ulams:tenant:create --db-password= admin
TENANCY_S3_PUBLIC_READ_POLICY false for stores without bucket policies (Cloudflare R2) true
ANTHROPIC_API_KEY, AI_DRIVER, AI_MODEL_*, ANTHROPIC_BASE_URL Platform AI settings inherited by every tenant env file on create and sync-env; override per tenant with ulams:tenant:set-env (ADR 0063) unset
WORKERS_CHECK_INTERVAL Seconds between workers.sh checks of the domain list and of exited processes 10
WORKERS_MAX_TIME Seconds a per-domain worker or scheduler loop runs before it is restarted (fresh code/config) 3600
WORKERS_LEAN_INTERVAL Lean mode: seconds between passes over the domains (default queues) 10
WORKERS_LEAN_HEAVY_INTERVAL Lean mode: the same for the builder and long-job queues 20
WORKERS_LEAN_MAX_TIME Lean mode: seconds a pass keeps taking jobs of one domain and queue 30

Set per tenant in .env.<host> (do not set them on the platform): TENANT_SLUG, REDIS_PREFIX, CACHE_PREFIX, HORIZON_PREFIX, CONTENT_ORIGIN, INITIAL_USER_EMAIL, INITIAL_USER_PASSWORD, FRONTEND_URL, ADMIN_URL, DEMO_MODE.

Read inside a tenant. DEMO_MODE is written by ulams:tenant:create <slug> --demo=on|off; the others are optional overrides. See packages/demo/README.md.

Variable name Description Default
DEMO_MODE Login without password (/api/demo/*) and an hourly reset. Never on production data false
DEMO_ADMIN_EMAIL Account of the automatic admin login INITIAL_USER_EMAIL
DEMO_STUDENT_EMAIL Account of the automatic student login student1@<admin e-mail domain>
DEMO_TUTOR_EMAIL Account of the tutor login (role: tutor) tutor@<admin e-mail domain>
DEMO_ADMIN_URL Admin panel link on the front’s demo badge ADMIN_URL
DEMO_RESET_SCHEDULE Schedule ulams:demo:reset true
DEMO_RESET_CRON When 0 * * * *
DEMO_RESET_WIPE_FILES Also delete every file in the tenant bucket on reset false
DEMO_RESET_STUDENTS Demo students when no baseline was captured 5
DEMO_CONTENT_SEEDER Seeder of the demo courses Database\Seeders\DemoCoursesSeeder
ULAMS_DEMO_EXPERIENCE Demo course(s) to seed TENANT_SLUG

Upload guard for packages and imports (zip-slip, symlinks, zip bombs, sniffed MIME type, size, virus-scan hook), see packages/uploads/README.md.

Variable name Description Default
UPLOADS_SCORM_MAX_MB Largest SCORM package upload 512
UPLOADS_CMI5_MAX_MB Largest cmi5 package upload 512
UPLOADS_COURSE_IMPORT_MAX_MB Largest course export zip accepted by the import 1024
UPLOADS_ZIP_MAX_ENTRIES Most entries in a SCORM/cmi5 package 5000
UPLOADS_ZIP_MAX_UNCOMPRESSED_MB Largest total uncompressed size of a package 2048
UPLOADS_ZIP_MAX_ENTRY_MB Largest single file inside an archive 1024
UPLOADS_ZIP_MAX_RATIO Largest compression ratio of an entry over 1 MB (zip bombs) 200
UPLOADS_COURSE_IMPORT_MAX_ENTRIES Most entries in a course import 10000
UPLOADS_COURSE_IMPORT_MAX_UNCOMPRESSED_MB Largest total uncompressed size of a course import 4096
UPLOADS_SCANNER null (no scan) or clamd (compose profile av) null
UPLOADS_CLAMD_HOST / UPLOADS_CLAMD_PORT clamd address clamav / 3310
UPLOADS_CLAMD_TIMEOUT Seconds to wait for clamd 60
UPLOADS_CLAMD_FAIL_CLOSED Reject uploads when clamd cannot be reached true
FILES_MAX_SIZE_MB Largest single file in the admin file manager (packages/files) 512
UPLOADS_LIASCRIPT_MAX_MB Largest LiaScript .md or .zip upload 128
LIASCRIPT_MAX_MARKDOWN_KB Largest LiaScript Markdown source (packages/liascript) 2048
LIASCRIPT_DISK Disk for LiaScript assets FILESYSTEM_DRIVER
LIASCRIPT_PROGRESS_TOKEN_TTL Lifetime of the LiaScript player’s progress token, seconds 14400
LIASCRIPT_PLAYER_BUILD_PATH Folder of the fetched LiaScript build packages/liascript/resources/player/build
Variable name Description Default
LTI_ISSUER Our issuer and base URL of the LTI endpoints APP_URL
LTI_RETIRED_KEY_GRACE_DAYS Days a retired key stays in the JWKS 30
LTI_KEY_BITS RSA key size (php-jwt requires at least 2048) 2048
LTI_LOGIN_HINT_TTL Seconds a launch’s login hint is valid 120
LTI_ID_TOKEN_TTL Lifetime of the id_token we sign, seconds 300
LTI_ACCESS_TOKEN_TTL Lifetime of AGS access tokens we issue, seconds 3600
LTI_STATE_TTL Lifetime of the tool-side OIDC state and nonce, seconds 600
LTI_CODE_TTL Lifetime of the tool-side one-time sign-in code, seconds 60
LTI_ALLOW_INSECURE_URLS Allow http and private addresses for tool/platform URLs. Development only false
LTI_HTTP_TIMEOUT Timeout of outgoing LTI requests, seconds 10
LTI_JWKS_CACHE_TTL Cache lifetime of fetched key sets, seconds 600
LTI_TOOL_LANDING_URL Where a tool-side launch lands ({front}, {code}, {course}) {front}/lti/launch?code={code}&course={course}
Variable name Description Default
ADAPT_SOURCE_ENABLED Adapt JSON sources and builds (off: the API answers 404) false
ADAPT_BUILDER_URL Build worker (GPL-3.0 service, compose profile adapt) http://adapt-builder:8080
ADAPT_BUILDER_TOKEN X-Internal-Token for the worker (empty)
ADAPT_BUILDER_TIMEOUT Seconds to wait for a build 300
ADAPT_MAX_SOURCE_KB Largest JSON source 4096
Variable name Description Default
DEMO_PERF Demo profile of the api container (make demo-up): production PHP settings, cached config/routes/events, vendor in a named volume. See php-profile.sh 0
ULAMS_OPTIMIZE Build config/route/event/view caches per domain at start (set in the production image) false (true in Dockerfile)
LOG_LEVEL Minimum log level of the file/stderr channels (production template: warning) APP_LOG_LEVEL, then debug
REDIS_CLIENT phpredis (C extension) or predis phpredis
RESPONSE_CACHE_DRIVER Cache store of the response cache; must support tags (Redis) for targeted invalidation the default cache store
HTTP_CACHE_PUBLIC Cache-Control: public, s-maxage on anonymous catalogue GETs (config/http_cache.php) true
HTTP_CACHE_S_MAXAGE Shared-cache lifetime of those responses, seconds 60
HTTP_CACHE_STALE_WHILE_REVALIDATE Seconds a shared cache may serve them stale while it revalidates 300

Variables read with env() in api/config, api/app and the packages. Laravel’s LARAVEL_* prefixed variables (see the guide above) are mapped onto config keys at runtime and are not listed here.

Variable Default(s) in code Read by
ADAPT_BUILDER_TIMEOUT 300 adapt
ADAPT_BUILDER_TOKEN adapt
ADAPT_BUILDER_URL 'http://adapt-builder:8080' adapt
ADAPT_MAX_SOURCE_KB 4096 adapt
ADAPT_QUEUE in_array(env('QUEUE_CONNECTION' adapt
ADAPT_QUEUE_CONNECTION in_array(env('QUEUE_CONNECTION' adapt
ADAPT_SOURCE_ENABLED false adapt
ADMIN_URL core, demo
AI_ALLOW_NETWORK_IN_TESTS false ai
AI_CACHE_TTL '1h' ai
AI_CASSETTES_PATH ai
AI_DEFAULT_FALLBACKS 'default' ai
AI_DRIVER 'anthropic' ai, tenancy
AI_FAKE_MODE 'synthetic' ai
AI_FALLBACKS_BETA 'server-side-fallback-2026-07-01' ai
AI_LIMIT_SUBJECT_COST_USD 5 ai
AI_LIMIT_SUBJECT_TOKENS 3000000 ai
AI_LIMIT_TENANT_MONTHLY_USD 50 ai
AI_MAX_RETRIES 2 ai
AI_MODEL_DEFAULT 'claude-sonnet-5-5' ai, tenancy
AI_MODEL_DEFAULT_LABEL 'Sonnet' ai, tenancy
AI_MODEL_LIGHT 'claude-haiku-5-5' ai, tenancy
AI_MODEL_LIGHT_LABEL 'Haiku' ai, tenancy
AI_MODEL_PREMIUM 'claude-opus-5-5' ai, tenancy
AI_MODEL_PREMIUM_LABEL 'Opus' ai, tenancy
AI_PREMIUM_FALLBACKS 'default' ai
AI_RECORD false ai
AI_RECORD_PATH ai
AI_TASK_GROUNDING_PROFILE 'light' ai
AI_TASK_INTERACTION_H5P_PROFILE 'default' ai
AI_TASK_INTERACTION_INTERACTIVE_PROFILE 'light' ai
AI_TASK_INTERVIEW_PROFILE 'light' ai
AI_TASK_LESSON_PROFILE 'default' ai
AI_TASK_METADATA_PROFILE 'light' ai
AI_TASK_OUTLINE_PROFILE 'default' ai
AI_TASK_PATCH_PROFILE 'default' ai
AI_TASK_PRICE_PROFILE 'light' ai
AI_TASK_QUIZ_PROFILE 'default' ai
AI_TASK_SELFCHECK_PROFILE 'default' ai
AI_TASK_UPDATE_PROFILE 'default' ai
AI_TIMEOUT 600 ai
ANTHROPIC_API_KEY env('ANTROPHIC_API_KEY' ai, tenancy
ANTHROPIC_BASE_URL ai, tenancy
APP_DEBUG false app, courses
APP_ENV 'production' app
APP_KEY app
APP_NAME 'Laravel' app
APP_PUBLIC_STORAGE app
APP_URL 'http://localhost:1000' app, files
APP_VERSION 'dev' auth
ASSET_URL null app
AUTH_AGENT_AUDIT_DAYS 365 auth
AUTH_DEVICE_APPROVE_PER_MINUTE 5 auth
AUTH_MAX_TOKENS_PER_USER 50 auth
AUTH_SUPERADMIN_EMAIL app, auth
AWS_ACCESS_KEY_ID app, courses, laravel-scorm, webinar
AWS_BUCKET app
AWS_DEFAULT_REGION 'us-east-1' app, laravel-scorm
AWS_ENDPOINT app
AWS_SCORM_BUCKET laravel-scorm
AWS_SECRET_ACCESS_KEY app, laravel-scorm
AWS_URL app, consultations
AWS_USE_PATH_STYLE_ENDPOINT false true app, tenancy
BCRYPT_ROUNDS 10 app
BROADCAST_DRIVER 'null' app
BUILDER_QUEUE_RETRY_AFTER 2400 app
CACHE_BYPASS_HEADER_NAME app, courses
CACHE_BYPASS_HEADER_VALUE app, courses
CACHE_DRIVER 'file' app
CACHE_PREFIX Str::slug(env('APP_NAME', 'laravel' app
CALLBACK_URL_FACEBOOK 'http://localhost:1000/api/auth/social/facebook/callback' app
CALLBACK_URL_GOOGLE 'http://localhost:1000/api/auth/social/google/callback' app
CART_OWNER_MODEL class_exists(App\Models\User::class app
CMI5_DISK env('SCORM_DISK', 'local' cmi5
CMI5_SESSION_MINUTES 120 lrs
COMMERCE_FRONT_URL env('FRONTEND_URL' commerce
COMMERCE_PROVIDER 'wellms' commerce
CONFIG_USE_DATABASE false settings
CONTENT_ORIGIN app, uploads
COURSE_BUILDER_ADMIN_URL env('ADMIN_URL' course-builder
COURSE_BUILDER_AUTO_FORMATS false course-builder
COURSE_BUILDER_CONCURRENT_RUNS 2 course-builder
COURSE_BUILDER_DISK 'course_builder_private' course-builder
COURSE_BUILDER_DOCX_UNCOMPRESSED_MB 100 course-builder
COURSE_BUILDER_EVAL_MONTHLY_USD 20 course-builder
COURSE_BUILDER_EVENTS_RETENTION_DAYS 30 course-builder
COURSE_BUILDER_FRONT_URL env('FRONTEND_URL' course-builder
COURSE_BUILDER_H5P true course-builder
COURSE_BUILDER_INTERACTIVE true course-builder
COURSE_BUILDER_LESSON_CONCURRENCY 4 course-builder
COURSE_BUILDER_LIASCRIPT true course-builder
COURSE_BUILDER_PDF_PAGES 300 course-builder
COURSE_BUILDER_PRIVATE_ROOT storage_path('app/private' course-builder
COURSE_BUILDER_QUEUE in_array(env('QUEUE_CONNECTION' course-builder
COURSE_BUILDER_QUEUE_CONNECTION in_array(env('QUEUE_CONNECTION' course-builder
COURSE_BUILDER_SESSION_COST_USD 5 course-builder
COURSE_BUILDER_SESSION_TOKENS 3000000 course-builder
COURSE_BUILDER_SESSIONS_PER_DAY 10 course-builder
COURSE_BUILDER_SOURCE_MB 20 course-builder
COURSE_BUILDER_SOURCE_TOKENS 400000 course-builder
COURSE_BUILDER_SSE_POLL_MS 500 course-builder
COURSE_BUILDER_SSE_SECONDS 25 course-builder
CSP_REPORT_RETENTION_DAYS 30 core
DB_ADMIN_DATABASE env('DB_DATABASE', 'postgres' app
DB_ADMIN_HOST env('DB_HOST', '127.0.0.1' app
DB_ADMIN_PASSWORD env('DB_PASSWORD', 'secret' app
DB_ADMIN_PORT env('DB_PORT', '5432' app
DB_ADMIN_USERNAME env('DB_USERNAME', 'default' app
DB_CONNECTION 'mysql' 'sqlite' app
DB_DATABASE 'forge' app
DB_FOREIGN_KEYS true app
DB_HOST '127.0.0.1' 'localhost' app
DB_PASSWORD '' app
DB_PORT '3306' '5432' '1433' app
DB_SOCKET '' app
DB_SQLITE_DATABASE __DIR__ . '/../database/database.sqlite' app
DB_SSL_MODE 'prefer' app
DB_USERNAME 'forge' app
DEMO_ADMIN_EMAIL demo
DEMO_ADMIN_URL demo
DEMO_CONTENT_SEEDER 'Database\\Seeders\\DemoCoursesSeeder' demo
DEMO_MODE false demo
DEMO_RESET_CRON '0 * * * *' demo
DEMO_RESET_SCHEDULE true demo
DEMO_RESET_STUDENTS 5 demo
DEMO_RESET_WIPE_FILES false demo
DEMO_STUDENT_EMAIL demo
DEMO_TUTOR_EMAIL demo
DYNAMODB_CACHE_TABLE 'cache' app
EXAMPLE_PLUGIN_GREETING 'Hello from the example plugin' example-plugin
FACEBOOK_CLIENT_ID app
FACEBOOK_CLIENT_SECRET app
FILES_MAX_SIZE_MB 512 files
FILES_MIMES 'avi,mov,mp3,mp4,wmv,pdf,doc,docx,ppt,png,jpg,jpeg,gif,webp, files
FILESYSTEM_CLOUD 's3' app
FILESYSTEM_DRIVER 'local' app
FRONTEND_URL 'http://localhost:1000/email' app, demo
GOOGLE_CLIENT_ID app
GOOGLE_CLIENT_SECRET app
H5P_INTERNAL_TOKEN h5p
H5P_SERVICE_CONFIG_DIR tenancy
H5P_SERVICE_TIMEOUT 300 h5p
H5P_SERVICE_URL 'http://h5p:8080' h5p
HEALTH_DB_CONNECTION env('DB_CONNECTION' app
HEALTH_SLACK_WEBHOOK_URL '' app
HORIZON_DOMAIN null app
HORIZON_PATH 'horizon' app
HORIZON_PREFIX Str::slug(env('APP_NAME', 'laravel' app
HTTP_CACHE_PUBLIC true app
HTTP_CACHE_S_MAXAGE 60 app
HTTP_CACHE_STALE_WHILE_REVALIDATE 300 app
INITIAL_USER_EMAIL 'admin@' . $domain demo, tenancy
INITIAL_USER_PASSWORD config('ulams_tenancy.demo_password' tenancy
INTERACTIVE_ALLOW_NETWORK false interactive
INTERACTIVE_DISK interactive
INTERACTIVE_ENABLED true interactive
INVOICES_CURRENCY_FRACTION 'ct.' invoices
INVOICES_CURRENCY_SYMBOL '$' invoices
INVOICES_LOGO invoices
JAAS_AUD 'jitsi' jitsi
JAAS_HOST 'https://8x8.vc/' jitsi
JAAS_ISS 'chat' jitsi
JAAS_KEY_ID '' jitsi
JAAS_PRIVATE_KEY '' jitsi
JAAS_RECORDING false jitsi
JAAS_SUB '' jitsi
JITSI_APP_ID 'meet-id' jitsi
JITSI_APP_SECRET 'Test' jitsi
JITSI_HOST 'meet-stage.ulams.app' jitsi
JITSI_RECORDING_DOWNLOAD_TIMEOUT 600 jitsi
JITSI_RECORDING_HOSTS '' jitsi
JITSI_RECORDING_MAX_BYTES 2 * 1024 * 1024 * 1024 jitsi
JITSI_WEBHOOK_SECRET jitsi
JITSI_WEBHOOK_TOKEN jitsi
JITSI_WEBHOOK_TOLERANCE 300 jitsi
L5_FORMAT_TO_USE_FOR_DOCS 'json' app
L5_SWAGGER_BASE_PATH null app
L5_SWAGGER_CONST_HOST 'http://my-default-host.com' app
L5_SWAGGER_GENERATE_ALWAYS true app
L5_SWAGGER_GENERATE_YAML_COPY false app
L5_SWAGGER_OPERATIONS_SORT null app
L5_SWAGGER_UI_ASSETS_PATH 'vendor/swagger-api/swagger-ui/dist/' app
LIASCRIPT_DISK liascript
LIASCRIPT_MAX_MARKDOWN_KB 2048 liascript
LIASCRIPT_PLAYER_BUILD_PATH liascript
LIASCRIPT_PREVIEW_KEEP 4 liascript
LIASCRIPT_PREVIEW_TTL 3600 liascript
LIASCRIPT_PROGRESS_TOKEN_TTL 14400 liascript
LIVING_COURSE_ALLOWED_HOSTS '' living-course
LIVING_COURSE_AUTO_ANALYSE_USD 0.50 living-course
LIVING_COURSE_CONNECTORS 'upload,git,url' living-course
LIVING_COURSE_INSECURE_HOSTS '' living-course
LIVING_COURSE_LEARNER_NOTICE_AFTER_DAYS 3 living-course
LIVING_COURSE_MAX_FRAGMENTS 4000 living-course
LIVING_COURSE_MAX_GROUPS 40 living-course
LIVING_COURSE_MIN_POLL_MINUTES 60 living-course
LIVING_COURSE_PROPOSAL_COST_USD 2 living-course
LIVING_COURSE_QUEUE env('COURSE_BUILDER_QUEUE', in_array(env('QUEUE_CONNECTION' living-course
LIVING_COURSE_QUEUE_CONNECTION env('COURSE_BUILDER_QUEUE_CONNECTION', in_array(env('QUEUE_C living-course
LIVING_COURSE_SOURCE_MONTHLY_USD 10 living-course
LIVING_COURSE_WEBHOOK_DEBOUNCE_SECONDS 600 living-course
LOG_CHANNEL 'stack' app
LOG_LEVEL env('APP_LOG_LEVEL', 'debug' app
LOG_SLACK_WEBHOOK_URL app
LOG_STDERR_FORMATTER app
LONG_JOB_QUEUE in_array(env('QUEUE_CONNECTION' app
LONG_JOB_QUEUE_CONNECTION env('LONG_JOB_CONNECTION', in_array(env('QUEUE_CONNECTION' app
LTI_ACCESS_TOKEN_TTL 3600 lti
LTI_ALLOW_INSECURE_URLS false lti
LTI_CODE_TTL 60 lti
LTI_HTTP_TIMEOUT 10 lti
LTI_ID_TOKEN_TTL 300 lti
LTI_ISSUER lti
LTI_JWKS_CACHE_TTL 600 lti
LTI_KEY_BITS 2048 lti
LTI_LOGIN_HINT_TTL 120 lti
LTI_RETIRED_KEY_GRACE_DAYS 30 lti
LTI_STATE_TTL 600 lti
LTI_TOOL_LANDING_URL '{front}/lti/launch?code={code}&course={course}' lti
MAIL_DRIVER 'smtp' app
MAIL_ENCRYPTION 'tls' app
MAIL_FROM_ADDRESS 'hello@example.com' app
MAIL_FROM_NAME 'Example' app
MAIL_HOST 'smtp.mailgun.org' app
MAIL_LOG_CHANNEL app
MAIL_PASSWORD app
MAIL_PORT 587 app
MAIL_USERNAME app
MAILGUN_DOMAIN app
MAILGUN_ENDPOINT 'api.mailgun.net' app
MAILGUN_SECRET app
MATTERMOST_AUTH 'default' 'bearer' mattermost
MATTERMOST_HOST 'localhost' mattermost
MATTERMOST_LOGIN 'admin' mattermost
MATTERMOST_PASSWORD 'secret' mattermost
MATTERMOST_SERVER 'default' mattermost
MATTERMOST_TOKEN 'bearertoken' mattermost
MEMCACHED_HOST '127.0.0.1' app
MEMCACHED_PASSWORD app
MEMCACHED_PERSISTENT_ID app
MEMCACHED_PORT 11211 app
MEMCACHED_USERNAME app
MJML_API_ID app, templates-email
MJML_API_SECRET app, templates-email
MJML_API_URL false app, templates-email
MJML_BINARY_PATH app, templates-email
MJML_USE_API false templates-email
MYSQL_ATTR_SSL_CA app
OH_DEAR_HEALTH_CHECK_SECRET app
ORIGIN_CHECK true core
PAGINATE_COUNT 10 app
PAPERTRAIL_PORT app
PAPERTRAIL_URL app
PASSPORT_CONNECTION app
PASSPORT_PRIVATE_KEY app
PASSPORT_PUBLIC_KEY app
PAYMENTS_DEFAULT_CURRENCY 'USD' Ulams\Payments\Enums\Currency::USD app, invoices, payments
PAYMENTS_DEFAULT_GATEWAY 'Stripe' app, payments
PAYMENTS_PRZELEWY24_API_KEY app, payments
PAYMENTS_PRZELEWY24_CRC app, payments
PAYMENTS_PRZELEWY24_LIVE false true app, payments
PAYMENTS_PRZELEWY24_MERCHANT_ID app, payments
PAYMENTS_PRZELEWY24_POS_ID app, payments
PAYMENTS_REVENUECAT_ENABLED false payments
PAYMENTS_REVENUECAT_RECEIPT_VERIFIER payments
PAYMENTS_STRIPE_API_BASE 'https://api.stripe.com' payments
PAYMENTS_STRIPE_PUBLISHABLE_KEY app, payments
PAYMENTS_STRIPE_SECRET_KEY app, payments
PAYMENTS_STRIPE_WEBHOOK_SECRET payments
PAYMENTS_STRIPE_WEBHOOK_TOLERANCE 300 payments
PDF_CERTIFICATE_VERIFY_URL '{APP_URL}/certificates/verify/{id}' templates-pdf
PDF_INTERNAL_TOKEN templates-pdf
PDF_RENDER_ON_CREATE true templates-pdf
PDF_SERVICE_TIMEOUT 30 templates-pdf
PDF_SERVICE_URL 'http://pdf:3000' templates-pdf
PDF_STORAGE_DIRECTORY 'pdfs' templates-pdf
PDF_STORAGE_DISK templates-pdf
PENCIL_SPACES_API_KEY pencil-spaces
PENCIL_SPACES_API_URL pencil-spaces
POSTMARK_TOKEN app
PUSHER_APP_CLUSTER 'mt1' app
PUSHER_APP_ENCRYPTED true app
PUSHER_APP_HOST '127.0.0.1' app
PUSHER_APP_ID app
PUSHER_APP_KEY app
PUSHER_APP_PORT 6001 app
PUSHER_APP_SCHEME 'http' app
PUSHER_APP_SECRET app
QUEUE_CONNECTION 'sync' adapt, app, course-builder, living-course
QUEUE_FAILED_DRIVER 'database-uuids' app
REDIS_CACHE_DB 1 app
REDIS_CLIENT 'phpredis' app
REDIS_CLUSTER 'redis' app
REDIS_DB 0 app
REDIS_HOST '127.0.0.1' app
REDIS_PASSWORD null app
REDIS_PORT 6379 app
REDIS_PREFIX Str::slug(env('APP_NAME', 'laravel' app
REDIS_QUEUE 'default' app
RESPONSE_CACHE_DRIVER app, courses
RESPONSE_CACHE_ENABLED true app, courses
RESPONSE_CACHE_LIFETIME 60 * 60 * 24 * 7 app, courses
RESPONSE_CACHE_TAG '' app, courses
SCORM_DISK 'local' app
SCORM_ROOT_DIR laravel-scorm
SCORM_TRACKING_TOKEN_TTL 14400 app
SENTRY_ENVIRONMENT app
SENTRY_LARAVEL_DSN env('SENTRY_DSN' app
SENTRY_PROFILES_SAMPLE_RATE app
SENTRY_RELEASE app
SENTRY_SEND_DEFAULT_PII false app
SENTRY_TRACE_QUEUE_ENABLED false app
SENTRY_TRACE_REDIS_COMMANDS false app
SENTRY_TRACES_SAMPLE_RATE app
SESSION_CONNECTION null app
SESSION_COOKIE $hostPrefix.Str::slug(env('APP_NAME', 'laravel' app
SESSION_COOKIE_PREFIX env('APP_ENV' app
SESSION_DRIVER 'file' app
SESSION_LIFETIME 120 app
SESSION_SECURE_COOKIE $hostPrefix !== '' app
SESSION_STORE null app
SHOPPING_CART_TAX_MODE 'flat' shopping-cart
SHOPPING_CART_TAX_RATE 0 shopping-cart
SPARKPOST_SECRET app
SQS_PREFIX 'https://sqs.us-east-1.amazonaws.com/your-account-id' app
SQS_QUEUE 'your-queue-name' app
STRIPE_KEY app
STRIPE_SECRET app
TELESCOPE_BATCH_WATCHER true app
TELESCOPE_CACHE_WATCHER true app
TELESCOPE_CLIENT_REQUEST_WATCHER true app
TELESCOPE_COMMAND_WATCHER true app
TELESCOPE_DOMAIN null app
TELESCOPE_DRIVER 'database' app
TELESCOPE_DUMP_WATCHER true app
TELESCOPE_ENABLED true app
TELESCOPE_EVENT_WATCHER true app
TELESCOPE_EXCEPTION_WATCHER true app
TELESCOPE_GATE_WATCHER true app
TELESCOPE_JOB_WATCHER true app
TELESCOPE_LOG_WATCHER true app
TELESCOPE_MAIL_WATCHER true app
TELESCOPE_MODEL_WATCHER true app
TELESCOPE_NOTIFICATION_WATCHER true app
TELESCOPE_PATH 'telescope' app
TELESCOPE_QUERY_WATCHER true app
TELESCOPE_REDIS_WATCHER true app
TELESCOPE_REQUEST_WATCHER true app
TELESCOPE_RESPONSE_SIZE_LIMIT 64 app
TELESCOPE_SCHEDULE_WATCHER true app
TELESCOPE_VIEW_WATCHER true app
TENANCY_ADMIN_CONNECTION 'pgsql_admin' tenancy
TENANCY_ADMIN_HOST '{slug}.admin.localhost' tenancy
TENANCY_API_HOST '{slug}.localhost' tenancy
TENANCY_BUCKET 'ulams-{slug}' tenancy
TENANCY_BUCKET_PUBLIC_URL tenancy
TENANCY_CONTENT_HOST '{slug}.content.localhost' tenancy
TENANCY_DATABASE 'ulams_{slug}' tenancy
TENANCY_DATABASE_PROVISIONER 'admin' tenancy
TENANCY_EMAIL_DOMAIN '{slug}.ulams.app' tenancy
TENANCY_ENFORCE_HOSTS true tenancy
TENANCY_FRONT_HOST '{slug}.app.localhost' tenancy
TENANCY_NEW_SITES false tenancy
TENANCY_PHP_BINARY PHP_BINARY ?: 'php' tenancy
TENANCY_PLATFORM_API false tenancy
TENANCY_PLATFORM_HOST 'api.localhost' tenancy
TENANCY_PLATFORM_HOSTS 'api.localhost,localhost,127.0.0.1,caddy,api' tenancy
TENANCY_PROCESS_TIMEOUT 900 tenancy
TENANCY_REDIS_PREFIX 'ulams_{slug}_' tenancy
TENANCY_S3_ENDPOINT env('AWS_ENDPOINT' tenancy
TENANCY_S3_KEY env('AWS_ACCESS_KEY_ID' tenancy
TENANCY_S3_PUBLIC_READ_POLICY true tenancy
TENANCY_S3_REGION env('AWS_DEFAULT_REGION', 'us-east-1' tenancy
TENANCY_S3_SECRET env('AWS_SECRET_ACCESS_KEY' tenancy
TENANCY_SCHEDULER_LOCK true tenancy
TENANCY_SCHEME 'http' tenancy
TENANCY_STORAGE_PUBLIC_URL 'http://storage.localhost' tenancy
TENANT_DEMO_PASSWORD 'secret' tenancy
TENANT_SLUG demo, tenancy
TOPIC_RESOURCE_FILES_MIMES 'avi,mov,mp3,mp4,wmv,pdf,doc,docx,ppt,png,jpg,jpeg,gif,zip' courses
TRUSTED_ORIGINS core
ULAMS_DEMO_EXPERIENCE demo
UPLOADS_CLAMD_FAIL_CLOSED true uploads
UPLOADS_CLAMD_HOST 'clamav' uploads
UPLOADS_CLAMD_PORT 3310 uploads
UPLOADS_CLAMD_TIMEOUT 60 uploads
UPLOADS_COURSE_IMPORT_MAX_ENTRIES 10000 uploads
UPLOADS_SCANNER 'null' uploads
UPLOADS_ZIP_MAX_ENTRIES 5000 uploads
UPLOADS_ZIP_MAX_RATIO 200 uploads
VIDEO_DISK config('filesystems.default' video
VIDEO_NON_STRICT_VALUE false video
VIDEO_PROCESSING_ENABLE true video
VIDEO_QUEUE 'queue-long-job' video
VIDEO_QUEUE_CONNECTION env('QUEUE_CONNECTION' video
VIEW_COMPILED_PATH realpath(storage_path('framework/views' app