尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
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:查看完整 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!