An open, auditable financial model of the Kansas STAR bond financing for the proposed Chiefs stadium in Wyandotte County, and what it means for taxpayers in Johnson and Wyandotte counties.
Live model: https://starbonds.graveissues.com/
Coverage: Kansas Reflector · Kansas Policy Institute · Field of Schemes · KC Business Journal
Under the executed STAR Bond Agreement (Project Monitor 2.0, December 22, 2025), the state finances $1.8B of a $3.0B stadium through 30-year STAR bonds repaid from incremental state sales, use, alcohol, and sports-wagering tax revenue inside the district — only growth above the base year is captured.
At default assumptions ($2.4B issued, 5.0% bond rate, 2.5% revenue growth, 1.30x coverage):
- Pledged revenue cannot cover debt service in the early years, because STAR captures only growth above a frozen base and that growth starts near zero. The unpaid interest is capitalized — added to principal, where it earns interest itself.
- Principal grows from $2.4B to about $2.6B before amortization begins. Annual debt service is then roughly $187–197M, requiring $243–257M/yr at 1.30x coverage.
- Revenue does not reach that threshold until Year 8–12, depending on which of the two use tax estimates you use and which capitalization rule. Until then the debt compounds.
- Total interest over 30 years is $2.6–3.1B — more than the amount borrowed. Under the reference model, $0.54B of principal is still outstanding at Year 30.
- Sales + use tax supplies about 88% of pledged revenue, and 96% of the growth being diverted. Alcohol and sports wagering are marginal either way.
The two ranges above are not uncertainty bands — they are two implementations that genuinely disagree. Both are documented rather than averaged.
Every input above is adjustable in the live tool and the notebooks. Full derivations and sources:
ASSUMPTIONS.md— base-year revenues, growth rates, increment method, data sourcesBOND_ASSUMPTIONS.md— bond structure, debt service math, coverage requirements, sensitivity tables
Primary documents are in data/: the executed STAR Bond Agreement, Kansas Department of Revenue sales/use tax publications and distributions, the Liquor Enforcement Tax FY25 county report, and the Kansas Lottery FY26 budget report. Each figure in the assumptions docs cites its source.
| Path | What it is |
|---|---|
star_financing_model.ipynb |
Core model: revenue increment, capitalized interest, level amortization, coverage, sensitivity grids |
star_financing_accelerated.ipynb |
The same model plus an EXCESS_PAYDOWN_PCT knob that applies revenue above required debt service to early principal reduction |
tax_bond_analysis.ipynb |
Exploratory analysis of the underlying KDOR sales and use tax series (2018–2025) that the base-year amounts are drawn from |
extract_2018_2020_data.py |
One-off ETL: pulls 2018–2020 annual totals out of the older KDOR file format and merges them into data/johnson_wyandotte_tax_consolidated.xlsx |
api/ |
Fastify/TypeScript port of the notebook model, served to the web app |
web/ |
React + Vite front end (starbonds.graveissues.com) |
infra/ |
AWS CDK stack: S3 + CloudFront + API Gateway + Lambda |
data/ |
Source documents and extracted datasets |
notes/ |
Research notes captured while building the model; not authoritative |
.github/workflows/ci.yml |
Executes both financing notebooks and builds the API and web app on every push |
CLAUDE.md |
Working notes for AI-assisted development of this repo |
The TypeScript model in api/ is the one behind the live tool; the notebooks are
the reference implementation it was ported from.
uv sync
uv run jupyter lab # open the notebooksRequires Node 18+. From the repository root:
npm install # installs the api/, web/ and infra/ workspaces
npm run dev # API on :3000, web on :5173npm run dev runs both workspaces concurrently; npm run dev:api and
npm run dev:web run them individually. The Vite dev server proxies /api to
the local API, so open http://localhost:5173.
Other useful targets:
npm run build # type-check and build api/ and web/
npm run lint -w web # eslintNo environment variables are needed for local development. See
.env.example for the optional API and deployment settings, and
infra/README.md for deploying to AWS.
This is a projection model, not a forecast. It assumes steady growth with no recessions, holds the grocery sales tax exemption permanent, and treats district boundaries as approximate. It is intended to make the financing structure legible and the assumptions arguable — if you think an input is wrong, change it and see what moves.
Built by Ian Graves, Prairie Village city councilmember and software engineer, as an independent analysis. Not affiliated with any party to the agreement. Developed with Claude as a modeling and coding collaborator; the assumptions, sources, and conclusions are mine.
MIT — see LICENSE.