Skip to content

Configuration Reference

This page covers the host package configuration that a Laravel app may need to set directly. Install-facing setup lives in the install guide; this page is for maintainers checking env vars, published config, disks, logs, and panel wiring.

Capell host packages publish config by package tag:

Terminal window
php artisan vendor:publish --tag=capell-core-config
php artisan vendor:publish --tag=capell-admin-config
php artisan vendor:publish --tag=capell-frontend-config

Installer and Marketplace config are loaded from their packages. Publish or override them only when the app has a real deployment reason to do so.

VariableDefaultUsed for
APP_URLhttp://localhost in LaravelDefault site URL, install prompts, generated callbacks, Marketplace webhook fallback
APP_KEY(empty until generated)Laravel encryption, signed URLs, cookies, and sessions
APP_ENVLaravel app defaultRuntime environment; live public domains should normally use production
APP_DEBUGLaravel app defaultException rendering; must be false before public traffic
CACHE_STORELaravel app defaultCache backend for runtime state, package flows, locks, and database-backed diagnostics
QUEUE_CONNECTIONsync in a fresh Laravel appBackground jobs and package workflows; production installs should normally use database or redis
SESSION_DRIVERLaravel app defaultSession persistence for admins and authenticated users
LOG_LEVELLaravel defaultCapell log channel level when the app adds the recommended capell channel

Source: packages/core/config/capell.php

