-
-
TriageFlow splash screen — the entry point for moderators. One click opens the full collaborative dashboard.
-
Full audit log — 50 entries, moderator username, timestamp, and action detail for every decision. Complete team accountability.
-
Spam promotion flagged — AI 82% confident, Remove+Ban recommended. Queue auto-sorts by urgency, low-risk items fall to the bottom.
-
AI triage panel: 82% confident Remove+Ban recommendation, author stats, and one-click actions.
-
Ban evasion detected — AI flags 0-karma, 0-day account. Rule-based analysis, one-click Remove or Ban actions.
-
Anti-collision live — left mod sees "Already claimed by u/LAndr_684" while right mod reviews the same report. Zero duplicate work.
-
Two mods reviewing different reports simultaneously — real-time sync, no interference, full parallel workflow across the team.
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
- css
- devvit-web
- esbuild
- google-gemini-api
- html
- javascript
- node.js-http-server
- redis
- typescript
Log in or sign up for Devpost to join the conversation.