Why I built it
Milo needed a better health record than scattered notes and messages.

What it tracks
- Daily activities and history
- Medication schedules and doses
- Weight trends
- Blood tests, including quick entry and text-based PDF extraction
- Vet appointments and a shareable summary
The app is local-first: the data lives in the browser through IndexedDB, with separate indexed tables for activities, medications, doses, weight records, attachments, blood tests, appointments, and settings.
this.version(1).stores({
cats: "id, name, createdAt",
activities: "id, catId, type, timestamp, [catId+timestamp], [catId+type]",
medications: "id, catId, isActive, [catId+isActive]",
medicationDoses: "id, medicationId, catId, scheduledTime, status",
weightRecords: "id, catId, timestamp, [catId+timestamp]",
bloodTests: "id, catId, testDate, [catId+testDate]",
appointments: "id, catId, dateTime, status, [catId+dateTime]",
})
Useful details
- PDF.js extracts text from multi-page lab reports before an optional model pass maps aliases into a consistent set of feline blood-test values.
- Blood-test values are checked against reference ranges and grouped into readable status categories.
- The shareable vet summary is deterministic: it calculates medication adherence, flags recent missed doses, tracks weight changes, highlights out-of-range blood values, and compares the latest test with the previous one.

Thought process
The important product decision was to make it useful without a backend. Health notes for a pet are personal, small, and frequent; requiring sign-in or a server would have made the tool feel heavier than the problem.
The summary generator is intentionally deterministic. A vet summary should not invent interpretation. It should count what was logged, flag obvious patterns, and make it easy to copy/share before an appointment.
It is a small product, but a useful one.