OpenAthlete
AGPLv3 endurance training platform: EU-oriented hosting, transparent CTL/ATL/TSB logic in code, self-hosting, and full export. Built in Grenoble.
Coach scouting notes and tournament-day profiles
Translation pending
Sports & fitnessTypeScript · CSSGitHub @jfmayedaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
Silicon Valley Judo - Competitor Analysis Dashboard
Multi-coach shared database with auth-protected scouting notes + printable offline tournament-day profiles.
Privacy-first competitor analysis tool for judo coaches. Track athlete development and opponent scouting notes with printable tournament-day profiles. Data is stored in a shared Supabase database with coach authentication required for all access.
• Node.js 18+ and npm
• Git
• A modern web browser
• Supabase account (for deployment)
Create a .env.local file in the project root with your Supabase credentials:Read the full README ↗Multi-coach shared database with auth-protected scouting notes + printable offline tournament-day profiles.
Privacy-first competitor analysis tool for judo coaches. Track athlete development and opponent scouting notes with printable tournament-day profiles. Data is stored in a shared Supabase database with coach authentication required for all access.
# Clone the repository
git clone https://github.com/jfmayeda/judo-comp-analysis.git
cd judo-comp-analysis
# Install dependencies
npm install
# Set up environment variables
cp .env.local.example .env.local
# Edit .env.local and add your Supabase credentials
Create a .env.local file in the project root with your Supabase credentials:
NEXT_PUBLIC_SUPABASE_URL=https://wnwcxousneqhzlkdzeku.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-actual-anon-key-here
NEVER commit .env.local to git. The .gitignore file is configured to exclude it.
Get your credentials from the Supabase project dashboard:
# Start development server
npm run dev
Open http://localhost:3000 to view the app. You'll be redirected to the login page.
# Build for production
npm run build
# Start production server
npm start
npm test # unit tests (node:test via tsx)
npm run smoke # browser smoke suite against a running server (Playwright + local Supabase mock)
npm run screenshots -- --out docs/screenshots/after # 19 scenes × 390/768/1440
The smoke suite and screenshots never touch Supabase: scripts/ui-smoke/supabase-mock.mjs answers the
REST/auth calls in-browser with demo fixtures, so no credentials are needed. Design rules live in
DESIGN.md; the overhaul record is in docs/UX_OVERHAUL_*.md and docs/PORTFOLIO_CASE_STUDY.md.
All data access requires authentication. Coaches must sign in before viewing any athlete or opponent information.
Login methods:
Admin creates coach accounts in Supabase:
Coach signs in:
Load sample data (optional):
This application is built with privacy-first principles:
last_initial as single character (DB constraint)athletesCREATE TABLE athletes (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
first_name TEXT NOT NULL,
last_initial TEXT NOT NULL CHECK (length(last_initial) = 1),
tokui_waza TEXT DEFAULT '',
development_areas TEXT DEFAULT '',
notes TEXT DEFAULT '',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
created_by UUID NOT NULL REFERENCES auth.users(id)
);
opponent_notesCREATE TABLE opponent_notes (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
athlete_id UUID NOT NULL REFERENCES athletes(id) ON DELETE CASCADE,
opponent_label TEXT NOT NULL,
club TEXT,
notes TEXT NOT NULL,
tournament TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
created_by UUID NOT NULL REFERENCES auth.users(id)
);
Both tables enforce RLS policies:
This prevents competition/trade-secret leaks from public access.
v1 (localStorage) → v2 (Supabase + Auth)
Key changes:
/workspace
├── app/
│ ├── athletes/[id]/
│ │ ├── page.tsx # Athlete detail & edit (auth required)
│ │ └── print/page.tsx # Printable profile (auth required)
│ ├── login/page.tsx # Coach login (password or magic link)
│ ├── page.tsx # Home / athlete list (auth required)
│ ├── layout.tsx # Root layout with AuthProvider
│ └── globals.css # Global styles + print CSS
├── lib/
│ ├── supabase.ts # Supabase client initialization
│ ├── supabase-store.ts # Supabase data layer (CRUD operations)
│ ├── auth-context.tsx # Auth context provider
│ ├── store.ts # (DEPRECATED) Old localStorage store
│ └── types.ts # TypeScript type definitions
├── .env.local.example # Environment variable template
├── .env.local # (gitignored) Your actual env vars
├── package.json # Dependencies & scripts
├── tsconfig.json # TypeScript config
└── README.md # This file
Push to GitHub:
git push origin main
Import Project to Vercel:
Configure Environment Variables:
In Vercel project settings → Environment Variables, add:
NEXT_PUBLIC_SUPABASE_URL=https://wnwcxousneqhzlkdzeku.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=<your-actual-anon-key>
CRITICAL: Use the actual anon key from your Supabase project dashboard (Settings → API).
Set for: Production, Preview, Development (all environments)
Deploy:
https://judo-comp-analysis.vercel.app)Create First Coach Account:
Go to Supabase Dashboard → Authentication → Users:
Test Authentication:
/loginVercel automatically redeploys when you push to main:
git add .
git commit -m "Update feature"
git push origin main
# Vercel deploys automatically
For first-time setup or testing:
Data is stored in Supabase PostgreSQL. To backup:
Option 1: Supabase Dashboard
Option 2: SQL Export
# Install Supabase CLI
npm install -g supabase
# Login and link project
supabase login
supabase link --project-ref <your-project-ref>
# Export data
supabase db dump -f backup.sql
If you have data in the old localStorage version:
created_by but not edit history (future enhancement)Potential future iterations (pending approval):
Private repository - Silicon Valley Judo internal use only.
This is an internal tool for Silicon Valley Judo. Contact Jacob Mayeda for questions or feature requests.
Built with ❤️ for Silicon Valley Judo coaches and athletes.
Now with Supabase authentication and shared database — secure, collaborative, and privacy-first!