Building an AI-Powered Knowledge Base for NYC Community Boards
Tal Roded, NYCuriosity Author & Manhattan CB3 Member
Sarah Sachs, Block Party Founder
Major Contributions from McKay Warren, Sourabh Chakraborty, Brandon Pachuca, Amy Chen

Have you ever attended a Community Board Meeting?
Most folks we ask, typically respond with a confused look...
Have you ever attended a community board meeting? I see some nods in the virtual crowd, it looks like some of us have attended, but maybe not as much as we would like. while some of us have attended these meetings, why are they important?

Why are Community Boards important?

local
Community boards produce more structured civic data than almost any other level of government.
Community boards discuss policies, initiatives, priorities which impact our day to day lives. They act as the community’s voice when brokering conversations with state and local governments, non profit agencies and other organizations. In a nutshell, they are the most local level of democracy, and making them more accessible strengthens the representation of the community.


How might technology be used to help make local democracy more accessible?
It can be said that democracy is not a spectator sport, and to become engaged in democracy we must be informed. Encourage people to actually attend community board meetings, being informed can help be engaged - to know what is being discussed in the meetings, to speak up as a public member, or even to vote as a public member Technology can help with this process of being informed


Our Story - Cheers to the NYC Civic Tech Community!



Oliver - on NYC OTI
Agenda
Part 1: What are community boards and why do they matter?
Part 2: What is the opportunity for civic technology?
Part 3: Recent Updates + Scaling the Tool
Demo time
Q&A

PART ONE
What Are NYC Community Boards
and Why Do They Matter?
The Local Layer of NYC Government Most People Don’t Know Exists
Community boards are the ground floor of New York City politics—and most New Yorkers have never heard of them.
· 59 community boards across NYC’s 5 boroughs
· Established by the NYC Charter
· Represent a single community district — neighborhood scale
· Members are uncompensated volunteers appointed by their Borough President to serve two-year terms
· Charter Mandate: “consider the needs of the community district and advise elected officials”
The key fact:
Community boards have NO formal decision-making power.
Their role is advisory.
So why do they matter? →
Soft Power — Why “Advisory” Doesn’t Mean Toothless
▶
Resolutions on the record
Every agency and elected official sees when CB formally opposes their project. Ignoring a unanimous board vote can have political costs.
▶
District Needs Statement (DNS)
Annual priorities document filed by each CB. City agencies must respond to DNS requests in budget planning — direct budget influence.
▶
Required ULURP referrals, SLA & sidewalk cafe applications
For major land use decisions (rezonings, new developments), the city is legally required to refer applications to the CB. Recommendations become public record.
▶
Political pipeline
Many City Council members began as CB members. Relationships here open doors in elected offices and city agencies.

BetaNYC Boundaries Map
How Community Boards Are Structured
Who’s on the board:
· Up to 50 volunteer members
· 2-year terms (max 4 consecutive)
· No salary, no formal qualifications
· Only requirement: Must live, work, or have significant interest in the district

Leadership & staff:
· Chair, Vice-Chairs, Secretary,
Treasurer (elected by members)
· One paid District Manager, optional additional non-member staff
Subject-matter Committees:
· Transportation · Parks · SLA
· Land Use · Landmarks · Housing
· Health · Youth & Education
What Is a Resolution?
Resolutions are official, written, public positions on a local issue.
Standard resolution format:
TITLE: One-sentence summary
WHEREAS, [context and reasoning]...
WHEREAS, [additional context]...
THEREFORE, BE IT RESOLVED,
that Community Board 3 [action]...
MCB3 votes on:
· Bar & restaurant liquor licenses
· Traffic safety improvements
· Real estate developments
· City agency requests
(repaving, tree planting…)
· City-wide policy positions
tee up the tool here - but they're not accessible...

Partial text of a Manhattan CB3 resolution from the Transportation Committee. Note the succinct title and series of WHEREAS clauses (which continue past the end of this image). [source]
Two Kinds of Community Board Meetings
Full Board Meetings
Monthly · Open to the public
· Public comment period (~2 min per person)
· Elected officials give reports
· Committees report resolutions
· Full Board votes on resolutions
Committee Meetings
(Usually) Monthly · (Usually) Open to the public
· Agencies present project details
· Resolutions drafted and debated by committees
· Where advocacy is most effective
· Where the real work happens
Advocate insight: By the time a resolution reaches the full board, the debate is mostly over. Show up to committee meetings.
The Information Problem
Community boards are officially transparent — but practically opaque.
✅ What exists
· All meetings open to the public
· All resolutions and votes recorded publicly
· Minutes posted as PDFs or on Airtable on individual community board websites
· PDFs (for MCB3) go back to 2002
❌ What’s missing
· No structured database
· No search across resolutions
· No way to track a topic or location
across 20 years of minutes
· No way to identify contested issues
· 268 siloed PDFs (for MCB3)

