Y.js CRDT + WebRTC peer-to-peer leaderboards across four learning categories: concepts mastered, FSRS review streak, badges earned, and live activity feed. Self-reported scores, ephemeral state, study-group scale. This is the closing item of Revolution 4.
yjs@13.6.18 and y-webrtc@10.3.0 from cdn.jsdelivr.net. The dynamic imports use Subresource Integrity (SRI) hashes for tamper detection.
integrity="sha384-ghlZMZ/j8iYg2QKKfDUo2/h7LTtqgqEDJZLR58Aha3XZ9l4K/MTy+y2mTTbKNPa9" attributes referenced below are placeholders, identical to the sibling POCs. Before deploying this page publicly, regenerate real SHA-384 SRI hashes for the exact pinned version URLs at srihash.org (or via openssl dgst -sha384 -binary file.mjs | openssl base64 -A) and replace the placeholder strings. With placeholders, modern browsers refuse to execute the modules and the tool fails closed — that is intentional.
wss://signaling.yjs.dev, wss://y-webrtc-signaling-eu.herokuapp.com, and wss://y-webrtc-signaling-us.herokuapp.com. Your room name is sent to those servers in plaintext. Anyone who knows your room name can join and self-report a score under any name. Do not transmit anything sensitive. The default room name is clearly synthetic.
nexus_mastery_v1 (Skill Mastery Map). If empty, opens with 0 and a hint to open the source tool.nexus_fsrs_history_v1 (Daily Practice). Streak = consecutive days with at least one logged review.nexus_portfolio_v1 (Skill Portfolio). Counts issued credentials and groups by tier.Want verifiable scores instead of self-reported ones? Export a Verifiable Presentation from the Skill Portfolio and share it alongside your leaderboard claim. Peers can then check the JWS signature against your did:web document.
Source: nexus_mastery_v1 (Skill Mastery Map). Sorted by count, ties broken by earliest join.
Source: nexus_fsrs_history_v1 (Daily Practice). Streak = consecutive days with at least one review (today or yesterday counts as active).
Source: nexus_portfolio_v1 (Skill Portfolio). Sorted by gold, then silver, then bronze count.
Last 50 events in this room. Auto-emitted when your local stats change (debounced to max 1 event per type per minute). Newest first.
signaling.yjs.dev and Heroku endpoints). Treat the room name as guessable.{name, avatar, joined, mastery, streak, totalReviews, mature, lapseRate, lastReview, badges:{gold,silver,bronze,total,last}}.{user, name, avatar, time, type, payload} events. Capped client-side at 50 in the rendered view; capped at 200 in the underlying array.nexus_mastery_v1, nexus_fsrs_history_v1, nexus_portfolio_v1 on connect, on a 30-second poll, and on the storage event (cross-tab updates). Writes to your Y.Map entry and emits debounced activity events.left event. Other peers stop showing you.<script type="module">) for Y.js + y-webrtc dynamic imports