Inspiration
On X, a Community Note takes a median of 18.1 hours to appear. Half of a post's reposts happen in the first 5.75 hours (Chuai et al., arXiv:2409.08781). By the time readers see the context, most of the damage is done. Only 11.5% of notes ever reach a verdict at all.
We downloaded X's own public Community Notes data to find out where the time goes. The answer surprised us:
$$ \underbrace{25\ \text{min}}{\text{deciding ratings are in}} \quad \text{vs.} \quad \underbrace{3.8\ \text{h}}{\text{X shows the note}} $$
The crowd has usually already decided. Readers just can't see it yet.
What it does
Fast Notes is a live, multiplayer room for one note.
- Calibrate in 15 seconds. You rate 5 real notes, and the app places you on a neutral Side A ↔ Side B axis learned from real raters. No political labels.
- The room calls in the missing side. A note only counts as helpful when people who usually disagree both find it helpful. The room shows which side is missing and routes the next person from that side to rate.
- The verdict locks live. A bridging model refits in the browser on every rating, so the verdict appears the moment the crowd reaches it.
- Multiplayer by QR. Press Invite, scan with a phone, calibrate, and you become the missing side. Everyone in the room stays in sync in real time.
- Live dispatch. Six real notes at once: real raters arrive one by one, and a dispatcher sends each person to the note that most needs their viewpoint.
- Honest results. A Results page replays 313 real notes in three orders: X's real order, random, and ours.
How we built it
Data. The public X Community Notes download: notes, status history and ratings. We sampled 1,000 notes, with 86,725 real ratings from 14,424 raters, streamed in chunks with pandas.
Model. Our own one-dimensional bridging matrix factorisation, after X's open-source scorer:
$$ \hat r_{un} = \mu + i_u + i_n + f_u \cdot f_n $$
Here $f_u$ is a rater's viewpoint and $f_n$ is how much a note splits viewpoints. A note is helpful when its intercept $i_n$ is high while $|f_n|$ stays small, meaning both sides agree. We calibrated the cut-offs against X's real statuses, and the model matches X on 76% of sampled notes.
Replay. For every note X rated helpful, we refit after each rating and count the ratings $K$ needed until the verdict is final, in X's order, in 50 random orders, and in our "missing side first" order.
App. Next.js, TypeScript, Tailwind and Motion. The same refit runs in TypeScript in the browser on every rating. Supabase Realtime keeps a room in sync across devices, with a BroadcastChannel fallback.
TRMI. We built it together in one TRMI room, from the data pipeline to the live app. One of us owned the pipeline and model, the other owned the live room, and we agreed the JSON schemas between them on day one.
Challenges we ran into
- The ratings files are huge, so we count ratings per note before loading anything.
- Our model is fitted on a sample, so its scale differs from X's. We calibrate the thresholds and report agreement as it comes out.
- Keeping a room consistent when people join mid-vote: one host browser owns the state and everyone else follows it.
- Our own hypothesis was wrong (see below), and we had to rebuild the story around what the data actually said.
Accomplishments that we're proud of
We tested our own idea against real data and reported the result honestly. We expected that asking the missing side first would need fewer ratings. It doesn't: the median is $K = 5$ in every order, because most notes settle at the five-rating minimum. The real win was hiding in plain sight, which is time:
$$ \frac{3.8\ \text{h}}{25\ \text{min}} \approx 9\times \text{ faster to show a verdict that already exists} $$
Every note, rating and rater on the site is real. Only the arrival pace in live rooms is simulated, and the app labels it.
What we learned
- Bridging-based ranking is simple to state and subtle to calibrate.
- Being honest about a negative result made the pitch stronger, not weaker.
- Multiplayer is the product here. A fact-check needs two different people, so the room has to bring them together.
What's next
- An opt-in rater pool that gets a push notification when a note is missing their side.
- Running the dispatcher on real arrivals instead of simulated ones.
- A pilot with a newsroom fact-check desk during a breaking event.
- Testing on the 88.5% of notes that never settle on X, where routing should matter most.
Built With
- jsonschema
- motion
- nextjs
- numpy
- pandas
- python
- qrcode
- react
- supabase
- supabase-realtime
- tailwindcss
- typescript
- vercel
- x-community-notes-data
Log in or sign up for Devpost to join the conversation.