Inspiration
Community meetings often invite everyone but still hear from only a few people. Fast speakers, repeated themes, and limited time can push quieter concerns out of the decision—even when those concerns affect safety or accessibility. We wanted a tool that improves participation without collecting names, recording voices, or hiding the order behind a black-box model.
What it does
FairTurn turns anonymous concerns into a transparent facilitation workflow:
- Collect a concern under a shared theme.
- Score it with three visible factors: urgency, people affected, and how under-heard the theme is.
- Build a speaking queue that avoids repeating the same theme when another voice is available.
- Let the facilitator inspect, reorder, and lock the queue.
- Edit and commit a human-written decision, then export a Markdown brief.
The live Voice balance indicator changes as the queue changes. Every score and reason stays visible, so the tool supports a meeting rather than deciding for it.
How we built it
FairTurn is a responsive React 19 and TypeScript application built with Vite. The fairness engine is a standalone deterministic module. It combines urgency (45%), people affected (35%), and under-heard representation (20%), then applies a theme-diversity pass to the ranked queue. Vitest covers weights, explanations, diversity, edge cases, balance scoring, and immutable reordering.
The product is local-first: no account, backend, analytics SDK, recording, personal identifier, or model API is required. The UI uses semantic landmarks, keyboard-operable rows, visible focus states, reduced-motion support, responsive stacking, and high-contrast feedback. GitHub Actions tests and builds every deployment.
Challenges we ran into
The main challenge was making fairness legible. A single score would be easy to build but hard to trust. We separated the engine into a documented weighted score and a visible theme-diversity rule, then exposed the exact factors next to the selected voice. We also had to preserve a dense three-column facilitation workspace on mobile without turning it into a pile of unrelated cards.
Accomplishments that we're proud of
- A complete add → rebalance → inspect → lock → commit → export workflow.
- No hidden ranking inputs and no automated final decision.
- Eight passing unit tests plus a successful production build.
- No known production dependency vulnerabilities.
- Desktop and mobile layouts with no page-level horizontal overflow.
- A public, reproducible repository and automated HTTPS deployment.
What we learned
Explainability is strongest when it is part of the interaction, not a paragraph in documentation. Showing why a voice moved, and letting a facilitator override that move, made the system feel more useful and more accountable. We also learned that privacy can simplify product architecture: anonymity and local execution remove an entire class of identity and recording risks.
What's next for FairTurn
Next we would add facilitator-defined factor weights, multilingual plain-language prompts, an offline room-sharing mode, and a signed decision-history export. We would also run moderated sessions with student councils and neighborhood groups to test whether the queue improves participation without slowing down the meeting.
Built With
- accessibility
- github-actions
- local-first
- lucide
- react
- typescript
- vite
- vitest
Log in or sign up for Devpost to join the conversation.