BeamNG.Earth
BeamNG.drive용 1:1 비율 실시간 지구, 실제 고도·위성 이미지·부동 원점·보조 서버에서 LOD 스트리밍
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Web app for THUMBZ, a Mobile Legends esports companion: watch live matches with realtime stats and chat, protected replays, venue tickets paid by QRIS / bank virtual account / crypto, fuzzy search, and match reminders. It installs as a PWA on Android, iOS and desktop. The API lives in thumbz-server. Its contract, thumbz-server/docs/API-CONTRACT.md, is the boundary; types are generated from its OpenAPI document (npm run gen:api). [README 설치·사용 부분 발췌] Quick startREADME 전문 보기 ↗
Web app for THUMBZ, a Mobile Legends esports companion: watch live matches with realtime stats and chat, protected replays, venue tickets paid by QRIS / bank virtual account / crypto, fuzzy search, and match reminders. It installs as a PWA on Android, iOS and desktop.
Next.js 15 (App Router) · React 19 · TanStack Query · Tailwind 4 · Supabase Auth · Socket.IO · shaka-player · Playwright · Vitest.
The API lives in thumbz-server. Its contract,
thumbz-server/docs/API-CONTRACT.md, is the boundary; types are generated
from its OpenAPI document (npm run gen:api).
| Area | What | Where |
|---|---|---|
| Rendering | ISR for public pages + on-demand revalidation by tag from the API; dynamic only where personal (ADR 0001) | src/app/**/page.tsx, src/app/api/revalidate/ |
| Lists | Numbered, shareable pagination; infinite replay feed (keyset cursors, IntersectionObserver, "Load more" fallback, scroll restored on back) | src/components/ui/Pagination.tsx, src/components/video/VideoFeed.tsx |
| Search | Deep-linkable /search?q=&type=&page= (server-rendered), debounced URL updates, ⌘K command palette with suggestions | src/app/search/, src/components/search/ |
| Realtime | Lazy Socket.IO client, rooms, sequence-gap detection → REST resync, polling only while disconnected | src/lib/realtime/, src/components/match/LiveMatchProvider.tsx |
| Match data | Real MPL PH week: per-game tabs, hero/item/emblem/talent icons, final builds, and an item-sequence timeline (each player's purchases as an ordered list for screen readers) | src/components/match/LiveStats.tsx, src/components/match/ItemTimeline.tsx, src/lib/utils/builds.ts |
| Video & DRM | shaka-player; picks Widevine/PlayReady → ClearKey → native HLS (Apple) → HLS via MSE; rotating playback tokens, heartbeats, device limit, quality menu, PiP, iOS fullscreen, keyboard shortcuts | src/components/video/, src/lib/player/ |
| Checkout | QRIS (QR rendered client-side), bank VA, crypto; idempotent retries; payment status over the socket | src/components/checkout/ |
| PWA | Manifest + maskable icons, hand-written service worker with offline fallback, install prompt / iOS steps, Web Push reminders (ADR 0002) | public/sw.js, src/components/pwa/, src/components/account/MatchReminders.tsx |
| Speed | Navigation progress bar, route skeletons, lazy heavy components, image CDN loader (WebP, sized), preconnect, real-user Web Vitals to /api/vitals | src/components/layout/, src/lib/image-loader.ts |
| Cross-platform | dvh, safe areas, no input zoom on iOS, sticky bars under the header, hover:hover only | src/app/globals.css |
| Accessibility | Skip link, WAI-ARIA tabs with arrow keys, focus return, labelled controls, contrast fixed to AA | throughout |
| SEO | Metadata in <head>, title template, sitemap, robots, per-match Open Graph image, SportsEvent JSON-LD | src/app/sitemap.ts, src/app/matches/[id]/ |
| Security | Strict image hosts, security headers + CSP (report-only), safe next redirects, server-side getClaims() | next.config.ts, src/middleware.ts |
Requirements: Node (see .nvmrc) and the API running locally (see the
server README; LIVE_SIMULATOR=true on its worker makes live matches play).
cp .env.example .env.local # NEXT_PUBLIC_API_URL, Supabase URL + anon key
npm ci
npm run dev # http://localhost:3000
The service worker registers in production builds only:
npm run build && npm start.
| Suite | Command | Notes |
|---|---|---|
| Lint + types | npm run lint && npm run typecheck | |
| Unit / component | npm run test:cov | Vitest + Testing Library; coverage floor on the logic layer |
| End to end | npm run test:e2e | Playwright: Desktop Chrome, Desktop Safari, iPhone, Pixel, against a running stack (ADR 0003) |
| Lighthouse | npm run lighthouse | Budgets in lighthouserc.json |
Local results on the production build: 52 e2e tests pass on all four browser
projects (5 skipped by design); Lighthouse accessibility, best practices and
SEO are 100 on the audited pages (/search is noindex on purpose).
End-to-end environment variables: E2E_BASE_URL (default
http://localhost:3000), E2E_API_URL, E2E_EMAIL / E2E_PASSWORD (a demo
account), E2E_SW=1 to include service-worker tests (production build),
E2E_NO_SANDBOX=1 where Chromium's sandbox is unavailable (containers, WSL).
CI: ci.yml (lint, types, unit + coverage, build) on every push and PR;
preview-checks.yml runs Playwright and Lighthouse against each Vercel
preview.
Match data: MPL Philippines (ph-mpl.com), © Moonton, used for a non-commercial portfolio.
Vercel. Environment: NEXT_PUBLIC_API_URL, NEXT_PUBLIC_SUPABASE_URL,
NEXT_PUBLIC_SUPABASE_ANON_KEY, REVALIDATE_SECRET (same value as the API's),
optional NEXT_PUBLIC_SITE_URL (canonical domain for metadata and the
sitemap).