Inspiration

Reddit mods are volunteer firefighters working with a garden hose. The native modqueue shows items in a flat chronological list with no sense of urgency, no way to coordinate with teammates, and no record of who did what. When the Data API changed, the third-party tools that filled these gaps disappeared overnight.

I wanted to build something that lives inside Reddit — no browser extensions, no Discord side-channels, no spreadsheets — and gives mod teams the situational awareness they've always needed.

What it does

ModTriage is a Devvit custom post that serves as a live mod queue command center:

  • Priority queue — items are scored by report count, report severity (harassment escalates immediately), and age. The most urgent content rises to the top automatically.
  • One-tap actions — tap any item to expand it and approve, remove, or mark as spam without leaving the post.
  • Co-mod presence — a live badge shows how many mods have the dashboard open. When anyone takes an action, all open sessions get a broadcast toast and silently refresh, eliminating duplicate work.
  • Action audit log — every approve/remove/spam is recorded with the actor's username and timestamp, accessible in the Log tab.
  • Hourly digest — a scheduled job posts a formatted stats comment every hour: queue depth, high-priority count, spam volume, oldest item age.
  • Filter sidebar — narrow the queue by report type (spam, rule violation, harassment, misinformation) or switch between priority and recency sorting.

How I built it

The entire app runs on Reddit's Developer Platform. The Custom Post UI is a Devvit JSX component using useAsync to fetch the modqueue and useChannel for realtime co-mod broadcasting. Queue data is cached in Devvit's KV Store with a 3-minute TTL to stay within API rate limits. A Devvit.addSchedulerJob cron handles the hourly digest. Priority scoring is a pure function: (reportCount × 3) + harassmentBonus + (ageHours × 2) − (score / 100).

Challenges

The hardest part was cache invalidation — when mod A removes an item, mod B's cached queue needs to update within seconds without hammering the Reddit API. The solution was combining a short KV TTL with a realtime channel broadcast that triggers a re-fetch on the receiving end, giving near-instant consistency without redundant API calls.

Devvit's custom post height constraints also required careful layout work to fit the filter sidebar, queue list, and action buttons into a usable vertical space across different screen sizes.

What I learned

Devvit's realtime primitives are genuinely powerful for coordination tools. The useChannel + useInterval combination gives you most of what you'd expect from a dedicated WebSocket server, but hosted and authenticated for free. I also came away with deep respect for how much mod tooling has historically relied on fragile third-party infrastructure — there's a real opportunity to rebuild it on a stable foundation.

What's next

  • Bulk select and bulk action (approve/remove all spam in one tap)
  • Keyword-based auto-flag rules (configurable per subreddit)
  • Toolbox usernote integration for viewing a user's note history inline
  • Mobile layout optimizations

Built With

  • api
  • devvit
  • devvit-kv-store
  • devvit-realtime
  • devvit-scheduler
  • mod
  • reddit
  • reddit-developer-platform
  • typescript
Share this project:

Updates