← All apps
🏃

running-app

Personal half marathon training tracker + AI coach for AthHalf 2026

README

# AthHalf Training App

Personal half marathon training tracker for **AthHalf — Athens GA, October 11, 2026**.
24-week plan, AI coach powered by Claude, installs to iPhone home screen as a PWA.

> **Single user.** This app is just for me. The plan dates and goal times are
> baked in. Fork at your own risk; nothing here generalizes.

## Stack

- Vite + React 19 + TypeScript
- React Router v7
- Tailwind CSS v3
- Zustand (state)
- Supabase (Postgres + magic-link auth + Edge Function)
- Anthropic API (Sonnet 4.6 with prompt caching), proxied via Edge Function
- Render Static Site (hosting)
- vite-plugin-pwa (Add to Home Screen on iOS Safari)

## Local development

```bash
# 1. Install
npm install

# 2. Copy env template, fill in Supabase URL + anon key from the
#    `ken-personal` Supabase project (Settings → API)
cp .env.example .env

# 3. Run
npm run dev
```

Then run `supabase/migrations/20260429_init.sql` in the Supabase SQL editor
once. It creates tables, enables RLS, and installs a trigger that auto-creates
a `settings` row on signup.

## Edge Function

The coach is a Supabase Edge Function (`supabase/functions/coach`). Deploy
with the Supabase CLI:

```bash
supabase functions deploy coach
supabase secrets set ANTHROPIC_API_KEY=sk-ant-...
# optional: pin a different model
supabase secrets set COACH_MODEL=claude-sonnet-4-6
```

## Tests

```bash
npm test          # vitest watch
npm run test:run  # one shot
```

## Build + deploy

```bash
npm run build     # → dist/
```

Render Static Site is configured for `npm install && npm run build` with
publish dir `dist`. Set `VITE_SUPABASE_URL` and `VITE_SUPABASE_ANON_KEY` in
the Render dashboard so they're baked into the bundle at build time.

## Project files

- `SPEC.md` — original build spec (read-only reference)
- `CLAUDE.md` — project rules + tech stack (this is what Claude Code reads)
- `MEMORY.md` — accumulated context, decisions, gotchas
- `STATUS.md` — what's shipped, what's next, blockers (update before every push

…(truncated for upload size)

STATUS

No STATUS.

DECISIONS

No DECISIONS.

MEMORY

No MEMORY.

CLAUDE.md

No CLAUDE.md.

Diary mentions

No recent diary mentions.