Corridor PM Dashboard
The weekly property meeting in one place: leasing, make-ready, capital projects, delinquency and the owner call.

Why I built it
Our weekly property-management meeting covered capital plans, delinquency, vacancies, unit pricing and make-ready status, and every one of those lived in a different spreadsheet kept by a different person. The first twenty minutes of every meeting went to figuring out whose numbers were right. I built this so the meeting could start with the numbers instead of an argument about them.
What it does
- Each property's weekly numbers in one place: occupancy, pre-leasing, delinquency, collections, and units at risk of sitting vacant.
- A weekly report per property: leasing funnel, expirations and renewals, days vacant and estimated lost rent, delinquency, market rent schedule, and a running commentary log.
- The weekly owner call runs from a fixed agenda, and each call snapshots the key numbers so week-over-week comparisons are fair.
- Meeting notes come in from Granola and their next steps become tracked tasks. The tool proposes which are new, already open or done, and a person confirms.
- Claude reads meeting notes to suggest capital projects, and reads contractor bid sheets (PDF or Excel) into comparison tables.
- Capital projects tracked by property: budget vs. spend, percent complete, dated notes, photos and competing bids, checked against the general ledger.
- A 14-step make-ready board from move-out inspection to move-in, plus per-unit inventory.
- Market comps from the weekly rent survey, with week-over-week moves in rents, concessions and fees.
- A shared calendar, a searchable library of SOPs and manuals, and access by role: admins see the portfolio, property managers see their own properties.
How it works
A FastAPI backend over Postgres owns the data. There are more than forty Alembic migrations in the repo, and nearly every one is a meeting where somebody asked for one more thing. The frontend is Next.js, one set of tabs per property.
AppFolio is pulled read-only across thirteen reports, with manual uploads as a backup. When we took over properties from a prior manager, their MRI exports, the owner's Google Sheet and some old tracker workbooks all imported into the same tables. A property onboarded mid-year looks like every other property.
Granola meeting notes sync every thirty minutes and the calendar feeds every fifteen. Migrations run on deploy.
Calls I made
Every screen says where its data came from
If a property's numbers still come from the prior manager's export, there's a banner saying so with the as-of date. I didn't want anyone reading last month's file as this week's numbers.
Claude suggests, somebody confirms
Task updates pulled from meeting notes and suggested capital projects sit as drafts until a person accepts them. Nothing changes on its own.
Imports are safe to run twice
Every importer defaults to a dry run. Onboarding a property is a step I can repeat, not a cleanup I have to get right the first time.