Inspiration

When three mods jump on the same brigade-spike, two of them act on the same item and one undoes the other. The current modqueue gives you no signal that a teammate is already on a report. Mod teams end up coordinating through Discord pings, which is slow and lives outside the workflow.

Sankofa Mod is the in-product coordination layer the modqueue should have had all along. The name comes from the Akan principle of going back to retrieve what you've left behind. That's exactly what mod work is: context, history, your team's footprints.


What it does

A drop-in panel installed once per subreddit. Open the Sankofa Mod post and every mod sees the same coordination layer.

  • Live presence. See which mods are online and what each is reviewing right now.
  • Atomic claims. One click locks an item. Other mods see the lock instantly. Five-minute auto-expire, extends on active work.
  • Smart sort. Human reports first, then severity, then trending, then newest.
  • Severity bands. Color-coded by your custom reason-to-severity rules.
  • User context card. Account age, sub history, native mod notes (read and write all five types), recent team actions, all inline.
  • Per-item discussion. Internal mod thread per queue item. Future mods see the rationale.
  • AI assist (Claude, optional). Two-line thread summaries plus suggested actions with a cited rule. The mod always confirms. The AI never acts on its own.
  • Live action feed. Every team action streamed in real time.
  • Daily brief. Modmail digest each morning: actions today, top mods, and collisions prevented.
  • Keyboard-first. j/k navigate, c claim, a/r/b act, ? for help.

Mod-only access enforced at the permission layer on every server call.


Tool Overview

Sankofa Mod is a shared coordination layer for your modqueue. Once it's installed, every mod on your team is looking at the same live view of what's in the queue, who else is online, and what's already being worked on.

How mods use it

Install from the App Directory. Mod Tools, open Sankofa Mod, click "Open coordination." That creates one persistent post in your sub. Mods open that post when they sit down to work the queue. Anyone who isn't a mod just sees a "mods only" splash.

You click any row to dig in. You claim before you act. Approve, remove, or ban inline. Settings live behind the gear icon.

How it works under the hood

The queue itself doesn't poll Reddit's listings. It subscribes to the PostReport, CommentReport, AutoModerator Filter, and Submit triggers directly. This matters because of the September 2025 Hide untrusted reports change, which causes some reports to never appear in the normal listings view. Triggers fire regardless of that filter, so nothing gets missed. Items disappear from the queue automatically when any mod actions them.

Before you act on an item, you claim it. Under the hood that's a Redis SET NX EX lock, which is atomic. Whoever clicks first owns it. The lock appears on every other mod's screen instantly over a Devvit realtime channel. If you walk away, the claim drops after five minutes. If you're actively typing or working in the item, the lock extends, so you don't lose it mid-removal-reason. Every collision the lock prevents gets logged.

A heartbeat every 30 seconds with a 60-second TTL on the server gives you a presence strip showing who's online and which item each mod is focused on.

Click a username and a context card opens beside the item: account age, post and comment counts scoped to your sub, anything your team has removed of theirs before, and recent mod actions on them. It reads and writes all five of Reddit's native mod note types, so anything you add here shows up in the regular mod notes UI too. The card caches for an hour.

Each queue item also has its own internal mod thread. I built this because my team kept pasting permalinks into Discord asking for a second opinion on edge cases. Now the discussion lives next to the item, persisted between sessions.

Every mod action streams to every mod's view in real time: removes, approves, bans, notes.

You can map report reasons to severity levels with color bands. The queue sorts human reports first, then severity, then engagement, then age. All of this is configurable.

Keyboard: j and k navigate. c claims. a, r, b approve, remove, and ban. ? for the rest.

A modmail digest goes out at 9 AM (you can change the time) with total actions for the day, your top 5 most active mods, and how many times the claim system stopped two mods from working the same item.

The AI assist is off by default. You opt in per install and bring your own Anthropic API key, which Sankofa never stores on its servers. With it on, Haiku 4.5 writes a two-line summary of long comment threads so you don't have to read the whole chain, and Opus 4.7 can suggest an action with the rule it thinks applies and a confidence score. The mod always confirms. The AI never acts on its own. That's a design decision, not a setting you can flip.

Security

Mod-only checks happen on the server, on every call. Not just in the UI. State is per-subreddit, so nothing leaks between communities. The custom post hosting the UI uses view-time mod gating on top of that.

Stack

Built entirely on Devvit. Realtime channels for live sync, Redis for claims and presence and per-item chat, triggers for ingestion, the native mod notes API, and modmail send for the brief. Everything in this submission was built inside the hackathon content window.


