Legislative tracking for teams.
FloorVote is an open, self-hostable bill tracker for any team that tracks legislation—automatic bill summaries, member voting, email notifications, and hearing calendars, all for about $5-7/month in infrastructure.
FloorVote monitors state and federal legislation and surfaces the bills that matter to your team—filtered by your keywords and summarized and tagged by AI according to your instructions. Your team can comment and vote on the bills, and your team can set an official position.
FloorVote can be used by individuals or teams, but it's especially powerful for teams, whether big or small. Instead of everyone on a team monitoring bills on their own and comparing notes over email or in meetings, FloorVote gives the whole team one shared place to watch, discuss, and respond to the bills that matter to them.
Each team gets a private, isolated deployment with its own database, member roster, bill list, activity feed, and calendar.
See the demo site · Docs · Get started · Security · Contributing
Development supported by the Bipartisan Policy Center.
| Bills | Keyword filtering · AI summaries, tags, and relevance scores · full text, fiscal notes, and amendments · triage for new matches · search across title, summary, and abstract · filtering by tag and priority · custom fields |
| Team | Support/oppose/neutral voting · comments with reactions and @-mentions · personal notes · priority flags · official team positions |
| Roles | Owner, admin, and member · custom roles for committee assignments · per-member voting restrictions |
| Calendar | Auto-added hearings · custom events · subscribe from any calendar app over ICS · spreadsheet import |
| Magic-link sign-in · daily or weekly digests · week-ahead hearing preview · new-match and mention alerts | |
| Admin | Configurable AI context, relevance question, and tag taxonomy · toggleable feature modules · bulk member invites · data export |
Each of these is explained in full on the docs site: What can FloorVote do?
| Backend | Hono on Cloudflare Workers—tenant API, central API |
| Database | Cloudflare D1 (SQLite via Drizzle ORM)—separate databases for central and each tenant |
| Storage | Cloudflare R2—bill text and masterlist cache, stored centrally |
| Queues | Cloudflare Queues—central ingestor, per-tenant bill delivery |
| Frontend | React 19 + React Router 7 + Vite 8, served via Workers Assets |
| Cloudflare Email Service, with Resend available as a fallback | |
| AI | Google Gemini 2.5 Flash via Cloudflare AI Gateway. Chosen for its affordability, accuracy, and ability to handle long PDFs, which is how many bills arrive. The default lives in api/src/lib/llm.ts, and the GEMINI_MODEL and GEMINI_THINKING_BUDGET vars override it per environment. |
| Legislative data | LegiScan. An OpenStates provider exists alongside it, but is experimental and not at feature parity. |
| Testing | Vitest with @cloudflare/vitest-pool-workers; Vitest + jsdom for the frontend |
flowchart TB
API["LegiScan API"] -->|hourly cron| C
subgraph C ["Central service — one per operator"]
CW["Worker + D1 + R2 + Queues"]
end
C -->|per-tenant queue| TA["Tenant A — Worker + D1 + Queue"]
C -->|per-tenant queue| TB["Tenant B — Worker + D1 + Queue"]
Central — one per operator. It makes every legislative API call and stores all bill text, so provider traffic, caching, and quota all sit in one place however many teams you run. It does no AI processing.
Tenants — one per team. Each runs the AI pass (summary, tags, relevance score) using its own configured context and taxonomy, keeps its own D1 database, serves the React app via Workers Assets, and never calls LegiScan directly. Because relevance is scored per team, the same bill can score very differently for two teams.
Tenant and central talk to each other over Cloudflare service bindings in both directions, with no shared secret in transit.
For the full data flow—cron passes, the ingestor, deduplication, and queue boundaries—see Architecture on the docs site.
FloorVote was developed using Claude Code and the superpowers plugin.
Architecture and security have been reviewed and strengthened through a volunteer engagement with U.S. Digital Response (volunteer: Larry Hitchon).
Bill data comes from LegiScan, licensed CC BY 4.0; summaries and relevance scores are generated by FloorVote. FloorVote reads legislative data through a provider interface, and LegiScan is the maintained implementation.
FloorVote is open source under AGPL-3.0. Contributions are accepted under the Developer Certificate of Origin — sign your commits with git commit -s. If you run a modified version as a network service, the AGPL requires you to offer your users the corresponding source.