Inspiration
Reddit moderators do most of their work in the modqueue — but the modqueue tells them almost nothing about the item they're being asked to judge. To act on a single reported post or comment, a mod opens the user's profile in a second tab, the moderation log in a third, the removal-reasons library in a fourth, and a modnote modal on top. Then they click Remove. Then they reopen the reason modal. Then they reopen the modnote modal.
The USENIX 2025 moderator survey put numbers on this: 84% of mods leave the modqueue for outside context on items they review, and 74.5% have hit collisions where two mods unknowingly worked the same report. That's the pain we wanted to compress.
What It Does
Receipts turns every reported post or comment into a shared case file.
From the post or comment mod menu, one click opens a Devvit Web dashboard with:
- The reported content and its author.
- Account context with neutral badges — account age, this-sub regular, NSFW profile. No risk scores, no detection labels.
- Subreddit-specific stats — recent posts/comments here, recent removed items, recent team actions, last matching mod-team action.
- Recent public activity preview of the author with citation links to the source content.
- Modnotes and moderation log for this target and this user.
- Co-mod presence pill showing other moderators viewing the same case in real time.
- Single moderation actions — Approve, Remove, Send Removal Reason, Add Modnote, Ban.
- A fixed macro that runs
Remove + Send Reason + Add Modnotein one click. - An optional Evidence Summary — manual-only, citation-bound, AI-assisted descriptive bullets.
The whole team sees the same case file. Nobody alt-tabs. Nobody collides. The repetitive three-step "remove, explain, document" sequence becomes one reliable action.
How We Built It
- Devvit Web for the custom-post dashboard. Server endpoints in Hono. Reddit moderator APIs for modnotes, modlog, user activity, and moderation actions.
- Redis for short-lived per-install state: dashboard post references, selections, citation indexes, summary cache, presence heartbeats, daily quota counters.
- Devvit Realtime for co-mod presence broadcasting, with a Redis-heartbeat fallback so the pill works even when Realtime hiccups.
- OpenAI Responses API (
gpt-4.1-mini) for Evidence Summary. Calls usestore: falseso Reddit content is not retained or used for training. Every response is parsed against a strict JSON schema and re-validated against a forbidden-language list before being shown or cached. - Testing: 23 test files, 104 passing tests, including FakeRedis and FakeReddit doubles for unit coverage and Vitest-mock-based route tests.
- Compliance hooks:
onPostDeleteandonCommentDeletetriggers invalidate cached Evidence Summaries that cited deleted content. A 30-summary-per-moderator-per-UTC-day quota guard prevents AI overuse. A manual Stored-Data Purge button removes all registered app-owned Redis keys.
Challenges We Ran Into
Framing AI without becoming an "AI detector." Devvit Rules and Reddit moderators are both — rightly — wary of profiling tools. The hardest design decision was deciding what AI should not do here. Receipts' Evidence Summary deliberately refuses to score risk, classify authenticity, or label users as bots / fake / malicious. The prompt forbids it, the JSON schema rejects it, and a forbidden-language regex catches it on the way out. The Evidence Summary is framed as a reading accelerator, not a judge.
App Directory review. v0.0.8 was denied with no reason exposed by the API. Hardening through v0.0.9, v0.0.10, and finally v0.0.11 involved repeated source-upload-incomplete errors, defaulting the model to gpt-4.1-mini, fixing dashboard-post reuse from menu actions, increasing the moderator-selection TTL after a live launch-delay bug, and locking the configured model to match the schema default. v0.0.11 was approved and is public.
Distinct co-mod presence proof. Two browsers logged into the same Reddit account intentionally collapse to a single mod identity, which is the correct filter behavior — but it means we couldn't visually demo two-mod presence without a second moderator session in playtest. The implementation and unit tests in src/presence.test.ts cover the realtime-plus-Redis-fallback path; the live two-mod capture is the one piece of the submission that ships without a head-on screenshot.
Accomplishments That We're Proud Of
- Zero mocks, stubs, or placeholders on the product code path. Every external integration (Reddit, Redis, Realtime, OpenAI) is wired through to its real implementation.
- 104/104 tests passing on the final submission commit.
- The macro: one click instead of four clicks across three modals.
- A live Evidence Summary capture from the running app with real citation chips pointing to real Reddit content IDs.
- Honest screenshot labeling. Five illustrative slides and four live captures, every one labeled in the submission-assets README.
What We Learned
- Devvit Web is a much better fit for shared-surface tools than the legacy blocks-based custom post. The iframe webview gives a real React-style dashboard with the full DOM.
- Reddit's moderator APIs are richer than the public docs suggest — modnotes, the moderation log, and cross-subreddit user activity are all accessible from an install-scoped app account.
- The hardest part of an AI-using mod tool isn't the API call. It's the validation layer that catches model outputs that drift into judgment-style language.
What's Next
- A second-moderator live capture once playtest can include a second mod identity.
- Per-subreddit configurable macros so each community can encode its own three-step playbook.
- Optional Evidence Summary regeneration with diff highlighting for stale cached summaries.
- A "Receipts trail" mod-mail digest summarizing the last 24 hours of receipts-handled cases.
Built With
- devvit
- devvit-realtime
- devvit-web
- gpt-4.1-mini
- hono
- node.js
- openai
- redis
- typescript
- vite
- vitest
Log in or sign up for Devpost to join the conversation.