A multi-user Pacific Crest Trail tracker built with Next.js, Supabase, and MapLibre. Sign up with email/password or connect your Strava account to get a live map of your PCT progress with stats, trail updates, email subscriptions for followers, and a shareable public tracker page.
Most of this app was built in a weekend with Claude Code.
| Layer | Technology |
|---|---|
| Framework | Next.js 15 |
| Language | TypeScript |
| Styling | Tailwind CSS v4 |
| Database | Supabase (Postgres + Storage) |
| Auth | Custom JWT sessions via jose — email/password or Strava OAuth |
| Map | MapLibre GL JS |
| Resend | |
| Linter/Formatter | Biome |
| Package manager | pnpm |
| Deployment | Vercel |
- Node.js 18+
- pnpm (
npm i -g pnpm) - A Supabase project
- A Strava API application (optional — for Strava sync)
- A Resend account with a verified domain (for password reset and subscriber emails)
-
Clone the repo
git clone git@github.com:NoahMLoomis/pct-tracker.git cd pct-tracker -
Install dependencies
pnpm install
-
Set up environment variables
Copy the env.example file and fill in your values:
cp .env.example .env
Variable Description SUPABASE_URLYour Supabase project URL SUPABASE_SERVICE_ROLE_KEYSupabase service role key (server-side only) NEXT_PUBLIC_SUPABASE_URLSame as SUPABASE_URLNEXT_PUBLIC_SUPABASE_ANON_KEYSupabase anon/public key SESSION_SECRETRandom string (32+ chars) for signing session JWTs NEXT_PUBLIC_BASE_URLhttp://localhost:3000for local dev, production URL for deploymentRESEND_API_KEYFrom your Resend dashboard RESEND_FROM_EMAILSender address on your verified Resend domain (e.g. noreply@mail.yourdomain.com)STRAVA_CLIENT_IDFrom your Strava API application (optional) STRAVA_CLIENT_SECRETFrom your Strava API application (optional) CRON_SECRETProtects the /api/cron/syncendpoint (optional, required if using Strava sync) -
Run database migrations
Apply the SQL files in
supabase/migrations/in order via the Supabase SQL editor. -
Start the dev server
pnpm run dev
Open http://localhost:3000.
The app is designed to deploy on Vercel. Set the same environment variables from .env.example in your Vercel project settings, with NEXT_PUBLIC_BASE_URL set to your production URL.
The cron sync endpoint (/api/cron/sync) can be triggered by Vercel Cron or any external scheduler using the CRON_SECRET for auth.
The develop branch exists because vercel automatically re-deploys any pushes on main. So when deployment is ready, merge develop into main and vercel should auto deploy
This project would not have happended without the reddit user r/Fickle_Bed8196 post or work on his app.
Derek Carr's 2025 PCT GPX file also made my job much easier