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.
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.
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.
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.
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.
I wanted my watch data in the same place as my goals, so I could look at them together.
| Decision | Why |
|---|---|
| An open-source Garmin client instead of Terra or Garmin's official API | Garmin's official health API is only open to businesses. |
| A scheduled GitHub Actions job, daily at 7:17am ET | No server to run. The job logs every sync so I can see when one fails. |
| Its own database schema and a restricted database role | If 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 run | Logging 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.