How This Is Built
Data sources, extraction method, and known limitations
Every dollar figure on this site is machine-extracted, never entered by hand. A scheduled program re-reads the
City of Fitchburg's own published documents, extracts the numbers, checks them against each other, and rebuilds
every page. This is what it does and where it can go wrong.
The explanatory text on the revenue and department pages (what each item is, where it comes from, who
controls it, and applicable tax rates) is the one part of this site that's hand-written rather than scraped —
state statute and municipal-finance structure don't change often enough to be worth automating. It's written in
plain language on purpose, since most people reading it aren't finance professionals, but the underlying legal
citations are real: each "Governing law" link points to the actual Massachusetts General Law on
malegislature.gov, verified against the statute's current text rather than assumed from memory. A line item
without a citation means it isn't set by a single specific state law (a locally-set fee, a federal grant term,
or a bookkeeping offset, for example), not that a citation was skipped. Every dollar figure alongside that text
is still pulled from the budget PDF at build time, same as everywhere else.
The italicized "compared to last year" note under every trend chart isn't hand-written, unlike the
text above it - it's a sentence generated fresh at build time from that item's own year-by-year figures,
written to read the way someone might actually say it out loud rather than like a spreadsheet footnote. The
wording (whether something "inched up," "jumped," or "stayed exactly flat") is picked automatically based on
how big the swing was, not written in advance and not random - the same figures always produce the same
sentence, and the sentence changes on its own the next time the underlying numbers do. The small note directly
under it points back to exactly which figures it was built from. That same automated check also
watches for a handful of specific patterns worth flagging - a line item showing up in the budget for the
first time, a line dropping to zero for a year before coming back, or a year that breaks a multi-year streak
of consistent increases or decreases - and adds a sentence about it when it finds one, using nothing but that
item's own figures. Deliberately absent: a bare "this has gone up most years" observation, since nominal
spending rises most years almost everywhere thanks to inflation and cost-of-living raises alone - that's noise,
not signal. What actually matters is answered by a "share of the whole" check instead: a department's share of
the total city budget, a revenue category's share of total operating revenue, a line item's share of its
category - computed for the earliest and latest years on record, and mentioned whenever that share has moved
by a percentage point or more (skipped when it hasn't, so it doesn't clutter pages where the share has stayed
put). For department spending specifically, that shift is spelled out as a change in priority - is the city
making this a bigger or smaller piece of the budget than it used to be - since that's the real question a
rising dollar figure alone can't answer. The "Add: 2 1/2%" line gets one further, purpose-built check on top
of the generic ones: Proposition 2½ caps that line at exactly 2.5% of the prior year's levy limit, so the
pipeline computes what that 2.5% should have been each year and says so whenever the city actually took less
(or, in principle, more) than the full amount.
A handful of revenue line items get a "Mayor's Corner" box: a check comparing the sitting Mayor's average for
that line against the immediately preceding Mayor's, using each fiscal year's own budget book to identify who
was Mayor at the time (every year's Mayor's Budget opens with a cover page naming them) rather than guessing
from election dates. This only runs on line items that reflect an actual annual choice the Mayor makes -
"Add: 2 1/2%" (how much of the state-allowed property tax increase to actually take) and the handful of
locally-set fee lines under Local Receipts (trash fees, licenses and permits, cemetery fees, rentals, and
general fees/charges). It's deliberately left off the local-option excise taxes (meals, rooms, marijuana),
since those rates are set once by City Council ordinance rather than chosen fresh each budget season, and off
anything state-formula-driven or driven by market/enforcement activity rather than a number the city itself
sets (fines, investment income, reimbursements).
A few pages also carry a "Backstory" box - a short, separately hand-researched note with its own named
source, distinct from both the generated trend sentence and the plain-language explanations above. These
exist only where they add real context a reader would otherwise be missing (why the hotel tax briefly hit
zero, why the meals tax has no history before FY2026) and are added sparingly, not for every line - most
pages won't have one.
Data Sources
Mayor's Budgets — the city's Archive Center, category "Mayor's Budgets",
currently FY2016 through the present. Each budget book contains a General Fund Expenditures-by-department table
and a General Fund Revenue recap covering that year plus several prior years.
Audited Financial Statements — the Office of the City Auditor's
annual audited statements, cataloged with links
back to 2010.
Retirement & OPEB reports — actuarial valuations of the pension system and retiree
health benefits liability, cataloged from the city's own archive categories.
How the Numbers Are Extracted
Fitchburg's budget books aren't spreadsheets — they're PDFs where each number is just text positioned on a page.
The pipeline opens each PDF, groups text by its position into rows and columns, and reconstructs the table the
same way a person reading it would: find the header row naming each fiscal year and column type (Actual,
Projected, Requested, Mayor), then read each department's row beneath it.
For every fiscal year, only that year's own adopted ("Mayor") column is treated as authoritative for that
year — a department's FY2022 figure always comes from the FY2022 budget book, never restated by a later one.
Validation
After extracting each department's row, the pipeline adds them up and compares the sum to the "Total
Expenditures" row printed in the same document. If they match (within rounding), the year is marked
high confidence. If they don't, the year is marked unverified
and shown with a note rather than silently published. As of today,
fiscal year(s) 2016 fall into this category.
Known Limitations
- No vendor-level checkbook. Fitchburg does not currently publish a searchable
vendor-payment checkbook the way some Massachusetts municipalities do. This site can only show the
department-level appropriations the city itself publishes.
- No payroll/salary data. The city does not publish a structured, itemized employee
earnings report. Rather than scrape third-party aggregator sites of uncertain provenance, this site omits
individual salary data until an official source is available. Tracked as a roadmap item.
- Department names shift over time. A department renamed or reorganized between budget years
(for example, "Building" becoming "Building Inspectional Services") will show a break in its trend line rather
than a continuous history, since the pipeline matches names exactly rather than guessing at renames.
- Statewide comparison data isn't wired up yet. The Commonwealth's Division of Local Services
publishes standardized peer-comparison data (debt trends, levy capacity, local receipts) for every
municipality, but as an interactive dashboard rather than a downloadable file. Automating that is on the
roadmap.
Update Schedule & Source Code
The data pipeline runs on a schedule and rebuilds this entire site automatically whenever the city publishes
something new. Every line of the pipeline, and every page you're reading, is open source:
https://github.com/nmadd57/burgbudget.