Jeu android de mots quotidien en français où vous assemblez un mot à partir de 16 tuiles de lettres dotées de valeurs de puissance pour atteindre une cible exacte, en misant sur des cartes de défi pour de plus gros bonus — un seul essai par jour, en solo ou entre amis dans des salles, avec un classement hebdomadaire.
  • Dart 84.8%
  • Python 10.2%
  • C++ 1.7%
  • CMake 1.3%
  • Just 1.1%
  • Other 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
gixita 908450105c play: analytics opt-in consent + privacy-policy item
The Play build sends usage analytics only after the player opts in from
the Configuration page's new "Usage statistics" switch (off by default;
FOSS hides it — its no-op analytics port reports unsupported):

- new analytics-consent port + shared_preferences adapter
  (settings.analytics.allowed; default opted-out, corrupt reads as default)
- AnalyticsPort gains setCollectionEnabled + isSupported; the Firebase
  adapter maps them to setAnalyticsCollectionEnabled, the no-op ignores
- manifest consent default: firebase_analytics_collection_enabled=false —
  nothing (not even first_open) is sent before the persisted choice
  applies at boot; AD_ID removals pinned by test/consent_manifest_test.dart
- Configuration page: the switch + a "Privacy policy" item opening the
  hosted policy (the single point of truth, AGENTS.md §7) via WebBrowser
- docs/privacy-policy.md synced: analytics moved from legitimate interest
  to consent (the HOSTED page needs the same update before upload)
- Crashlytics stays always-on (disclosed legitimate interest), per plan
2026-09-22 16:23:06 +02:00
android play: analytics opt-in consent + privacy-policy item 2026-09-22 16:23:06 +02:00
appimage feat: change package name 2026-09-19 13:57:48 +02:00
assets feat(dictionnaire): map the nl tags onto the game vocabulary 2026-09-18 21:21:28 +02:00
dictionnaire feat(dictionnaire): map the nl tags onto the game vocabulary 2026-09-18 21:21:28 +02:00
docs play: analytics opt-in consent + privacy-policy item 2026-09-22 16:23:06 +02:00
fastlane refactor: one application for fr + nl, drop the per-language build flavor 2026-09-22 08:20:33 +02:00
fdroid/metadata feat: change package name 2026-09-19 13:57:48 +02:00
ios feat: change package name 2026-09-19 13:57:48 +02:00
lib play: analytics opt-in consent + privacy-policy item 2026-09-22 16:23:06 +02:00
linux feat: change package name 2026-09-19 13:57:48 +02:00
macos feat: change package name 2026-09-19 13:57:48 +02:00
test play: analytics opt-in consent + privacy-policy item 2026-09-22 16:23:06 +02:00
test_driver chore(dev): the probe taps semantics labels; plan date slips fixed 2026-09-18 21:43:29 +02:00
tool challenge: letter cards price their letter's value 2026-09-22 14:05:47 +02:00
web fix(android): adaptive launcher icon renders on masked launchers 2026-09-16 18:24:43 +02:00
windows feat: change package name 2026-09-19 13:57:48 +02:00
.gitignore fix(screenshots): never render the whole capture matrix in one process 2026-09-18 19:59:27 +02:00
.metadata Initial deployable hello-world Flutter template skeleton 2026-08-25 16:17:27 +02:00
analysis_options.yaml feat: "Ton parcours" screen between the title screen and the board 2026-09-08 19:40:50 +02:00
firebase.json Initial deployable hello-world Flutter template skeleton 2026-08-25 16:17:27 +02:00
justfile refactor: one application for fr + nl, drop the per-language build flavor 2026-09-22 08:20:33 +02:00
l10n.yaml Initial deployable hello-world Flutter template skeleton 2026-08-25 16:17:27 +02:00
LICENSE Initial deployable hello-world Flutter template skeleton 2026-08-25 16:17:27 +02:00
pubspec.google.yaml chore: release 0.5.0 — version bump, bilingual release notes, store changelogs 2026-09-18 22:11:28 +02:00
pubspec.lock feat: implement button url for definition 2026-09-16 16:12:21 +02:00
pubspec.yaml chore: release 0.5.0 — version bump, bilingual release notes, store changelogs 2026-09-18 22:11:28 +02:00
README.md feat: change package name 2026-09-19 13:57:48 +02:00
RELEASE_NOTES.md chore: release 0.5.0 — version bump, bilingual release notes, store changelogs 2026-09-18 22:11:28 +02:00

MotsDeMinuit

A daily word game with one shot a day. Once a day you receive 16 letter tiles — every letter carrying its Scrabble-like value (14) — and 3 daily challenge cards. Assemble any word from the tiles, each usable only once: your base score is the total value of the tiles your word consumes, and every satisfied challenge card adds its bonus on top. Compete solo against yourself week after week, or head-to-head with friends in rooms that play their own daily puzzle.

