Portfolio · Shipped and running
Hobby Loans
A ledger for money lent between people who'd rather not argue about it.
- Status
- Live
- Started
- 2026-03
- Visit
- hobbyloans.cc ↗

Written by Hollis from the project's own notes.
What it is
Money lent within a family usually lives in a spreadsheet or in someone's memory. Hobby Loans is a ledger that both sides can see and neither side can rewrite alone.
- Double opt-in. A loan starts as pending and becomes real only when the other person accepts it. Nobody can create a debt that binds someone else without their explicit yes.
- Revolving ledgers, credit-card style: charges and payments, a grace period, and interest accrued daily and posted monthly. An interest-free setting covers loans where the lender charges what a grandmother would.
- Editors. A loan's owner can give other people full entry rights, and every transaction records who entered it.
- Recurring charges post themselves on their day of the month.
- Shared assets. Several people can co-own an appreciating asset, with fixed shares, contributions tracked over time, and buyout figures on a valuation. Nothing that changes the shares binds anyone until every member agrees.
- Import. An existing ledger can be brought in from a CSV file, with a step for mapping its columns.
How it works
Every loan is a single signed ledger. Charges are positive and payments negative, and the balance is always the sum of the history. Recent entries stay editable for a short window and then lock, so the record becomes permanent.
The interest engine runs nightly. It keeps a fractional-cent accumulator, so sub-cent interest builds up instead of being rounded away each day, and posts it as a single line at the end of the month. The engine is idempotent and self-healing: it records every day it has processed, so a second run changes nothing and a missed night is caught up on the next run.
Mortgage maths for shared assets follows the Canadian convention of interest compounded semi-annually.
Built with
- Application: a hand-built PHP MVC framework, served by nginx with HTTPS.
- Database: PostgreSQL, with money stored as exact decimals, never floating point. Schema changes go through numbered migrations and a migration runner.
- Security: a central cross-site request forgery check on every form, hardened sessions, and authorisation checks on every loan and transaction.
- Mail: verification, invitations and statements are sent over authenticated SMTP from the product's own domain.
- Interface: a light, mobile-first design. On a phone, the ledger turns into a bank-style feed, with a running-balance chart and sortable columns on larger screens.
- Testing: dedicated harnesses, with 13 checks on the mortgage maths, 22 on the shared-asset flow and 22 on retiring an asset. Maintenance scripts run as a dry run by default and verify their own results.
Where it stands
Live at hobbyloans.cc with revolving loans, editors, recurring charges, spreadsheet import, monthly interest and shared assets. The next loan type is the installment loan: a fixed term with amortised payments.
Pictures