Table from the Office of the Manhattan Borough President
Community Board member term limits begin in 2027 - is local government prepared for the significant loss of institutional knowledge?
Community Board Term Limits
This is a problem Block Party can help solve.
PART TWO
What is the Opportunity for Civic Technology?
Now transitioning into the civic tech part of our presentation, where we will share how we leveraged technology to help make this information more accessible.

Community Board Meetings can be inaccessible.
As Tal has eluded to, community board meetings can be inaccessible, whether it is attending a meeting or staying informed on local policy decisions. This was always the idea behind block party, when community board meetings became virtually accessible on YouTube during the Covid pandemic, I thought it would be cool to use technology to create a summary and full transcript from the meeting conversation. Block party has continued to evolve over the years and continues to serve the community because most folks don’t have the time to attend the many hours of meeting conversations or know what was discussed.

Community Board 3 meetings on average last 02:07:38
For community board 3 the typical meeting lasts about 2 hours and occur a few times per week. Across community boards in the block party meeting transcript archive,

The longest community board meeting in our archive lasted 07:22:17
The longest community board meeting from the on record was 7 hours, 22 minutes, and 17 seconds. It was from Manhattan CB2 February 11, 2025 - Outdoor Dining Working Group Meeting This is evidence that A LOT is discussed at these meetings, but unless you’re really plugged in - it’s hard to stay informed or engage. This is really the ethos behind Block party


Where over the past 6 years we have collected hundreds of meeting transcripts across districts representing each borough.

Block Party’s Archive has 11,986 Community Board Meeting Transcripts dating from 2015 to yesterday

Since the start of the pandemic CB meetings have been publishing their meetings to Youtube, digitizing the information for archive, and public access. And the volume of meetings published continues to grow.



The Information Problem


Now here is what we did for resolutions. The rest of this presentation will be about Block party’s newest feature where we developed a searchable archive for community board 3 resolutions. You would have had to click through 17 years of resolutions. Who is going to do that? This makes it searchable. information but would take forever to read 268 meeting PDfs you have to look through manually, within those.
Database Overview — What Does MCB3 Vote On?
6,511
Total resolutions
21,593
Paragraph clauses
26.9
Avg resolutions
per meeting
Keyword frequency across 6,511 resolution titles:
Deny
2,546 (39.1%)
Approve/Approval
1,526 (23.4%)
Recommend
1,336 (20.5%)
Support
718 (11.0%)
Request
471 (7.2%)
Oppose
42 (0.6%)

Typically they Deny!
(unless stipulations agreed to)
Above 6500 resolutions that each have their own context and action. Within those are nearly 2M words, which is about 3.3 War and Peace novels. There is so much text, but no way to search across resolutions. There is no way to Ctr-F to find all resolutions. So CB3 tends to approve the denial of resolutions accounting for 39% of all resolutions — which seem to stem from their liquor license docket. The board’s default posture is to deny or set conditions (“Deny Unless Stipulations Agreed To”) rather than give unconditional approval.
When Key Community Decisions Become More Accessible
Analytics Opportunity
Search thousands of resolutions by address, business name, or topic
Track a community board’s position on recurring issues over 20+ years
Compare contested vs. unanimous votes by topic area
Identify patterns on controversial issues
With NLP / Embeddings
Semantic search: ‘Find all resolutions about outdoor dining’
Cluster resolutions by topic or location
Detect shifts in sentiment and language over time
Compare positions across community boards
Civic
Accountability
Flag if city agencies ignore a resolution
Track liquor license denial → approval
Explore how community boards respond to the needs of their district
Knowledge base linking resolutions to the meeting discussion
Taking it Further with AI
· What a database unlocks: Longitudinal analysis: “how has MCB3’s posture on liquor licensing changed?” · Pattern detection: what gets denied vs. approved? · Semantic search by address, business, or policy topic Use case possibilities: Extract locations that are discussed to search by business name, address, agency, permit type
When Key Community Decisions Become More Accessible
Analytics Opportunity
Search thousands of resolutions by address, business name, or topic
Track a community board’s position on recurring issues over 20+ years
Compare contested vs. unanimous votes by topic area
Identify patterns on controversial issues
With NLP / Embeddings
Semantic search: ‘Find all resolutions about outdoor dining’
Cluster resolutions by topic or location
Detect shifts in sentiment and language over time
Compare positions across community boards
Civic
Accountability
Flag if city agencies ignore a resolution
Track liquor license denial → approval
Explore how community boards respond to the needs of their district
Knowledge base linking resolutions to the meeting discussion
Taking it Further with AI
Particularly with term limits, access to institutional knowledge is even more important!

