Inspiration

74.5% of Reddit moderators experience "collision" — two mods simultaneously addressing the same report without knowing it. They find out only after the fact: a double ban, conflicting actions, or wasted review time. We built TriageFlow to make collision structurally impossible — not through guidelines or communication, but through atomic distributed locks that enforce it at the infrastructure level.

What it does

TriageFlow is a collaborative mod queue dashboard built entirely on Devvit Web that makes collisions structurally impossible — not just less likely. Core mechanics:

  • Reports auto-populate via PostReport and CommentReport triggers — zero setup
  • Each item gets an urgency score 0–100 based on report velocity, viral spread, and time pressure
  • When a mod claims an item, an atomic Redis lock (SET NX) fires instantly
  • All open dashboards sync via a 10-second polling loop — no realtime subscription required
  • The second mod sees 🔒 u/modname immediately — claim blocked Actions: Approve / Remove / Remove+Lock+Ban 7d — one click, all API calls handled Team stats bar: Resolved today · Avg resolution time · Collisions avoided

How we built it:

  • Devvit Web architecture — Node.js HTTP server compiled with esbuild, static HTML/JS client communicating exclusively via fetch() API calls
  • Redis atomic locks (SET NX + TTL) for race-condition-proof claiming
  • 10-second polling loop syncs queue state across all connected moderators
  • Urgency formula: reports × 15 + velocity × 5 + viral bonus + time pressure
  • AI triage: smart rule-based analysis on every claim, Google Gemini when available
  • Zero blocks: no addCustomPostType, no useWebView, no useChannel — pure Devvit Web

Challenges we ran into

The hardest problem was the distributed lock race condition: two mods could both read "unlocked" and both succeed. We solved this with Redis SET NX (atomic set-if-not-exists) — only one writer wins at the hardware level. The second challenge was the full architecture migration. The app originally used addCustomPostType and useWebView (deprecated by Devvit in March 2026). We rewrote the entire stack to Devvit Web: replacing JSX blocks with a Node.js HTTP server, replacing postMessage communication with fetch() API calls, and replacing realtime channel subscriptions with a polling-based sync loop. The result is a cleaner, more maintainable architecture that passed App Hub review. The third challenge was CSP restrictions in Devvit webviews — inline scripts are blocked entirely. All JavaScript must live in external files. We also had to reverse-engineer the postMessage protocol for requestExpandedMode since importing @devvit/web/client in plain HTML requires a bundler.

Accomplishments that we're proud of

Solving the race condition correctly. The distributed lock was the hardest part. A naive get-then-set approach has a race condition where two mods both read "unlocked" and both succeed. We implemented Redis SET NX (atomic set-if-not-exists) — only one writer wins at the hardware level, not at the application level. This is the same pattern used in production distributed systems. Full migration to Devvit Web. We rewrote the entire app from blocks (addCustomPostType, useWebView, useChannel) to pure Devvit Web architecture — Node.js HTTP server, fetch() API, static client — and shipped it before the hackathon deadline. The app was approved by the Reddit team and is live on the App Hub. Zero-setup auto-queueing. Reports appear in the dashboard automatically via PostReport and CommentReport triggers — mods don't have to do anything to populate the queue. Install the app and it just works. A working collaborative tool in a single hackathon. Every core feature ships and works: real-time locks, urgency scoring, AI triage, team stats, mod log, and chain actions — all running on Devvit with no external servers.

What we learned

Distributed systems primitives matter even at small scale. The difference between SET and SET NX is one flag — but it's the difference between a tool that works and one that has subtle, hard-to-reproduce bugs under concurrent load. Modern architecture is worth the rewrite. Migrating from blocks to Devvit Web forced a cleaner separation: HTTP routes instead of message handlers, fetch() instead of postMessage, stateless server instead of reactive components. The final codebase is smaller and easier to reason about than the original. The problem is bigger than we thought. The CHI 2026 research we found during development confirmed that collision isn't an edge case — it's the norm. 74.5% of moderators experience it. That number changed how we prioritized features: anti-collision became the core, everything else is support. Fallback design is a feature, not a compromise. When Gemini is unavailable, the rule-based analysis kicks in silently. Mods always get a recommendation. Designing for graceful degradation made the app more reliable than one that depends on a single external service.

What's next for TriageFlow — Collaborative Mod Queue

Expanded AI context. Pull author history, prior bans, and karma trends into the AI prompt — not just the report reason. A 3-day-old account reporting harassment is a different signal than a 5-year veteran. Custom urgency rules per subreddit. Let mod teams define their own scoring weights. A news subreddit weights velocity differently than a gaming community. Shift scheduling integration. Show which mods are currently active, allow team leads to assign items to specific moderators, and track per-mod resolution stats over time. Mobile-optimized layout. Many mods moderate on mobile. The current dashboard is functional but not optimized for small screens. Cross-subreddit dashboard. For mod teams who cover multiple communities, a unified view across subreddits with a single priority queue.

Built With

Share this project:

Updates