Building an Advocacy Site for the Ulster County Fair Taxes Act
How we built UCFairTax.com — from a password-gated collaborator preview to an interactive tax calculator and income visualization designed to make a policy argument, not just present data.
When the Ulster County Fair Taxes Act (S.10532/A.11460) was introduced in May 2026, the sponsors needed a way to explain a genuinely complex policy to a general audience — quickly, and without misrepresenting the numbers.
The core challenge: the surcharge is described in the legislation as 16.75% of a state income tax calculation. That's precise and legally defensible, but it lands badly with a constituent who reads "16.75%" and assumes that's the rate on their income. The real effective rate on total income is 0.12% to 0.92% for nearly all affected filers. Getting from "16.75% of a tax calculation" to "less than 1% of your income" requires either trust or a calculator.
We built the calculator.
Starting private
The site launched password-protected. Before going public, the sponsors — including the County Executive and the bill's legislative sponsors — needed to review the content, verify the tax math, and suggest edits. A full authentication system would have been overkill. We implemented a simple middleware-based password gate in Next.js: a cookie set by a /unlock page, checked on every request, with the SITE_PASSWORD environment variable controlling access. Unset the variable and the gate disappears. No code changes needed for the public launch.
This pattern — lightweight gates via environment-controlled middleware — is one we use whenever a site needs review before going live but doesn't warrant user accounts.
The calculator
The interactive calculator lets a visitor enter their NYS taxable income, select their filing status, and immediately see three numbers: their state income tax, the Fair Taxes Act surcharge, and their after-tax income. The results are shown both as dollar amounts and as a pie chart.
The pie chart was a deliberate choice. Dollar amounts are concrete but hard to compare intuitively. A pie chart showing a thin amber sliver labeled "Surcharge" against a large blue "After-Tax Income" segment communicates in a way the numbers alone don't. The chart is built with pure SVG — no charting library — because the requirements were simple enough that a dependency wasn't worth it, and because a library would have added a full render cycle before the chart appeared.
The income tables and the chart that didn't show state taxes
The income tables page shows pre-computed surcharge amounts for a range of incomes, with a stacked area chart above the table. An early version of that chart showed three bands: after-tax income, state income tax, and the surcharge. The problem was that the state income tax band — which is many times larger than the surcharge — dominated the chart. Visitors noticed the large amber band and asked about that, not about the thin strip at the bottom.
The fix was simple: remove the state income tax from the chart entirely. The chart now shows two areas — taxable income and the surcharge. The surcharge is visually obvious as a narrow band at the bottom of a large income block. That's the argument the chart needs to make. The state income tax appears in the table below for reference, but it doesn't compete with the chart's visual message.
The chart also has a user-adjustable upper bound. The full income range runs to $5M, but at that scale the lower-income portion of the chart is compressed into noise. The default upper bound is $500K for single filers and $1M for joint filers — enough to cover the majority of affected filers — with a simple input that lets visitors explore higher ranges. When the filing status tab changes, the upper bound resets to its filing-appropriate default.
Tax math as a constraint, not a feature
The biggest risk on a project like this is getting the numbers wrong. The legislation's surcharge formula is specific: 16.75% of the difference between the NYS income tax on total income and the NYS income tax computed as if income stopped at the threshold. That requires implementing the full 2026 NYS IT-201 bracket schedule, not an approximation.
We built the tax calculation as an isolated module (lib/taxCalc.ts) with a single exported function — testable, auditable, separate from any UI. The CLAUDE.md for the project includes explicit accuracy rules: what language to avoid, what numbers to never round up, and what effective rates apply to which income levels. The site reflects those constraints in its copy as well as its calculations.
The 2026 legislative session ended without the bills coming to a vote. They'll be re-introduced in 2027. The site will stay live through that cycle — consensus-building material for the county legislature and public-education resource for the re-introduction push.
UCFairTax.com is live at ucfairtax.com. Interested in a similar project? Get in touch.