config/filament-flex-forms.php. Keys listed below can also be set via .env without publishing (unless noted otherwise).
License
License check, portal, and purchase URLs are fixed in the package (same endpoints Studio uses). They are not config or.env settings — changing them is not supported.
license.signing_public_key is loaded from the bundled public Ed25519 JWK at resources/license/signing-public-key.json, not an env var — you should not need to touch it.Security
bool
default:"false"
When
true, every form encrypts submission answers at rest (same as Global Settings → Security → Require encryption on all forms, but locked by env). Env: FLEX_FORMS_FORCE_SUBMISSION_ENCRYPTION. See Multi-tenancy and General Settings.Localization (i18n)
Host overrides for Studio / Fill JS catalogs. Full workflow (publish PHP + JSON, add languages, RTL): Localization & RTL.string|null
default:"null (lang/vendor/filament-flex-forms/js)"
Absolute or app-relative root for published JS locale JSON (
studio/{locale}.json, fill/{locale}.json). Env: FLEX_FORMS_I18N_JS_PATH. Leave empty to use Laravel lang_path('vendor/filament-flex-forms/js').Uploads
string
Disk for logo/cover/social images — must be publicly readable so crawlers can render link previews. Env:
FLEX_FORMS_DESIGN_DISK.string
default:"local"
Disk for respondent file uploads — kept private, served via signed URLs. Env:
FLEX_FORMS_SUBMISSIONS_DISK.string
default:"flex-forms/design, flex-forms/submissions"
Root path prefix inside each disk.
int
default:"80 / 85"
Compression quality for optimized images (WebP default 80, JPEG 85). Env:
FLEX_FORMS_WEBP_QUALITY, FLEX_FORMS_JPEG_QUALITY.array
Long-edge limits for Studio design assets. Cover writes a normal + thumb pair; logo fits a 500×500 box; social/OG is center-cropped to 16:9 JPEG. Images are never upscaled.
int
default:"1500 / 350"
Public fill field images: normal max 1500px, thumb max 350px (WebP). Non-image uploads (PDF, video, audio, …) stay as a single original file.
string
default:"disk"
Storage driver for design assets and public fill field uploads:
disk (default) or spatie. When spatie, Media Library is the primary store (conversions + URLs). Env: FLEX_FORMS_MEDIA_DRIVER.string|null
default:"null"
Optional Spatie disk override. When null, Flex Forms uses the purpose-aware design / submissions disks. Env:
FLEX_FORMS_SPATIE_DISK.string
default:"flex-forms"
Prefix for Spatie media collections (e.g.
flex-forms-design-cover). Env: FLEX_FORMS_SPATIE_COLLECTION_PREFIX.bool
default:"true"
Generate Spatie responsive srcsets for cover/field
normal conversions. Env: FLEX_FORMS_SPATIE_RESPONSIVE.bool
default:"false"
Queue Spatie conversions (needs a worker). Default
false so Studio/fill get URLs immediately. Env: FLEX_FORMS_SPATIE_QUEUE_CONVERSIONS.int
default:"40"
Rejects images above this resolution before processing.
int
default:"30"
Per-IP upload rate limit on Studio design uploads.
int
default:"15"
How long a signed private-file URL stays valid.
int
default:"524288000 (500 MB)"
Total upload quota per form across all submissions.
callable|null
default:"null"
Required for multi-tenant apps.
fn (?Authenticatable $user, FlexForm $form, string $ability): bool — without it, any authenticated panel user can upload/view files for any form.bool
default:"false"
When
true, uploads/views are denied unless uploads.authorize is set — flip this on for SaaS hosts to fail closed instead of open.Builder
int
default:"10"
Maximum number of pages a form can have in Studio. Env:
FLEX_FORMS_MAX_PAGES.Filament navigation
Sidebar item for the Forms resource. Prefer the fluent plugin API in your panel provider; config / env are fallbacks.Filament sidebar group. Env:
FLEX_FORMS_NAVIGATION_GROUP.Sidebar label. Env:
FLEX_FORMS_NAVIGATION_LABEL.Heroicon (or other Blade icon) for the Forms item. Env:
FLEX_FORMS_NAVIGATION_ICON.Sort order inside the group. Env:
FLEX_FORMS_NAVIGATION_SORT.Studio branding
string|null
default:"null / Filament"
Left-rail branding shown inside Studio itself (not the public fill page) — override programmatically with
FilamentFlexFormsPlugin::make()->brandLogo()->brandName(), or via FLEX_FORMS_STUDIO_BRAND_LOGO / FLEX_FORMS_STUDIO_BRAND_NAME.Studio account menu
The Studio left rail shows a Filament-style account avatar below Global Settings. Items are cloned from the current panel’suserMenuItems() (profile, logout, and any custom entries). Nested children in config extras render as nested submenus.
If your panel only customizes logout with MenuItem::make()->icon(...) (no URL), Studio still exposes Log out as a POST to Filament’s logout route.
Env:
FLEX_FORMS_STUDIO_USER_MENU.Env:
FLEX_FORMS_STUDIO_USER_MENU_EMAIL.Optional auth guard and expected Authenticatable FQCN (defaults to the Filament panel user). Env:
FLEX_FORMS_STUDIO_USER_MENU_GUARD / FLEX_FORMS_STUDIO_USER_MENU_MODEL.Attribute names or
fn (Authenticatable $user) callbacks. When null, Flex Forms uses Filament’s name/avatar helpers and the user’s email.Filament menu keys to hide in Studio (e.g.
['profile']).Extra menu entries merged after Filament’s. Each item may include
key, label, url, method (get|post), icon, color, sort, group, openInNewTab, and nested children for submenus.Per-user menu payload cache via FlexFormsCache (Redis when Insights Redis scaling is enabled, otherwise Laravel cache) plus an in-request memo. Invalidation is TTL-only — profile/menu changes are not bumped; wait for
cache_ttl or disable cache in local/dev. Env: FLEX_FORMS_STUDIO_USER_MENU_CACHE / FLEX_FORMS_STUDIO_USER_MENU_CACHE_TTL.Submission emails (HTML)
Publish Blade templates to customize HTML visually:string
default:"#0F172A"
Fallback accent when the form design has no accent color. Env:
FLEX_FORMS_MAIL_ACCENT.bool
default:"false"
When true, respondent receipts include the answers table (also forced on when “Include answers receipt” is checked). Env:
FLEX_FORMS_MAIL_RESPONDENT_ANSWERS.string
Blade view names for team alerts, respondent receipts, and plain-text fallback.
Studio permissions (optional Spatie)
Spatie is not required. See the full guide: Studio permissions (RBAC).bool
default:"true"
Master switch. Env:
FLEX_FORMS_PERMISSIONS_ENABLED.bool
default:"true"
When true and
spatie/laravel-permission is installed, enforce mapped Gate names only if that permission exists in your DB. Env: FLEX_FORMS_PERMISSIONS_SPATIE.bool
default:"false"
Deny when no authorize callback and no registered Spatie permission. Env:
FLEX_FORMS_PERMISSIONS_STRICT.callable|null
default:"null"
fn (Authenticatable $user, StudioAbility $ability, ?FlexForm $form): ?bool — return null to continue the chain.array
Maps each Studio ability (e.g.
createForm) to a Gate / Spatie name (e.g. Create:FlexForm).Insights
int
default:"90"
How long raw analytics events are kept before pruning.
int
default:"100000"
Hard cap on filtered raw-event cursor rows. When exceeded, the scan stops and
meta.filtered_scan_capped is set. Global Insights with filters on ranges longer than 31 days also clamps the scan window and sets meta.filtered_range_clamped (separate from the row-budget flag). Env: FLEX_FORMS_INSIGHTS_FILTERED_SCAN_MAX_ROWS.int
default:"300"
Seconds an Insights query result is cached — see Redis production checklist.
bool|null
default:"null (auto-detect)"
Force Redis scaling on/off, or leave unset to auto-detect connectivity. Env:
FLEX_FORMS_INSIGHTS_SCALING_REDIS.string
default:"null / flex_forms.insights."
Named Redis connection and key namespace.
object
Country/city for Insights maps. Defaults: CDN headers, optional local MaxMind. External
ip-api Pro HTTPS is opt-in (enable_external_api + api_key) — visitor IPs are personal data; keep off unless you have a DPA and disclose the processor. Plain HTTP is never used.int
default:"120"
Soft per-form × IP event budget for the analytics beacon (in addition to the route throttle). Env:
FLEX_FORMS_BEACON_EVENTS_PER_FORM_IP.object
User-agent substrings, referrer substrings, and regexes used to exclude bots/crawlers from traffic and drop-off numbers.
list<class-string>
default:"[]"
Class names implementing
SubmissionMiddleware, run around submission ingest. Also push via FilamentFlexFormsPlugin::pushSubmissionMiddleware(). See Events & hooks.list<class-string>
default:"[]"
Extra
IntegrationDriver classes registered at boot. Prefer FilamentFlexFormsPlugin::registerIntegration() for panel-scoped apps. See Custom integrations.list<string>
default:"[]"
Absolute paths scanned for
*.php driver classes (e.g. app_path('FlexForms/Integrations')).bool
default:"false"
When false, host drivers cannot replace shipped keys like
mailchimp.list<string>
default:"[]"
Extra delivery-context keys always redacted before persistence (e.g.
ssn, nip).Do I need to publish the config at all?
Do I need to publish the config at all?
No — every key has a sane default and can be overridden purely with env vars. Publish only if you need PHP-level overrides like
uploads.authorize.