Inspiration

What it does

How we built it

The Problem

Ban appeals on Reddit have no standard process. Banned users DM random mods, mods reply inconsistently, nothing gets logged, and the rest of the mod team has no visibility. Large subreddits handle hundreds of bans — and appeals slip through the cracks constantly.

What I Built

Ban Appeal Manager is a Devvit app that creates a structured, logged, in-Reddit appeal workflow. A mod installs the app, uses one menu item to create a pinned "Ban Appeals" post, and that post becomes the single entry point for everything.

Banned users open the post, fill out a short appeal form explaining their case, and see a live status screen that updates as mods act. The moment a decision is made, they receive a private message with the outcome and the mod's note.

Mods get a full dashboard — appeal queue with filters and search, full detail views with the original ban reason pulled automatically, a voting system so the whole team can weigh in, one-click approve (which auto-unbans via the Reddit API) or deny, internal notes only the team can see, and a complete audit log on every appeal.

What Inspired Me

I moderate a few communities and the appeal problem is real. Every time someone gets banned and wants to appeal, it becomes a chaotic DM thread with one mod who may or may not loop in the rest of the team. There's no record, no consistency, and no fair process for the user. I wanted to build the tool I actually wished existed.

How I Built It

Built entirely on the Devvit platform using TypeScript and Devvit Blocks — no external servers, no database outside of Redis, no HTML or CSS. Everything runs inside Reddit's infrastructure.

Key technical decisions:

  • Redis sorted sets for the appeal index (scored by timestamp, paginated 10 per page)
  • Optimistic UI updates for mod votes with revert-on-failure so the interface feels instant
  • JSON serialization at the Devvit useState/useAsync boundary to work within the platform's JSONValue type constraints
  • Scheduler job that auto-closes stale appeals after 30 days with an automated PM
  • AppInstall trigger that registers the scheduler automatically — zero config for mods

Challenges

The biggest challenge was Devvit's rendering model. It's not React — hooks are position-based, state must be JSON-serializable, and there's no concept of component unmounting. Getting optimistic vote updates to revert cleanly on failure, and making the appeal detail view always fetch fresh data when navigating between appeals, required careful use of depends keys and local state reset patterns.

Mobile layout was also tricky — Devvit Blocks has no CSS media queries, so responsive design means using grow on every container and splitting filter tabs into two rows of buttons rather than one overflowing row.

Challenges we ran into

Accomplishments that we're proud of

What we learned

What's next for Ban Appeal Manager

Built With

Share this project:

Updates