- JavaScript 87.4%
- CSS 6.2%
- HTML 5.9%
- Shell 0.5%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
All checks were successful
image / build (push) Successful in 16s
Thirty line items by thirty years is a 2,500px table. On the page it showed roughly thirteen rows and ten columns; the rest was scrolling in two directions at once. Maximize expands controls and table together to the viewport, with the tighter cell padding that mode can afford. Compact figures round to two units — $1.09M against $1,092,901, a third the width — which is the only lever that fits more years on screen without hiding a row or a year. The CSV stays at full monthly precision regardless. Together: 26 rows and 22 of 34 columns visible at 1440x900, against 13 and 10 before. Not everything — thirty years by thirty rows does not fit a laptop screen at a readable size, and claiming otherwise would mean shrinking it past the point of being worth reading. Line item and Total stay pinned, so scrolling the rest never loses the row you are on. The controls hint is allowed to shrink: at full width it claimed its own flex line and pushed the maximize button onto a second row, costing a row of table in the mode that exists to show more rows. |
||
| .forgejo/workflows | ||
| circumstances | ||
| content | ||
| engine | ||
| jurisdictions | ||
| persist | ||
| reference | ||
| test | ||
| tools | ||
| ui | ||
| .gitignore | ||
| build.sh | ||
| Chicago Property Development.pdf | ||
| CLAUDE.md | ||
| DEPLOY.md | ||
| financial_model_spec.md | ||
| flow.html | ||
| guide.html | ||
| index.html | ||
| jurisdiction.json | ||
| LICENSE | ||
| package.json | ||
| README.md | ||
| schedule.html | ||
| STACK.md | ||
Renew
0.0.1 beta · AGPL-3.0-or-later
A feasibility screener for adaptive reuse — converting vacant or underused buildings into mixed-income housing with retail, work, and community space.
Enter a building and it returns a verdict: what it costs, what funds it, what the gap is, whether the debt covers, and what would block it. The whole model runs in your browser. Nothing you type is sent anywhere.
This is a screening estimate, not underwriting. It is a first-pass filter for whether a building is worth investigating further — not a pro forma, not a credit application, and not advice.
Scope
Subsidy is modelled as a list of programs, not a mode. An empty list is an ordinary market-rate deal running the identical cost, income, debt, and return machinery. Low-Income Housing Tax Credits (IRC §42) and the federal historic rehabilitation credit (IRC §47) are two programs it knows about, and they stack. Others can be added without touching the rest of the model.
That is the point of the name: the tool is about bringing buildings back, whatever combination of capital gets it done.
Running it
No dependencies, no build step, no install.
npm test # the model, the statute, and the published figures
npm run smoke # builds, then renders every page in headless Chrome
./build.sh # assemble the publishable site into dist/
npm run smoke needs google-chrome on PATH. It checks the rendered page
rather than the arithmetic: console errors, failed requests, horizontal
overflow, whether the app booted at all, and whether any control is too small
to operate — at desktop, tablet and phone widths. It exists because three
inputs once laid out at zero pixels wide while every unit test then in the
suite passed. Add --keep to write screenshots to dist-smoke/.
To preview locally:
./build.sh && (cd dist && python3 -m http.server 8531)
Layout
| Path | What it is |
|---|---|
engine/ |
The model. Pure functions, no DOM, no I/O — shared by every interface. |
ui/, persist/, index.html |
The public screener. |
jurisdictions/ |
Everything location-specific, one directory per place. Copy TEMPLATE to run your own city — see jurisdictions/README.md. |
test/ |
Golden-file tests against hand-checked figures. |
financial_model_spec.md |
The specification the engine implements, with its corrections recorded. |
STACK.md, DEPLOY.md, CLAUDE.md |
Architecture decisions, deployment contract, working notes. |
How this was built
Most of the code in this repository was written by an AI agent (Claude), working from
financial_model_spec.md under human direction and review. That is stated plainly here
because it bears on how the repository should be read.
- The specification came first, and it is human-owned. The engine implements a written spec. Where the spec turned out to be wrong, the correction is recorded in the spec rather than patched silently into the code, so the two cannot quietly diverge.
- The arithmetic is checked against published figures, not against itself. The rent derivation reproduces the Illinois allocating agency's own published tables 84 out of 84. The golden-file tests exist because the failure mode that matters in a model with hard regulatory gates is a plausible-looking wrong number, which no amount of code review catches on its own.
- A person maintains it and answers for it. Scope, correctness and publication are human decisions. The agent does not decide what is true or what ships.
That is a different thing from bulk-generating code and publishing the output unreviewed. Judge it on the spec and the tests, which is the same standard any feasibility model should be held to.
Licence
GNU Affero General Public License v3.0 or later.
The Affero clause is the point. If you run a modified instance for your own city — which you are encouraged to do — the people using it are entitled to the source that produced their numbers. A feasibility tool whose arithmetic cannot be inspected is a tool asking to be trusted rather than checked, and this one is meant to be checked.
Status
Beta. The engine is tested, and its rent derivation reproduces the Illinois allocating agency's own published figures — every county schedule, income band, and bedroom count IHDA publishes, 15,540 figures in all. It has not been checked against a completed transaction. Do not rely on it for a decision that costs money.