
Mission
We are an open source, non profit Chi Hack Night Breakout Group focused on the question:
Why don't we pay attention to our representatives between elections?
What We're Offering
We're building an open-source, simplified, and expanded version of OpenStates' data on state and federal legislation, and providing examples on how that data can be used.
The datasets, as they exist now, include:
- Federal, state, and local (for Chicago only) bill information
- Daily updates on legislative bills
- Vote totals - and breakdowns - by legislator
- Automatic tagging of bills by topic, using Claude
- Automatic summarization of bills, using Claude
This expanded collection of datasets will eventually include:
- Summaries and sourcing of legislative campaign promises
Current Examples
In-progress Examples
- Automated, personality-focused BlueSky bots
Project History
WindyCivi began development in 2022. We initially wanted to create a destination for simplified, summarized updates on legislative action, with the ability to follow or filter for certain legislative topics - and this is what was initially built as the Windy Civi iOS app, and website, which was first launched in a beta in 2024.
As our expanded dataset began to come together, we decided to incorporate a ledger structure to the data to allow for more performant updates, and to let the data become open-source, and accessible by anyone who wants to use it to create their own website, app, bot, or other platform for showcasing updates. This is the vision that we've been focused on as of 2025.
We're excited to build towards a vision of democratized, simplified access to legislative updates, for all.
Want To Contribute?
Take a look at our Github, Docs, and message us on our Slack channel.
Let The People Take Back Their Government
Our 2024 efforts taught us a few things:
- People don't want to download another app or use another portal.
- Getting bill data is really hard, and usually involves using private APIs.
- Creating AI summaries and topics should be controlled by organizations/individuals.
As such, our effort has become 2-fold
Contributors
- Austin McLaughlin
- Brandon
- Daniel Cappy
- Edwin Cuevas
- Jeff Leverenz
- Sartaj Chowdhury
- S.Murakami
- Tamara Dowis
2025 Bill Blockchain
Open Civic Data Blockchain Proposal
This proposal outlines a decentralized, peer-to-peer system for managing and publishing civic data using a blockchain-like append-only log. Built on the Open Civic Data schema and powered by Git, this architecture enables transparency, tamper-resistance, and flexibility in how public information is stored, shared, and consumed. By treating government data as a series of verifiable, timestamped events, we create an ecosystem where organizations and individuals can build custom civic feeds, automate updates, and uncover hidden dynamics in governanceβall without relying on centralized servers.
Why Use a Hashed Append-Only Log?
-
π Truly Peer-to-Peer
Everyone keeps their own copy of the dataβno central server needed, no extra cost. -
π The Constitution Is Basically a Blockchain
Government changes through amendments. Our log reflects this: permanent, append-only, and transparent. -
π» Highly Tailored Custom Feeds Built With Code + AI
Composable event logs will be easy to filter, tag, and summarize. Orgs can compose those feeds too in order to make highly tailored feeds for publishing. -
π€ Publish Everywhere with Bots
Organizations can automate updates to any number of platforms easily, from Blue Sky Bot Alert posters βthink Reddit replies or Bluesky postsβon top of each other. In addition, we can make tooling to have public RSS feeds that can then be imported by news organizations. -
βοΈ Blockchain without the Cringe or Cost
Blockchain hashes + public key signatures let users verify data themselves without expensive proof algorithms. For IDs, Decentralized Identifiers are the new standard, and interop with Bluesky. -
βοΈ Network Agnostic
Supports everything: peer-to-peer, pub-sub, polling, WebRTC, email, RSS, pushβnotifications, etc. They will all work naturally. -
π± Our App Becomes A Glorified P2P Feed Reader With Civic Tendencies
By being a P2P feed reader with special features around civic data, we simplify the app itself, and allow others to make their own client apps. -
π RSS Feeds Just Work
Feed-based design lets us easily pull in existing sources like Executive Orders or court decisions via RSS, and allows organizations to pull news website feeds. -
βͺ Bonus: Reveal Power Dynamics
Replay legislative logs to uncover hidden patternsβwho votes when, with whom, and under whose influence.
Why Open Civic Data as the Base Schema?
-
π€ Plug Into the Civic Tech Ecosystem
Uses familiar Open Civic Data formats, making it easy to integrate with existing tools and scrapers. -
π Reuse Existing Data
Works with platforms like OpenStates and Councilmatic, giving us access to many data sources.
Why Git for Data Storage?
-
π Folders + Files = Maximum Portability
The most universal data structureβeasy to read, edit, and share across tools and platforms. -
π Git Is Already Peer-to-Peer
Git is built on a distributed log.git pullworks seamlessly in our app and AI workflows. -
π GitHub = Easy Browsing
Markdown rendering and file previews make GitHub a friendly UI for exploring without needing to clone. We can also expose RSS feeds via GHPages. -
π§© Submodules Keep Repos Lean
Git submodules let us split large datasets across repos, so no single repo gets bloated.
Folder Structure + Filename Convention
/open-civic-data-blockchain/
βββ country:us/ # United States
β βββ state:il/ # Illinois state
β β βββ sessions/ # Legislative sessions
β β β βββ ocd-session/country:us/state:il/2023-2024/ # Full OCD session ID
β β β β βββ bills/ # Bills in this session
β β β β β βββ sb1234/ # Senate Bill 1234
β β β β β β βββ logs/ # Event logs folder
β β β β β β β βββ 20240115T123045Z_session_bill_created.json # Initial bill creation in session
β β β β β β β βββ 20240115T123045Z_metadata_created.json # Initial metadata creation
β β β β β β β βββ 20240117T143022Z_metadata_updated.json # Metadata update with field mask
β β β β β β β βββ 20240117T143156Z_sponsor_added.json # Sponsors added
β β β β β β β βββ 20240120T092133Z_version_added.json # Version document added
β β β β β β β βββ 20240130T152247Z_action_added.json # Action recorded
β β β β β β β βββ 20240215T103045Z_doc_added.json # Supporting document added
β β β β β β β βββ 20240315T140011Z_vote_initiated.json # Vote started
β β β β β β β βββ 20240315T143022Z_vote_updated.json # Vote partial results
β β β β β β β βββ 20240315T150537Z_vote_finalized.json # Vote complete
β β β β β β βββ files/ # Raw file storage
β β β β β β βββ bill_introduced.pdf # Original version document
β β β β β β βββ bill_amended.pdf # Amended version document
β β β β β β βββ fiscal_note.pdf # Supporting document
β β β β β βββ hb0789/ # House Bill 789
β β β β β β βββ logs/ # Event logs folder
β β β β β β β βββ 20240118T090023Z_session_bill_created.json # Initial bill creation in session
β β β β β β β βββ 20240118T090023Z_metadata_created.json # Initial metadata creation
β β β β β β β βββ ...
β β β β β β βββ files/ # Raw file storage
β β β β β β βββ ...
β β β β β βββ ...
β β β β βββ events/ # Events for this session
β β β β βββ 2024-04-15-senate-appropriations-hearing.json # Senate committee hearing
β β β β βββ 2024-02-22-house-floor-session.json # House floor session
β β β β βββ ...
β β β βββ ocd-session/country:us/state:il/2021-2022/ # Previous session
β β β β βββ ...
β β β βββ ...
β β βββ events/ # Events not tied to a specific session
β β βββ 2024-07-15-joint-commission-meeting.json # Joint commission meeting
β β βββ 2024-08-20-special-task-force.json # Special task force meeting
β β βββ ...
β βββ state:ca/ # California state
β β βββ ...
β βββ state:ny/ # New York state
β βββ ...
βββ country:ca/ # Canada
βββ ...
Git Architecture
We plan to auto-generate many git repos.
Session Git Repo
This repo should be a blockchain-like append only log, making syncing data as easy as git pull.
Question: what about the files like PDFS? They feel right to keep in here as a copy, but also, would balloon the size of these. Maybe yet another submodule for session files?
/
βββ README.md # Session-specific information
βββ bills/ # Bills in this session
β βββ sb1234/ # Senate Bill 1234
β β βββ logs/ # Event logs folder
β β β βββ 20240115T123045Z_session_bill_created.json
β β β βββ 20240115T123045Z_metadata_created.json
β β β βββ 20240117T143022Z_metadata_updated.json
β β β βββ ...
β β βββ files/ # Raw file storage
β β βββ bill_introduced.pdf
β β βββ bill_amended.pdf
β β βββ fiscal_note.pdf
β βββ hb0789/ # House Bill 789
β β βββ logs/
β β β βββ ...
β β βββ files/
β β βββ ...
β βββ ...
βββ events/ # Events for this session
βββ 2024-04-15-senate-appropriations-hearing.json
βββ 2024-02-22-house-floor-session.json
βββ ...
Locale Git Repo
Overall locale repo (also generated). Contain links to git submodules that have event logs for different sessions/events. Will also contain scripts to rebuild data into Open Civic Data formats.
ocd-blockchain-illinois/
βββ .gitmodules
βββ README.md
βββ scripts/
β βββ scrape.py # Shortcut to directly scrape for this locale
| βββ rebuild.py # To rebuild OCD data from blockchain logs
βββ sessions/
β βββ ocd-blockchain-illinois/ocd-session/country:us/state:il/2023-2024/
β βββ ocd-blockchain-illinois/ocd-session/country:us/state:il/2021-2022/
β βββ ocd-blockchain-illinois/ocd-session/country:us/state:il/2019-2020/
βββ events/
βββ 2022-2026/
βββ 2018-2022/
βββ 2014-2018/
Main Repo
The primary repo (also generated) that people can clone to get all civic data easily via the submodules.
open-civic-data-blockchain/
βββ .gitmodules
βββ README.md
βββ scripts/
β βββ update_all.sh
β βββ integrity_check.py
β βββ generate_cross_jurisdictional_report.py
βββ jurisdictions/
βββ country:us/
β βββ state:il/ # Illinois submodule
β βββ state:ca/ # California submodule
β βββ state:ny/ # New York submodule
β βββ district:dc/ # Washington DC submodule
β βββ county:us/state:va/fairfax/ # Fairfax County submodule
β βββ place:us/state:tx/austin/ # City of Austin submodule
βββ country:ca/
β βββ province:on/ # Ontario province submodule
β βββ province:bc/ # British Columbia submodule
βββ country:uk/
βββ england/ # England submodule
βββ scotland/ # Scotland submodule
TODO List
-
Timestamps: Scrape-Oriented vs. Gov-Oriented
Are log timestamps the time we scraped the data, or the time of the actual government update?
What if a specific event doesn't have a timestamp?
β€ Open Civic Data also discussed this -
Unique IDs
OpenStates uses a lot of generated UUIDs. Ideally, our folder/file structure and naming conventions should follow official legislative data.- Jurisdiction ID: Follows OCD naming convention β
country:us/state:fl/government - Session ID: TODO
- Bill ID:
jurisdiction_id/sessions/:session_id/bill.identifierβ use official ID likeHB250 - Vote Event ID: TODO
- Person ID: TODO
- Event ID: TODO
- Jurisdiction ID: Follows OCD naming convention β
-
Bill Folder + Filename Convention
bill.metadata:bill_id/log/metadata_update_{TODO}.jsonbill.actions:bill_id/log/action_{TODO}.jsonbill.votes:bill_id/log/vote_{TODO}.jsonbill.sponsors:bill_id/log/sponsor_update_{TODO}.jsonbill.versions:- File:
bill_id/files/version_{TODO}.pdf - Log:
bill_id/log/version_add_{TODO}.json(we can extract PDF content to JSON)
- File:
bill.documents:- File:
bill_id/files/documents_{TODO}.pdf - Log:
bill_id/log/document_add_{TODO}.json(we can extract PDF content to JSON)
- File:
-
Event Folder Convention
Events tied to sessions should live inside the session folder.
Out-of-session events: can we define a reliable alternate time span for organization? -
How to Handle Metadata Changes
Metadata (likebill) may change from scrape to scrape.
UsefieldMaskfor lightweight updates, or consider JSON Patch.
β€ https://jsonpatch.com// bill.metadata_events { "fieldMask": ["from_organization"], "bill": { "from_organization": "" } }
Environment Setup
For now, we aren't doing any coding that touches the previous code. All code/decisions should be in this scraper_next folder as an isolated experiment. If you don't have git access, message @sartaj.
Easy: Download Data and Explore With SQL Explorers
- OpenState Illinois Scraper Output Files
- State/Federal OpenStates Data Explorer
- password is ChiHackNight closing group phrase all lowercase
- Chicago OCD Data Explorer Explore Councilmatic PG Dump for Chicago OCD data
Advanced: Running Scrapers / Importing PG Dumps
- Open States
- via Scraper. We are using this for v1. By running the scrapers directly, data will be much more up to date as it scrapes data directly. It also allow us to run certain scrapers, like USA, multiple times a day.
- via SQL Dump, which updates every few days, and has bill full text, in addition to a lot of other content like maps data.
- Chicago SQL Dump. This updates every night and is managed by Datamade, who we have already been collaborating with on Chicago data. They also do stuff like AI summaries that we can pre-pull.
Prior Art
- Washington DC made Github their official law source of truth. It looks immutable.
- How append-only logs are used in p2p/blockchain applications.
- Beginners guide to event sourced databases and their benefits.
- Bluesky LGBTQ+ Legislation Alerts This incredible team has manually created a system that I think we can make tooling for that they would potentially want to use.
Communications
- Discussion via Slack
- Task Board via Slack
- (this file) Collaborative Brainstorming via Git: Feel free to edit.
Bill Bot Designer
Overview
The Bill Bot Designer is a tool for creating automated bots that monitor and publish legislative updates from the Open Civic Data Blockchain. These bots can be configured to watch specific bills, jurisdictions, or events and automatically post updates to various platforms like Bluesky, Twitter, RSS feeds, or custom webhooks.
Why Bots?
- π€ Automated Monitoring: Bots can continuously watch for legislative changes without human intervention
- π’ Multi-Platform Publishing: Single bot configuration can publish to multiple platforms simultaneously
- π― Targeted Alerts: Organizations can create highly specific feeds for their constituents
- β‘ Real-Time Updates: Instant notifications when important legislative events occur
- π Consistent Formatting: Standardized message formats across all platforms
Bot Architecture
Event-Driven Design
Bots operate on an event-driven architecture, listening to the append-only log of legislative events:
Legislative Event β Blockchain Log β Bot Filter β Message Generation β Platform Publishing
Bot Components
- Event Listener: Monitors the blockchain log for new events
- Filter Engine: Applies rules to determine if an event should trigger the bot
- Message Generator: Creates platform-specific messages from event data
- Publisher: Sends messages to configured platforms
- Rate Limiter: Ensures compliance with platform API limits
Configuration Examples
Basic Bill Monitor Bot
name: "Illinois Bill Monitor"
description: "Monitors all Illinois bills for key actions"
# Event filtering
filters:
- jurisdiction: "country:us/state:il"
- event_types: ["bill_introduced", "bill_passed", "bill_vetoed"]
- keywords: ["environment", "education", "healthcare"]
# Message template
message_template: |
π {bill.identifier}: {bill.title}
ποΈ {action.description}
π
{action.date}
π {bill.url}
# Publishing platforms
platforms:
- type: "bluesky"
account: "@legislative-alerts.bsky.social"
rate_limit: "10/hour"
- type: "rss"
feed_url: "https://example.com/il-bills.xml"
update_frequency: "immediate"
Specialized Committee Bot
name: "Senate Appropriations Monitor"
description: "Tracks all bills going through Senate Appropriations"
filters:
- jurisdiction: "country:us/state:il"
- committee: "Senate Appropriations"
- event_types: ["bill_referred", "bill_hearing_scheduled", "bill_vote"]
message_template: |
π° Senate Appropriations Update
π {bill.identifier}: {bill.title}
π Fiscal Impact: {bill.fiscal_note.summary}
π
Next Action: {next_action.description}
ποΈ Date: {next_action.date}
platforms:
- type: "webhook"
url: "https://api.example.com/appropriations-webhook"
headers:
Authorization: "Bearer {webhook_token}"
- type: "email"
recipients: ["budget@example.org", "finance@example.org"]
subject: "Senate Appropriations Alert: {bill.identifier}"
Constituent Alert Bot
name: "District 5 Constituent Alerts"
description: "Alerts constituents about bills affecting their district"
filters:
- jurisdiction: "country:us/state:il"
- sponsor_district: "5"
- event_types: ["bill_introduced", "bill_passed", "bill_signed"]
message_template: |
π District 5 Update
π {bill.identifier}: {bill.title}
π€ Sponsored by: {sponsor.name}
π Summary: {bill.summary}
π
Status: {bill.status}
π Learn more: {bill.url}
platforms:
- type: "sms"
phone_numbers: ["+15551234567", "+15559876543"]
provider: "twilio"
- type: "slack"
channel: "#district-5-alerts"
workspace: "example-org"
Platform Integrations
Bluesky
- Rate Limit: 10 posts per hour
- Character Limit: 300 characters
- Features: Rich text, links, images
- Authentication: App password required
Twitter/X
- Rate Limit: 300 tweets per 3 hours
- Character Limit: 280 characters
- Features: Text, images, polls
- Authentication: OAuth 2.0
RSS Feeds
- Format: RSS 2.0 or Atom
- Update Frequency: Configurable
- Features: Full text, categories, enclosures
- Hosting: GitHub Pages, custom server
Webhooks
- Method: POST
- Content-Type: application/json
- Authentication: Bearer token or API key
- Retry Logic: Exponential backoff
- Providers: SMTP, SendGrid, Mailgun
- Templates: HTML and plain text
- Attachments: PDF bills, documents
- Rate Limits: Varies by provider
SMS
- Providers: Twilio, AWS SNS
- Character Limit: 160 characters
- Features: Text only
- Cost: Per message
Advanced Features
Conditional Logic
filters:
- jurisdiction: "country:us/state:il"
- conditions:
- if: "bill.fiscal_impact > 1000000"
then: "priority = high"
- if: "bill.sponsor.party == 'Republican'"
then: "include_opposition_analysis = true"
Message Templates with Variables
message_template: |
{#if bill.fiscal_impact > 1000000}π° HIGH COST BILL {/if}
π {bill.identifier}: {bill.title}
π€ Sponsor: {bill.sponsors[0].name} ({bill.sponsors[0].party})
π Fiscal Impact: ${bill.fiscal_impact:,.0f}
π
{action.date | date_format: "%B %d, %Y"}
π {bill.url}
{#if bill.summary}
π {bill.summary | truncate: 200}
{/if}
Scheduled Publishing
publishing:
schedule:
- time: "09:00"
timezone: "America/Chicago"
days: ["monday", "tuesday", "wednesday", "thursday", "friday"]
- time: "17:00"
timezone: "America/Chicago"
days: ["monday", "tuesday", "wednesday", "thursday", "friday"]
batch_size: 5
delay_between_posts: "30s"
Analytics and Monitoring
analytics:
track_engagement: true
platforms:
- bluesky
- twitter
- webhook
metrics:
- posts_sent
- engagement_rate
- error_rate
- response_time
alerts:
- condition: "error_rate > 0.05"
action: "email_admin"
- condition: "no_posts_24h"
action: "slack_alert"
Best Practices
Content Guidelines
- Be Accurate: Always verify data before publishing
- Stay Neutral: Present information without bias
- Include Context: Provide background information when relevant
- Use Clear Language: Avoid jargon and technical terms
- Include Sources: Always link to official sources
Technical Guidelines
- Rate Limiting: Respect platform API limits
- Error Handling: Implement retry logic and fallbacks
- Monitoring: Track bot performance and errors
- Testing: Test configurations before going live
- Documentation: Document bot purposes and configurations
Legal Considerations
- Copyright: Respect copyright on bill text and documents
- Attribution: Always credit original sources
- Disclaimers: Include appropriate disclaimers
- Compliance: Follow platform terms of service
- Privacy: Don't collect or store personal information
Getting Started
1. Choose Your Use Case
- General Monitoring: Track all bills in a jurisdiction
- Committee Focus: Monitor specific committees
- Issue-Based: Track bills by topic or keywords
- Constituent Service: Alert constituents about relevant bills
2. Design Your Filters
- Jurisdiction: Which government body to monitor
- Event Types: What actions to track
- Keywords: Specific topics or terms
- Sponsors: Bills from specific legislators
3. Create Your Message Template
- Platform Limits: Consider character limits
- Required Information: Bill ID, title, action, date
- Optional Details: Sponsor, summary, fiscal impact
- Call to Action: Links to learn more or take action
4. Configure Platforms
- Primary Platform: Choose your main publishing platform
- Secondary Platforms: Add additional platforms for reach
- Testing: Test with a small audience first
- Monitoring: Set up alerts and analytics
5. Deploy and Monitor
- Gradual Rollout: Start with limited scope
- Monitor Performance: Track engagement and errors
- Iterate: Refine based on feedback and data
- Scale: Expand to additional jurisdictions or topics
Examples in Action
Bluesky Legislative Alerts
The Bluesky LGBTQ+ Legislation Alerts bot demonstrates how effective automated legislative monitoring can be. It:
- Monitors bills across multiple states
- Filters for LGBTQ+ related legislation
- Posts concise, informative updates
- Builds a community around legislative transparency
Chicago Councilmatic
The Chicago Councilmatic system shows how bots can enhance existing civic data platforms:
- Integrates with existing Open Civic Data sources
- Provides real-time updates on city council activities
- Maintains historical records of all legislative actions
- Enables custom feeds for different stakeholders
Future Enhancements
AI-Powered Features
- Smart Summaries: AI-generated bill summaries
- Impact Analysis: Automated analysis of bill effects
- Sentiment Analysis: Track public opinion on bills
- Predictive Modeling: Forecast bill outcomes
Advanced Integrations
- Calendar Integration: Add events to personal calendars
- CRM Integration: Track constituent interactions
- Newsletter Integration: Compile weekly summaries
- API Access: Allow third-party integrations
Enhanced Analytics
- Engagement Tracking: Measure bot effectiveness
- A/B Testing: Test different message formats
- Audience Insights: Understand who's following bots
- Performance Optimization: Improve delivery rates
Windy Civi
A unified portal with notifications for Chicago residents, showing local, state, and federal bills with AI summaries and topics, allowing users to get notifications.
Contributors
- Andrew Dauphinais
- Emme
- Kari Douglass
- Marissa Heffler
- Sartaj Chowdhury
- Zach Schoneman
Additional Contributors
- haileyplusplus
- Fiona Tang
- Miroslava Osorio
- Nate Johnson
December 2024 Presentation
The following is our presentation from December 2024
Slides


































Civi Social + MyChicago
Allow residents of Chicago to directly interact with their elected officials.
Contributors
Additional Contributors
- Charles Cole
- Sue Kwong
History



Socratic.Center
Easily find who represents you.
This era involved making www.socratic.center, a site to easily find your representative. From here, this project merged into Chi Hack Night as a breakout group.
Contributors
History