· What a database unlocks: Longitudinal analysis: “how has MCB3’s posture on liquor licensing changed?” · Pattern detection: what gets denied vs. approved? · Semantic search by address, business, or policy topic Use case possibilities: Extract locations that are discussed to search by business name, address, agency, permit type Now we transition into Block Party’s newest feature and what we built:

Here is How We Built It
Create Vector Embedding
Generate Summary
First we
The Source Data — Community Board Website PDFs
MCB3 posts meeting minutes and vote records publicly — but in three different URL formats across eras.
2021 – present
manhattancb3/downloads/minutes/YYYY/minutesYYYY-MM.pdf
2004 – 2020
manhattancb3/downloads/minutes/minutesYYYY-MM.pdf
2002 – 2003
manhattancb3/cb3docs/reso-archive/MM-Name-YYYY-Resolutions.pdf
Challenge: each era has different PDF formatting, vote tally conventions, and resolution structure.

It’s exciting to see some community boards have adopted solutions like Airtable!

How the Extractor Works — Three-Step Pipeline
1
Fetch PDF
HTTP request to nyc.gov
Processed in memory—no files saved
→
2
Extract text
pdfplumber reads all pages
Concatenates raw text string
→
3
Parse & store
Regex splits text:
Find resolution chunks (VOTE:)
Split by markers TITLE:
WHEREAS: THEREFORE:
Create Vector Embedding

Pause to ask if folks are familiar with vector embeddings

Generate Summary
Group text chunks by each section of the resolution
Send to a prompt
Specify the output structure



Who wants to read this?

Community concerns
Reliable data points
Locations
Entities
Topics
Next steps
Resolutions as a Data Source
We created a summary from the full resolution text in order to make the information more accessible. Here is what the full resolution looked like



What if we could dive into the meeting discussion?



“Our main concern is that, all parking spaces on Canal Street from Broadway to East Elizabeth Street will be removed under the new DOT plan to widen the sidewalks. This will create major problems for truck delivery to local businesses and for seniors and patients with mobility impairments, who rely on ambulance or call service to reach the doctor's offices. Especially, since there are about 200 medical providers and two large radiology center on Canal Street.”
Link to Full Transcript




“Our main concern is that, all parking spaces on Canal Street from Broadway to East Elizabeth Street will be removed under the new DOT plan to widen the sidewalks. This will create major problems for truck delivery to local businesses and for seniors and patients with mobility impairments, who rely on ambulance or call service to reach the doctor's offices. Especially, since there are about 200 medical providers and two large radiology center on Canal Street.”
Link to Full Transcript


What if we could search across all 59 community boards?


Join the Party!
blockparty.studio
[email protected]
https://www.linkedin.com/in/sarahjunesachs/
https://www.linkedin.com/in/tal-roded/




