BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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“.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.