
After purchase: Lemon key vs portal keys (read this first)
Checkout happens on Lemon Squeezy. Lemon emails you a Lemon license key (also listed under My Orders). That Lemon key is never pasted into Filament and never used as a Composer password. What you do instead:- Open the License Portal.
- Register with:
- your email (same as Lemon checkout when possible),
- a password for the portal,
- your Lemon Squeezy license key.
- After registration, the portal generates two credentials for you:
- Composer token (
cmp_…) — only forcomposer config --auth/ CI, so you can download the package. - Public API key (
pk_forms_…) — only for Filament (Global Settings → License → License public key), so Studio unlocks on registered domains.
- Composer token (
Full portal reference: The License Portal.
Step-by-step installation
1. Buy and register on the License Portal
- Purchase from the Flex Forms store.
- Copy your Lemon Squeezy license key from the receipt email or My Orders.
- Go to license.bjanczak.com/flex-forms/panel.
- Create an account: email + password + paste the Lemon license key when asked.
- After signup, the portal shows your generated Composer token (
cmp_…) and Public API key (pk_forms_…). Keep both; you will usecmp_…on this page andpk_forms_…in Activate license.
Lemon may show the purchase as inactive until you register the first domain in the portal. That means “valid purchase, zero domains activated,” not a failed payment.
2. Copy your Composer token
- In the portal, open Install via Composer.
- Copy the token starting with
cmp_(and the ready-made commands if shown). - Store it in a password manager. You need it on every machine that runs
composer install/composer updatefor this project (laptop, CI, Forge, etc.).
3. Point Composer at the private registry
From your Laravel project root:composer.json under "repositories":
flex-forms is only a local label. You can keep other Composer repositories alongside it.
4. Authenticate to the registry
Username is always the literal wordtoken (not your email):
YOUR_COMPOSER_TOKEN with the full cmp_… value from the portal.
This creates or updates auth.json. Add auth.json to .gitignore. Committing it publishes your download password.
A wrong token typically shows as 401 Unauthorized when resolving janczakb/filament-flex-forms.
5. Require the package
janczakb/filament-flex-forms.
You do not need to run npm install inside the package for normal use — Studio, fill, and embed assets ship prebuilt.
6. Publish assets and run migrations
- Publishes Flex Forms assets (
filament-flex-forms-assets) - Optionally publishes translations with
--translations - Runs
php artisan filament:assets - Asks to run
php artisan migrate(or runs them when non-interactive /--force)
7. Register the plugin on your Filament panel
Open your panel provider (oftenapp/Providers/Filament/AdminPanelProvider.php):
FLEX_FORMS_PERMISSIONS_STRICT=true.
8. Activate the license (required)
Composer install does not putpk_forms_… into Filament for you.
- Register every hostname you use in the License Portal.
- Paste the portal-generated Public API key (
pk_forms_…) into Global Settings → License → License public key.
Prerequisites
Confirm these before or while you install.Which key goes where
Production checklist after install
Queues
Queues
Run a queue worker in production. Integrations, some Insights work, and mail jobs expect the queue to process. Local
QUEUE_CONNECTION=sync is acceptable for a first smoke test only.Scheduler
Scheduler
Ensure
php artisan schedule:run is cron’d every minute (Forge / Cloud / Kubernetes CronJob). Flex Forms relies on scheduled maintenance for Insights and related tasks.Trusted proxies
Trusted proxies
Behind Cloudflare, AWS ALB, or nginx, configure Laravel Trusted Proxies so
Request::ip() is the real visitor. Flex Forms uses IP for submission metadata, rate limits, and optional duplicate-by-IP. Misconfigured proxies make every visitor look like 10.x / 127.0.0.1.Caches
Caches
After changing
.env or published config: php artisan optimize:clear (or your usual deploy cache rebuild).CI / CD (GitHub Actions, GitLab, Forge)
Never commitauth.json. Store cmp_… as a secret, for example FLEX_FORMS_COMPOSER_TOKEN.
Example GitHub Actions fragment:
composer install on release succeeds.
When you regenerate a Composer token in the portal, update every secret and every server auth.json in the same change window.
Upgrading
Already installed? When a new Flex Forms release ships, runcomposer update janczakb/filament-flex-forms, migrate, and php artisan flex-forms:upgrade. License keys do not need a database upgrade.
Full checklist, CI notes, dry-run, and troubleshooting: Upgrading.
Troubleshooting
Package not found / could not find a matching version
Package not found / could not find a matching version
Confirm the repository URL is
https://composer.bjanczak.com and that composer require janczakb/filament-flex-forms uses that exact package name. Run composer clear-cache and retry.Package installed but Studio is locked or missing
Package installed but Studio is locked or missing
Install succeeded; activation did not. Paste
pk_forms_… and register the hostname — Activate license.Class FilamentFlexFormsPlugin not found
Class FilamentFlexFormsPlugin not found
Dump autoload (
composer dump-autoload), confirm the require succeeded, and clear opcache if you use it in production.Migration errors
Migration errors
Ensure the DB user can create tables. Re-run
php artisan migrate and read the failing migration name. Do not skip migrations permanently — Studio depends on them.Exact package name?
Exact package name?
janczakb/filament-flex-forms