Side project Data AI tooling

KPI tracker

Role
Solo builder
Users
Me and friends
Stack
Next.js, Supabase, Vercel, Python, GitHub Actions
Built with
Claude Code
The KPI tracker's Stats view in dark mode: six KPI cards in a grid, each with a monthly trend line and a change versus last month.
The Stats view with monthly trends. Two KPI names are changed for privacy.
Problem

I tracked my weekly goals in an Excel sheet. I love data and I love improving, but I needed the visuals, and I needed to log from my phone.

What I built

A mobile-friendly web app with weekly goals, progress bars and charts over time, plus to-dos and a calendar. Friends can sign up and get their own private space.

The extension

A daily sync that pulls my Garmin watch data into the same database, and Claude skills that let me ask about my week or my to-do list in plain language.

Designing the data model

The hard part wasn't the UI. It was that my goals don't all have the same shape, and a spreadsheet hides that. I ended up with four task types:

On top of that: weekly goals with progress bars, charts over time, to-dos with categories, calendar events and a calendar feed I can subscribe to, and Google sign-in.

Letting Claude read it

I wanted to ask "what's left on my list this week?" instead of opening the app. So I wrote a Claude skill that reads my data. It's read-only by default and filtered to my user, so friends' data never comes into it.

The Garmin sync

I wanted my watch data in the same place as my goals, so I could look at them together.

DecisionWhy
An open-source Garmin client instead of Terra or Garmin's official APIGarmin's official health API is only open to businesses.
A scheduled GitHub Actions job, daily at 7:17am ETNo server to run. The job logs every sync so I can see when one fails.
Its own database schema and a restricted database roleIf the sync's secret ever leaked, it couldn't reach anything else in the app.
Reuse saved login tokens instead of logging in on every runLogging in every day is the kind of pattern that gets an account flagged.

A second Claude skill sits on top of the synced data for analysis. The sync has been running daily since October 9, 2026.