VariableDefaultUsed for
CAPELL_SKIP_TWO_FACTOR_WHEN_LOCALtrueSets capell.auth.skip_two_factor_when_local; consumers may skip 2FA only when the application environment is local. Set to false to exercise local 2FA.
CAPELL_VERSION(null)Optional Capell version override for Marketplace health reports
CAPELL_RUNTIME_ROLEcombinedImmutable process composition: combined, public, or authoring; see Runtime roles
CAPELL_CACHE_PATHbootstrap/cache/capellDirectory used for Capell component cache files
CAPELL_CACHE_TTL60Default TTL in seconds for Capell’s general cache helpers
CAPELL_CACHE_LOCK_SECONDS30Lifetime in seconds of the lock Capell holds while filling a cache entry, preventing stampedes
CAPELL_CACHE_LOCK_WAIT_SECONDS10How long a request waits for another process to finish filling the same cache entry before failing
CAPELL_MULTI_NODEfalseDeclare a multi-node deployment so Doctor requires a shared cache store
CAPELL_RELEASE_ROOT_MODEmutablemutable permits guarded release-root writes; immutable and atomic require Composer and migration publication during the release build
CAPELL_SERVER_SIDE_TOOLINGfalseDeclare that this server installs extensions and builds assets itself, so Doctor requires Composer, Node, and proc_open
CAPELL_PHP_BINARY(null)CLI PHP binary used for every Capell subprocess; falls back to CAPELL_SETUP_PHP_BINARY, then PHP_BINARY, then the executable search path
CAPELL_COMPOSER_BINARY(null)Composer binary, composer.phar, or wrapper script used for every Capell subprocess; falls back to CAPELL_SETUP_COMPOSER_BINARY, then the executable search path
CAPELL_COMPOSER_TIMEOUT_SECONDS600How long one Composer run may take; the Marketplace install job timeout is this plus the buffer below, and the queue retry_after must exceed that total
CAPELL_COMPOSER_JOB_TIMEOUT_BUFFER_SECONDS120Extra time the Marketplace install job keeps after Composer returns, for finalizing the attempt and recording telemetry
CAPELL_COMPOSER_NO_CACHEfalseRun Composer with --no-cache, re-downloading every dependency on every install; leave off unless a shared cache cannot be trusted
CAPELL_COMPOSER_CACHE_DIRstorage/framework/composer/cacheWhere Composer keeps its download cache for Capell-run installs
CAPELL_COMPOSER_MEMORY_LIMIT-1Value passed to Composer as COMPOSER_MEMORY_LIMIT
CAPELL_ASSETS_DISKlocalFilesystem disk checked by Capell Doctor for writable asset storage
CAPELL_SITEMAP_MAX_URLS_PER_FILE50000Maximum URLs per generated sitemap file
CAPELL_SITEMAP_XML_PATH/sitemap-xmlPublic path used for sitemap index entries
CAPELL_STATIC_SITE_INTERNAL_REQUESTSfalseAllows static-site generation to use internal request handling
CAPELL_BLAZE_ENABLEDBLAZE_ENABLED, then trueEnables Blaze support where installed
BLAZE_DEBUGfalseEnables Blaze debug behaviour
CAPELL_BLAZE_THROWfalseThrows during Blaze candidate auditing
CAPELL_DISABLE_CACHEfalseDisables Capell’s general cache layer; set to true only for explicit uncached operation
CAPELL_ANALYTICS_COLLECTION_ENABLEDtrueCollects public page-view activity; when false, the beacon script is not injected and the collection endpoint discards hits
CAPELL_ANALYTICS_SEARCH_COLLECTION_ENABLEDfalsePermits recording normalized, filtered on-site search terms; opt-in, and inert until a package calls the recording Action
CAPELL_ANALYTICS_ACTIVITY_RETENTION_DAYS1Age, clamped to 1–7, after which raw activity rows are pruned by the daily capell:activity:prune schedule
CAPELL_ANALYTICS_VISITOR_RETENTION_DAYS30Age, clamped to 14–400, after which visitor-day markers are pruned by the daily capell:activity:prune-visitors schedule
CAPELL_ANALYTICS_RATE_LIMIT_PER_MINUTE30Per-IP limit on the activity collection endpoint; requests over the limit are dropped silently with a 204
CAPELL_DISABLE_CACHE_SAVE_KEYS[]Cache keys or patterns that should not be saved
CAPELL_RELATIONSHIP_DIAGNOSTICSfalseEnables extra relationship diagnostics for page URL/site-domain checks
CAPELL_WORKSPACES_PRUNE_SCHEDULEfalseEnables the publishing workspace prune schedule
CAPELL_WORKSPACES_PRUNE_CRON15 3 * * *Cron expression for workspace pruning
CAPELL_WORKSPACE_PREVIEW_HOME_ROUTEcapell-frontend.homeRoute used for workspace home previews
CAPELL_WORKSPACE_NOTIFICATIONStrueEnables workspace state-change notifications
CAPELL_RELEASE_WINDOWSfalseEnforces configured release windows during publishing
CAPELL_RELEASE_WINDOWS_TZUTCTimezone used for release windows
CAPELL_PLUGINS_SOURCE_URLhttps://plugin.capell.app/packages.jsonLegacy plugin source URL
CAPELL_PLUGINS_CACHE_TTL3600Legacy plugin cache TTL in seconds
CAPELL_PLUGINS_RETRY_TIMES3Maximum attempts for the idempotent plugin catalogue read
CAPELL_PLUGINS_RETRY_DELAY_MS500Base delay in milliseconds between plugin catalogue read attempts
CAPELL_PLUGINS_RETRY_AFTER_MAX_MS60000Maximum accepted Retry-After delay in milliseconds for plugin catalogue reads
CAPELL_MARKETPLACE_READ_RETRY_TIMES3Maximum attempts for idempotent Marketplace catalogue and extension reads
CAPELL_MARKETPLACE_READ_RETRY_DELAY_MS500Base delay in milliseconds between Marketplace read attempts
CAPELL_MARKETPLACE_READ_RETRY_AFTER_MAX_MS60000Maximum accepted Retry-After delay in milliseconds for Marketplace reads
CAPELL_MEDIA_BACKENDspatieMedia backend resolver key, such as spatie or curator
CAPELL_SUPER_ADMIN_ROLEsuper_adminRole name used for the highest admin role
CAPELL_ADMIN_ROLEadminRole name used for admin users
CAPELL_EDITOR_ROLEeditorRole name used for editor users
CAPELL_DEVELOPER_ROLEdeveloperRole name used by developer-focused admin widgets
CAPELL_INSTALL_DEBUGfalseLogs installer events for support debugging
CAPELL_INSTALL_DEBUG_PACKAGE_SELECTIONfalseLogs installer package-selection mode, prompt defaults, and selected packages for support debugging
CAPELL_INSTALL_WELCOME_ROUTES_WEB_PATHroutes/web.phpRoutes file patched when the installer toggles the welcome route
CAPELL_INSTALL_WELCOME_ENV_PATH.envEnv file patched when the installer toggles the welcome route
CAPELL_INSTALL_MODE(null)Enables capell:cloud-bootstrap when set to cloud
CAPELL_CLOUD_REGISTRATION_URL(null)Capell Cloud registration endpoint used by capell:cloud-bootstrap
CAPELL_REGISTRATION_TOKEN(null)Secret token for Capell Cloud registration
CAPELL_SITE_URL(null)Public site URL assigned by the cloud host; never falls back to APP_URL
CAPELL_INSTALL_PACKAGES(empty)Comma-separated package list for cloud bootstrap installs
CAPELL_INSTALL_THEMEdefaultTheme key used by cloud bootstrap installs
CAPELL_ADMIN_NAMEAdminBootstrap admin name fallback when cloud credentials omit a name
CAPELL_ADMIN_EMAIL(empty)Bootstrap admin email fallback when cloud credentials omit an email
CAPELL_LOCKDOWN_FILEstorage/framework/capell-lockdown.jsonLockdown state file path
CAPELL_LOCKDOWN_USER_IDS(empty)Comma-separated user IDs allowed to bypass Lockdown
CAPELL_LOCKDOWN_EMAILS(empty)Comma-separated user emails allowed to bypass Lockdown
CAPELL_DEVELOPER_PAGEtrueShows the developer dashboard page
CAPELL_SYSTEM_HEALTH_PAGEtrueShows the system health dashboard page
CAPELL_DEVELOPER_TOOLS_PHP_WRITESlocal_onlyControls developer tooling PHP file writes
CAPELL_DEVELOPER_TOOLS_DATABASE_WRITESlocal_onlyControls developer tooling database writes
CAPELL_DEVELOPER_TOOLS_READONLY_PREVIEWtrueKeeps developer tooling previews read-only
CAPELL_DEVELOPER_TOOLS_EDITOR_URL_TEMPLATE(null)Editor URL template for opening local files

