Building Deedbox, a Logbook for Your Home

Every house comes with a pile of paperwork that nobody tells you to keep. There's the closing statement, the invoice for the new roof, the water heater's warranty, the property tax bill with two due dates you'll forget, and a vague feeling that the furnace filter was changed "a while ago". When you finally sell, someone asks what you spent on improvements, and you go digging through email for a receipt from six years ago.

I wanted one place for all of it, so I built one. It's called Deedbox, and it's live now.

The Deedbox dashboard

What Deedbox does

Deedbox is a logbook for independent homeowners. You set it up in a few minutes and keep it for as long as you own the place.

  • Maintenance schedules. Recurring jobs run on the calendar or on usage, so the furnace filter comes due after 300 hours of running instead of on a guess. Each completion records who did it, which vendor, and what it cost.
  • Projects and invoices. Group a remodel's invoices together and keep the receipts attached.
  • Cost basis. Tag each expense as an improvement, a repair or a closing cost, and Deedbox keeps your adjusted basis by the rules in IRS Publication 523. You can try a sale price against the $250,000 / $500,000 home-sale exclusion and bring real numbers to your CPA.
  • Property tax. Installments, due dates, delinquency dates and what you paid, year after year, with unpaid ones in your Monday email.
  • Value and equity. A value estimate every month, loan balances amortized from their terms (no bank connection needed), and your own appraisals beside the estimates.
  • Documents. Deeds, warranties and permits stored privately and opened through links that expire.
  • Shared with your household. Invite a partner or co-owner so everyone sees the same logbook.

Adjusted cost basis in Deedbox

How it's built

Deedbox is Laravel 13 on PHP 8.5, with Inertia, Vue 3, TypeScript and Tailwind 4 on the front end, using Nuxt UI components in plain Vue mode. MySQL and Redis sit underneath, with Horizon running the queues. A few decisions shaped most of the code.

The household is the tenant

Every record belongs to a household, not a user, because a house is usually shared. Each model uses a BelongsToHousehold trait that scopes every query to the current household and refuses to create a record for any other. Route model binding runs after the household is set, so asking for someone else's record is a plain 404, never a leak. An architecture test fails the build if a new model forgets the trait.

Money is integers, and basis is never stored

All money is stored as integer cents and parsed from what you type with string math, so no float ever touches a dollar. Adjusted basis isn't a column anywhere. It's computed from your expenses each time, so retiring an improvement (say, the old roof when the new one goes on) or adding a rebate is reflected immediately and can't drift out of sync.

Value estimates that don't cost a fortune

Property data from a commercial provider is billed per call, which doesn't fit a free plan. So alongside RentCast, Deedbox has its own price-trend estimator built on the FHFA's public house price index: your purchase price (or your latest appraisal) scaled by how prices in your ZIP code and state have moved since. It's labelled clearly as a trend estimate rather than an appraisal, and it costs nothing to run. Plus households get RentCast's records, assessed values and estimates first, with FHFA filling in behind them.

Your home calls out, never in

The Home Assistant integration was the part I most wanted for my own house. Deedbox generates the YAML for you: REST sensors for overdue tasks, the next property tax payment and how far along each usage-based task is, plus a rest_command to post usage like furnace run hours. Home Assistant reaches out to Deedbox with a household token; Deedbox never reaches into your network.

Usage-based maintenance tasks

There's also a calendar feed on every plan, so what's due shows up in the calendar you already use. An Actual Budget bridge is next.

Privacy by default

Error reports carry the household's public id and the signed-in user, and nothing else: no IPs, cookies, query strings or request bodies. Analytics go to a self-hosted Plausible instance and only ever see the route pattern, like /properties/:property/tax, never the real URL.

Deploys nobody notices

Deedbox runs on Coolify from an image that GitHub Actions builds after the tests pass. The web container rolls over only once the new one passes its health check, migrations run before it serves anything, and the queue workers wait until the schema is current before starting. Every migration has to work with the code before it as well as after, so a deploy never takes the site down.

Try it

Deedbox is free for one home, with price-trend value estimates, the calendar feed and 100 MB of documents. Plus adds up to five homes, 5 GB of documents, public records and assessed values, the Home Assistant integration, read-only members and a cost basis report for your CPA with every receipt attached.

If you own a home and your paperwork lives in a kitchen drawer and three inboxes, give it a try: create your logbook. I'd love to hear what you think.