Identity arrives resolved—not scattered across SDK events.
Read normalized users, channels, guilds, participants, permissions, voice, layout, and the original payload when you need it.
const user = useDiscordUser()Build the interface, trusted server, and realtime room as one application. Ludicord turns Discord context into typed React primitives.
Race the signal. Keep the room in sync.
All players share one Activity instance.
room.ready()Ludicord owns the boundaries that usually get rebuilt for every embed. Your files stay recognizable; the generated runtime makes them work together.
Read normalized users, channels, guilds, participants, permissions, voice, layout, and the original payload when you need it.
const user = useDiscordUser()Screens, HTTP handlers, and realtime endpoints stay separate in source and become one typed manifest at compile time.
app/embeds/home/embed.tsxscreenapp/api/score/route.tsHTTPapp/ws/room/route.tsrealtimeBrowser hooks and server handlers agree on verified user and Activity-instance context.
Ludicord validates the application before it announces a URL. Diagnostics come from the compiled route graph, so failures point to the file that owns them.
❯ ludicord dev
✓compiled 4 screens and 2 server routes
✓Discord credentials validated
✓WebSocket room ready
Activity connected at https://localhost:3000
The README stays focused on the supported path. Advanced checks and maintenance commands live in the documentation where they can be explained properly.
npx create-ludicord-app@latestGenerate the Activity shell, auth states, routes, and realtime starting point.
ludicord devCompile the route graph, validate setup, and connect Discord to local development.
ludicord build → ludicord startProduce and run one verified runtime for UI, APIs, auth, and WebSockets.
Documentation synced to public Ludicord 3.1.0 · 20c4889