lara-zeus/boredom
A Laravel wrapper for the Bored API that suggests things to do when you're bored. Fetch random activities filtered by type, participants, price, or accessibility through a clean, simple, expressive interface.
Architecture fit. This is a presentation-layer leaf dependency. Under the correct reading — a Filament avatar provider — it touches exactly one seam: Filament::setAvatarProvider() in a PanelProvider. No schema, no migrations, no queue, no storage, no background jobs, no model changes. That is the single most important architectural fact for a TPM: a dependency this shallow can only become load-bearing if someone lets it, and enforcing the seam (no LaraZeus\* references from views, resources, or the User model) keeps it removable in one line.
Integration feasibility. Genuinely small. Install, verify namespace of the shipped provider class against src/, register in the panel's boot() (not register()), publish config if the package ships one, clear Filament's component cache, smoke-test a UserResource table and a comment thread. Half a day is the honest ceiling. If it exceeds that, the build-vs-buy math has already flipped: the capability is roughly 50 lines of deterministic SVG seeded from a name and wired to Filament's AvatarProvider contract.
Technical risk. Ranked:
composer.json and the 2.1.0→3.0.0 diff before an engineer starts, because every downstream argument — effort, privacy, blast radius — flips between the two readings. The "no vendor egress" compliance argument only holds for the avatar reading, and only if generation is local SVG rather than an outbound call to a Boring Avatars host.Key questions.
composer.json require filament/filament: ^5.0 only, or does 3.0.0 also support v3? This determines whether the package is usable at all on the current panel.AvatarProvider contract, and what is its exact FQCN?name, email, or something else — and is it configurable?Stack fit. Filament v3+ panels, Laravel 11/12, PHP 8.2+. Out of scope for Filament v2, and out of scope for any non-Filament Laravel surface — it does not give you an avatar helper you can call from a Blade view or an API resource. If you need avatars on a customer-facing panel running a different stack, this package does not solve that; a small in-house provider does.
Migration path. Phased, all reversible:
composer.json and src/. Gate everything on this.vendor/lara-zeus/boredom/src directly — for a package this thin, reading code is faster and more reliable than reading docs that contradict themselves.AppAvatarProvider implements AvatarProvider) that delegates. One use statement then becomes the entire swap surface — to a different vendor, or to an initials fallback.Compatibility. Pin to the exact minor ("lara-zeus/boredom": "3.0.*"), not ^3.0 and never *. Treat composer.lock in CI as the real pin. Verify the constraint block against your panel's filament/filament, laravel/framework, and php versions before estimating — a package tracking Filament majors will produce an install failure that looks like a dependency-resolution problem and is actually a stack mismatch.
Sequencing. Two rules:
filament/filament, on a non-production panel first. Unrelated Composer drift on this package is how you get an opaque view exception mid-release.Maintenance. Low steady-state cost, non-zero structural cost. The code footprint is trivial; the upgrade tax is not. Every Filament major — 3→4, 4→5, 5→6 — converts into a migration task for your team, because the package will bump majors to follow and you cannot control when. Mitigations: exact-version pin, the app-level wrapper so a swap is one line, and a written decision record stating the expected end-state is vendoring the ~50 lines once the admin surface matures. With 0 dependents and a single maintainer, the continuity math favours owning the code eventually — buy for speed now, plan the exit.
Support. There is effectively no support channel. GitHub issues on an 8-star repo with one maintainer is not a support contract; treat it as "best effort, possibly never." Internally, the ticket surface is small but real: users will notice "my avatar changed" when you switch the seed field or when a user edits their display name. Pick the seed deliberately and document it — seed from name for personalization (collides on duplicate names), seed from email for uniqueness (silently changes when the email changes). Accessibility is also on you, not the package: deterministic SVGs are decorative and need no alt next to visible text, but standalone chips and comment headers need an aria-label or adjacent label wired in your own resource config.
Scaling. Trivially, if generation is local. Local SVG synthesis is CPU-cheap, stateless, needs no cache, no timeout, no rate limit, and nothing can go down. The only tuning worth considering is memoizing by seed if avatars render in very long tables — and that's a micro-optimization at admin-panel volumes, not a design constraint. If generation turns out to be an outbound HTTP call to a Boring Avatars host, every one of these properties inverts: per-render latency, rate-limit exposure, a vendor outage that degrades your admin UI, and a privacy argument that evaporates because you're back to shipping a user identifier to a third party. This is the second reason question #3 above is a gate.
Failure modes.
| Mode | Symptom | Detection | Blast radius |
|---|---|---|---|
Wrong boot() hook |
Set and nothing happens | Smoke test | Cosmetic |
| Stale Filament cache | Same as above | filament:clear-cached-components |
Cosmetic |
| Filament major bump | View/class exception on panel load | CI + staging panel | Panel-wide, blocks release |
| Unnamed record | Blank avatar, no error | Manual check | Cosmetic |
| Package abandoned | No Filament 6 support | Roadmap review | Forces in-house build |
| Description mismatch | Wrong package installed | Diligence | Wasted sprint |
| Seed field change | Avatars silently re-roll | User reports | Trust/UX noise |
The pattern to internalize: the failure mode that costs money is the framework-major exception on a production panel, and it is entirely preventable by the bundling rule. Everything else is cosmetic and self-announcing.
Ramp-up. Hours, not days. Any Laravel developer reads src/ in ten minutes and ships the change in an afternoon. The scarce resource is not engineering skill — it's the diligence to confirm what the package actually does before estimating, and the discipline to keep the integration to one line. Budget the half-day as a cap, with an explicit exit criterion: if configuration, namespace archaeology, or a Filament 5 bug pushes past it, stop and write the provider in-house. That threshold is the whole governance story for this dependency, and it's worth writing down as a precedent for the next ten thin, single-maintainer UI packages that ask the same question.
How can I help you explore Laravel packages today?