BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
Play Tic Tac Toe online for free. Challenge a smart AI, play with a friend via invite link, or battle in real-time multiplayer - no download, no signup.
GamesTypeScript · JavaScriptGitHub @fia-tOnlineOwner 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.
Безкоштовна браузерна гра в хрестики-нулики на Next.js 15 (App Router) + Firebase, з повноцінним SEO-шаром: метадані, sitemap/robots, JSON-LD, блог, i18n-заготовка, менеджер реклами, аналітика, PWA. Відкрийте http://localhost:3000. Next.js читає .env.local лише при старті сервера - після будь-якої зміни файлу перезапустіть npm run dev. Ігрові роути (/, /play, /play/[roomId], /admin) навмисно лишились поза (marketing) route group і виглядають так само, як і раніше - нова навігація/реклама на них не впливає.Read the full README ↗
Безкоштовна браузерна гра в хрестики-нулики на Next.js 15 (App Router) + Firebase, з повноцінним SEO-шаром: метадані, sitemap/robots, JSON-LD, блог, i18n-заготовка, менеджер реклами, аналітика, PWA.
cd tictactoe-game
npm install
cp .env.local.example .env.local # заповніть Firebase-ключі та (опційно) SEO/ads/analytics
npm run dev
Відкрийте http://localhost:3000.
Next.js читає
.env.localлише при старті сервера - після будь-якої зміни файлу перезапустітьnpm run dev.
app/
page.tsx - головна: сама гра (vs AI), поза (marketing) групою
play/, play/[roomId]/ - онлайн-кімнати (Firebase), не займані SEO-шаром
admin/ - адмін-панель (заборонена для індексації в robots.ts)
(marketing)/ - route group: усі нові SEO/контент-сторінки
layout.tsx - header/footer/рекламні слоти для цієї групи
about/, blog/, contact/, daily-challenge/, how-to-play/, leaderboard/,
multiplayer/, play-vs-ai/, play-vs-friend/, privacy/, terms/,
tic-tac-toe-rules/
sitemap.ts, robots.ts, manifest.ts, opengraph-image.tsx, icon.png, apple-icon.png
lib/
seo/ - site-config.ts (домен/бренд), metadata.ts (генератор Metadata),
json-ld.tsx (Organization/WebApplication/VideoGame/Breadcrumb/Article)
blog/posts.ts - дані статей блогу
i18n/ - locales.ts, get-dictionary.ts, dictionaries/{en,uk,de,es,fr,it,pt,nl,pl}.ts
components/
layout/ - SiteHeader, SiteFooter
ads/AdsManager.tsx - рекламні слоти (AdSense/NitroPay/Setupad/Mediavine)
analytics/ - GoogleAnalytics, GoogleTagManager
pwa/ - ServiceWorkerRegistration, InstallPrompt
social/ShareButtons.tsx
seo/Breadcrumbs.tsx
public/
sw.js - мінімальний service worker (офлайн-фолбек)
icons/ - згенеровані PNG-іконки (16/32/180/192/512)
Ігрові роути (/, /play, /play/[roomId], /admin) навмисно лишились
поза (marketing) route group і виглядають так само, як і раніше - нова
навігація/реклама на них не впливає.
.env.local:
NEXT_PUBLIC_AD_PROVIDER=adsense # adsense | nitropay | setupad | mediavine | none
.env.local):
NEXT_PUBLIC_ADSENSE_CLIENT, NEXT_PUBLIC_ADSENSE_SLOT_TOP /
_BOTTOM / _SIDEBAR / _INCONTENT.NEXT_PUBLIC_NITROPAY_SITE_ID.NEXT_PUBLIC_SETUPAD_PUBLISHER_ID.npm run dev / передеплойте.Розмітка сторінок не змінюється - <AdSlot position="..." />
(app/components/ads/AdsManager.tsx) сам вирішує, що рендерити, залежно від
NEXT_PUBLIC_AD_PROVIDER. Доступні позиції: top-banner, bottom-banner,
sidebar, between-content, reward. У dev-режимі без реального ID
показується пунктирний плейсхолдер із назвою позиції (щоб бачити верстку);
у production він просто не рендериться, поки немає реальних ID.
NEXT_PUBLIC_SITE_URL -> метод "HTML tag".content="..." і вставте в .env.local:
NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION=xxxxxxxxxxxxxxxx
<head> (див. verification.google
у app/layout.tsx).https://ваш-домен/sitemap.xml.NEXT_PUBLIC_ANALYTICS_ID=G-XXXXXXXXXX # GA4 Measurement ID
NEXT_PUBLIC_GTM_ID=GTM-XXXXXXX # GTM Container ID
Обидва підключаються лише якщо ID заданий (app/components/analytics/*) -
без ID жодних скриптів не вставляється. Можна використовувати одне з двох
або обидва одночасно.
i18n зараз - це готова структура з активною лише English, як і було погоджено на старті проєкту (переклад усього контенту на 5 мов вручну дав би непередбачувану якість без професійного перекладу).
Що вже є (app/lib/i18n/):
locales.ts - список з 9 мов (en, uk, de, es, fr, it, pt, nl, pl), en - дефолтна.dictionaries/{locale}.ts - короткі UI-рядки (навігація, футер, спільні
кнопки) вже перекладені для всіх 9 мов.app/lib/seo/translations.ts (правки - в адмінці, "Переклади" → SEO).Гра (game/src/lib/i18n.ts + locales/*.ts) уже працює всіма 9 мовами: мова береться з браузера
гравця (на порталі - з SDK), невідома мова - англійська. Правки текстів з адмінки ("Переклади")
лежать у Firestore translations/{locale} поверх вбудованих перекладів.
get-dictionary.ts - getDictionary(locale) асинхронно завантажує потрібний словник.Щоб перевести конкретну мову з "заготовки" в реально доступну (напр. /uk/...):
app/[locale]/ сегмент маршруту для сторінок, які мають
перекладатись (найпростіше - обгорнути лише (marketing) сторінки,
лишивши ігрові роути без префікса).getDictionary("en") на
getDictionary(params.locale).app/lib/blog/posts.ts, тексти
/how-to-play, /tic-tac-toe-rules тощо) - словники з dictionaries/
покривають лише UI-хром, не цей контент.alternates.languages (hreflang) у buildMetadata
(app/lib/seo/metadata.ts) для кожної активної мови.app/sitemap.ts.Щоб додати 7-у мову: створіть dictionaries/xx.ts (TypeScript провалить
збірку, якщо пропустите ключ - копіюйте en.ts і перекладіть значення),
додайте "xx" в locales і localeNames/localeToHreflang у locales.ts,
і зареєструйте в loaders у get-dictionary.ts.
app/components/gameLogic.ts /
app/components/onlineGameLogic.ts - нову логіку варто виносити так само
окремим модулем, а не в компонент.gameMode в
app/components/tic-tac-toe.tsx (за зразком "traditional" | "difficult")
і новий компонент на кшталт DifficultTicTacToe.OnlineGameMode
(app/components/onlineGameLogic.ts) і обробіть його в app/lib/onlineGame.ts
та OnlineBoard.tsx/FriendGameModal.tsx.app/(marketing)/ за зразком
play-vs-ai/page.tsx (метадані через buildMetadata, breadcrumbs, CTA на
реальний ігровий роут) і впишіть шлях в app/sitemap.ts.buildMetadata()
(app/lib/seo/metadata.ts) - єдине джерело title/description/keywords/canonical/OG/Twitter.app/lib/seo/json-ld.tsx - Organization + WebApplication
(глобально, в layout.tsx), VideoGame (на /play-vs-ai), BreadcrumbList
(у Breadcrumbs), BlogPosting (на сторінках блогу), FAQPage (на /tic-tac-toe-rules).app/sitemap.ts,
app/robots.ts) - офіційний App Router спосіб, нічого правити вручну.app/icon.png, app/apple-icon.png, app/manifest.ts,
public/icons/* згенеровані з public/images/logo.png. Це placeholder-якість
(масштабоване лого) - перед публікацією варто замінити на дизайнерські іконки.app/opengraph-image.tsx генерується динамічно через next/og.NEXT_PUBLIC_AD_PROVIDER=none і порожні NEXT_PUBLIC_ANALYTICS_ID/NEXT_PUBLIC_GTM_ID
означають, що жоден зовнішній рекламний/аналітичний скрипт не завантажується,
поки ви свідомо не заповните відповідні змінні середовища. Реальні рекламні
ID/домен/email у коді - лише плейсхолдери (tictactoe-game.com,
[email protected]) - замініть їх перед публікацією.
next.config.ts додає CSP, X-Frame-Options, X-Content-Type-Options,
Referrer-Policy, Permissions-Policy до кожної відповіді. CSP дозволяє лише
домени вже підключених інтеграцій (Firebase, Google Analytics/GTM, AdSense,
NitroPay). Якщо ви приберете styled-components або захочете прибрати
'unsafe-inline' зі script-src - перейдіть на nonce-based CSP
(generateNonce у next.config.ts).
next build), змінні середовища додайте в
Project Settings -> Environment Variables.output: "standalone" у next.config.ts.@cloudflare/next-on-pages (не входить у
цей проєкт) через відмінності edge-рантайму; app/opengraph-image.tsx
використовує export const runtime = "edge" і сумісний із цим шляхом./daily-challenge і /leaderboard - це SEO-сторінки з описом функціоналу
"Coming Soon", без реального бекенду (немає fake-даних, щоб не вводити в оману).