BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
Drag and drop football players into S, A, B, C, D tiers. Save and share your rankings.
GamesTypeScript · HTMLGitHub @ProposalWizardOnlineOwner 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.
A Next.js 14 app that lets authenticated users drag & drop football players into S/A/B/C/D tiers and save their rankings to Supabase.
All dependencies are open-source.
1. Go to supabase.com and create a new project.
2. In the Supabase Dashboard → SQL Editor, paste and run the contents of supabase/schema.sql.
This creates the three tables, seeds the default topic + 12 players, and sets up Row Level Security.
Edit .env.local and fill in your values from Supabase Dashboard → Settings → API:
5. Configure the Supabase Auth redirect URLRead the full README ↗A Next.js 14 app that lets authenticated users drag & drop football players into S/A/B/C/D tiers and save their rankings to Supabase.
| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router, TypeScript) |
| Auth & DB | Supabase (Auth + PostgreSQL) |
| Drag & Drop | @dnd-kit/core + @dnd-kit/sortable |
| Styling | Tailwind CSS v3 |
All dependencies are open-source.
git clone <your-repo>
cd tierlist-app
npm install
supabase/schema.sql.
This creates the three tables, seeds the default topic + 12 players, and sets up Row Level Security.cp .env.local.example .env.local
Edit .env.local and fill in your values from Supabase Dashboard → Settings → API:
NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
NEXT_PUBLIC_APP_URL=http://localhost:3000
In Supabase Dashboard → Authentication → URL Configuration:
http://localhost:3000http://localhost:3000/auth/callbackFor production, add your live domain instead.
npm run dev
Open http://localhost:3000 – you'll be redirected to /auth to sign up or log in.
tierlist-app/
├── app/
│ ├── layout.tsx # Root layout + global CSS
│ ├── page.tsx # Redirects to /auth or /tierlist
│ ├── globals.css # Tailwind directives
│ ├── auth/
│ │ ├── page.tsx # Login / sign-up page (Server Component)
│ │ └── callback/route.ts # Supabase OAuth/magic-link callback
│ ├── tierlist/
│ │ └── [topic]/page.tsx # Tierlist page (Server Component, fetches data)
│ └── api/
│ ├── auth/signout/route.ts # POST → sign out
│ └── tierlist/
│ ├── save/route.ts # POST → save rankings
│ └── [topic]/route.ts # GET → fetch topic + players + rankings
├── components/
│ ├── AuthForm.tsx # Sign-in / sign-up form (Client Component)
│ ├── TierlistBoard.tsx # Main DnD board (Client Component)
│ ├── TierRow.tsx # One S/A/B/C/D row (droppable)
│ └── PlayerCard.tsx # Draggable player card
├── lib/
│ ├── types.ts # Shared TypeScript types & constants
│ └── supabase/
│ ├── client.ts # Browser Supabase client
│ ├── server.ts # Server Supabase client (RSC / API routes)
│ └── middleware.ts # Session-refresh helper for middleware
├── middleware.ts # Next.js middleware (auth guard + session refresh)
├── supabase/schema.sql # Full DB schema + seed data
└── .env.local.example # Environment variable template
Browser Server
─────── ──────
/auth page (Server Component)
└─ renders <AuthForm /> ──────────────── Client Component
│ supabase.auth.signInWithPassword()
│ (direct browser → Supabase)
└─ router.refresh() ──────────────► triggers Server Component re-render
→ redirects to /tierlist/[topic]
/tierlist/[topic] (Server Component)
├─ createClient() (server) ──────────── reads session from cookie
├─ fetches topic, players, rankings from Supabase
└─ renders <TierlistBoard /> ─────────── Client Component
│ Local state: tierMap (player positions)
│ DnD events update tierMap in real-time
│
└─ "Save Rankings" button
fetch POST /api/tierlist/save
│
└─ Route Handler (Server)
├─ validates auth + payload
├─ DELETE old rankings
└─ INSERT new rankings
| Decision | Reason |
|---|---|
| Server Components for data fetching | Zero client-side loading state; SEO-friendly |
| Client Component for drag & drop | DnD requires browser events (pointer, touch) |
| Delete-then-insert save strategy | Simpler than row-level upserts when tier assignments change |
UNIQUE (user_id, topic_id, player_id) DB constraint | Server-side guarantee a player can't be in two tiers |
@dnd-kit instead of react-beautiful-dnd | Active maintenance, accessible, supports touch |
@supabase/ssr instead of legacy auth-helpers | Official, cookie-based, works with Next.js App Router |
tierlist_topics (id, slug, title, description, created_at)
tierlist_players (id, topic_id → topics, name, position, club, image_url, created_at)
tierlist_rankings (id, user_id → auth.users, topic_id → topics, player_id → players,
tier CHECK IN ('S','A','B','C','D'),
UNIQUE(user_id, topic_id, player_id))
Row Level Security ensures each user can only read and write their own rankings. Topics and players are publicly readable.
tierlist_topics with a unique slug.tierlist_players referencing that topic_id./tierlist/<your-slug>.npm run build # verify the build passes locally first
.env.local in Vercel's project settings.https:// production domain.