fof/reactions
Add reactions to Flarum posts with fof/reactions. Let users react using emoji or custom icons, with configurable reaction sets, per-post reaction summaries, and a reactions list. Lightweight, extensible, and easy to configure.
Framing correction (important): fof/reactions is not a Laravel package — it is a Flarum extension (type: flarum-extension) that runs on Flarum's Laravel-derived foundation (Illuminate container, Eloquent, database migrations, event dispatcher) but is not installable into a Laravel application. Any evaluation that treats it as a drop-in Composer dependency for a Laravel service is wrong, and that misunderstanding is the single biggest risk in the intake record. The relevant question is not "should we add this to our Laravel app" but "do we operate Flarum, or are we prepared to."
Architecture fit: High fit only if a Flarum forum is already in the estate. The extension follows Flarum's extender/API conventions: a reactions table with a polymorphic-ish link to posts and users, permission-scoped visibility (view/post reactions), a JSON:API resource, and a Mithril/TypeScript frontend bundled through Flarum's asset compiler. It integrates through Flarum's extension lifecycle rather than through application service providers, so it composes with core search, notifications, and permission systems out of the box.
Integration feasibility: Mechanically trivial inside Flarum — composer require fof/reactions, php flarum migrate, php flarum cache:clear, enable in admin. The real effort is environmental (PHP 8.x, MySQL/MariaDB, writable extensions/storage, asset rebuild pipeline), not code.
Technical risk:
Key questions for the vendor/owner: Which Flarum core versions are supported and tested? Is there an active maintainer with commit rights? How are reactions aggregated for display (denormalized counters vs. per-request COUNT)? Does it integrate with the search driver and notification system? What is the data export/GDPR story for user reactions? Is there an anti-abuse rate limit (reaction spam)?
Stack fit: PHP 8.1–8.3, MySQL 8/MariaDB 10.6+, Flarum 1.x, Redis for cache/sessions recommended, S3-compatible object storage if the forum already uses fof/upload. Composer-based deploy with a committed composer.lock; the extension version must be pinned exactly, not floated.
Migration path:
clarkwinkelmann/flarum-ext-likes, fof/gamification, or a bespoke likes column): do not run both. Write a one-off backfill mapping legacy like rows to a single +1-style reaction record, verify counts row-for-row, then disable and uninstall the predecessor.Compatibility checks: extension-type conflicts with other reaction/like extensions; search index rebuild required after adding the resource; permission matrix must be set explicitly (guest view, member react, moderation delete); confirm the frontend asset build succeeds against the pinned core version before promoting.
Sequencing: metadata/provenance verification → staging install with a production-shaped data snapshot → migrate + cache clear → smoke test (post, react, unreact, permission boundaries, notification delivery, mobile layout) → permission-gated production rollout to a small group → full enablement after one week → then legacy cleanup. Never run the migration on a large posts table outside a maintenance window; the reactions table build is fast, but index creation on a busy DB is not.
Maintenance: Low ongoing code maintenance (small surface area, clean extender usage) but non-zero ownership: someone must watch upstream releases, re-test against each Flarum core bump, and be prepared to fork. Realistic budget: ~2–4 hours/month steady state, plus 1–2 days per core minor upgrade. Because there are no downstream dependents, the community will not surface regressions for you.
Support: Community forum and GitHub issues only; no commercial support, no CVE process, no deprecation notice. Mitigate by vendoring the extension into your own repository after provenance verification so an upstream deletion or hostile takeover cannot break deploys.
Scaling: The dominant cost is write amplification on popular threads and read amplification on thread listings. Enforce a unique index on (post_id, user_id, reaction_type-ish key), index post_id for aggregate fetches, and confirm posts eager-load reaction summaries to avoid N+1. If the community is large, plan for a periodic aggregation job and eventual archival of cold reaction rows. Frontend cost is minor (a few icons per post).
Failure modes:
Ramp-up: A Laravel-fluent engineer can deploy it in half a day; understanding Flarum's extender model, permission scoping, and asset pipeline takes 1–2 days. Add a half-day for the provenance/security review. The organizational ramp-up is the harder part: decide explicitly who owns the forum platform before adopting an extension that only makes sense inside one.
Bottom line: Good tactical fit for an existing Flarum instance (low cost, conventional design), poor strategic fit as a "Laravel package" — and the combination of 0 dependents, 21 stars, and an impossible release date makes provenance verification a hard gate, not a formality.
How can I help you explore Laravel packages today?