The three activity-collection env vars above are read only when the Capell Admin package is absent. With Admin present — the normal case — Admin’s own Settings → Dashboard values (analytics_collection_enabled, analytics_search_collection_enabled, analytics_activity_retention_days) take over instead, and the env vars are silently ignored. If the settings table is unreadable, Admin falls back to its own field defaults, not to these env vars. Configure activity collection through Admin in a normal install; the env vars exist for Admin-less or headless deployments. CAPELL_ANALYTICS_RATE_LIMIT_PER_MINUTE has no Admin equivalent and is always read from config.

Search-term recording is opt-in and currently has no built-in caller: enabling CAPELL_ANALYTICS_SEARCH_COLLECTION_ENABLED (or the Admin equivalent) does nothing on its own until a package records searches through RecordSearchActivityAction. When it does, the term is lowercased, whitespace-collapsed, and dropped if empty, over 160 characters, or the entire term matches an email, URL, or phone-number pattern — a query only containing an address, such as a bare email, is filtered; the same address inside a longer sentence is not.

Raw activity rows are pruned daily by capell:activity:prune, scheduled at 00:35 UTC. CAPELL_ANALYTICS_ACTIVITY_RETENTION_DAYS (or its Admin equivalent) is clamped to 1–7 regardless of what is configured.

Visitor-day markers are separate rows with their own schedule, capell:activity:prune-visitors at 00:45 UTC, and their own window: CAPELL_ANALYTICS_VISITOR_RETENTION_DAYS is clamped to 14–400 and has no Admin settings equivalent. The floor of 14 is deliberate — the dashboard compares the last seven days against the seven before them, and a multi-day visitor count cannot be rebuilt from daily rollups once the rows are gone. Each marker is a truncated HMAC of site, address and user agent, salted with the application key and the UTC day; the daily rotation means the same person is unlinkable across days, so a multi-day figure counts a returning visitor once per day.