Project Impact

Workflow collisions on the modqueue aren't anecdotal. A CHI 2026 peer-reviewed study by Bajpai and Chandrasekharan, "Think about it like you're a firefighter": Understanding How Reddit Moderators Use the Modqueue, surveyed 110 moderators across more than 400 subreddits. 74.5% reported experiencing collisions on the queue, and most teams fall back to Discord side-channels to coordinate around them. That's the exact pain Sankofa fixes.

Three communities where I think the fit is sharpest:

r/AskHistorians (~2.7M members)

AMA days are what claim-locking and live presence were built for. When a top-billed AMA goes live, the comment-report queue can spike 5–10x in under an hour. The same handful of inflammatory comments get reported by dozens of users in parallel. Today the pattern is: three mods independently open the same item, two of them act on it, Discord fills with "wait, did you already get this one?" Sankofa kills that loop. First click locks the item. Every other mod sees the lock right away.

My estimate for a typical high-traffic AMA: roughly 40–60% fewer double-actioned comments, and 30–60 minutes per mod per event clawed back from re-checking items someone else has already handled.

r/SuicideWatch (~570k members, 24/7 global traffic)

Time-to-triage on a crisis post isn't a workflow metric. It's a life-safety variable. Sankofa's severity bands and human-first sort push first-person crisis language above reported spam. The inline context card tells the mod taking action whether they're looking at a repeat help-seeker, a brand-new account, or someone returning who the team has prior notes on. Three very different situations, three very different responses.

The per-item discussion thread means a mod coming on shift inherits the prior team's context without scrolling a Discord backlog from people in a different timezone. The wins here are harder to quantify than on r/AskHistorians and I don't want to fake numbers I haven't measured. The shape of the impact is: faster first response on the highest-stakes items, fewer dropped handoffs across shift changes, and team memory that survives a mod stepping back.

r/relationships (~3.7M members)

Brigaded posts routinely produce 200+ angry comments per item. Most are variations of the same takedown. A few are genuinely actionable. The AI thread summary compresses tone and flags the outliers in two lines, so every mod doesn't have to read the whole chain to make a call. The live action feed makes a raid legible in real time. You can see the spike happening, which accounts are involved, who's already on it, without reloading anything.

Rough estimate: about half the time per decision on heavy-comment posts, and meaningfully less burnout on raid days.

The common win across all three: collisions prevented, context preserved, and the coordination that's been living in Discord side-channels moved back inside the workflow where it belongs.


How we built it

Devvit Web 0.12.22 (custom post, 7 triggers, scheduler, menu) | React 18 + Vite + Tailwind webview | Devvit Redis + Realtime channels for state and fan-out | Direct fetch to api.anthropic.com (Haiku 4.5 for summaries, Opus 4.7 for suggestions) | 43 Vitest unit tests on pure server logic.

The architectural pivot that made it work. In September 2025, Reddit shipped a server-side Hide untrusted reports filter that excludes low-trust reports from every public listing API. Polling getModQueue() returns the wrong thing. We rebuilt the queue as an event-driven Redis index fed by seven triggers (PostReport, CommentReport, AutomodFilterPost, AutomodFilterComment, PostSubmit, CommentSubmit, and ModAction for trimming). The queue now reflects the actual report stream, not the filtered one.


Challenges

  • The hidden modqueue. Spent two days debugging an empty queue before we found the Sept 2025 filter. 36-hour pivot to event-driven indexing.
  • CommentV2 author resolution. In this SDK version, author is the t2_-prefixed account id, not the username. Built a resolver that detects t2_ candidates and falls back to getUserById().
  • Devvit Redis quirks. No SCAN, no per-field hash TTL, set() wants a Date not seconds, zRange(0, -1) doesn't mean "everything." Each one cost a real evening.

What we're proud of

  • Concept-complete in 8 days.
  • 43 tests, all passing on every commit.
  • A genuine architectural insight (event-driven beats polling for Devvit moderation apps) we'll write up for r/Devvit after the hackathon.
  • Visual identity that means something. The Sankofa palette, the Adinkra glyph, and the proverb in the footer all tie back to the moderation-as-recovery metaphor.
  • Graceful degradation everywhere. AI without an API key, deleted accounts, malformed Redis blobs — all handled without crashing.

What's next

  • Subreddit-specific rule packs (r/AskHistorians citation rule, r/science peer-review rule).
  • Mobile-first webview redesign.
  • Optional outbound webhook so subs that already run a Discord mod-channel keep their alerts.

Built With

Share this project:

Updates