devvit-expert
Current Devvit coding assistant for Reddit apps. Use this skill whenever the user is building, debugging, migrating, or publishing a Devvit app. Default to modern Devvit Web with `devvit.json`, `post` + `server`, typed shared contracts, and `/api` and `/internal` endpoints. Prefer current React, Three.js, Phaser, Unity, or GameMaker starters based on the product shape. Treat legacy `@devvit/public-api`, `useWebView`, `webroot`, and `addCustomPostType()` as migration-only paths for existing apps.
Devvit Expert
Default to Devvit Web. Treat legacy @devvit/public-api and Blocks-era apps
as migration work, not as a target architecture. If a repo is already legacy,
keep it working while moving it toward the current Devvit Web template shape.
First move
Read the actual project before writing code:
package.jsondevvit.json- the app entry layout such as
src/client/*,src/server/*,src/shared/*, or legacysrc/main.tsx
Then classify the repo:
- Devvit Web if it uses
devvit.jsonwithpostandserver, or a client/server split with/apiand/internal - legacy public-api if it uses
blocks.entry,@devvit/public-api,Devvit.configure(),useWebView, orwebroot/
Also choose the starter intentionally:
- mod tools: default to the current React-based Devvit Web starter unless the repo is already using another current web stack
- games: default to React for UI-heavy apps, Phaser for 2D gameplay, Three.js for 3D or spatial experiences, and Unity or GameMaker only when the game is actually engine-driven
Default working model
For new work and most fixes, use the current Devvit Web template mentality:
devvit.jsonis the source of truth- the frontend can use standard web frameworks, but the repo's active starter outranks ad hoc framework mixing
- client UI talks to server endpoints, not
postMessage /api/*is for app UX/internal/*is for Reddit callbacks such as menu items, triggers, forms, and scheduler tasks- external HTTP, Reddit API calls, Redis, and secrets stay on the server
If the docs conflict with the repo, prefer:
- the repo's current starter/template files
devvit.jsonschema and current config docs- current Devvit Web capability docs
- legacy docs only for legacy maintenance
Devvit Web vibe-coding workflow
Implement in this order:
- lock down
devvit.json - add server routes and handlers
- define shared request and response types
- wire client fetches and UI
- validate playtest, build output, permissions, and publishability
Use the repo's existing template as the coding scaffold. Do not invent a mixed architecture when the starter already shows the right imports, route layout, and scripts.
Practical defaults:
- runtime: assume Node.js
22.2.0+unless the repo is pinned differently for a verified reason - interactive UI:
post.dirfor client assets plusserver.entryfor server code - menu items: declare in
devvit.json, implement under/internal/menu/* - triggers: declare in
devvit.json, keep handlers idempotent under/internal/triggers/* - forms: use direct client forms where supported; use
/internal/form/*for server-backed submissions - client requests: use
/api/* - shared contracts: keep typed payloads in
src/shared/*when the repo uses that pattern
Guardrails
- Keep secrets out of client code and source control
- Keep external HTTP calls on the server and whitelist domains in
devvit.json - Design Redis with installation scoping in mind
- Do not assume key scans, plain sets, or global cross-subreddit state
context.redis.globalrequires exclusive permission and explicit approval from Reddit — do not use or recommend it for general-purpose apps- Include the exact
devvit.jsonchanges when giving code - When debugging, check architecture, permissions, endpoint paths, settings, and build output before blaming business logic
devvit.yamlis only valid for Devvit Singleton / Modtools Apps; Devvit Web apps usedevvit.json
Legacy compatibility
Legacy repos may still use:
@devvit/public-apiDevvit.configure()Devvit.addMenuItem()Devvit.addTrigger()Devvit.addSchedulerJob()useWebViewwebroot/
When editing a legacy repo:
- keep fixes narrow only as an intermediate step while planning migration
- do not teach legacy patterns as the preferred architecture
- do not recommend
addCustomPostType()for new work - always migrate off Blocks and legacy public-api patterns
- prefer gradual migration to
devvit.jsonplus Devvit Web unless the user explicitly wants a rewrite - replace
useWebViewview-switching withrequestExpandedMode()(the client API for switching between compact and expanded post view)
Funds and challenge builds
If the user is building for Reddit Developer Funds, a hackathon, or a challenge:
- stay on Devvit Web and use a current starter
- design for installs, repeat engagement, and moderator-safe rollout
- add lightweight telemetry for installs, sessions, retention, and key in-app events when the repo permits it
- check the current Reddit program page before citing payout amounts, deadlines, judging criteria, or active challenge details
- do not hard-code time-sensitive program claims into code, docs, or launch copy
References
- Read
references/patterns.mdfor the implementation order, route taxonomy, Redis patterns, and migration tactics. - Read
references/api.mdfor config expectations, endpoint behavior, runtime requirements, and current docs links.