octopyid/filament-palette
A color palette picker for Filament forms. Add a clean, swatch-based field that lets users choose from predefined colors instead of typing hex codes, making theme, tag, status, and category selection faster and more consistent in your admin panels.
Architecture fit FilamentPalette is a presentation-layer plugin for Filament panels: it swaps the admin panel's colour palette and persists the choice through Laravel's cache abstraction. That is a deliberately shallow integration — no schema changes, no service-provider boot ordering hazards beyond the standard Filament plugin registration, and no interception of application domain logic. For a TPM this is the low-risk category of dependency: if it fails, the admin UI loses theming, not correctness.
v1.1.0 materially improves the architecture story in two ways. First, FILAMENT_PALETTE_CACHE_STORE turns an implicit dependency on the default cache store into an explicit configuration surface, which is the right direction for a package that persists state. Second, the removal of composer.lock from version control is the correct posture for a distributed library — consumers resolve dependencies against their own Laravel/Filament matrix rather than inheriting the maintainer's lockfile. The .gitattributes export-ignore rules reduce the installed footprint by stripping tests, .github, and related dev artefacts.
The PaletteManager refactor to contain local cache fallback "without leaking state into the testing environments" is a meaningful signal: the maintainers identified a state-bleed class of bug and addressed it structurally rather than with conditional guards scattered through call sites.
Integration feasibility
Integration is a standard Composer install plus plugin registration, with one new optional-but-recommended config step. The primary feasibility constraint is not installation effort but cache topology: the package persists the selected palette via cache, so the chosen store must be shared and durable across every node serving the panel. On a single-node deployment with file cache this is trivially satisfied. On a load-balanced fleet, file cache means each user's palette selection is pinned to whichever node handled the write — visible as flapping themes. Redis, Memcached, or database cache resolves this.
The "smart fallback" for local development is convenient but introduces an environment-conditional code path that behaves differently from production. This is worth an explicit review question rather than silent acceptance: the fallback triggers on array or null drivers, both of which are legitimate intentional choices in production contexts (stateless containers, testing, read-only filesystems). A silent override of an operator's declared cache driver is the kind of behaviour that is helpful in dev and surprising in prod.
Technical risk
env() at runtime) or php artisan config:cache will silently freeze the value. New package, so this is worth verifying once rather than assuming.Key questions
FILAMENT_PALETTE_CACHE_STORE fall back to the app default when unset, and is the value resolved via config() (cache-safe) rather than env()?Stack fit
Requires a Laravel application running Filament. v1.1.0's CI matrix spans PHP 8.2, 8.3, and 8.4, which sets a practical floor of PHP 8.2 for supported configurations. Laravel and Filament version support should be confirmed against composer.json before committing, since the release notes do not enumerate them. Fit is strongest where the platform already runs a shared cache backend (Redis is the common case) and weakest on multi-node deployments still using file cache.
Migration path
No breaking changes are declared between v1.0.3 and v1.1.0; SemVer discipline is stated and the changelog's Added/Changed/Removed sections contain no removal of public API. Existing installs upgrade by changing the Composer constraint and running composer update. The composer.lock removal has no effect on consumers who already installed the package — it changes dependency resolution for new installs only. Teams pinned to 1.0.* should be moved to ^1.1.
Compatibility
redis, memcached, database, file (single-node), dynamodb — any durable, shared store. Avoid array and null in any environment where palette persistence matters.php artisan config:cache. Confirm the env var is consumed through a config file.Sequencing
composer.json constraints against our Filament and Laravel versions.^1.1 in composer.json; upgrade in a branch, not a hotfix lane.FILAMENT_PALETTE_CACHE_STORE explicitly to our shared store rather than relying on the application default — explicitness here is cheaper than debugging palette flapping later.Maintenance Ongoing maintenance is light: a Composer constraint bump per release, and no migrations, no scheduled tasks, no queue workers. The addition of Pest and Orchestra Testbench suites plus a GitHub Actions matrix shifts the maintenance burden from "we must manually verify each upgrade" to "we can trust green CI for the declared matrix and spot-check our unsupported combinations." Laravel Pint enforcement means the codebase stays reviewable. The main residual maintenance obligation is tracking Filament major releases, since a Filament 4-style breaking change would strand the package until the maintainer catches up.
Support Support surface is narrow — the feature is admin theming, so user-visible failure is cosmetic. Expect internal tickets of the form "my theme keeps resetting" and "colleagues see a different palette than I do," both of which point at cache topology or global-vs-per-user scoping rather than at bugs. Document the chosen cache store in the runbook so first-line support does not chase phantom theme bugs. No vendor SLA is available; support is community/upstream issue-tracker only.
Scaling Scaling is bounded entirely by the cache backend, which is infrastructure we already operate and monitor. Two scaling notes: palette reads sit on the admin panel rendering path, so cache latency is on the critical path for every admin page load — negligible against a local Redis, non-trivial if the configured store is remote or contended. Second, the cache entry is small and low-cardinality, so volume is a non-issue; if the palette proves to be per-user, cardinality scales with admin seat count and remains trivial.
Failure modes
file cache — palette selection appears to randomly revert as requests hit different nodes. Highest-probability operational surprise.config:cache staleness — env var changed but config not rebuilt; the store setting silently remains the old value. Standard Laravel trap, but newly relevant here.Ramp-up
Minimal. A Laravel-fluent engineer can integrate, configure, and verify this in well under a day, most of which is cache-topology validation rather than package work. The package is small enough to read end-to-end, which is the right due-diligence move given maintainer concentration and the open scoping questions. Recommended ramp: one engineer reads the PaletteManager and config file (~1 hour), answers the scoping and fallback questions, then proceeds with staging deployment.
How can I help you explore Laravel packages today?