Skip to content

Repository files navigation

Smotu

Smotu est une réadaptation moderne du grand Smotu, le seul et l'unique selon Codex, mais aussi selon Claude Code.

Un jeu de mot quotidien en cinq lettres, sobre, rapide, connecté et classé. Le joueur retrouve l'esprit Wordle: six essais, des indices couleur, une grille du jour et la satisfaction de gratter des points quand le mot tombe enfin.

Ce que propose Smotu

  • Mot du jour: une grille quotidienne, plus exigeante, plus rentable.
  • Mode libre: des manches rejouables à volonté, jouables même sans compte (en invité, sans sauvegarde), pour continuer après le mot du jour.
  • Pseudo public: chaque joueur choisit un pseudo affiché à la place de son nom de compte, y compris au classement.
  • Classement global: les points des deux modes sont additionnés.
  • Profil joueur: score, rang, victoires et avatar 3D interne.
  • Dictionnaire étendu: les propositions sont validées sur une grande banque de mots français, proche de l'expérience Wordle.
  • Interface responsive: dark theme, header mobile, footer classique et modale de règles.
  • Déploiement simple: une app React servie par Cloudflare Workers avec D1 en base de données.

Règles du jeu

Le principe est direct: trouver un mot de cinq lettres en six essais.

Couleur Signification
Vert Lettre bien placée
Jaune Lettre présente ailleurs
Gris Lettre absente

Le mot du jour rapporte jusqu'à 900 points. Le mode libre rapporte jusqu'à 360 points par victoire, mais il peut être rejoué sans limite.

Pourquoi c'est sympa

Smotu ne cherche pas à être un gros produit. C'est un jeu court, lisible et rejouable, avec juste assez de persistance pour donner envie de revenir: continuer sa série, améliorer son rang, comparer les scores, puis relancer une manche libre quand le mot du jour est plié.

Stack

  • React + React Router
  • Tailwind CSS
  • Better Auth pour l'auth Google et email/mot de passe
  • Cloudflare Workers
  • Cloudflare D1
  • Drizzle ORM / Drizzle Kit
  • TypeScript
  • Vite + Cloudflare Vite plugin

Architecture

src/
  components/       UI, header, footer, modale, grille de jeu
  game/             hooks React pour les modes de jeu et le profil
  pages/            pages routées côté React
  lib/              client API et utilitaires
worker/
  index.ts          API Cloudflare Worker
  db/schema.ts      schéma Drizzle D1
shared/
  game.ts           règles, types, scoring et logique de lettres

Les routes /api/* passent par le Worker. Le reste est servi comme une SPA React. Le Worker initialise automatiquement les tables et index D1 nécessaires au premier appel API.

Lancer en local

npm install
npm run dev

Ouvre ensuite l'URL affichée par Vite, généralement:

http://localhost:5173

Déployer sur Cloudflare

Créer une base D1 une seule fois:

wrangler d1 create smotu-db

Puis remplacer database_id dans wrangler.jsonc par l'id retourné par Cloudflare.

Déployer:

npm run deploy

npm run deploy lance le build, applique les migrations D1 remote puis lance wrangler deploy.

Analytics PostHog

Le suivi PostHog côté navigateur s'active uniquement quand une clé projet est fournie à Vite. Configure ces variables dans l'environnement de build:

VITE_POSTHOG_KEY=phc_xxx
VITE_POSTHOG_HOST=https://us.i.posthog.com

VITE_POSTHOG_HOST est optionnel et vaut https://us.i.posthog.com par défaut. Les pages vues sont capturées à chaque navigation React Router et les utilisateurs connectés sont identifiés avec leur identifiant applicatif.

Commandes utiles

npm exec tsc -- --noEmit
npm run build
npm run deploy
npm run db:generate
npm run db:push
npm run d1:migrate:local
npm run d1:migrate:remote

db:generate, db:push et les commandes d1:migrate:* restent disponibles pour faire évoluer ou diagnostiquer le schéma.

Après le passage à Better Auth, applique les migrations D1 avant de déployer le Worker:

npm run d1:migrate:local
npm run d1:migrate:remote

Pour remettre à zéro la D1 locale:

rm -rf .wrangler/state

Authentification

Smotu utilise Better Auth pour la connexion Google et email/mot de passe. Les sessions sont stockées dans D1 et lues côté Worker via les cookies Better Auth.

Les scores sont rattachés à un identifiant Smotu stable dérivé du compte Google (google:<sub Google>), pas à l'identifiant interne Better Auth. Si un compte Google recrée une session ou un utilisateur Better Auth, les données de jeu continuent donc de pointer vers le même joueur. Cet identifiant reste interne au Worker: les classements publics exposent un identifiant player:<hash>, le pseudo Smotu et l'avatar interne.

Les comptes email utilisent l'identifiant Better Auth local (auth:<id>).

Les photos fournies par les fournisseurs d'authentification ne sont pas affichées publiquement. Le site utilise uniquement le pseudo Smotu et l'avatar interne.

En production, configure les secrets suivants dans Cloudflare:

wrangler secret put BETTER_AUTH_SECRET
wrangler secret put GOOGLE_CLIENT_ID
wrangler secret put GOOGLE_CLIENT_SECRET

En local, GOOGLE_SECRET_ID est aussi accepté comme alias de GOOGLE_CLIENT_SECRET.

About

Réinterprétation de Smotu selon Codex et Claude Code

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages