A mobile-first archery training tracker built with Next.js.
Record sessions, track arrow placement on interactive targets, and review your progress over time.
- Multiple target types — Indoor 1-spot, Indoor 5-spot, Flint 1-spot, Flint 4-spot
- Touch-based arrow placement with zoom overlay for precise positioning
- Session summary with shot chart, group radius, aim offset, and per-arrow score table
- Score editing — tap any arrow score to correct it inline
- Session notes with star rating
- Dark mode with theme toggle
- Authentication — register, login, settings (name/email/password), forgot password via email
- Next.js 15 — App Router, standalone output
- NextAuth v5 — credentials-based auth
- Prisma 7 — SQLite via better-sqlite3
- Tailwind CSS
- Nodemailer — Gmail SMTP for password reset emails
- Docker + Cloudflare Tunnel — self-hosted deployment without a fixed IP
npm install
npx prisma migrate dev
npm run devDATABASE_URL="file:./dev.db"
AUTH_SECRET=your-secret # openssl rand -base64 32
AUTH_URL=http://localhost:3000
# Gmail SMTP (for password reset)
SMTP_USER=you@example.com
SMTP_PASS=your-app-password # Google App Password (requires 2FA)The app runs as a Docker container with SQLite persisted on a host volume. A cloudflared sidecar handles the Cloudflare Tunnel — no fixed IP or port forwarding required.
- Docker + Docker Compose on the host
- A domain managed by Cloudflare
- A Cloudflare Tunnel token (Zero Trust → Networks → Tunnels)
- Clone the repo and create a
.envfile:
DATABASE_URL="file:/app/data/prod.db"
AUTH_SECRET=your-secret # openssl rand -base64 32
AUTH_URL=https://your.domain.com
SMTP_USER=you@example.com
SMTP_PASS=your-app-password
CLOUDFLARE_TUNNEL_TOKEN=your-token- Build and start:
docker compose build
docker compose up -dMigrations run automatically on startup. The app is served via the Cloudflare Tunnel at the configured domain with a free TLS certificate.
git pull
docker compose build
docker compose up -d --force-recreate app