On this pageA full-stack Effect app
Typing Terminal
A production real-time multiplayer typing speed game. Build a room, share the code, and race friends to type the same passage. It runs at typingterminal.com.
The other entries in this section are single-process apps that show one feature at a time. Typing Terminal is the full picture: a Foldkit client, an Effect-based RPC server, and a shared schema package that both ends import directly.
Race your friends →View source on GitHub →
The repo splits into three packages.
shared/declares Effect Schemas (Room,Player,GameStatus,PlayerProgress) and theRoomRpcsgroup built with@effect/rpc. Both client and server import from here. There is no codegen step. Adding a field to a payload schema produces type errors on both sides at the same time.server/is a Node HTTP server built on@effect/platformand@effect/rpc. Room state lives inRef<HashMap>stores provided as Effect Services. The streaming subscription RPC pushes room updates and per-player progress to every connected client over NDJSON.client/is a Foldkit app with two routes (Home and Room) and the same Model / Message / update / view loop you have seen in the smaller examples, scaled up. The Room submodel coordinates the live game: it consumes the streaming RPC as a Subscription, dispatches keystroke updates as Commands, and renders the scoreboard from a derived view of the synced room state.
No new framework concepts are involved. The architecture is the same one Counter uses. The interesting part is what falls out when that architecture meets a real backend: shared schemas across the wire, a typed RPC client without runtime decoders, a streaming Subscription that owns reconnect logic, and Commands that map cleanly to RPC calls.
- Multiplayer rooms with hosts and joiners, joined by a short room code
A
Waiting | GetReady | Countdown | Playing | Finishedstate machine modelled as a discriminated union on the server, mirrored on the client- Live progress streaming: every keystroke from every player flows through the same RPC stream and updates the scoreboard in real time
- Per-player WPM and accuracy scoring computed on the server
- Reconnect-tolerant subscriptions with pending-cleanup tracking so a brief disconnect does not drop you from the room