Two pillars define the experience:

  • Determination — everyone (solo world-wide, or a room) solves the same puzzle on the same day; fairness, sharing and bragging come for free.
  • One shot a day — you cannot replay today's game. Once you submit, the day is closed and your result (and, in a room, everyone else who has also submitted) is immediately visible — daily FOMO and instant reflection.

The daily puzzle is generated deterministically from date + seed (pure, offline), so the board builds with no server round-trip and results are verifiable. Solo uses a global seed; each room carries its own seed, so every member plays the identical board.

This repo is built on a deployable Flutter template — everything needed to ship to Google Play and F-Droid is already wired in, so development starts from a working, buildable project.

What you get

  • Two build flavours from one codebase
    • FOSS (F-Droid) — the default pubspec.yaml + lib/main.dart. No Firebase, no analytics, no crash reporting (the ports are no-ops).
    • Play (Google Play) — pubspec.google.yaml + lib/main_play.dart with Firebase Analytics, Crashlytics (and Remote Config ready).
  • Localizationflutter gen-l10n ARB pipeline (French first, per the game plan), with a completeness gate.
  • Google Play — Fastlane lanes, per-locale store metadata, icon, feature graphic and screenshots.
  • F-Droid — recipe in fdroid/metadata/ and reproducible reference-build tooling in tool/.
  • Tests — widget smoke test, F-Droid/Play flavour pin, l10n completeness, and a store-screenshot generator.
  • Builds & device flowsjustfile recipes for the Linux desktop build, Android (phone) install, Waydroid adb device, logs, analysis.

Quick start

flutter pub get
flutter run            # any connected device or desktop target
just test              # quality gate (tests)
just analyze           # static analysis
just l10n-check        # translation completeness

Release builds:

just apk-foss          # FOSS APK (F-Droid reference)
just apk-play          # Play APK (Firebase)
just aab-foss          # FOSS App Bundle
just aab-play          # Play App Bundle (Google Play)
just screenshots       # regenerate store screenshots
just store-upload      # upload the Play listing (needs PLAY_SERVICE_ACCOUNT_JSON)

Architecture

The game is developed with domain-driven design and test-driven development (see AGENTS.md). Features live under lib/features/<feature>/ split by layer:

lib/features/<feature>/domain/          ports, entities, value objects — pure Dart, no Flutter/plugin imports
lib/features/<feature>/infrastructure/ adapters implementing the ports — plugins, storage, platform channels
lib/app/                                composition root (bootstrap, theme)

Dependencies point inward only: presentation → application → domain ← infrastructure. The UI and adapters depend on the domain ports, never on a concrete SDK. The FOSS build wires no-op adapters; the Play build wires the real ones via bootstrap_play.dart.

The full product plan (game mechanics, screens, milestones, tech stack) lives in plans/high-level-plan.md.

Making it yours

  1. Rename the package id com.gixita.motsdeminuit everywhere: pubspec.yaml, pubspec.google.yaml, android/app/build.gradle.kts (namespace + applicationId), AndroidManifest.xml, the F-Droid metadata file name + Repo:/Builds:, and fastlane/Appfile + Fastfile package_name.
  2. Register your own Firebase project and run flutterfire configure (regenerates lib/firebase_options.dart and android/app/google-services.json). firebase_options.dart is tracked (the client API key is public — it is embedded in the APK, so it is not a secret); google-services.json stays gitignored (regenerated per environment). The Play build needs this step before it can be built.
  3. Replace the hello-world UI in lib/ with your app.
  4. Write your own store text (fastlane/metadata/android/<locale>/*.txt) and screenshots (just screenshots).
  5. Point the release tooling (tool/fdroid-reference-build*.sh, docs/*, the fdroid recipe) at your repo.

Documentation

The full build, release and distribution docs live in docs/:

Dictionary data & attribution

The French and Dutch dictionaries that power word validation, conjugation tags and the challenges are derived from the French Wiktionary and the Dutch Wiktionary (CC BY-SA 4.0), with usage frequencies from the OpenSubtitles 2018 corpus for both languages (via FrequencyWords, CC BY-SA 4.0). Both datasets explicitly allow commercial use; in return, the derived word lists are published under the same licence and the sources are credited in-app. The official statement — sources, licences and the ready-to-paste credit for the « À propos » screen — is docs/attribution.md. The extraction tooling (uv + Python 3.14) and its documentation live in dictionnaire/; source dumps are machine-local and regenerable, so they stay out of version control.

License

GPL-3.0 — see LICENSE. The bundled dictionary data is CC BY-SA 4.0 — see docs/attribution.md.