- Dart 84.8%
- Python 10.2%
- C++ 1.7%
- CMake 1.3%
- Just 1.1%
- Other 0.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
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 |
||
| android | ||
| appimage | ||
| assets | ||
| dictionnaire | ||
| docs | ||
| fastlane | ||
| fdroid/metadata | ||
| ios | ||
| lib | ||
| linux | ||
| macos | ||
| test | ||
| test_driver | ||
| tool | ||
| web | ||
| windows | ||
| .gitignore | ||
| .metadata | ||
| analysis_options.yaml | ||
| firebase.json | ||
| justfile | ||
| l10n.yaml | ||
| LICENSE | ||
| pubspec.google.yaml | ||
| pubspec.lock | ||
| pubspec.yaml | ||
| README.md | ||
| RELEASE_NOTES.md | ||
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 (1–4) — 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.dartwith Firebase Analytics, Crashlytics (and Remote Config ready).
- FOSS (F-Droid) — the default
- Localization —
flutter gen-l10nARB 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 intool/. - Tests — widget smoke test, F-Droid/Play flavour pin, l10n completeness, and a store-screenshot generator.
- Builds & device flows —
justfilerecipes 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
- Rename the package id
com.gixita.motsdeminuiteverywhere:pubspec.yaml,pubspec.google.yaml,android/app/build.gradle.kts(namespace + applicationId),AndroidManifest.xml, the F-Droid metadata file name +Repo:/Builds:, andfastlane/Appfile+Fastfilepackage_name. - Register your own Firebase project and run
flutterfire configure(regenerateslib/firebase_options.dartandandroid/app/google-services.json).firebase_options.dartis tracked (the client API key is public — it is embedded in the APK, so it is not a secret);google-services.jsonstays gitignored (regenerated per environment). The Play build needs this step before it can be built. - Replace the hello-world UI in
lib/with your app. - Write your own store text (
fastlane/metadata/android/<locale>/*.txt) and screenshots (just screenshots). - 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/:
- release.md — the end-to-end release flow.
- google-play.md — Google Play upload.
- fdroid.md — F-Droid inclusion and updates.
- fdroid_reproducible_build.md — why the reference APK is built in a container.
- attribution.md — the official data-attribution statement (see below).
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.