CAPELL_DISABLE_CACHE_SAVE_KEYS accepts exact keys, wildcard patterns, or regex patterns:

CAPELL_DISABLE_CACHE_SAVE_KEYS=page-*,/^user-\d+$/,my-key

Source: packages/core/config/redirects.php

VariableDefaultUsed for
CAPELL_REDIRECTS_AUTO_ENABLEDtrueEnables automatic redirect behaviour

Source: packages/admin/config/capell-admin.php

VariableDefaultUsed for
CAPELL_ADMIN_PATHadminFilament panel path and admin-owned route prefix
CAPELL_ADMIN_DOMAIN(null)Optional host restriction for admin panel and admin-owned routes
CAPELL_AUTO_CLEAR_CACHEtrueClears relevant caches after admin writes
CAPELL_AUTO_REFRESH_CACHEfalseRefreshes page cache after admin writes where supported
CAPELL_ADMIN_SECURITY_HEADERS_ENABLEDtrueAdds admin response security headers
CAPELL_AUTO_TRANSLATE_LANGUAGE_TEXTtrueShows the auto-translate action on language repeater tabs
CAPELL_SHOW_CONFIGURATOR_TYPE_HINTfalseAllows developer-only configurator class path hints in blueprint selectors when the admin setting also enables them
CAPELL_LAYOUT_BUILDER_DEFAULT_EDITOR_MODEcontent_firstDefault Layout Builder editor mode
CAPELL_LAYOUT_BUILDER_PREVIEW_MATCH_FRONTEND_CONTAINER_LAYOUTtrueKeeps admin layout previews aligned with frontend container behaviour
CAPELL_UPDATE_DANGER_THRESHOLD3Version-behind count treated as dangerous in upgrade notices
CAPELL_UPDATE_API_ENABLEDtrueEnables update checks against the Capell update API
CAPELL_UPDATE_API_URLhttps://capell.app/api/updates/checkUpdate API endpoint
CAPELL_UPDATE_API_TIMEOUT_SECONDS10Update API timeout
CAPELL_UPDATE_API_ENFORCE_HTTPStrueRequires HTTPS for update API calls
CAPELL_UPDATE_NOTIFICATIONS_ENABLEDtrueEnables scheduled upgrade summary notifications
CAPELL_UPDATE_NOTIFICATION_FREQUENCYweeklySchedule frequency for upgrade summary notifications
CAPELL_UPDATE_NOTIFICATION_EMAILS(empty)Comma-separated email recipients for upgrade summaries
CAPELL_EXTENSIONS_COMPOSER_DRIFT_AUTO_FIXfalseAllows all-package Composer drift repair through capell:extensions:repair-composer-drift --all; dashboard reads never run Composer

Use the shared admin entrypoint helper when configuring Filament:

use Capell\Admin\Support\AdminPanelEntrypoint;
return $panel
->domain(AdminPanelEntrypoint::domain())
->path(AdminPanelEntrypoint::path());

See Admin domain and path for path-only and subdomain examples.

Source: packages/frontend/config/capell-frontend.php

