A lightweight community utility to help reconnect misplaced KC jerseys caused by logistical errors (e.g. incorrect shirt shipping or wrong personalization).
Users search for the name (flocage) they were supposed to receive or received incorrectly, and discover if someone else has declared it.
- No complex matching system
- No social network logic
- Just a fast, searchable registry
- Frontend: Next.js (App Router) + TypeScript + Tailwind CSS + shadcn/ui
- Animations: Framer Motion
- Icons: Lucide React
- Backend: Supabase (PostgreSQL + Auth + Storage)
- Authentication: X (Twitter) OAuth 2.0
- Instant search by flocage name
- X (Twitter) OAuth login — one jersey per user
- Declare a jersey you received by mistake
- Edit or delete your declaration
- Photo upload with modal lightbox view
- Clickable photos in search results
- Admin moderation — approve/reject declarations
- Basic rate limiting (10 insertions/minute)
- MIT License
- Search: Enter the flocage on your jersey to find who received it
- Declare: Log in with X and declare the jersey you received by mistake
- Connect: Contact the owner via their X profile link
- Go to supabase.com and create an account/project
- In the SQL Editor, run the contents of
supabase/migrations/001_initial_schema.sql - Go to Project Settings > API and copy:
Project URL→NEXT_PUBLIC_SUPABASE_URLPublishableAPI key →NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
- In your Supabase dashboard, go to Authentication > Providers
- Enable X / Twitter (OAuth 2.0)
- Add your X API credentials (Client ID and Client Secret)
- Set the callback URL in your X Developer app:
https://<your-project>.supabase.co/auth/v1/callback
cp .env.local.example .env.localFill in your Supabase credentials.
npm run devsrc/
app/
page.tsx # Homepage with search
declare/page.tsx # Jersey declaration & edit form
admin/page.tsx # Admin moderation dashboard
layout.tsx # Root layout
globals.css # Global styles
components/
ui/ # shadcn/ui components
auth-button.tsx # Authentication button
hooks/
use-auth.ts # Auth state management
lib/
supabase.ts # Supabase client
database.types.ts # TypeScript types
utils.ts # Utilities
supabase/
migrations/ # SQL migrations
To prevent trolls and NSFW content, all declarations require manual approval before appearing in search results.
- Users submit a declaration
- The declaration is marked as
approved = false(pending) - Admins review pending declarations at
/admin - Approved declarations appear in search results; rejected ones are deleted
- Log in to the app with your X account (to create your user record)
- Get your user ID from the Supabase dashboard (Auth > Users)
- Run this SQL in the Supabase SQL Editor:
INSERT INTO public.admins (user_id)
VALUES ('your-user-id-here');- Visit
/adminto access the moderation dashboard
- View all pending declarations
- Approve: Makes the jersey visible in search results
- Reject: Permanently deletes the declaration
- See submission date, flocage, size, photo, and Twitter handle
MIT License — see LICENSE file.