Inspiration
Every active subreddit moderator has the same three complaints:
- Duplicate posts clog the mod queue — mods triage the same question for the tenth time.
- No one recognises good contributors — the people doing the work post into the void.
- Mods are flying blind on community health — there's no Reddit-native way to see whether activity is up or down this week.
Most existing mod tools solve one of these (AutoMod for spam, third-party bots for stats). None solve all three from a single mod-installable no-code dashboard. SubSense was built to fix that gap — three compounding pain points, one pinned post, zero ongoing configuration.
What it does
SubSense pins a single custom post to a subreddit. Every member can open it and see three tabs (plus a mod-only Settings tab):
🔍 Radar — duplicate post detection Before publishing, a member types their post title. Radar searches an index of the last 500 post titles using Jaccard similarity (pure TypeScript, no ML) and surfaces the top 3 matches with match percentages, flair pills, and click-to-open links. Stops duplicate posts at the point of authoring rather than after they hit the queue.
🏆 Board — weekly contributor leaderboard
Tracks posts × 3 + comments × 1 per user via the onPostSubmit and onCommentSubmit triggers. Shows the top 10 with 🥇🥈🥉 medals for the podium and an expandable "Last week's winners" archive. Resets automatically every Sunday at 00:00 UTC via a scheduled cron job.
📊 Pulse — community health snapshot A daily-refreshed view of the last 7 days: post count, comment count, active users, most-used flairs, and trend arrows comparing the current 7-day window to the previous one. Data is aggregated incrementally via triggers (no Reddit API polling, no rate-limit risk).
⚙️ Settings — moderator-only configuration Mods see a fourth tab with toggles for each feature, board reset day (Sunday or Monday), and a Pulse retention slider (7–90 days). Mod identity is verified server-side via Reddit's moderators API with a 60-second cache. Non-mods don't see the tab and can't hit the endpoint even if they construct the request manually.
How we built it
- Devvit Web (Reddit's current platform —
@devvit/web0.12.23), not the deprecated Blocks API - Hono HTTP server on Reddit's serverless runtime — handles
/api/endpoints, menu actions, triggers, and scheduled jobs - React 19 + Vite + Tailwind 4 — single-page dashboard SPA rendered inside the custom post webview
- Redis (built into Devvit, per-subreddit-scoped) — single source of truth for the title index, leaderboard scores, daily activity buckets, and settings
- TypeScript project references for client / server / shared with strict
exactOptionalPropertyTypesandnoUncheckedIndexedAccess - Vitest — 34 unit tests across 5 suites covering Jaccard similarity, scoring logic, snapshot building, and configuration defaults
The architecture is deliberately split into three execution environments: Reddit (fires webhooks), our Hono server (sees Redis and the Reddit API), and the React SPA (talks only to /api). The server is the single source of truth — React holds zero persistent state, so concurrent moderator activity never desyncs the UI.
Challenges we ran into
- The Devvit platform recently migrated from Blocks to Web. Most existing examples online are still Blocks-based; we had to reverse-engineer the new Hono/React stack from official templates and the SDK type definitions.
- Devvit's webview is a sandboxed iframe — plain
<a target="_blank">doesn't navigate out. We use Devvit'snavigateTo()bridge with awindow.openfallback for new-tab behavior wherever the sandbox allows it. - Pulse trend math needs at least 14 days of activity to compare current week to previous week. To make the dashboard demo-able on day one, we built a Seed Demo Data feature that generates 14 days of realistic buckets with a deliberate upward trend.
- The Pulse refresh cron only fires once a day. We added a mod-only "Refresh now" button on the Pulse tab so moderators don't have to wait.
Accomplishments we're proud of
- One install, three features. SubSense is the only submission we're aware of that targets three distinct mod pain points from a single dashboard.
- Production-grade engineering. Strict TypeScript, 34 unit tests across pure-logic modules, type-check / test / build all exit 0.
- Trust-first UX. Mod-only routes guarded server-side. Empty states, error retries, and toast feedback on every action.
- Zero ML, fast similarity. Token-based Jaccard with stopword removal runs in under 5ms across a 500-post index. No model files, no training, no ongoing cost.
What we learned
- Devvit Web's architecture is a step up — typed APIs, real React, real Vite, real Tailwind, with Devvit-specific concerns (triggers, scheduler, moderator-only routes) layered on top.
- The conceptual split between "in-app actions over
fetch" and "Reddit-bridge actions viashowForm/navigateTo" is the key to making a Devvit Web SPA feel native.
What's next for SubSense
- Multi-tier user recognition — badges and flair awards for hitting weekly milestones, not just leaderboard ranks
- Cross-subreddit board — opt-in shared leaderboard for moderators running networks of related subs
- AI-suggested megathreads — surface trending themes from Pulse data so mods can spin up consolidation threads proactively
- Pre-built rule packs — community-type-specific starting points (gaming, finance, hobby, support)
Built With
- devvit
- hono
- node.js
- react
- redis
- tailwindcss
- typescript
- vite
Log in or sign up for Devpost to join the conversation.