Inspiration

Every active subreddit moderator has the same three complaints:

  1. Duplicate posts clog the mod queue — mods triage the same question for the tenth time.
  2. No one recognises good contributors — the people doing the work post into the void.
  3. 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/web 0.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 exactOptionalPropertyTypes and noUncheckedIndexedAccess
  • 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's navigateTo() bridge with a window.open fallback 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 via showForm / 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

Share this project:

Updates