How it works
About
I built Milwaukee Budget Decoder to make the city’s budget easier to get into and understand. Each year the budget arrives as two long PDFs, hundreds of pages of tables and numbers, and it’s overwhelming even for people who want to follow along.
I’ve lived in Milwaukee for more than 19 years and have worked at Radio Milwaukee that whole time; today I’m its Director of Digital Strategy and Innovation. This is a personal project, not a Radio Milwaukee product. For the past two years I’ve been learning to build products with AI, through more than 20 hackathons and several launched projects, and this site follows the rule I care most about: AI helps explain, but every number comes from the budget documents and links to its page.
It’s for anyone who wants to be engaged with what Milwaukee is doing. If you spot a mistake, tell me on LinkedIn.
Everything here describes a proposal. The Common Council reviews and amends the budget before adopting it in November, so the numbers can still change. The site explains what the documents say; it doesn’t argue for or against any spending choice.
How the numbers are checked
Every figure comes from two documents the city published: the Proposed Plan and Executive Budget Summary (224 pages) and the Proposed Detailed Budget (455 pages). A program reads their tables into a database, and each row keeps its address in the documents: which book, which PDF page, which printed page and, for line items, which line.
Twenty key figures, such as the all-funds total, the tax rate and the Police budget, were read by hand from the documents. Every change to the site is checked against them, and against the documents’ own totals (departments add up to their section, sections add up to the budget). If any check fails, the change can’t go live.
Plain-language definitions and background facts were written from the documents and reviewed by a person before publishing. Where the documents disagree with themselves, the site shows the printed figure and says so in a note.
The chat works on the same rule. The AI model picks which lookup to run and writes the sentences around the result; the figures come from the database with their pages, never from the model. It can still word things poorly, so check any figure you plan to use against its source page. The code is public on GitHub.
How the budget PDFs become cited answers:
- The city’s two budget PDFs are the only source.
- A Python program reads their pages once, splitting them into figures (tables and line items) and narrative text.
- The figures are loaded into the database, each with its page. The number checks above test them against the documents’ own totals, and if any check fails, nothing new goes live.
- The narrative text is cut into passages and indexed so it can be searched by meaning and by keyword, each passage keeping its page.
- Pages and the chat read exact figures from the database tables, and background from the passage search.
How the chat answers a question:
- You type a question in the chat panel.
- The site checks it first: questions are limited to 500 characters, and there are limits per visitor and per day to keep costs down.
- The AI model (Anthropic’s Claude) reads the question and picks from 16 read-only lookups, such as department totals, fees or a text search.
- The lookups return figures from the database with their pages. The model writes the sentences around them.
- The answer shows the figures as tables with source links. Each step is logged privately so wrong answers can be found and fixed.
The same two paths as diagrams (best on a larger screen): the budget data and the chat.
How well the chat answers
The chat is tested on 66 questions residents and journalists ask, including 5 follow-ups asked partway through a conversation. Where a question has a known answer, the figures are checked against ones read from the documents by hand, and every answer is checked against rules such as staying neutral. A computer check also flags any dollar amount or percentage that didn’t come from a lookup.
| Outcome | Answers | Share |
|---|---|---|
| CorrectRight figures and points, and it followed the rules | 55 | 83% |
| IncompleteMissed a figure or point, or broke a rule such as taking a side | 6 | 9% |
| Unsourced figureStated a number no lookup returned, even when the arithmetic was right | 4 | 6% |
| Couldn’t answerSaid it couldn’t find what was asked | 1 | 2% |
For comparison, researchers testing a chatbot for the Lexington, Massachusetts town budget reported 78% correct (GRASP, 2025). Their questions were different, so read that as a rough guide, not a ranking. The test questions are public.
How we calculate your receipt
Your City Receipt estimates what the city charges one property, under the 2026 budget and under the Mayor’s proposal for 2027.
- We find the property in the city’s Master Property File (MPROP), the public list of every parcel and its assessed value.
- City property tax: the 2026 assessment times the proposed 2027 rate, divided by 1,000. The 2026 figure uses the 2025 assessment and the 2026 rate.
- Where it goes: the same assessment times each part of the rate (city operations, debt, pensions and so on). Only this split is exact; property tax isn’t set aside for individual departments.
- City charges: the garbage fee for each home (when the city collects garbage there), snow and ice and street lighting by the foot of street frontage, and the average household sewer and stormwater charge.
- Renters see the building’s total divided by its number of homes. The owner pays it; the budget doesn’t show how much of it reaches rent, so the receipt doesn’t guess.
| Item | 2026 | 2027 proposed |
|---|---|---|
| City property tax rate1per $1,000 of assessed value | $7.61 | $7.29 |
| …for City operations (General City Purposes)1per $1,000 | $3.33 | $3.05 |
| …for City debt1per $1,000 | $2.41 | $2.31 |
| …for Pensions (employee retirement)1per $1,000 | $1.74 | $1.80 |
| …for Contingent fund1per $1,000 | $0.11 | $0.11 |
| …for Capital improvements1per $1,000 | $0.02 | $0.02 |
| Solid waste (garbage) fee2per home a year | $271.80 | $280.00 |
| Extra garbage cart2per cart a year | $81.24 | $83.68 |
| Snow and ice2per foot of street frontage | $1.19 | $1.23 |
| Street lighting2per foot of street frontage | $1.12 | $1.16 |
| Sewer and stormwater3average home a year. The 2026 amount is worked out from the budget’s stated change, not printed directly. | $241.88 | $247.02 |
Why debt and pensions look bigger on the Overview
The Overview shows what each budget section costs in total. The receipt shows only the part paid by the city property tax. City debt costs $326.6 million in the 2027 proposal, and $109.1 million of it comes from the property tax1; other money pays the rest. Pensions cost $273.4 million, of which $84.7 million comes from the property tax and $159.4 million from the city’s sales tax4. That’s why the debt total can rise while the debt part of your tax rate falls: most of the increase is paid by other money, and the rate is the levy divided by the city’s total assessed value, which grew.
What the receipt assumes
- 40 feet of street frontage, the typical property the budget itself uses, because the property file has no frontage.
- City garbage service for homes with one to four units; larger buildings usually hire private haulers.
- One garbage cart, and an average household’s sewer and stormwater charge (actual charges depend on water use).
- Condo buildings list no unit numbers in the property file, so condo owners type in their unit’s assessed value.
What it leaves out
Only the city’s part of a property tax bill. Milwaukee Public Schools, Milwaukee County, the Metropolitan Sewerage District (MMSD) and Milwaukee Area Technical College (MATC) set their own taxes, and state credits reduce the bill. Tax-exempt and state-assessed properties get no estimate.
Privacy
The addresses you type aren’t stored or logged. Owner names and mailing addresses from the property file are never loaded. The shareable receipt image leaves out the address and the assessed value.
Sources
4 pages of the City of Milwaukee’s 2027 proposed budget documents. Tap any blue number on this page to open the page it comes from.
Show all 4 sources
Budget Summary
- 1.p. 7 (PDF 17)Used for the tax rate, the rate split, the rate split
and 4 more
, the rate split, the rate split, the rate split and section totals and levies. - 2.p. 159 (PDF 169)Used for city fees, city fees, city fees
and 1 more
and city fees. - 3.p. 203 (PDF 213)Used for the sewer charge.
- 4.p. 163 (PDF 173)Used for the sales tax for pensions.