Inspiration

What it does

How we built it

Challenges we ran into

Accomplishments that we're proud of

Inspiration

A lot of Canadian homeowners are renewing mortgages they signed when rates were much lower. The renewal letter gives you one rate and a signature line. It does not tell you what a lower rate is worth over the term, whether you could move to another lender without passing the stress test again, or what breaking early would cost. I wanted a tool that starts from the letter you actually got and gives you answers you can check.

What it does

Reads a text based renewal letter PDF and pulls out the balance, rate, amortization and term, with the page each field came from. Compares your offer against other offers on the same time horizon and shows payment, interest and the balance left at the end. Checks whether you might qualify for a straight switch at renewal under the rules in force since late 2024 (OSFI from November 21, 2024; Finance Canada insured switches from December 16, 2024). It never says approved. Estimates the cost of breaking your mortgage using each lender's own method. Pulls live Bank of Canada data and each lender's own posted rates, and marks a rate as unverified instead of guessing. Writes a call script, a dated action plan and a PDF report with sources.

Example with the illustrative sample letter (not a real offer): $480,000 left over 19 years, a 5.49% offer works out to $3,378.66 a month. At 4.49% it is $3,122.52.

How I built it

Python and FastAPI on the back end, plain HTML, CSS and JavaScript on the front end, SQLite through SQLAlchemy, PyMuPDF to read PDFs and ReportLab to write them. The mortgage maths uses Decimal and Canadian semi annual compounding. Rates come from the Bank of Canada Valet API and lenders' own rate pages and feeds, with five years of history rebuilt from the Internet Archive, Common Crawl and Arquivo.pt. 1561 Python tests and 270 Node tests pass.

Challenges

Lenders do not calculate penalties the same way, so I reproduced each one from its own published calculator instead of using a textbook formula. Some bank sites refuse automated readers; when that happens the app labels a manual reading instead of working around the block. The switching rules have conditions (insured or not, federally regulated lender or not, no cash out, same amortization, up to $3,000 for costs), which took more tests than the payment maths.

Accomplishments

Every number traces back to the letter, with its page, or to a public source with a link. Penalties for RBC, Desjardins, Tangerine, Simplii, ATB, Haventree, Laurentian, Equitable and Bridgewater were reproduced from those lenders' own calculators during Build Week (commit messages: RBC 34 recorded cases within $0.30; Desjardins, Tangerine and Simplii 3000 of 3000 each). The app works with no API keys.

What I learned

That the hard part of mortgage maths is not the formula but matching each lender's own method, and that showing where every number came from matters more than adding features.

What's next

Sign in and saved cases so it can safely hold real customer data, and penalty methods for more lenders.

What we learned

What's next for Renewal Radar

Prior work and AI tools

I started Renewal Radar before Build Week. Everything up to commit 3d95a4f (October 16, 2026, 11:47 AM ET, before the noon kickoff) existed before Build Week: 69 commits on October 12, 23 on October 15 and 4 early on October 16, covering the mortgage maths, switching rules, PDF field extraction, the Bank of Canada feed, the TD penalty engine, reports, saved cases and tests.

Built during Build Week (October 16 to 25, 2026), commits 7f4381e through f5efc9c:

  • A daily rate recorder with retries, a second source, self repair and a watchdog, plus lenders' own rate sources for DUCA, Steinbach, Coast Capital and 13 smaller lenders (Oct 16 to 18).
  • Penalties reproduced from each lender's own calculator for RBC, Desjardins, Tangerine, Simplii, ATB, Haventree, Laurentian, Equitable and Bridgewater (Oct 18).
  • Labelled manual readings for sites that block automated readers (Oct 17).
  • Fixes for dead source links and the run instructions, and the sample letter moved to a made up lender (Oct 22), and the public README, screenshots and a Pillow security update (Oct 24). No templates or starter kits were used. I wrote the code with help from AI coding assistants (Claude, ChatGPT and GitHub Copilot), and I reviewed and tested the changes.

Built With

Share this project:

Updates

Submission history