Elevator pitch: Mod Vanguard is a Reddit-native moderation command center that turns report bursts, case ownership, decisions, appeals, rule trends, and audit history into one shared workflow for human moderators.
Mod Vanguard is a Devvit Web app for subreddit moderation teams. It is built for teams that need more than a raw report queue: they need context, ownership, precedent, appeal history, rule-level feedback, and a clean audit trail without leaving the Reddit-installed workflow.
The product stays human-in-the-loop. Mod Vanguard organizes the work; moderators still make the final moderation decisions.
- Hackathon Submission
- At A Glance
- What Problem It Solves
- Core Ideas
- Feature Matrix
- Screenshot Gallery
- Feature Guide
- End-To-End Moderator Workflow
- Architecture
- Devvit Integration
- Safety And Privacy
- Project Impact
- Submission Strengths
- Demo Video
- Run It Locally
- Devvit Playtest
- Demo Seed
- Quality Gate
- Useful Scripts
- Repository Map
- Out Of Scope
| Field | Value |
|---|---|
| Category | Best New Mod Tool |
| Project | Mod Vanguard Command Center |
| Participant | u/dank_corp |
| App listing | developers.reddit.com/apps/mod-vanguard |
| Public repository | github.com/d3v07/modcase_reddit |
| Demo video | 60-second public demo |
Submission description:
Mod Vanguard is a Devvit Web moderation workspace that converts reports, moderator menu actions, appeals, and final decisions into structured casefiles. Moderators can triage queue pressure, claim cases, review target context, reuse prior decision memory, resolve appeals with linked history, inspect rule drift, export audit records, and monitor live intake health from one Reddit-installed app.
| Area | Details |
|---|---|
| Purpose | Give subreddit moderation teams one shared command center for triage, ownership, precedent, appeals, rule health, audit, and intake visibility. |
| Primary users | Human subreddit moderators working through report bursts, marketplace disputes, appeal follow-up, rule review, and team handoff. |
| Core value | Turns scattered moderation signals into structured casefiles without taking final judgment away from moderators. |
| Reddit Developer Platform usage | Devvit Web app, post/comment menu actions, subreddit menu action, report triggers, scheduled claim expiry, Redis-backed state, and moderator-scoped server routes. |
| Public demo | 60-second YouTube walkthrough. |
| App listing | developers.reddit.com/apps/mod-vanguard. |
| Repository | github.com/d3v07/modcase_reddit. |
| Local proof surfaces | Dashboard, Casefile, Appeals, Decisions, Raid Shield, Trust Adapter, Compassion Guard, Mod Mentor, Rule Ops, Audit, Settings, and Signal Intake. |
| Submission-ready supporting docs | Architecture, demo script, privacy notes, QA notes, and Devvit capability checklist. |
Moderation breaks down when the context is scattered. A team may see reports in one place, mod notes somewhere else, prior decisions in memory, appeal history in another thread, and runtime health nowhere at all. That creates repeated questions:
- Which case is urgent?
- Has another moderator already started on it?
- What exact target are we deciding on?
- Are the reports clustered or isolated?
- Have we ruled on similar marketplace or trust issues before?
- Did an appeal connect back to the original decision?
- Can we export a scoped explanation later?
- Are report triggers, menu actions, and scheduled jobs actually arriving?
Mod Vanguard turns those questions into visible workflow surfaces.
Every meaningful review target becomes a casefile. A casefile links the target, report pressure, readiness checks, ownership, timeline, prior decisions, and final moderator action.
Report Radar clusters repeated reports against the same target. A moderator sees the pressure level, count, timing, reasons, and linked case rather than reconstructing the burst manually.
The app never auto-removes, auto-approves, bans, locks, mutes, or decides an appeal. It surfaces context and records the decision a moderator explicitly makes.
Decision Memory and Rule Ops are designed around the active subreddit. They do not join data across communities and do not create public moderator rankings.
Signal Intake shows whether event streams are arriving, whether payloads were quarantined, and whether scheduled automation has run. This prevents a polished dashboard from hiding broken runtime inputs.
| Surface | Route | Screenshot | Moderator job | Proof point |
|---|---|---|---|---|
| Dashboard | #/ |
dashboard | Start triage from queue pressure, urgent lanes, and report heat. | Shows open queue, urgent cases, report pressure, and media count in one scan. |
| Report Radar | #/ and linked case cards |
dashboard | Convert repeated reports into one reviewable pressure cluster. | Shows pressure tier, report count, reasons, heat, timing, and linked case action. |
| Casefile Lens | #/cases/:id |
casefile | Review target context, signals, readiness, timeline, ownership, and decision controls. | Keeps the final action beside the evidence and related memory. |
| Claim And Handoff | #/cases/:id |
casefile | Prevent duplicate moderator work and request second opinions. | Claim, release, second-opinion, and expiry events are recorded in the case timeline. |
| Decision Memory | #/decisions/search |
decisions | Reuse prior rule-tagged precedent before making a similar ruling. | Marketplace safety decisions are searchable and link back to source cases. |
| Appeals Desk | #/appeals |
appeals | Resolve later disputes with the original decision context attached. | Appeals show linked case context, history, status, and outcome controls. |
| Raid Shield | #/raid-shield |
raid shield | Identify coordinated pressure before it overloads the queue. | Surge lanes and report clusters are grouped into a stabilization surface. |
| Trust Adapter | #/trust-adapter |
trust adapter | Compare risky marketplace or source decisions against subreddit-specific memory. | Prior approvals/removals and trust-sensitive clusters stay scoped to the community. |
| Compassion Guard | #/compassion-guard |
compassion guard | Surface workload, handoff risk, and second-opinion needs. | Urgent cases, appeals, report pressure, and handoff recommendations are visible together. |
| Mod Mentor | #/mod-mentor |
mod mentor | Turn live cases into guided coaching for newer moderators. | Prompts connect current cases to precedent and rule-fit checks. |
| Rule Ops | #/rule-ops |
rule ops | Inspect rule friction, action distribution, appeal load, and drift. | Aggregates cases, reports, decisions, and appeals by rule. |
| Audit Trail | #/audit |
audit | Reconstruct what happened and export scoped records. | Filters and JSON/CSV export operate over case, appeal, and decision events. |
| Settings | #/settings |
settings | Confirm shipped workflows and readiness boundaries. | Route-backed switches separate live workflow depth from future ideas. |
| Signal Intake | #/settings/ingestion |
signal intake | Confirm runtime event health and find quarantined/failing payloads. | Shows counters, freshness, automation runs, failures, and dead letters. |
| Triage and case review | Appeals and precedent |
|---|---|
![]() |
![]() |
![]() |
![]() |
| Protection and trust workflows | Coaching and rule operations |
|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
| Runtime readiness | Signal health |
|---|---|
![]() |
![]() |
The Dashboard is the command deck. It starts with the current moderation queue, urgent cases, report heat, reviewable media, and the most important lanes for the next moderator action.
What it shows:
- Open case volume.
- Urgent lane count.
- Report count and report pressure.
- Media review load.
- Triage lanes such as fast review, second opinion, unclaimed, and media.
- Report pressure spotlight cards.
- Direct links into the next casefile.
Why it matters:
- Moderators can scan pressure before opening individual cases.
- High-pressure clusters stay visible instead of being buried in separate reports.
- The first screen is useful even when the queue is large.
Report Radar turns many independent reports into one visible cluster. Each cluster carries enough context to decide whether the team should open a linked case immediately.
What it shows:
- Pressure tier.
- Report count.
- Reason count.
- Heat score.
- First report time.
- Latest report time.
- Report reasons.
- Linked case action.
Why it matters:
- Moderators can distinguish routine reports from coordinated pressure.
- The team avoids double-counting a burst as unrelated work.
- A report cluster can become the entry point into a structured casefile.
Casefile Lens is the detailed review surface. It keeps target context, report pressure, readiness checks, signals, ownership, related memory, timeline, and decision controls in one route.
Supported target types:
- Text posts.
- Image posts.
- Link posts.
- Comments.
- Modmail-style records.
- Incident shells.
What it shows:
- Target title, author/community context, type, and source.
- Team state and ownership.
- Linked report cluster.
- Signals and readiness checks.
- Target snapshot.
- Decision panel.
- Related prior memory.
- Timeline.
Why it matters:
- Moderators do not have to remember context across screens.
- Review readiness is explicit.
- The final decision is grounded in the same visible record the team can later audit.
Claim and Handoff prevents duplicate work by making ownership visible. A moderator can claim a case, release it, or request a second opinion.
What it supports:
- Claiming a case.
- Releasing a claim.
- Requesting another moderator.
- Scheduler-backed stale-claim expiry.
- Timeline events for ownership changes.
Why it matters:
- Two moderators are less likely to work the same case unknowingly.
- Second-opinion requests become part of the workflow, not a side conversation.
- Stale ownership can be cleaned up automatically.
Decision Memory stores final moderation decisions in a searchable form. Each decision records action, rule tag, note, moderator, timestamp, and linked case.
What it shows:
- Searchable prior rulings.
- Rule-tagged decisions.
- Action filters.
- Strongest match result.
- Links back to source cases.
Why it matters:
- Similar cases can be handled consistently.
- Marketplace safety and trust decisions become reusable precedent.
- Moderators can search before acting instead of relying on memory.
Appeals Desk keeps later disputes attached to the original case and decision history. It gives moderators appeal context without letting the system auto-judge the appeal.
What it shows:
- Appeal queue.
- Appeal status filters.
- Linked case context.
- Original decision history.
- Appeal timeline.
- Outcome controls.
Why it matters:
- Appeals are not detached from the original review.
- Moderators can see what happened before resolving the dispute.
- Outcomes become part of the same audit trail.
Raid Shield focuses on coordinated report pressure and surge review. It uses existing report and case data to highlight work that could overload the queue.
What it shows:
- Coordinated signals.
- High-pressure clusters.
- Surge-linked cases.
- First stabilization lane.
Why it matters:
- Moderators can respond to pressure patterns before the queue scatters.
- Surge cases are grouped into a review lane.
- The team gets a specific "stabilize first" surface.
Trust Adapter helps moderators compare risky targets against subreddit-specific trust memory. It is especially useful for source, author, marketplace, and link-pattern review.
What it shows:
- Targets needing trust context.
- Trust-sensitive report clusters.
- Prior approved and removed marketplace decisions.
- Local trust calibration memory.
Why it matters:
- Trust decisions are local to a community.
- Moderators can compare a target against prior subreddit behavior.
- Repeat low-trust patterns become visible without joining data across subreddits.
Compassion Guard makes moderator workload and handoff risk visible. It is built for high-pressure moments where speed can hurt judgment.
What it shows:
- Urgent cases.
- Second-opinion pressure.
- Appeal load.
- Hot report clusters.
- Handoff recommendation.
Why it matters:
- The team can slow down on cases that deserve another look.
- Moderators can route high-pressure work before fatigue affects decisions.
- Compassion is treated as workflow design, not decoration.
Mod Mentor turns live cases into coaching prompts for newer moderators. It gives a newer mod a reviewable case, precedent to compare, and prompts that keep the decision consistent.
What it shows:
- Cases for mentored review.
- Coaching prompts.
- Prior precedent.
- Rule-fit reminders.
- Second-opinion checks.
Why it matters:
- New moderators can learn from real workflow context.
- Training stays connected to the current queue.
- The system supports better human judgment without taking the decision away.
Rule Ops summarizes rule activity inside the current subreddit. It focuses on rule friction rather than moderator performance.
What it shows:
- Cases by rule.
- Reports by rule.
- Decisions by rule.
- Appeals by rule.
- Action distribution.
- Repeat patterns.
- Drift signals.
- Time windows.
Why it matters:
- Moderators can see which rules are producing workload.
- Rules with repeated appeals or report pressure become easier to inspect.
- The team can tune rules from evidence instead of anecdotes.
Audit Trail lists case, decision, appeal, and workflow events. It supports scoped filtering and export.
What it shows:
- Timeline events.
- Case filters.
- Appeal filters.
- Date filters.
- JSON export.
- CSV export.
- Packet scope.
Why it matters:
- Moderators can explain what happened later.
- Exports are scoped to visible filters.
- Auditability does not require exposing unrelated data.
Settings shows available workflow switches and readiness signals. It separates implemented route-backed workflows from future ideas.
What it shows:
- Enabled workflow count.
- Route-backed workflow switches.
- Install surface readiness.
- Data boundary readiness.
- Human-control readiness.
Why it matters:
- Reviewers can see the shipped workflows are enabled.
- Moderators can confirm the app shape before relying on it.
- The route-backed settings page avoids pretending unfinished features are live.
Signal Intake is the runtime health surface. It shows whether reports, menu actions, scheduled jobs, quarantined payloads, and failures are flowing through the system.
What it shows:
- Event freshness.
- Event counters.
- Automation runs.
- Failed actions.
- Quarantined payloads.
- Dead-letter states.
- Refresh control.
Why it matters:
- Moderators can tell if the app is receiving live signals.
- Malformed payloads do not silently disappear.
- A healthy-looking dashboard can be checked against actual intake state.
The core flow is intentionally linear: pressure becomes a casefile, a moderator claims the work, precedent informs the ruling, and the final record stays searchable and auditable.
sequenceDiagram
participant Reports as Report pressure
participant Dashboard as Dashboard
participant Casefile as Casefile Lens
participant Memory as Decision Memory
participant Audit as Audit Trail
participant Mod as Moderator
Reports->>Dashboard: Cluster repeated reports
Dashboard->>Casefile: Open linked case
Mod->>Casefile: Claim review
Casefile->>Memory: Show related precedent
Mod->>Casefile: Record action, rule tag, and note
Casefile->>Audit: Append timeline event
Audit->>Memory: Preserve searchable decision record
- A target receives repeated reports.
- Report Radar groups those reports into a pressure cluster.
- Dashboard surfaces the cluster in the report pressure spotlight.
- A moderator opens the linked casefile.
- Casefile Lens shows target context, readiness, signals, linked reports, and related memory.
- The moderator claims the case.
- The moderator reviews prior marketplace or rule precedent.
- The moderator records an action, rule tag, and note.
- The case timeline receives the final decision event.
- Decision Memory makes that ruling searchable.
- A later appeal enters Appeals Desk.
- The appeal is linked to the original case.
- The moderator reviews original decision history.
- The moderator records an appeal outcome.
- Audit Trail captures the case and appeal events.
- JSON or CSV export provides a scoped record.
- Rule Ops aggregates cases, reports, decisions, and appeals.
- The team inspects a rule such as
Marketplace safety. - Repeated friction, action distribution, and drift signals become visible.
- Moderators can open related cases or decisions from the rule view.
- The team can adjust moderation practice with evidence.
- A moderator opens Signal Intake.
- The team checks event freshness and counters.
- Failed actions or quarantined payloads are visible.
- Scheduler runs confirm claim expiry automation.
- The team can trust, debug, or pause the demo based on real intake state.
Mod Vanguard has four layers:
- Devvit runtime inputs receive Reddit menu actions, report triggers, and scheduled jobs.
- Server adapters and services normalize input, validate contracts, enforce idempotency, and update state.
- Devvit Redis stores subreddit-scoped cases, claims, decisions, appeals, reports, audit events, and ingestion telemetry.
- React Devvit Web UI gives moderators the dashboard, casefile, appeals, protection views, rule ops, audit, settings, and signal intake.
flowchart LR
Reddit["Reddit post, comment, report, or subreddit menu"] --> Devvit["Devvit menu action, trigger, or scheduler"]
Devvit --> Adapter["Input adapter"]
Adapter --> Validation["Zod validation and idempotency"]
Validation --> Services["Case, claim, decision, appeal, report, rule ops, audit, ingestion services"]
Services --> Redis["Devvit Redis"]
Redis --> Routes["Hono API routes"]
Routes --> Client["React Devvit Web UI"]
Client --> Moderator["Human moderator"]
Moderator --> Routes
flowchart TB
Report["Post or comment report"] --> Adapter["Report trigger adapter"]
Menu["Moderator menu action"] --> MenuAdapter["Menu action adapter"]
Scheduler["Claim expiry scheduler"] --> SchedulerAdapter["Scheduler adapter"]
Adapter --> Contract["Shared Zod contracts"]
MenuAdapter --> Contract
SchedulerAdapter --> Contract
Contract --> Idempotency["Idempotency guard"]
Idempotency --> Services["Case, report, claim, appeal, decision, audit, ingestion services"]
Services --> RedisKeys["Canonical Redis keys"]
RedisKeys --> UI["Devvit Web command center"]
Services --> DeadLetters["Dead letters and processing errors"]
DeadLetters --> Intake["Signal Intake"]
flowchart LR
Dashboard["Dashboard"] --> Casefile["Casefile Lens"]
Casefile --> Claim["Claim / Handoff"]
Casefile --> DecisionPanel["Decision Panel"]
DecisionPanel --> Memory["Decision Memory"]
Memory --> Appeals["Appeals Desk"]
Appeals --> Audit["Audit Trail"]
Dashboard --> Raid["Raid Shield"]
Dashboard --> Trust["Trust Adapter"]
Dashboard --> Compassion["Compassion Guard"]
Casefile --> Mentor["Mod Mentor"]
Memory --> RuleOps["Rule Ops"]
Settings["Settings"] --> Intake["Signal Intake"]
flowchart LR
CaseEvent["Case opened, claimed, or updated"] --> Timeline["Case timeline"]
Decision["Moderator decision"] --> Timeline
Appeal["Appeal outcome"] --> Timeline
Timeline --> AuditIndex["Audit event index"]
AuditIndex --> Filters["Scoped filters"]
Filters --> Json["JSON export"]
Filters --> Csv["CSV export"]
Filters --> Reviewer["Moderator or judge review"]
flowchart TB
Root["#/ Dashboard"] --> Cases["#/cases/:id"]
Root --> AppealsRoute["#/appeals"]
Root --> DecisionsRoute["#/decisions/search"]
Root --> RaidRoute["#/raid-shield"]
Root --> TrustRoute["#/trust-adapter"]
Root --> CompassionRoute["#/compassion-guard"]
Root --> MentorRoute["#/mod-mentor"]
Root --> RuleRoute["#/rule-ops"]
Root --> AuditRoute["#/audit"]
Root --> SettingsRoute["#/settings"]
SettingsRoute --> IntakeRoute["#/settings/ingestion"]
More detail: docs/architecture.md.
The app is configured in devvit.json.
| Surface | Current wiring | Why it matters |
|---|---|---|
| Devvit Web post | post.dir points to dist/client with index.html as the tall entrypoint. |
The command center renders inside Reddit as a Devvit Web app. |
| Server entry | server.entry points to index.cjs, built from src/server/index.ts. |
The React client and Devvit callbacks share the same typed server. |
| Permissions | Redis enabled, Reddit API scoped to moderator. |
Case state persists in Devvit Redis and moderator-only actions stay behind moderator context. |
| Post/comment menu | Open Mod Vanguard on posts and comments. |
A moderator can create or open a case from the item being reviewed. |
| Subreddit menu | Create Mod Vanguard Dashboard. |
A team can create the shared dashboard post during install/playtest. |
| Report triggers | onPostReport and onCommentReport. |
Real reports can update report clusters and linked cases. |
| Scheduler | claim-expiry every five minutes. |
Stale claims can be released and recorded in intake telemetry. |
Relevant Reddit Developer docs:
Mod Vanguard is intentionally conservative:
- No automatic remove, approve, ban, lock, mute, or appeal outcome without moderator confirmation.
- No cross-subreddit joins.
- No public moderator ranking or shaming surface.
- No external API dependency in the core demo path.
- No secrets in code or committed files.
- Moderator-scoped routes are protected by the permission guard.
- Audit exports contain only subreddit-scoped moderation workflow records.
Privacy detail: docs/privacy.md.
Mod Vanguard is designed for communities where moderation is a repeated workflow with reports, precedent, trust patterns, appeals, and team coordination.
| Community | Why it would help |
|---|---|
r/hardwareswap |
Marketplace communities face repeated scam reports, fake listing patterns, impersonation warnings, and trust decisions. Mod Vanguard helps cluster report pressure, preserve rule-tagged precedent, and audit why a marketplace safety decision was made. Public context: ongoing scam alert, rules. |
r/GameSale |
Buy/sell communities need consistent scam-prevention enforcement and clear moderator history. Mod Vanguard gives moderators searchable prior decisions, linked case context, and appeal history instead of forcing each ruling to start from memory. Public context: avoiding scams and following rules. |
r/mechmarket |
Trade-heavy communities rely on repeat rules, trust signals, confirmation history, and scamwatch norms. Mod Vanguard helps compare a risky target against subreddit-specific memory and keep appeal/audit context attached to the original case. Public context: trade confirmation rules. |
Broader impact:
- Less duplicate work because claim ownership is visible.
- Faster decisions because target context and report pressure are linked.
- More consistency because prior decisions are searchable.
- Easier handoffs because timelines, second opinions, and appeal links stay attached.
- Better accountability because audit export is scoped and explicit.
| Strength | Evidence in this project |
|---|---|
| Moderator-centered workflow | The first screen is an operational queue, not a landing page. Every major route is built around a moderator task: triage, review, claim, decide, appeal, audit, or verify intake health. |
| Real Reddit Developer Platform fit | The app uses Devvit Web, Redis, menu actions, report triggers, scheduler hooks, and moderator-scoped server routes documented in devvit.json and the runtime docs. |
| Human-in-the-loop safety | Mod Vanguard organizes context and stores decisions, but it does not auto-remove, auto-approve, ban, mute, lock, or resolve appeals without moderator confirmation. |
| Subreddit-scoped memory | Decision Memory, Trust Adapter, Rule Ops, and Audit Trail are designed around the active community rather than cross-subreddit profiling. |
| Auditability | Case timelines, appeal outcomes, decision records, rule summaries, and scoped JSON/CSV exports are first-class surfaces. |
| Runtime proof | Signal Intake shows event freshness, counters, scheduler runs, processing failures, and quarantined payloads so moderators can see whether the workflow is actually receiving signals. |
| Submission clarity | The README includes a demo link, app listing, repository link, feature walkthrough, screenshot gallery, architecture diagrams, local run instructions, playtest checklist, and QA gate. |
Public 60-second demo: youtu.be/SZ0vM9E-Lf0
Demo script and click path: docs/demo-script.md.
Requirements:
- Node.js compatible with the project toolchain.
pnpm10.x. The lockfile currently usespnpm@10.26.2.- Devvit CLI access for real playtest runs.
Install dependencies:
pnpm installRun the local preview:
pnpm preview:localUse another port if needed:
PORT=5175 pnpm preview:localLocal preview is for browser smoke testing and screenshots. Real Reddit, Redis, menu action, report trigger, and scheduler data comes from Devvit playtest.
Configured test subreddit:
r/mod_vanguard_dev
Run:
pnpm devvit:playtestLive playtest checklist:
- Run
pnpm buildandpnpm build:server. - Run
pnpm devvit:playtest. - Open the playtest app in
r/mod_vanguard_dev. - Use the subreddit menu to create the Mod Vanguard dashboard post.
- Use the post/comment menu item on a test target and confirm a case appears in the dashboard.
- Submit or replay post/comment report payloads and confirm Report Radar and Signal Intake update.
- Leave a claim long enough for the scheduler path to run, then confirm stale claim telemetry appears.
- Record a moderator decision, open Decision Memory, and verify the prior decision is searchable.
- Export an Audit Trail slice and confirm it only contains subreddit-scoped moderation workflow records.
Dry run is the default:
pnpm seed --dry-runLive runtime seed:
MODCASE_BASE_URL=<playtest-or-runtime-url> pnpm seed --liveThe seed creates a prior marketplace decision and sends report trigger payloads for the current demo target. Live writes require both a reachable Devvit playtest/runtime URL and the explicit --live flag.
Before handing this to reviewers or judges, run:
pnpm install --frozen-lockfile
pnpm typecheck
pnpm lint
pnpm test
pnpm build
pnpm build:server
pnpm format
pnpm generate:demo-content
pnpm seed --dry-runKnown build warnings are documented in docs/qa.md. They are non-fatal bundler warnings from the current dependency/app shape.
| Command | Purpose |
|---|---|
pnpm install |
Install dependencies from the lockfile |
pnpm typecheck |
Type-check the project |
pnpm lint |
Run ESLint with zero warnings allowed |
pnpm test |
Run Vitest |
pnpm test:coverage |
Run Vitest coverage |
pnpm build |
Build the Devvit Web client |
pnpm build:server |
Build the Devvit server entry |
pnpm preview:local |
Build and run local mock-backed preview |
pnpm generate:demo-content |
Regenerate synthetic demo cases and media |
pnpm seed --dry-run |
Show seed actions without writing live data |
pnpm seed --live |
Send seed data to a configured runtime URL |
pnpm devvit:playtest |
Run Devvit playtest |
docs/
architecture.md System design and route map
demo-script.md 60-second and full walkthrough scripts
devvit-capability-checklist.md Runtime capability status
privacy.md Data boundary and safety notes
qa.md Manual and automated QA checklist
screenshots/ README screenshots captured from local preview
scripts/
preview-local.mjs Local static app plus mock API server
seed-demo.ts Dry-run/live seed scenario
src/client/
App.tsx App shell and navigation
routes/ Dashboard, casefile, appeals, rule ops, audit, settings
components/ Shared UI primitives and target renderers
lib/api.ts Typed API client and local mock mode
lib/mocks/ Schema-valid local preview fixtures
src/server/
adapters/ Devvit menu, report, and scheduler adapters
routes/ Hono API and internal runtime routes
services/ Case, decision, appeal, report, rule ops, audit logic
storage/ Redis wrapper, codecs, and canonical key builders
src/shared/
api/contracts.ts Zod request/response contracts
types/ Shared domain types
Mod Vanguard does not try to replace moderators. It does not perform final enforcement by itself, it does not create public moderator scoreboards, and it does not join data across subreddits. The goal is to make human review faster, more consistent, and easier to audit.











