What I'm
Building
Nights-and-weekends software — self-hosted, built for my own family and friends, and headed toward open source. The same engineering standards as the day job, applied to problems small enough to actually finish.
Party Invite App
Self-hosted invitations and RSVPs, with no corporate platform in the middle.
A web app for running private events end to end. Create a party with a poster, invite guests privately by passcode-protected link — or open registration to let them sign themselves up — then collect RSVPs with adult and child head counts, guest lists, and notes, all managed from an admin console.
Built security-first, because event data is personal: argon2id-hashed passcodes, signed httpOnly sessions, a CSRF token on every mutation, RSVP responses encrypted at rest, login lockout after repeated failures, and a full admin audit log. Role-based admin accounts with granular permissions. Ships as a Docker Compose stack with encrypted backups.
- Private passcode invites & open self-registration
- RSVP with adult/child counts & guest lists
- Poster upload — portrait & landscape
- Granular admin roles & permissions
- Encrypted-at-rest guest data
- Email / SMS invite sharing
Family Status Board
A shared kanban board for the whole household.
A self-hosted task board for family and personal work: shared kanban columns, recurring and scheduled tasks with rotation between family members, per-user accounts and roles, and an installable, mobile-first PWA so it lives on everyone's phone. Points, rewards, approval flows, and streaks turn chores into something the kids actually engage with.
A sibling to the party app, sharing the same conventions — cookie-session plus CSRF auth, encrypted-at-rest PII, in-code forward-only migrations, encrypted SQLite backups, and Gitea CI/CD. Tags, email notifications, and per-user themes round it out. Runs on the Bun runtime end to end.
- Shared kanban for family & personal tasks
- Recurring / scheduled tasks with rotation
- Points, rewards & approval flows
- Per-user accounts, roles & themes
- Streaks, tags & email notifications
- Installable mobile-first PWA
Family Music Recaps
Turning weekly lesson notes into real practice material.
Live and in use at home. A single-family app that turns a kid's weekly music-lesson notes into AI-generated practice exercises, complete with real notation, guitar tab, chord diagrams, and audio playback (all via abcjs), across violin, piano, and guitar. Parents administer student profiles and lesson logs; kids log each lesson in their own words and ask for something to practise.
Claude enriches the raw notes into concept tags and kid-friendly memory aids, then writes exercises that build on lesson history instead of repeating it. Music teachers get their own read-mostly accounts by one-time invite link — they see only the students a parent assigned them, and may suggest a rewording rather than edit a child's own words. Anything a child asks that touches pain, posture or instrument setup is routed to a parent instead of answered by a model.
- Lesson logs in the kid's own words
- AI exercises with notation, tab & playback
- Multi-student, multi-instrument profiles
- Invited teacher accounts, scoped & read-mostly
- Safety triage routes to a parent, not a model
- Printable practice packets
Dairy Repro Analytics
Herd reproduction, reconstructed from the raw exports instead of a broken spreadsheet.
Reproduction analytics for a working dairy. It ingests the herd software's raw exports — every dated event, plus the whole-herd inventory going back sixteen years — reconstructs each animal's breeding history from them, and reports heat detection, conception and pregnancy rate over time and across cohorts. It replaces a quarterly workbook whose formulas had drifted: whole rows of #REF!, a quarter of #DIV/0!, and a herd pregnancy rate counting heifer pregnancies against cow-only eligibility.
The arithmetic was never the hard part — the definitions were. Every rate is computed on the 21-day estrus cycle, the actual unit of breeding opportunity, so a month and a quarter answer the same question at different resolutions. Truncated periods are clipped and labelled, recent cycles are marked provisional and refused as a headline, overlapping imports layer rather than double-count, and every figure carries the derivation run and ruleset that produced it. What the data can't support, it says so rather than quietly averaging.
- Every rate on the 21-day cycle basis
- Event replay from the raw herd exports
- Data-quality queue, held-back findings explained
- Cell-by-cell workbook reconciliation
- Per-animal file: events, services, outcomes
- Printable & CSV reports, stamped with their basis
These are personal projects, built and self-hosted on my own infrastructure. Open-source releases are planned as they stabilize.