VariableDefaultUsed for
CAPELL_FRONTEND_LAYOUT_FILEcapell::appDefault Blade layout for frontend page rendering
CAPELL_FRONTEND_CONTAINER_WIDTH_DEFAULT(null)Default layout container width key when the layout has no override
CAPELL_FRONTEND_PUBLIC_AGGRESSIVE_PREFETCHfalseEnables Laravel Vite aggressive prefetching for public assets
CAPELL_FRONTEND_STYLESHEET_RECOVERY_ENABLEDtrueEnables stable fallback and bounded retry for failed critical stylesheets
CAPELL_FRONTEND_STYLESHEET_FALLBACK_URL/vendor/capell-frontend/capell-frontend.cssStable local stylesheet used while the intended asset is unavailable
CAPELL_FRONTEND_STYLESHEET_RECOVERY_RUNTIME_URL/vendor/capell-frontend/stylesheet-recovery.jsStable local URL for the recovery runtime
CAPELL_HTML_CACHEtrueEnables static HTML cache reads
CAPELL_WRITE_HTML_CACHEtrueAllows static HTML cache writes
CAPELL_PUBLIC_RENDER_DATA_CACHEtrueCaches hydrated public render payloads
CAPELL_MINIFY_HTMLtrueMinifies rendered HTML before returning or caching
CAPELL_MODEL_EVENT_REGISTRATION_MODEdeferredCache event tracking mode: sync, deferred, or async
CAPELL_FRONTEND_REGISTER_HOME_ROUTEfalseRegisters / to the Capell frontend controller
CAPELL_FRONTEND_USE_SITE_DOMAIN_FOR_URLSfalseRewrites generated frontend URLs to the resolved site domain
CAPELL_THROW_ON_NO_SITESfalseThrows instead of returning 404 when no sites exist
CAPELL_AUTO_CREATE_SYSTEM_PAGEStrueAuto-creates missing system pages when resolving fallback pages
CAPELL_FRONTEND_DEFAULT_SCHEME(null)Optional forced scheme for generated frontend URLs, such as https
CAPELL_SITE_BASE_URL(null)Base URL override for generated site URLs
CAPELL_FRONTEND_PURGE_QUEUEdefaultQueue used for CDN purge jobs
CAPELL_FRONTEND_CDN_PROVIDER(null)CDN purge provider: cloudflare, fastly, or varnish
CAPELL_FRONTEND_CLOUDFLARE_PURGE_TOKEN(null)Cloudflare API token for tag purges
CAPELL_FRONTEND_CLOUDFLARE_ZONE_ID(null)Cloudflare zone ID for tag purges
CAPELL_FRONTEND_FASTLY_API_KEY(null)Fastly API key for surrogate-key purges
CAPELL_FRONTEND_VARNISH_URL(null)Varnish endpoint used for BAN requests
CAPELL_DEBUG_LOGfalseAdds frontend resolution debug logging
CAPELL_FRONTEND_STATIC_ARTIFACTS_PATH(null)Override directory for capell:generate-html output; defaults to storage
CAPELL_ERROR_PAGE_MANIFEST_DIRECTORY(null)Directory for the generated error-page manifests; defaults to storage/framework
CAPELL_FRONTEND_TAILWIND_OUTPUT_CSSresources/css/capell/frontend.cssPath the generated frontend Tailwind stylesheet is written to
CAPELL_FRONTEND_EXTERNAL_INTEGRITY_POLICYwarnSubresource-integrity policy for external assets: off, warn, or require
CAPELL_CACHE_INVALIDATION_GRAPH_MAX_DEPTH20Maximum traversal depth when resolving which cache entries a change invalidates
CAPELL_CACHE_INVALIDATION_GRAPH_MAX_NODES5000Safety bound on nodes visited during cache-invalidation traversal
CAPELL_CACHE_INVALIDATION_GRAPH_MAX_EDGES10000Safety bound on edges walked during cache-invalidation traversal
CAPELL_FRONTEND_PUBLIC_VIEW_QUERY_GUARD_ENABLEDtrueDetects database queries executed from public Blade views
CAPELL_FRONTEND_PUBLIC_VIEW_QUERY_GUARD_MODEexceptionGuard reaction: exception to fail loudly, or log to record and continue
CAPELL_FRONTEND_PUBLIC_VIEW_QUERY_GUARD_DOCS_URL(docs.capell.app symptom table)Help URL embedded in the guard’s error message
CAPELL_FRONTEND_PUBLIC_RENDER_CONTRACT_RECORD_PASSEDfalseRecords passing public render-contract checks as events
CAPELL_FRONTEND_PUBLIC_RENDER_CONTRACT_RECORD_FAILEDtrueRecords failing public render-contract checks as events

The public view query guard is a development safeguard: queries belong in the render pipeline, not in Blade. Set CAPELL_FRONTEND_PUBLIC_VIEW_QUERY_GUARD_MODE=log in production if you would rather record violations than return an error page. Any value other than log is treated as exception.

