https://developers.reddit.com/docs/llms.txt
- Frontend: React 19, Tailwind 4 (@theme), Vite
- Backend: Devvit Node.js, Hono, tRPC v11
- Testing: Vitest +
@devvit/test(in-memory server mocks)
- Client CSP: No external
fetchin WebView. Proxy external APIs (Gemini/Firestore) via Server. - Interaction:
navigateToandrequestExpandedModerequiree.nativeEventfrom anonClick. - Limits: 30s timeout | 4MB Req / 10MB Res | 24h Redis TTL default.
- v4 Architecture: "Splash" is an active HTML Inline View (
splash.tsx), not a static image. - Blocks: Never use
@devvit/public-apifor UI. Full WebView only.
/src/server: Backend. Accessredis,reddit,context./src/client: Frontend. Accessnavigation,realtime.devvit.json: Defines routes andsplashvsgameentrypoints.
import { requestExpandedMode } from '@devvit/web/client';
const launch = (e: React.MouseEvent) => requestExpandedMode(e.nativeEvent, 'game');import { navigateTo } from '@devvit/web/client';
navigateTo('https://url.com'); // External/Internal// Client: Subscribe
import { connectRealtime } from '@devvit/web/client';
await connectRealtime({ channel: 'ch1', onMessage: (msg) => {} });
// Server: Broadcast
import { realtime } from '@devvit/web/server';
await realtime.send('ch1', { data: 1 });- Required:
devvit.json➔reddit➔SUBSCRIBE_TO_SUBREDDIT(asUser). - Logic:
await reddit.subscribeToCurrentSubreddit();(Server-side).
await redis.set('k', 'v');
await redis.incrBy('score', 1);import { test } from '../test'; // src/server/test.ts
test('Mocked server', async () => {
await redis.set('k', 'v');
expect(await redis.get('k')).toBe('v');
});