We would love to connect - come join the party and sign-up to stay updated on conversations happening in your community board, or search through our archive mode for stories and insight.
March ended with one board, one parser, and an open question
1
board: Manhattan CB3
6,511
resolutions, 2002–2026
0
automated runs · every script kicked off by hand
The question the March talk ended on:
“Extending to all 59 boards: how might we generalize the pipeline? Each board formats their minutes differently.”
Quick recap of the March state: everything you just saw ran on one board, MCB3, with hand-run scripts and a parser that knew exactly one document format. The closing slide of the original talk asked how we would ever generalize it. This new section is a progress report on exactly that question.
The scripts became one pipeline; a new board is one YAML file
One ResolutionDocument flows through every stage; Pydantic validators guard each step.
1
domain object shared by all boards
12
board YAML configs · zero forked code
6
CLI commands · every operation repeatable
The big decision: stop patching scripts and build the pipeline the scaffolding always implied. One domain object with a validated lifecycle, board behavior expressed as YAML config, and a CLI (extract, reextract, audit, report, export-csv, migrate) so every operation is repeatable. The test suite covers parsers, sources, and pipeline fixes, so a parser change on one board cannot silently break another.
Six adapter classes cover every way a board publishes
NYCGovAssetsSource
MCB3
nyc.gov minute PDFs, four URL eras
WordPressIndexSource
MCB2MCB4MCB9MCB10
scrapes the boards’ index pages
AirtableSharedViewSource
MCB5MCB6MCB11MCB12
signed CSV export, no API key
AirtableInterfacePageSource
MCB1
headless browser reads the page’s own data call
GoogleDriveFolderSource
MCB7
public Drive folder of dated PDFs
WaybackCdxSource
MCB8
Internet Archive when the live site blocks crawls
The board’s YAML names its adapter; no adapter needs an API key.
The core insight of the scale-up: boards differ most in where their documents live, not what the documents say. So discovery became a pluggable adapter. Six adapter classes cover every hosting pattern across Manhattan: city-hosted PDFs, WordPress sites, a Google Drive folder, the Internet Archive, and two flavors of Airtable: share views harvested without an API key, and an interface page read by a headless browser. Everything downstream of discovery is identical.
The hardest boards fell to detective work
0 API keys
Airtable’s signed share-view export opened MCB5, 6, 11, and 12
40 → 3,013
MCB5 resolutions once the share view replaced the Wayback crawl
5,070 docs · ~30 s
headless Chromium reads MCB1’s interface page · zero PDF downloads
1 folder ID
MCB7’s Drive archive, back to 2000, found in its compiled React bundle
Crowd-pleaser slide: the weird finds. A Drive folder ID excavated from a React bundle, Airtable share views harvested through their own signed export endpoint (MCB5 went from 40 resolutions to 3,013), and a headless browser reading MCB1’s interface page the way the page reads itself: 5,070 documents in about 30 seconds with zero PDF downloads.
Claude is now the primary parser; regex assists and checks
1 · Regex scouts
Runs first on every document; structural hints at zero token cost.
2 · Claude parses
claude-sonnet-4-6 on every document: forced tool call, strict schema, hallucinated tallies rejected.
3 · Regex checks
Boosts missed vote tallies; takes over fully if Claude returns nothing.
→
→
Trust, but verify: a deterministic 5% sample runs both parsers every week, so format drift on any board surfaces as a diff, not as silent data corruption.
March was pure regex, which fails silently when a board changes its format. The polarity flipped since then: Claude Sonnet is now the primary parser on every document, with a forced tool call and a strict schema that mirrors the resolution model, plus a guard that rejects any vote tally not present verbatim in the source. Regex still earns its keep: it runs first to produce structural hints, boosts tallies the model missed, and is the backup when the API errors or returns nothing. The weekly 5% dual-parse sample turns silent drift into a visible diff.
The audit loop drove extraction failures to near zero
The loop per board: dump → audit → fix, every change logged in a running scorecard.
This is where most of the real hours went. MCB3 trained us on one dialect of the resolution format; the other boards each speak their own. The loop that worked: dump the board, audit the output, fix the parser, repeat. The metrics here come from the scorecard ledger: resolutions with zero text chunks fell from 85% to 1% on MCB4 and from 52% to 0% on MCB7 after the chunking change, and a heuristic fix restored all 297 MCB5 titles that had been blanked. Residual pollution on the Airtable boards is at or under one row per board.
Every resolution now carries text, votes, a summary, and an embedding
One resolution record
Verbatim text
every clause, with its source document and parser version
Structured vote
yes · no · abstain · outcome, parsed even from prose tallies
Three-part summary
title · context · action, written by Claude Haiku
Embeddings
text-embedding-3-large, 3,072 dims, on every chunk
A reader can trust the gist and still check the source.
The record itself got richer. Where March gave us a title, clauses, and a vote, each resolution now keeps its verbatim source text with provenance, a structured three-part summary written by claude-haiku-4-5 in exactly the shape the Block Party site displays, full vote breakdowns, and 3,072-dimension embeddings on every chunk for semantic search.
The plumbing runs itself and reruns safely
GitHub Actions
Sunday delta cron
idempotent upserts
dry-run rehearsal
resolution-engine
content-addressed PDF cache
audit + report commands
regression checks between runs
Supabase
Postgres + pgvector
3 tables · numbered migrations
stable UUIDs, links never break
→
→
Battle scars included: nyc.gov blocking bot user-agents, token-limit truncation on 19-resolution meetings, streaming requirements on long extractions. Every bug the cron surfaced is now a regression test.
None of this is glamorous, and all of it is the difference between a demo and a system. Supabase with pgvector is the single source of truth, schema changes are migrations, UUIDs survive re-runs so nothing downstream breaks, and GitHub Actions runs each board’s backfill with idempotent upserts while a Sunday cron picks up deltas. One honest operational note for the speaker: the July backfill exhausted the free Actions minutes, so cron runs resume when the monthly quota resets. The bugs the cron surfaced are all regression tests now.
Eleven boards now hold 34,096 resolutions
34,096
resolutions
161,577
text chunks
100%
of chunks embedded
1984
earliest record (MCB6)
March was one board and 6,511 resolutions. July is 5.2× that.
*MCB11 includes duplicate pre-cleanup copies queued for reprocessing. Live Supabase counts, July 24, 2026.
The headline numbers, queried live from Supabase on July 24: eleven boards, 34,096 resolutions, 161,577 text chunks, every chunk embedded. MCB4’s letter archive reaches back to 1997 and MCB6’s Airtable reaches 1984. One caveat on the chart: MCB11’s bar includes duplicate pre-cleanup copies queued for reprocessing, so its distinct count is lower. The corpus is 5.2× the March count.
Eleven of twelve boards are live; MCB9 waits on OCR
MCB1
✓ live in Supabase
MCB2
✓ live in Supabase
MCB3
✓ live in Supabase
MCB4
✓ live in Supabase
MCB5
✓ live in Supabase
MCB6
✓ live in Supabase
MCB7
✓ live in Supabase
MCB8
✓ live in Supabase
MCB9
scanned PDFs · needs OCR
MCB10
✓ live in Supabase
MCB11
✓ live in Supabase
MCB12
✓ live in Supabase
82 of 83 MCB9 PDFs are scanned images with no text layer; OCR is the unlock, not a looser parse.
The full honest picture. Eleven boards are live in Supabase with embeddings and Haiku summaries; the Airtable harvest cleared every gated board without an API token. MCB9 posts its minutes as scanned images, 82 of 83 PDFs with no text layer, so it waits on an OCR stage rather than getting a worse parse. The project rule stands: no backfilled numbers, a blank beats a guess.
The failure mode of civic data pipelines is silence
The web decays.
Four URL eras on one board, a React rebuild, Cloudflare walls, dead domains.
Green doesn’t mean done.
One passing run discarded every embedding it paid for; verification now counts actual rows.
Heuristics eat real data.
A signature pattern blanked 297 MCB5 titles; curated titles are never overridden now.
Regex fails silently on OCR text.
No word boundary exists in “InFavor0Opposed”; every pattern change is re-measured against the corpus.
If you take one meta-lesson from this section: the failure mode of civic data pipelines is silence. A green run that discarded every embedding, a trimmer that halved documents, a heuristic that blanked 297 real titles, a regex that matched nothing: none of them threw an error. What works is verification that counts actual rows and an audit loop that re-measures every change against the corpus.
The arc runs from one board toward all 59
Nearest ship: semantic search across boards on blockparty.studio. The vector search index migration is written and queued.
The March deck asked whether the pipeline could generalize. It did: the backfill finished on July 18 and every live board is on the weekly delta cron. The near-term list is concrete: OCR MCB9, then ship cross-board semantic search on blockparty.studio; the HNSW vector index migration is committed and queued to apply. The adapter architecture was always aimed at 59 boards; Manhattan was the proving ground.
Join the Party! There are More Questions to Explore
49 / 49
?
A Tool for Civic Inquiry
What happens next. Did the agency comply? Did the developer get approved?
?
Extend to all 59 Community Boards
How might we generalize the pipeline? Each board formats their minutes differently.
?
Connect to the Committee Layer
Real deliberation happens in committees — can we connect conversation context to resolutions?
?
More Accessible
How might we improve how the key information can be extracted, summarized, digested?
Read more @ NYCuriosity. Join @ Committee Meeting. Subscribe @ Block Party.
Please share your thoughts/feedback/ideas with us!
Please look through it and give us ideas, and Sign up for email - subscribe Read Tal’s substack! He writes about newsletters about Community Boards Go to a committee meeting!