Projects
/ project/Personal Tool

Milo Health

Offline-first health tracker I built for my cat Milo.

Status
Smaller experiment
Type
Personal Tool

Why I built it

Milo needed a better health record than scattered notes and messages.

Milo Health mobile flow: quick logs, medications, and vet summary

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.

Generated vet summary screen

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.