HTML content rendering is sanitized by RenderHtmlContentAction; Blade directives are not evaluated. Allow only attributes that are safe for public CMS output through capell-frontend.html_content_allowed_attributes. See packages/frontend/docs/security.md.

Source: packages/installer/config/capell-installer.php

VariableDefaultUsed for
CAPELL_SETUP_ALLOW_REINSTALLAPP_DEBUG, then falseAllows the browser installer to run again after install
CAPELL_SETUP_COMPOSER_BINARYcomposerComposer binary used by the browser installer
CAPELL_SETUP_PHP_BINARYphpCLI PHP binary used for fresh Artisan processes
CAPELL_SETUP_DEFAULT_PACKAGEScapell-app/filamentorsOptional packages preselected in the browser installer
CAPELL_SETUP_ADMIN_NAME(empty)First admin name prefilled in the browser installer
CAPELL_SETUP_ADMIN_EMAIL(empty)First admin email prefilled in the browser installer
CAPELL_SETUP_ADMIN_PASSWORD(empty)First admin plaintext password input; hashed on create

Set CAPELL_SETUP_PHP_BINARY when the web SAPI sees PHP_BINARY as php-fpm or another non-CLI executable.

For a local demo install, set the admin defaults as plaintext form values:

CAPELL_SETUP_ADMIN_NAME="Demo Admin"
CAPELL_SETUP_ADMIN_EMAIL=[email protected]
CAPELL_SETUP_ADMIN_PASSWORD=password123

CAPELL_SETUP_ADMIN_PASSWORD is not encrypted in .env and should not be pre-hashed. Capell passes it through the setup flow as the login password, then Laravel hashes it before saving the admin user.

Source: packages/marketplace/config/capell-marketplace.php

VariableDefaultUsed for
CAPELL_MARKETPLACE_ENABLEDtrueEnables Marketplace integration
CAPELL_INSTANCE_ID(null)Existing Marketplace instance ID
CAPELL_MARKETPLACE_URLhttps://capell.app/api/v1Marketplace API base URL
CAPELL_MARKETPLACE_WEB_URLhttps://capell.appPublic Marketplace web URL
capell-marketplace.marketplace.timeout_seconds10Marketplace API request timeout
capell-marketplace.marketplace.telemetry_timeout_seconds3Marketplace telemetry request timeout
capell-marketplace.marketplace.cache_ttl_seconds300Fresh Marketplace response cache TTL
capell-marketplace.marketplace.stale_cache_ttl_seconds3600Stale Marketplace response cache TTL
capell-marketplace.marketplace.warm_throttle_seconds60Minimum seconds between catalogue cache warm runs
CAPELL_MARKETPLACE_CATALOGUE_PAGE_LIMIT3Page limit for catalogue fetches
CAPELL_MARKETPLACE_WEBHOOK_URL(null)Explicit public callback URL for Marketplace events
CAPELL_MARKETPLACE_WEBHOOK_SECRET(null)Shared secret for Marketplace webhook verification
CAPELL_MARKETPLACE_TROUBLESHOOTING_URLhttps://docs.capell.app/extensions/marketplace-heartbeatHelp URL shown in Marketplace diagnostics
CAPELL_MARKETPLACE_QUEUE_CONNECTIONdatabaseQueue connection Marketplace install jobs are sent to
CAPELL_MARKETPLACE_HTTP_PROXY(null)Proxy URL applied to every outbound marketplace call
CAPELL_MARKETPLACE_HTTP_VERIFY(null)Path to a CA bundle, or false, for every outbound marketplace call
CAPELL_MARKETPLACE_QUEUEcapell-marketplaceNamed queue Marketplace install jobs are sent to
CAPELL_MARKETPLACE_QUEUED_STALE_AFTER_SECONDS120How long an install may sit queued before Capell reports that nothing is consuming the queue
CAPELL_MARKETPLACE_WORKER_HEARTBEAT_STALE_AFTER_SECONDS300How long a recorded worker heartbeat still counts as evidence a worker is running
CAPELL_MARKETPLACE_HEALTH_HTTP_PROBEtrueWhether the post-install health check also requests the site’s own homepage
CAPELL_MARKETPLACE_HEALTH_HTTP_TIMEOUT_SECONDS5Timeout for that homepage request
CAPELL_MARKETPLACE_HEARTBEAT_SCHEDULEDtrueWhether the scheduled Marketplace heartbeat runs
CAPELL_MARKETPLACE_HEARTBEAT_AT02:40Local scheduler time for the Marketplace heartbeat
CAPELL_MARKETPLACE_AUTO_UPDATE_SCHEDULEDfalseWhether unattended Marketplace updates are scheduled
CAPELL_MARKETPLACE_AUTO_UPDATE_AT03:20Local scheduler time for unattended Marketplace updates

