Reactions
Every shared session and plan has live emoji reactions powered by WebSocket:
cool ·
heart ·
lightbulb
How it works
When you view a session or plan, the page opens a WebSocket connection to the server. Clicking a reaction button sends the emoji, and the server broadcasts it to all connected viewers. Reactions fall down the screen with a gentle animation.
Reaction counts are persisted — they accumulate across all viewers and sessions. Counts are displayed on the reaction buttons and on profile page tiles.

Rate limiting
Reactions are rate limited to 3 per second per connection. Excess reactions are silently dropped.
Muting
Click the bell icon in the toolbar to mute reaction animations. Your mute preference is saved in localStorage and persists across page loads.
WebSocket protocol
Connect to GET /s/{nanoid}/reactions or GET /p/{nanoid}/reactions.
Send:
{"emoji": "😎"}
Receive:
{"emoji": "😎", "x": 0.42}
The x field is a random float between 0 and 1, used for horizontal positioning of the floating animation.