Inspiration

Every active subreddit deals with ban appeals, and most of them arrive as walls of free-form text in modmail. Mods spend triage time parsing rants before they can decide. Users feel unheard because they cannot tell what information the mod team needs. We wanted to give both sides a calmer process.

What it does

AppealAssist turns Reddit ban appeals from free-form modmail rants into clean structured packages for moderator teams.

When a mod bans a user or removes a comment, AppealAssist sends the affected user a direct message with a link to a short structured form. The form asks four questions:

  • which rule do you believe was misapplied (chosen from the sub's actual rules)
  • why do you disagree
  • evidence or context (optional)
  • what outcome do you want

On submit, the appeal arrives in the mod team's modmail formatted as a pre-organised package, paired with three additional signals:

  • Appeal history for the user (first-time appealer or repeat, with the last few entries listed)
  • Tone signal based on a rule-based scorer for profanity, shouting, excessive punctuation, and personal attacks (no AI, no external API)
  • Possible duplicate flag when the same user submits similar text within 24 hours

Mods also get menu items for "Show user appeal history" on any post or comment, plus a "Stats overview" with total appeals and last 7-day count.

How we built it

Built with Devvit Classic. TypeScript end to end. Reddit Data API for DM and modmail sending. Devvit Redis for cooldown state, appeal history (with atomic counter), action context (with 30-day TTL), and idempotency lock (15-second TTL) preventing double-submit duplicates.

Settings let each subreddit toggle auto-DM behaviour, customise the intro text, and set a per-user cooldown.

Challenges we ran into

  • Devvit Classic vs Webbit v1 architecture distinction (devvit.yaml vs devvit.json) tripped the project up early. Resolved by sticking to Classic.
  • Markdown injection in user reasoning text could let a malicious user fake a mod note inside the modmail. Solved by wrapping user input in a triple-tilde fence with backtick sanitisation.
  • Race conditions on double-submit. Solved with a 15-second Redis idempotency lock around submit.
  • Appeal history counter accuracy past 50 entries. Solved with a separate atomic counter via incrBy.

Accomplishments that we're proud of

  • Mod-side modmail reads cleanly at a glance, rule cited near the top.
  • Tone signal correctly tiers hostile vs measured appeals without any language model.
  • Duplicate detection catches copy-paste appeals from the same user via word overlap.
  • Full Devvit-native implementation. No external API surface. No data leaves Reddit.

What we learned

  • Rule-based scorers are enough for tone detection on short structured appeals.
  • Word-overlap matching is the right tool for duplicate detection on a 24h window.
  • Atomic counters in Redis give accurate totals when entry lists are capped at 50.

What's next for AppealAssist

  • Modmail quick-action buttons (approve / deny / clarify) once Devvit exposes them.
  • Per-sub tone thresholds editable in settings.
  • Optional appeal categorisation when the sub has rule-specific workflows.

Built With

Share this project:

Updates