Marketplace installs do not use QUEUE_CONNECTION. They are pinned to CAPELL_MARKETPLACE_QUEUE_CONNECTION (default database) and the named queue capell-marketplace. A worker started as plain php artisan queue:work consumes the default queue and will never pick these jobs up — the admin UI stays at “queued” with no error. Run a worker that names the queue, and allow enough time for Composer:

Terminal window
php artisan queue:work database --queue=capell-marketplace --timeout=900

If you set this connection to sync, the Composer install runs inside the web request and will be killed by max_execution_time. Keep it on a real queue connection.

After every package change, Capell runs a health check before it calls the operation a success, and rolls composer.json, composer.lock and vendor/ back to how they were if that check refuses the site. The primary probe boots a fresh PHP process — it needs no web server and no publicly reachable hostname, and it checks bootstrap and autoload state rather than that something answers on a port. CAPELL_MARKETPLACE_HEALTH_HTTP_PROBE controls only the secondary request to your own homepage; turning it off loses a confirmation but can never turn a failure into a pass, because a probe that cannot connect already skips rather than failing. A site that is not reachable from inside itself — behind a load balancer, or in a container — is a normal deployment, not a broken one.

Only override CAPELL_MARKETPLACE_URL for staging or self-hosted Marketplace APIs. If Marketplace reports that api/registration-sessions cannot be found, the app is probably using an old unversioned API URL.

These change what anonymous visitors can reach, or what protections apply. None has an env var, so they are only settable by publishing the config file — and easy to miss.

Config keyDefaultEffect
capell-admin.security_headers.headersX-Content-Type-Options: nosniff, Referrer-Policy: strict-origin-when-cross-origin, Permissions-Policy: camera=(), microphone=(), geolocation=(), X-Frame-Options: SAMEORIGINLiteral header map stamped on every admin response. Publishing replaces the whole map, so add a CSP or change the frame policy here. Only the enabled flag has an env var.
capell-frontend.fallback_public_views.view_names[]Allowlist of full Blade view names an unresolved public path may render
capell-frontend.fallback_public_views.prefixes['pages']Permitted leading view segments for fallback views. Widening this exposes more application templates to anonymous visitors.
capell-frontend.route.reserved_domains[]Hosts the frontend catch-all must never serve. The admin domain is reserved automatically.
capell-frontend.route.reserved_prefixes[]Path prefixes excluded from frontend catch-all routing
capell-frontend.route.reserved_exact_paths[]Exact paths excluded from frontend catch-all routing
capell-frontend.route.url_regexnegative-lookahead regexDecides which URLs the frontend catch-all claims. Excludes admin, api, livewire, storage, and asset extensions; allows .html.
capell-frontend.public_view_query_guard.ignored_connections[]Connections exempt from the public-render query guard. Adding one silently disables leak detection for it.
capell-frontend.public_html_authoring_markers[]Extra substrings treated as unsafe authoring markers when inspecting public HTML
capell-frontend.cache_skip_authenticatedtrueBypasses the frontend HTML cache for signed-in requests. Leave enabled unless you are certain no per-user content is rendered.
capell.runtime.auth_pathslogin, register, forgot-password, reset-password/*, email/verify*, confirm-password, two-factor-challengePath patterns the runtime resolver classifies as auth context
capell-admin.user_resource.role_schema_types['super_admin' => 'administrator']Maps a role to the user form schema it sees, controlling which fields that role can edit
redirects.auto_redirects.status_code301HTTP status for redirects created automatically when a page URL changes. Only enabled has an env var.

Commonly adjusted, and not settable through the environment:

Config keyDefaultEffect
capell.default_pageshome, error_404, maintenance, welcomePages created automatically for a new site
capell.media.crop_presetsthumbnail 320×320, card 800×600, hero 1600×900, open_graph 1200×630Named crop presets offered on media edit; changing these changes generated derivative sizes
capell.media.modelCapell\Core\Models\MediaMedia model class override
capell-frontend.default_layout / foundation_themedefault / defaultFallbacks when a site or page specifies none
capell-frontend.redirect_default_sitetrueRedirects unmatched hosts to the default site instead of returning 404
capell-frontend.pagination_limit12Page-list page size when a caller passes no limit
capell-frontend.meta_title_seperator' | 'Separator between site and page name in <title>. Note the spelling of the key.
capell-frontend.date_formatM jS, YPublish-date format on asset cards and tiles
capell-frontend.tailwind.sourcesresources/views/**/*.blade.phpGlobs scanned for Tailwind class extraction
capell-frontend.tailwind.validate_sourcesfalseValidates those globs before generating assets
capell-admin.navigation_badge_countsfalseGlobal switch for admin navigation badge count queries
capell-admin.resources.page.navigation_badgefalseHides the Pages navigation badge even when counts are enabled
capell-admin.resources.user.navigation_badgefalseHides the Users navigation badge even when counts are enabled
capell-admin.shortcutsg p, g s, g t, g ,, g w, /Admin keyboard shortcut map
capell-admin.social_types8 networksSocial link types offered in the site social-icons form
capell-installer.database_table_cache.storefileCache store for the installer’s table-existence cache

