Link Robins Support — private support tickets
A help-desk extension that I'm releasing publicly. It adds a private support-ticket system to Flarum with first-class support for ban appeals.
Why not just use discussions?
Tickets need stricter visibility than Flarum's discussion model gives you. The owner sees their own ticket; staff see everything; nobody else sees anything at all -- not even the URL works. With discussions this would be doable but every interaction (replyCount, "last reply by", search results, notifications) leaks something. As a separate domain it's clean.
What's in 1.0.0
The basics: admin-defined categories, a ticket page with replies, status workflow (open → in_progress → awaiting_user → resolved → closed) that auto-advances based on who replied, decisions on appeal tickets, assignment to staff.
Internal notes for staff coordination. They're filtered at the database level for non-staff -- the owner doesn't see them in the reply list, can't fetch them directly, and the replyCount excludes them from the owner's perspective. No notification fires for an internal note.
Appeal flow. A category flagged is_appeal gets stricter rate limits AND a special interaction with the Suspend extension: suspended users CAN'T file general tickets (so they can't use support as a chat workaround) but CAN file appeals (so they can actually plead their case).
Rate limits per user. Default 3 appeals per 30 days, 1 concurrent open appeal, 10 general tickets per 24 hours. All admin-configurable; set to 0 to disable any individual limit.
Permanent appeal-ban. A separate per-user flag for the case where someone is wasting your time with appeals. Blocks appeals; leaves general tickets available. Admin UI in the extension page.
Notifications. In-app + email. Owner gets notified when staff replies; staff get notified for new tickets and owner replies. Standard NotificationGrid preferences so each user can toggle drivers.
File attachments. If you already have fof/upload installed, the compose and reply forms get an "Attach files" button. Soft dependency -- no requirement to install it; the button just doesn't appear if fof/upload isn't there. Files go through fof/upload's normal pipeline (storage, mime validation, size limits, permissions).
Permissions
One permission: linkrobins-support.handle_tickets. Anyone in admin bypasses it. Default assignment is the moderate group. Anything goes.
Security notes
- Tickets/replies have anti-impersonation via two layers: the JSON:API schema doesn't declare
user as writable (so spoof attempts get a clean rejection), and the creating() hook overwrites user_id with the authenticated actor regardless.
- Visibility scoping lives in BOTH the resource
scope() (Show) and the Searcher getQuery() (Index), with identical rules. Removing either one wouldn't open a hole -- both are required by Flarum 2's pipeline -- but it's worth understanding that they're paired.
- The reply Index applies
WHERE is_internal_note = false for non-staff at the database level. Internal notes don't enter the response shape at all.
What's NOT in 1.0.0
- Public/canned responses. Staff can use the regular reply form. (Can add if enough demand)
Install
composer require linkrobins/support
php flarum migrate
php flarum cache:clear
Then enable in admin → Extensions and configure categories.
Source
GitHub: linkrobins/support
Packagist: https://packagist.org/packages/linkrobins/support
MIT licensed.



