Forty toggles. One resolver.
Custom roles, custom names, custom colours. Auto-promotion. Per-category overrides. Self-assignable opt-in roles.
Forty permission keys, an open role model, and a resolver that always shows its work.
- 01
Forty permission keys
ShippedGrouped into eight categories: posts (7), comments (6), reactions (3), moderation (8), settings (6), roles (4), domain (3), billing (3). Every key is independently grantable; no enum locks two unrelated capabilities together.
- 02
Custom names + colours
ShippedRename "Moderator" to "Vigil". Call new members "Lanterns". Pick any spot colour. The role's name and tint show in post bylines, the member list, and the mod HUD.
- 03
Per-category overrides
ShippedOne role can behave differently in
#announcementsthan it does in#lounge. Override the grant or the deny; the resolver tells you exactly which override is in effect for any (member, channel, permission) triple. - 04
Auto-promotion
ShippedSet a rule on any role — "30+ days since joining AND 10+ threads posted" — and a nightly job promotes everyone who meets it. Four measurable axes: days, threads, comments, reactions. Stack up to eight criteria with
allorany. - 05
Self-assignable roles
ShippedMembers give themselves opt-in flags — "I'm a developer", "Beta tester", pronoun preferences, colour groups. The owner picks which roles are self-assignable; staff roles never are.
- 06
The Why? debugger
ShippedPick a member, pick a permission. The resolver shows every role they hold, every grant, every deny, every override, and the final resolved state — with the audit-log row that explains how they got there. Cuts support time on "why can't I' questions in half.
- 01Permissions resolve at request time, cached per session for the life of the request.
- 02The cache busts on role change for the affected member only — no global flush, no stampede.
- 03Every assignment (manual or auto-promoted) writes to the audit log, with the rule snapshot attached.
- 04The Why? debugger replays the resolution against the live audit log so you can answer the question six months later.
- 05The nightly auto-promotion job runs at 06:00 UTC and sends an in-app notification to every promoted member.
- No auto-revoke
Once promoted, members keep the role until you remove them by hand. Demotion-by-inactivity is the kind of feature that goes wrong in interesting ways; we left it off deliberately.
- No auto-promote into staff
Owner / Admin / Moderator roles can't carry promotion rules. Activity-based access to moderation powers is the wrong default — use per-category overrides instead.
- Daily promotion, not real-time
The nightly job is easier to reason about than a stream of intra-day promotions. Sub-daily activity wouldn't materially change who hits the bar.