Keys read by optional packages, not by this repository

Section titled “Keys read by optional packages, not by this repository”

Several keys live in a host config file but are consumed by an optional package. They do nothing until that package is installed, and searching this repository for a consumer finds none — which does not mean they are dead. Do not remove them.

Config keyRead by
capell.publishing-studio.release_windows.*, .notifications.*, .review_policy.*capell-app/publishing-studio (ReleaseWindowGuard) and capell-app/automation-studio
capell.sitemap.xml_path, .disk, .directorycapell-app/site-discovery
capell-admin.layout_builder.allowed_editor_modescapell-app/layout-builder (LayoutBuilderConfiguration)
capell-frontend.breakpoints.lgcapell-app/theme-foundation views
capell.analytics.daily_rollup_retention_days (CAPELL_ANALYTICS_DAILY_ROLLUP_RETENTION_DAYS)No consumer in this repository today; daily metric rollups are not pruned by age here

Release windows in particular are enforced by the Publishing Studio package. Without it installed, setting those keys restricts nothing.

Static HTML cache output is owned by the installed cache/static package, not by capell-app/frontend alone. Only add a dedicated disk when that package’s docs or installer patch expects it. Older installs commonly use:

'page_cache' => [
'driver' => 'local',
'root' => public_path('page-cache'),
'throw' => false,
],

The web server user must be able to write to this path when the installed cache package has CAPELL_WRITE_HTML_CACHE=true. Do not configure Nginx or Apache to serve public/page-cache unless an installed cache package owns that directory and its public-output safety tests pass.

Add a dedicated Capell channel to config/logging.php if the installer has not patched it already:

'capell' => [
'driver' => 'single',
'path' => storage_path('logs/capell.log'),
'level' => 'debug',
],

Frontend logging uses this channel when it exists and falls back to Laravel logging when it does not.

Register a morph map in the consuming app if polymorphic records may outlive class renames:

use Capell\Core\Models\Language;
use Capell\Core\Models\Page;
use Capell\Core\Models\Site;
use Capell\Core\Models\Blueprint;
use Illuminate\Database\Eloquent\Relations\Relation;
Relation::morphMap([
'language' => Language::class,
'page' => Page::class,
'site' => Site::class,
'blueprint' => Blueprint::class,
]);