Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
Das Social-Tippspiel für echte Sportfans.
Translation pending
GamesTypeScript · PLpgSQLGitHub @ReneM18OnlineOwner 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.
Kostenloses Social-Sport-Tippspiel als Web-App: Fußball, NFL, NBA und NHL tippen, mit virtuellen Sternen statt Echtgeld. Komplett auf Deutsch, Dark Theme, für das Handy gebaut (funktioniert auch am Desktop). Keine App-Store-App: die Seite lässt sich im Browser „zum Startbildschirm hinzufügen“.Read the full README ↗
Kostenloses Social-Sport-Tippspiel als Web-App: Fußball, NFL, NBA und NHL tippen, mit virtuellen Sternen statt Echtgeld. Komplett auf Deutsch, Dark Theme, für das Handy gebaut (funktioniert auch am Desktop). Keine App-Store-App: die Seite lässt sich im Browser „zum Startbildschirm hinzufügen“.
| Teil | Was |
|---|---|
| Oberfläche | Next.js 14 (App Router), React 18, TypeScript, Tailwind CSS |
| Datenbank, Login, Live-Chat | Supabase (Postgres, Auth, Realtime) |
| Hosting | Vercel, baut automatisch bei jedem Push auf main |
| Echte Sportdaten | TheSportsDB (kostenloser Schlüssel, kein eigener Key nötig) |
Drei getrennte Zähler: Rangliste-Punkte (Elo-ähnlich), Saison-Pass-XP und Sterne (Einsatz-Währung).
app/ Seiten (eine Datei pro Seite, z. B. app/rangliste/page.tsx)
components/ wiederverwendbare Bausteine (Karten, Navigation, Chat, …)
lib/ Logik und Datenzugriff (Supabase-Anbindung, Punkte, Sportdaten)
public/ Bilder und App-Icons
supabase/ SQL-Skripte für die Datenbank
Die Skripte im Ordner supabase/ legen Tabellen, Regeln und Funktionen an.
Ausführen jeweils im Supabase-Dashboard unter SQL Editor → New query →
Skript einfügen → Run. Die Skripte sind so geschrieben, dass ein zweiter Durchlauf nichts kaputt macht.
Bei einer neuen, leeren Datenbank in dieser Reihenfolge:
profiles.sql – Spielerprofiletips.sql – Tippssocial-features.sql – Spiele, Teams, News, Kommentare, Feed, Chat, Duelle, Turnierefix-rechte-tabellen.sql – Grundrechte für die App-Tabellenfixes-features40.sql – Korrekturen (Sterne, Endstand-Korrektur, Sicherheit)tipprunden.sql – private Tipprundenvereinswertung.sql – Herzensverein und VereinstabellenDie Live-Datenbank hat alle sieben Skripte bereits. Kommt später ein neues Skript dazu, wird nur dieses eine ausgeführt.
Wichtig: Die Admin-E-Mail ist in der SQL-Funktion is_admin() hinterlegt
(social-features.sql). Neue Tabellen brauchen immer RLS-Regeln und
grant-Rechte für anon/authenticated.
Die App braucht zwei Werte aus Supabase (Project Settings → API):
NEXT_PUBLIC_SUPABASE_URL
NEXT_PUBLIC_SUPABASE_ANON_KEY
.env.example nach .env.local kopieren und die Werte eintragen.
.env.local wird nie auf GitHub hochgeladen.Der „anon“-Key darf öffentlich sein, die Daten schützen die RLS-Regeln in Supabase.
Für Live-Stände auf den Tippkarten (Rene, 15.10.2026) braucht die App einen Schlüssel von API-Sports (Gratis-Plan: 100 Abfragen pro Tag je Sportart):
API_SPORTS_KEY=
NEXT_PUBLIC_,
der Schlüssel bleibt auf dem Server (Route app/api/live/route.ts).source, fetchedAt,
liveError, quota). Hängen die Daten, steht im Matchcenter „Live-Daten
verzögert“ und auf der Tippkarte „verzögert“ am LIVE-Pill. Der Admin-Bereich
zeigt in der Kachel „Live-Daten“ Anbieter, letzten Abruf, Fehler und die
Abfragen von heute (ohne zusätzliche Abfrage).Der Anbieter ist austauschbar (Rene, 16.10.2026). Gewählt wird er über die
Umgebungsvariable LIVE_PROVIDER (Standard api-sports):
LIVE_PROVIDER=api-sports
Aufbau:
| Datei | Was |
|---|---|
lib/live/types.ts | anbieterneutrale Typen (LiveGame, LiveSnapshot, LiveProvider …) – nur davon hängen Route und Browser ab |
lib/live/cache.ts | Server-Cache mit festen Ablaufzeiten, fasst gleichzeitige Abrufe zusammen |
lib/live/providers/apiSports.ts | alles API-Sports-Spezifische (URLs, Schlüssel, Umwandlung, Fehler, Quote) |
lib/live/index.ts | wählt den Anbieter über LIVE_PROVIDER |
Neuen Anbieter ergänzen:
lib/live/providers/<name>.ts anlegen, die ein LiveProvider-Objekt
exportiert (Vorlage: apiSports.ts): id, name, url,
configError() (fehlender Schlüssel), getDay({ sport, date, league })
und diagnostics().getDay die Spiele des Tages (Wiener Zeit) abrufen – mit
cachedLoad aus lib/live/cache.ts und cache: "no-store" – und in
LiveGame umwandeln. Status auf NS/LIVE/HT/BREAK/FT/AET/PEN/OTHER
abbilden, für die mitlaufende Minute statusShort „1H“/„2H“/„HT“ setzen.
Nur eingeschaltete Ligen liefern (isLiveLeagueEnabled aus lib/liveConfig.ts).source ehrlich setzen: live (frischer Live-Stand), day (nur
Tagesliste) oder stale (alter Live-Stand nach Fehler), Fehler beim
Live-Abruf in liveError, Quote in quota, falls der Anbieter sie mitschickt.lib/live/index.ts in PROVIDERS eintragen, Schlüssel und
LIVE_PROVIDER=<id> bei Vercel setzen.Voraussetzung: Node.js 18.17 oder neuer (empfohlen 20 oder 22).
npm install # einmalig, installiert genau die Versionen aus package-lock.json
npm run dev # startet die App auf http://localhost:3000
Weitere Befehle:
npm run build # Produktions-Build (prüft auch alle TypeScript-Typen)
npm run start # startet den fertigen Build
Jede Änderung auf dem Branch main wird von Vercel automatisch gebaut und
veröffentlicht, das dauert ein bis zwei Minuten.
Ändert sich die Datenbank, muss das neue SQL-Skript zusätzlich einmal im Supabase SQL Editor ausgeführt werden (siehe oben).
Hinweis: Vorschau-Deployments von Vercel für Pull Requests schlagen derzeit
oft fehl, obwohl der Code in Ordnung ist. Entscheidend ist der Deploy nach dem
Merge auf main.