eigen_flutter 0.3.6
eigen_flutter: ^0.3.6 copied to clipboard
EigenInteractive Flutter client: the whitelabel app half for turn-based multiplayer games on the EigenInteractive server.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Entries are maintained with cider; add them
as you work (cider log added "…"), and cider release moves everything under
## [Unreleased] into a dated section at release time.
Pre-1.0, breaking changes land in a MINOR bump: ^0.1.0 resolves to
>=0.1.0 <0.2.0. See
Versions and compatibility
for how this package, the engine and the generated eigen_api client pair up.
0.3.6 - 2026-08-08 #
Changed #
- Em dashes are gone from every line this package writes, including the strings a player reads: 'The game updated. Try again.', the notification-permission rows in settings, and the in-progress replay notice. Comments, docs, the example game, the workflows and the changelog itself went with them.
0.3.5 - 2026-08-07 #
Changed #
configure_firebasechecks that a Google account is signed in to the Firebase CLI before it starts, and namesfirebase loginwhen none is. Those are the credentials both CLIs share, and previously the one preflight failure FlutterFire was left to discover for itself. The check fails open: only an answer that positively reports no accounts stops the run.- A successful run names the Firebase project and the Android and Web app IDs it configured against. FlutterFire matches an existing Android app on the package name and an existing Web app on its display name, and reuses either without comment, so adopting the apps a project already had looked identical to registering new ones, and now does not.
- The Web SDK configuration is downloaded quietly. It is an intermediate (read, checked, rewritten as
web/firebase-config.js, then deleted) so the Firebase CLI's own success line announced a temporary file that no longer existed by the time anyone read it. A failing download still prints everything it said.
0.3.4 - 2026-08-07 #
Changed #
- The credit line defaults to
Built with EigenInteractive, matching the game's own website, and renders as prose with only the brand name linked, accent-coloured and without an underline. ABranding.madeByCreditthat never names the engine stays plain text. The settings and about screens now share oneMadeByCreditwidget instead of the same footer written twice.
Fixed #
configure_firebaseno longer fails withFirebaseProjectRequiredExceptionon a first run:--yesis only passed once the Firebase project is settled, so an unconfigured run gets FlutterFire's project picker, where a project can also be created, instead of a hard stop. The project can be named with--project <id>, and is otherwise read back from thefirebase.jsona previous run wrote or a.firebaserc, so re-runs stay non-interactive.--account <email>is accepted for a machine signed in to several Google accounts,--helpprints the usage, and a bare--is ignored sorun firebase:configure -- --project xworks under both npm and pnpm. Every other option is refused with a usage error rather than passed to FlutterFire: platforms in particular are fixed at Android and Web, which are the platforms the app has and where the messaging service worker's configuration comes from.
0.3.3 - 2026-08-07 #
Changed #
- Bundle Inter and Space Grotesk as single variable files instead of nine static Inter weights, and pair them across the Material 3 text roles: Space Grotesk on display and headline, Inter on everything read at length.
Branding.displayFontFamilyoverrides the display face andBranding.seedColornow defaults to the EigenInteractive teal, so a game looks deliberate before anyone has configured it and is one line to rebrand. Font payload drops from 2.7 MB to under 1 MB while gaining a family, becauseFontWeighthas driven thewghtaxis since Flutter 3.41 and this package requires 3.44.tool/download_fonts.sh, which fetched static weights from gstatic by content hash, is gone.
0.3.2 - 2026-08-07 #
Changed #
configure_firebasechecks forflutterfireandfirebasebefore it starts, and names the one that is missing with the command that installs it. It previously pointed at both CLIs without saying how to get either, and only after FlutterFire had already written its files.
0.3.1 - 2026-08-06 #
Changed #
- Use EigenInteractive as the product name in the package description, README, dartdoc and the default
madeByCreditcredit line. No API changes; the generated payload header comment now readsGenerated from the game-owned EigenInteractive contract., so a game runninggenerate_payloads --checkneeds one regeneration.
0.3.0 - 2026-08-05 #
Changed #
- Breaking for apps that customised the Firebase notification meta-data.
The manifest merger treats two
<meta-data>entries with the sameandroid:nameand differentandroid:valueas a conflict and fails the build. An app that declarescom.google.firebase.messaging.default_notification_channel_idordefault_notification_iconwith a value other thanyour_turn/@drawable/ic_notificationmust now either drop its copy, since this package supplies both, or keep it and addtools:replace="android:value"(orandroid:resource) to that element. Declaring the same values as this package needs no change.
Fixed #
- Notifications no longer need a hand-created icon. This package referenced
@drawable/ic_notificationfrom its Dart while its Android plugin shipped no resources at all, so the icon only resolved in apps that happened to create that drawable themselves. The plugin now ships it, together with the Firebase default-channel and default-notification-icon meta-data. An app overrides the silhouette by declaring the same resource name; Android resource merging gives the application module precedence over a library.
0.2.0 - 2026-08-03 #
Changed #
eigen_apimoved to^0.2.0, following the engine to its 0.2.x release line. No Dart API changed. The 0.2.0 spec is byte-identical to 0.1.0's apart from the version stamp, and 0.2.0 of the engine was a TypeScript-side cleanup, but a consumer cannot depend on this package andeigen_api 0.2.0at the same time until this ships, so it is a breaking change to the constraint rather than a patch.
0.1.0 - 2026-08-02 #
Initial release. The entries below describe the starting state rather than changes from a previous version.
Added #
configure_firebase, which runs FlutterFire and generates the messaging service worker's public Web configuration from the selected Firebase app.runEngineApp(...)entry point, withAppConfig/EngineConfig/Brandingas the composition-root config. The framework reads every runtime value fromEngineConfigand never from the app'sEnv, so this package needs no Firebase project or.envof its own.Branding.madeByCredit, so the settings footer credit is configurable.- The
GameModule/GameRulescontract: a game supplies one rules unit perschemaVersion, and the framework dispatches on the version a game was created at. - Client-side optimistic preview (
previewAction) and cue-aware rendering against the engine's append-only observation history. - Generated wire enums preserve values introduced by a newer server as an
unknownDefaultOpenApisentinel instead of failing response decoding. Known values retain their specific UI; unknown values degrade to generic UI when safe, while gameplay-critical values block only the affected surface and offer a native Play update on Android or a browser reload on web. - Firebase auth (Google + guest), FCM push, Crashlytics and Analytics wiring. Auth and notification capability share one required Firebase project; the player permission prompt remains an explicit opt-in and delivery remains best-effort.
- Avatar upload and display against the worker-served avatar URL, via
cached_network_image. - Rock–Paper–Scissors under
example/: a complete game, and the worked answer to "how do I test a game screen". Itsfixtures/v1/rps.jsonis the Dart half of a twin-fixture contract the engine repo checks from the other side. - Inter bundled as a package font (all 9 weights under
fonts:), so consuming apps get it automatically and it renders offline from the first frame.AppThemereferencespackages/eigen_flutter/Inter.
Changed #
- Public app deployment values now use Dart compilation environment
declarations and one cross-platform
app-config.json; startup reports missing or malformed required values before initializing engine services. - Persisted Riverpod API snapshots are native-only. Web keeps provider data for the browser session and refetches after reload, while preferences, Firebase Auth, and notification bookkeeping retain their own browser persistence.
- FCM registration now uses Firebase Installation IDs end-to-end. Web calls
Firebase's current
registerAPI through a narrow compatibility adapter; Android uses native FID auto-registration configured by the package's Android plugin, so consuming apps do not edit their generated manifest or Gradle properties. The app no longer requests, refreshes, or persists deprecated registration tokens. - Notification opt-in is a contextual non-modal card for seated multiplayer players. The platform permission state drives the UI directly; blocked users get an explicit Settings recovery path.
- The backend is the Eigen engine on Cloudflare Workers, not Supabase. The
data layer talks to the Worker over REST and WebSocket; the transport half is
the generated
eigen_apiclient, published from the engine repo at the engine's own version and consumed here as an ordinary versioned dependency. There is no vendored OpenAPI spec and no local codegen for it. - Riverpod toolchain moved to the 3.3.2 line (
flutter_riverpod ^3.3.2,riverpod_annotation ^4.0.3,riverpod_generator ^4.0.4,riverpod_lint ^3.1.4,riverpod_sqflite ^0.4.3) so the engine resolves the same riverpod core consuming apps do; generated code must be built against the core the app compiles against, and riverpod 3.3.x changedNotifier.runBuild's signature.
Removed #
- The Supabase stack in full:
supabase_flutter, the vendoredsupabase/{migrations,functions,seed.sql,config.toml}, thesync_supabaseCLI that copied it into consuming apps, and theupdate-ratings/refresh-fcm-tokenedge functions. Ratings, notifications and every other server-side concern now live in the engine. google_fonts, which fetched Inter at runtime, replaced by the bundled package font above.