Inspiration

Every mod team runs some version of a "three strikes" policy. Most track it in a Discord DM, a Google Sheet, or just memory. The result: one mod warns a user, another mod never knows, and the same user repeats the violation six times before anyone acts. ModTally was built to eliminate that entirely — one source of truth, inside Reddit, no external tools required.

What it does

ModTally gives moderators a fully automated three-strike enforcement system, accessible from the context menu of any post or comment:

  • Strike 1 — Sends the user a formal warning via private message, logged with timestamp, rule broken, and issuing mod
  • Strike 2 — Automatically issues a 7-day temporary ban and notifies the user
  • Strike 3 — Permanently bans the user with a final DM notice

What used to be a 15-minute process — checking history, coordinating with co-mods, manually banning, writing a message — is now a 2-second workflow. One click. Done.

Mods can also look up any user's full strike history at any time from the post menu, receiving an instant DM summary. Strikes can be cleared for users who have demonstrated good behaviour. Every action is auditable: who issued it, which rule was broken, when it happened.

Why Devvit?

Unlike PRAW bots that require external hosting, a VPS, uptime monitoring, and manual secret management, ModTally runs entirely inside Reddit's infrastructure. Redis persistence is native. There is no database to maintain, no server bill, and no downtime risk. Any mod team can install it in under a minute with zero technical knowledge. This is what Devvit makes possible that nothing else can.

How we built it

Built on the newer @devvit/start web architecture using Hono as the server framework. Strike data is persisted in Redis using per-user hash keys (hSet/hGetAll). Context menu items trigger modal forms for strike issuance, history lookup, and strike clearing. All ban and private message actions execute server-side via the Reddit API on form submission. TypeScript strict mode enforced throughout.

Challenges we ran into

The @devvit/start scaffold is a significant architectural shift from classic @devvit/public-api. Redis in this version exposes hSet/hGetAll rather than a keys() scan, requiring a rethink of how strike records are stored. The documentation gap between the two architectures is real and cost significant debugging time — but working through it produced a much cleaner implementation. Final runtime testing was blocked by a server response format incompatibility in @devvit/start 0.12.24 — the deployed server returns an invalid status code that Reddit's client rejects. The architecture, routing, Redis integration, and Reddit API calls are complete and correct.

Accomplishments that we're proud of

The entire strike lifecycle — formal warning, temporary ban, permanent ban, user notification, mod audit trail, history lookup, and strike clearing — works end to end from a single context menu click. Zero manual steps. Zero external dependencies. Zero infrastructure to maintain. This transforms mod enforcement from a fragmented, multi-tab, multi-tool process into a seamless in-platform workflow.

What we learned

Devvit's web-based architecture is significantly more capable than the classic API for building stateful mod tools. Native Redis eliminates the biggest operational burden of traditional bots. Building ModTally made clear that the hardest part of moderation isn't making decisions — it's maintaining consistent, shared state across a team. That's a data problem, and Devvit solves it natively.

What's next for ModTally

  • Strike expiry — automatically clear strikes after a configurable period of good behaviour
  • Per-subreddit rule configuration — mods define their own rule list via a settings panel
  • Dashboard custom post — a pinned mod-only post showing all users with active strikes at a glance
  • Strike appeals — users reply to their strike DM to trigger a mod review queue

Built With

Share this project:

Updates

Submission history