nahom endale
Case StudiesAboutResume
Nahom Endale

© 2026 Nahom Endale, New York

Case StudiesAboutResumeGitHubLinkedIn
Nahom Endale/Case studies/Concrete Bills
Concrete Bills logo

Concrete Bills

Real-time NYC legislative tracking

Policy orgs · Early signups from the Comptroller's office & CBC

Claude · Summaries, FAQs & digests

Daily · Automated editorial crons

Auto · Posts to Bluesky & Threads

01The Challenge

+
NYC's legislative data is public but practically unreadable: hundreds of bills move through Legistar in dense legal language, scattered across committees and meetings. Residents, journalists, and advocates had no easy way to see what was actually happening, or what it meant.

02The Solution

+
Concrete Bills ingests NYC Legistar data into Supabase and makes it explorable through an Algolia-powered dashboard. A separate Node cron service on Render runs the editorial layer: it collects daily legislative actions, uses Claude to write plain-English summaries and FAQs, composes a weekly digest, indexes everything into Algolia, and auto-publishes updates to Bluesky and Threads. The Next.js app stays fast because the heavy editorial work happens on a schedule, not on request.

03Features

+

Thousands of NYC bills explorable with Algolia InstantSearch, filterable by status, committee, and sponsor.

A daily cron pulls Legistar context and uses Claude to summarize each legislative action in plain English.

For significant bills, Claude writes 3 to 5 plain-English FAQs so residents can actually understand them.

An automated composer groups bills into passed, in-committee, and introduced, then writes a narrative recap.

Browse every council member by borough and follow the committees moving each bill.

The pipeline composes and publishes daily legislative updates straight to Bluesky and Threads.

04System Architecture

+

Source

NYC Legistar API

Pipeline

Cron + Claude

Store

Supabase

Index

Algolia

Distribution

Bluesky + Threads

Delivery

Next.js App

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

Source

NYC Legistar API

Pipeline

Cron + Claude

Store

Supabase

Index

Algolia

Distribution

Bluesky + Threads

Delivery

Next.js App

05Technology Stack

+

Next.js 15 (App Router) · React · Tailwind · Zustand · Embla

Algolia InstantSearch · Supabase (Postgres) · Clerk Auth · NYC Legistar API

Claude (Haiku & Sonnet) · Node + p-limit · PDF/DOCX parsing · Algolia indexing

Bluesky (AT Protocol) · Threads API · IndexNow + RSS · PostHog

06Key Learnings

+
  1. 01Splitting editorial work into a separate cron service kept the app fast while AI summaries, FAQs, and digests generate on a schedule.
  2. 02Grounding Claude in fetched Legistar context produced accurate, plain-English summaries residents could trust.
  3. 03Algolia InstantSearch made thousands of bills explorable without building and maintaining a custom search backend.
  4. 04Auto-publishing to Bluesky and Threads turned each day's legislative activity into distribution with zero manual posting.
Visit concretebills.com ↗
Visit concretebills.com ↗
Home, with Algolia legislative search
Home, with Algolia legislative search
Explore Bills: search and filters
Explore Bills: search and filters
Bill page with AI summary and documents
Bill page with AI summary and documents
Weekly digest: an AI-written recap
Weekly digest: an AI-written recap
City Council hearing with recorded video
City Council hearing with recorded video
Ask about this bill: plain-English AI answers
Ask about this bill: plain-English AI answers
Home, with Algolia legislative searchExplore Bills: search and filtersBill page with AI summary and documentsWeekly digest: an AI-written recapCity Council hearing with recorded videoAsk about this bill: plain-English AI answers
Home, with Algolia legislative search
previous← AI Virtual Staging StudionextLive TV Streaming →