Free and open source · AGPL v3.0 or later
Run a debate tournament without paying for a server.
CrabbyTab is a debate tabulation system for British Parliamentary, two-team and N-team formats. It follows Tabbycat's draw, allocation and standings algorithms, computes them in your browser, and keeps working when the tab room's connection drops.
- Free hostingA Next.js app on Vercel and a Firebase project on the no-cost Spark plan. No paid APIs.
- Offline-firstYour working copy lives in the browser; changes sync to Firestore when you are back online.
- Reproducible drawsEach draw's random seed is stored on the round and in the audit log.
- Moving from Tabbycat?Import a Tabbycat DebateXML archive, or export one back.
Everything a tab room needs
From setup to the final, CrabbyTab covers the whole tournament: imports, check-ins, draws, allocation, ballots, feedback, standings, breaks, public pages and email.
-
Draws
British Parliamentary, two-team (Asian/UADC, Australs, World Schools, Karl Popper, custom) and N-team rooms. Power pairing, random, round robin, seeded and manual draws, conflict avoidance, side balance, byes and a drag-and-drop draw editor.
Rounds and draws -
Adjudicator allocation
Hungarian allocation weighing adjudicator strength, conflicts and history, with preformed panels, feedback-weighted scores and venue allocation with hard and soft constraints.
Adjudicator allocation -
Ballots and results
Consensus and voting ballots, double entry with checks, ballots submitted through adjudicators' private URLs, optional public ballot and feedback forms, paper-ballot intake and postponed debates.
Ballots and results -
Standings, breaks and liveness
Configurable team and speaker precedence, break categories with institution caps and reserves, Standard and AIDA break rules, partial elimination rounds and live/safe/dead liveness per category.
Standings · Breaks -
Public site
Draws, results, standings, motions, tabs and breaks appear only once you release them. Public pages are served from a cached snapshot made at publish time, which keeps Firestore reads within the free tier.
Public pages and releases -
Private URLs and email
Personal links for ballots, feedback and check-ins, QR slips, email campaigns and automatic draw and result notifications.
Private URLs · Email -
26 languages
English plus every language Tabbycat offers, including right-to-left Arabic and Hebrew. The 25 non-English catalogues are machine-drafted and still need review by fluent speakers.
Internationalisation notes -
REST API
A versioned API at
API and tokens/api/v1with per-tournament, scoped, hashed and revocable tokens, rate limits, transactional writes and an OpenAPI document. -
Audit log
A hash-chained log of tab-room actions, including overrides of tournament rules with their recorded reasons, from the UI and the API.
Audit log -
Offline work and live sync
Ballots, draws, allocations and check-ins in the current round sync live between admin devices. Other data uploads and downloads explicitly, and conflicting edits are archived instead of overwritten.
Backups, restore and cloud sync -
Imports and exports
CSV imports for institutions, teams, adjudicators, venues and motions; DebateXML import and export; full JSON backups with a validated restore; CSV exports.
Participants and imports · CSV formats
How it works
CrabbyTab keeps computation local and uses the cloud for sharing, not for thinking.
Work in the browser
The tournament you edit is stored in your browser. Draws, allocations, standings and breaks are calculated there, so a slow connection does not stop the tab room.
Sync to Firebase
Changes are merged into Firestore. Records changed on two devices are listed as conflicts for you to resolve; nothing newer is silently replaced.
Publish what you release
A sanitised snapshot of released information feeds the public pages. Participants use private URLs that write straight to the cloud copy.
Compared with Tabbycat
Tabbycat is the established open-source tab system, and CrabbyTab follows its algorithms and conventions closely. CrabbyTab is an independent project and is not affiliated with Tabbycat. Its results are checked against Tabbycat's own code with a differential test harness, but it is younger and less battle-tested.
Where CrabbyTab differs by design
- Hosting: serverless on free tiers instead of a Django and PostgreSQL server.
- Offline: a local working copy that keeps working without a connection.
- Public pages: served from snapshots made at publish time and cached.
- Accountability: a hash-chained audit log and recorded reasons for every rule override.
- Ties: teams tied in a standings tier are ordered by the draw's seeded random order rather than database order.
Known gaps and limits
- Live collaboration covers the current round's ballots, draw, allocation and check-ins; settings, rounds, motions, breaks and feedback still sync by upload and download.
- N-team rooms support random and manual draws only, as in Tabbycat.
- BP ballots are consensus only; voting ballots are for two-team formats.
- No browser push notifications; email is used instead. Institutions are per tournament.
- Translations are machine-drafted; server errors and emails are still English.
Read the full comparison with Tabbycat · Parity audit and roadmap
Quick start
You need Node.js 22 and npm. Firebase is optional for trying CrabbyTab on your own machine: tournament data can stay in the browser.
git clone https://github.com/The-Studio-of-Sadiq/crabbytab.git
cd crabbytab
npm ci
cp .env.example .env.local
npm run dev
Then open http://localhost:3000. Add your Firebase project's NEXT_PUBLIC_FIREBASE_* values to .env.local to enable sign-in and cloud sync.
Installation and local development · First tournament walkthrough
Deploy for a tournament
- Create a Firebase project with Email/Password sign-in and a Firestore database.
- Review and publish the repository's
firestore.rules. - Import the repository into Vercel (Next.js preset, Node.js 22) and set the environment variables from
.env.example. - Create user accounts in Firebase Authentication and list global administrators in
FIREBASE_ADMIN_UIDS.
CrabbyTab has no public sign-up. Keep the service-account key and SMTP password in server-side environment variables only.