• v2.7.0 cc9fb4e266

    Emily released this 2026-11-04 21:03:26 +01:00 | 27 commits to main since this release

    Universal Gaming 2.7.0

    Password-manager autofill

    • Web: uses the browser Credential Management API. A Fill password
      action appears on the sign-in card, and the first tap in a field asks the
      browser for a saved credential. Successful sign-in offers to store the
      credential again.
    • iOS/Android: username, e-mail and password fields expose native autofill
      hints and trigger the platform save prompt. Android also uses Digital Asset
      Links so credentials saved for https://games.emilyh.de are available to the
      app.
    • iOS associated domains: the app carries applinks and webcredentials
      entitlements. The web image serves the matching
      apple-app-site-association file when built with APPLE_TEAM_ID.
    • Android App Links open every https://games.emilyh.de URL in the app.
    • iOS Universal Links are enabled, including the /account route, once the
      app is signed with a team ID that matches the served association file.
    • The web build uses clean URLs (/account) and routes deep links to the
      account screen.

    Backend update safety (backend 1.3.0)

    • Ordered, idempotent PostgreSQL migrations tracked in schema_migrations.
    • update.sh takes a pre-update pg_dump backup, rebuilds, runs
      node src/migrate.js, then starts the services.

    Downloads

    • UniversalGaming-2.7.0-android.apk / .aab
    • UniversalGaming-2.7.0-ios-unsigned.ipa (re-sign before installing)
    • UniversalGaming-2.7.0-macos.dmg
    • UniversalGaming-2.7.0-web.zip
    • SHA256SUMS.txt
    Downloads
  • v2.6.1 6f5f55c458

    Emily released this 2026-11-04 17:41:43 +01:00 | 31 commits to main since this release

    Universal Gaming 2.6.1

    Password-manager autofill is fixed across the web, Android, iOS and desktop builds.

    • Sign-in fields now expose standard username, e-mail and password autofill hints, disable autocorrect/suggestions, and trigger the platform save prompt after a successful sign-in or registration.
    • Android declares Digital Asset Links and App Links for https://games.emilyh.de and includes the asset_statements metadata, so Android password managers can share credentials saved on the website.
    • iOS now carries the webcredentials:games.emilyh.de associated-domain entitlement. A signed build can use it once the web deployment serves /.well-known/apple-app-site-association generated with your Apple Team ID (APPLE_TEAM_ID=...). The unsigned IPA cannot use associated domains.
    • The bundled Nginx and Caddy configs serve /.well-known files exactly and never fall back to the Flutter SPA.

    Downloads

    • UniversalGaming-2.6.1-android.apk — universal release-signed APK
    • UniversalGaming-2.6.1-android.aab — Google Play bundle
    • UniversalGaming-2.6.1-ios-unsigned.ipa — unsigned iOS build
    • UniversalGaming-2.6.1-macos.dmg — ad-hoc signed macOS app
    • UniversalGaming-2.6.1-web.zip — static web build
    • SHA256SUMS.txt

    See INSTALL.md and WEB_HOSTING.md for details.

    Downloads
  • v2.6.0 a4f61a08d4

    Emily released this 2026-11-04 16:12:11 +01:00 | 35 commits to main since this release

    Universal Gaming 2.6.0

    Chess

    • Computer opponent is now the default. A depth-2 alpha-beta search replies after a short delay without blocking the UI.
    • Local two-player and online by username remain available from the game-mode sheet.
    • Online matches require a free account: challenge by username, accept/decline/cancel, play, resign. Moves are validated by the backend with chess.js; the app polls for the opponent's move.
    • Move history moved to the upper-right header icon.

    Accounts

    • Register with an optional e-mail address, or sign in with either username or e-mail.
    • Add, change or remove an e-mail from Account settings.
    • Optional confirmation e-mail with resend support. Unverified accounts still work; the app shows the status.
    • Existing accounts, UUIDs and local game data are unchanged.

    Controls and polish

    • Sudoku action buttons use a two-row layout on phones with larger tap targets.
    • Hub, onboarding, help and privacy copy updated for computer/online chess and e-mail accounts.
    • Fixed a narrow-screen overflow in the hub hero features.

    Backend

    Requires Universal Gaming Backend 1.2.0 for online chess and e-mail features:
    https://git.emilyh.de/Emily/UniversalGamingApp-Backend/releases/tag/v1.2.0

    Downloads

    Platform File
    Android UniversalGaming-2.6.0-android.apk / .aab
    iOS UniversalGaming-2.6.0-ios-unsigned.ipa (re-sign with Sideloadly/AltStore)
    macOS UniversalGaming-2.6.0-macos.dmg
    Web UniversalGaming-2.6.0-web.zip

    Prebuilt web container: git.emilyh.de/emily/universal-gaming-web:2.6.0 (also :latest).

    SHA256SUMS.txt is attached. The hosted web build is live at https://games.emilyh.de. The default account server https://account.games.emilyh.de is running backend 1.2.0 with online chess and e-mail login enabled.

    Verification

    • flutter analyze: clean
    • flutter test --concurrency=1: 216 tests passing
    • APK signature verified with the release certificate
    • DMG verified; web and IPA ZIPs tested
    Downloads
  • v2.5.0 dfeb36bd2f

    Emily released this 2026-11-04 15:18:45 +01:00 | 36 commits to main since this release

    Competitive leaderboard

    • The leaderboard now opens in Competitive mode by default and shows the global top five per game and mode.
    • Viewing is public; submitting a score requires a free account and happens automatically after a solo game while signed in.
    • If the server is unreachable, disabled, or you are offline, the screen falls back to the on-device board and explains why. Switch to Local to keep every result on this device.
    • Local results are always saved first, so a network failure never loses a score. Signed-in competitive results are also uploaded in the background.
    • Chess remains local two-player and is not ranked.

    Backend 1.1.0

    • New public leaderboard endpoints, best-score retention, ranking and rate limits.
    • LEADERBOARD_ENABLED can disable competitive scores server-side.
    • Reorganized Docker Compose setup and update.sh for easy git pull upgrades.

    Other

    • Account and onboarding copy now explains that only username and score metadata are uploaded when using the competitive board.
    • Updated documentation for local/competitive privacy, leaderboard API and backend upgrades.
    Downloads
  • v2.4.0 7b3a1c2bb2

    Emily released this 2026-11-04 14:14:34 +01:00 | 38 commits to main since this release

    Universal Gaming 2.4.0

    New

    • Local leaderboard for every solo game. Results are ranked by time, then moves, stored on-device and never uploaded. Open it from the new Leaderboard card on the hub.
    • Built-in How to play sheets for all eleven games, available from each hub card and from the in-game help button. Each sheet covers the goal, rules, controls and tips.
    • TriPeaks card series — a played card now becomes the new waste top, so you can chain ascending and descending ranks until no option remains. The UI shows the current series, and the result records your best series.

    Fixed game logic

    • TriPeaks now correctly supports full ±1 series instead of only one card per draw. Ace/King wrap-around remains supported.
    • Pyramid no longer reports game over when a King on the waste pile can still be removed with an empty stock.
    • Spider now rejects mixed-suit multi-card runs; single cards can still move onto any descending card.

    Notes

    • Version 2.4.0+10.
    • Existing saved games, stats and accounts keep working.
    • Chess is local multiplayer and is not ranked; the leaderboard screen explains this.
    Downloads
  • v2.3.1 6e4c83911e

    Emily released this 2026-11-04 12:58:25 +01:00 | 39 commits to main since this release

    Universal Gaming 2.3.1

    Security update from the November 2026 review.

    • Flutter 3.47.9 / Dart 3.13.7 — fixes GHSA-frr6-h895-5pxp (high), the eMudhra intermediate-CA TLS MitM issue affecting dart:io on Android, Windows and Linux. Rebuild native binaries with this SDK or newer.
    • External links are restricted to HTTP(S). Changelog, release and footer links can no longer launch javascript:, file:, data: or other schemes.
    • Unencrypted account servers show a warning in Account settings when the URL uses HTTP outside localhost/emulator addresses.
    • Web deployment headers — the bundled Nginx and Caddy configs now add X-Content-Type-Options, X-Frame-Options, Referrer-Policy and Permissions-Policy.
    • Version 2.3.1+9.

    All games and offline generation are unchanged. Existing saved games and accounts keep working.

    Downloads
  • v2.3.0 688894d8d1

    Emily released this 2026-11-04 12:10:40 +01:00 | 40 commits to main since this release

    Universal Gaming 2.3.0

    • Account server connection test in Account settings. Enter or change a server URL and tap Test connection to verify it before signing in; the result shows the backend version and database.
    • PostgreSQL-backed accounts in the self-hosted backend (1.0.2). Docker Compose now starts PostgreSQL 16 with a persistent volume and health check; SQLite remains for local development and tests.
    • Transaction logging — every database operation is printed as a [db] line in docker compose logs.
    • GET /healthz now reports the active database backend.
    • Version 2.3.0+8.

    All eleven games, Killer Sudoku, and offline generation are unchanged. Existing accounts keep working through the same API.

    Downloads
  • v2.2.0 1e229489b4

    Emily released this 2026-11-04 11:46:05 +01:00 | 41 commits to main since this release

    Highlights

    • Killer Sudoku is here. Dashed cages add up to their target and never repeat a digit. Five difficulties, notes, hints, undo/redo, resume support, separate records and a cage-aware conflict highlighter.
    • Height-aware scaling in every game. Card tables, Mahjong, Pyramid, TriPeaks, Minesweeper, Chess and both Sudoku variants now size from the shorter viewport edge, so phone landscape and split-screen windows no longer waste space or clip boards.
    • Mahjong tile labels now scale down cleanly instead of overflowing on small tiles.
    • Account server default is now https://account.games.emilyh.de.
    • Backend default port is now 6767 (Accounts 1.0.1).
    • Docker web frontend now serves on port 6969 by default, with an included Compose file.

    Fixes and polish

    • Hub now lists eleven games and the onboarding copy is updated.
    • Landscape layout tests added for every game at phone, tablet and desktop sizes.
    • Killer Sudoku generation is verified to produce exactly one solution per puzzle, with complete cage coverage and valid sums.
    • 177 Flutter tests pass; flutter analyze reports no issues.

    Downloads

    • UniversalGaming-2.2.0-android.apk — universal release-signed Android build
    • UniversalGaming-2.2.0-android.aab — Google Play bundle
    • UniversalGaming-2.2.0-ios-unsigned.ipa — unsigned, re-sign with Sideloadly/AltStore
    • UniversalGaming-2.2.0-macos.dmg — universal macOS build
    • UniversalGaming-2.2.0-web.zip — static web build
    • SHA256SUMS.txt — checksums for all artifacts

    Accounts backend: https://git.emilyh.de/Emily/UniversalGamingApp-Backend/releases/tag/v1.0.1

    Downloads
  • v2.1.1 34f6e95f22

    Emily released this 2026-11-04 11:00:25 +01:00 | 42 commits to main since this release

    Universal Gaming 2.1.1

    A small patch release for safe, platform-specific update downloads.

    Fixed

    • Windows no longer offers the web ZIP as a native update. It only offers a
      release asset whose name contains windows, otherwise it opens the release
      page.
    • Linux only offers a linux .tar.gz asset, otherwise it opens the release
      page.
    • Android and macOS still select the APK and DMG directly.

    This is the release to use if you build the app from source on Windows or
    Linux. Everything else from 2.1.0 is included: startup update checks, the
    changelog button, the web footer and outdated-build notice, optional
    self-hosted accounts with stable UUIDs, the account page, and iPad support.

    Accounts backend

    https://git.emilyh.de/Emily/UniversalGamingApp-Backend

    Docker Compose, SQLite persistence, bcrypt hashes, JWT sessions, rate limiting,
    CORS and a release proxy. Build the app with:

    flutter build apk --release \
      --dart-define=UNIVERSAL_GAMING_API_URL=https://accounts.example.com
    

    Downloads

    File Platform
    UniversalGaming-2.1.1-android.apk Android 7.0+ (universal, release-signed)
    UniversalGaming-2.1.1-android.aab Google Play upload
    UniversalGaming-2.1.1-ios-unsigned.ipa iOS 15+ (re-sign with Sideloadly/AltStore)
    UniversalGaming-2.1.1-macos.dmg macOS 12+ (universal, ad-hoc signed)
    UniversalGaming-2.1.1-web.zip Static web build

    SHA256SUMS.txt contains the SHA-256 digest of every artifact. Windows and
    Linux builds remain source-only; use the build commands in INSTALL.md.

    Notes

    • Existing installs skip onboarding automatically.
    • The iOS IPA is unsigned; no Apple distribution identity is available.
    • The macOS app is ad-hoc signed and not notarized. Use Open Anyway on
      first launch.
    • Games work offline. Network access is used only for update checks and the
      account server you explicitly configure.
    Downloads
  • v2.1.0 cc4481b6d6

    Emily released this 2026-11-04 10:48:18 +01:00 | 44 commits to main since this release

    Universal Gaming 2.1.0

    Ten offline games, now with update checks, a changelog, and optional
    self-hosted accounts.

    What's new

    • Update checks — the app checks the public release feed on startup. The
      changelog button in the upper-right corner opens release notes, the release
      page, and a platform-appropriate download link (APK, DMG, ZIP, or package).
    • Changelog tooltip — the button shows a red dot and an
      "Update available" tooltip when a newer release exists.
    • Web footer — every hosted build links to the source repository and shows
      an "outdated hosted build" notice when latest.json reports a newer version.
    • Optional accounts — username/password accounts on your own server.
      Accounts use stable UUID identities, so renaming never changes the account.
      Account creation is offered during onboarding but is never required.
    • Account page — sign in or create an account, copy the UUID, rename the
      account, change the server URL, sign out, or delete the account.
    • iPad ready — the iOS target is universal (iPhone + iPad) with all four
      iPad orientations and layout tests at iPad portrait and landscape sizes.
    • Network permission — Android now declares INTERNET; macOS adds the
      network-client entitlement. Games still work fully offline.

    Accounts backend

    The backend is a separate repository:

    https://git.emilyh.de/Emily/UniversalGamingApp-Backend

    It ships with Docker and Docker Compose, SQLite persistence, bcrypt password
    hashing, JWT sessions, rate limiting, CORS configuration, and a release proxy.
    The README documents every environment variable, reverse-proxy examples,
    backups, and curl examples.

    Build the app with your server URL baked in:

    flutter build apk --release \
      --dart-define=UNIVERSAL_GAMING_API_URL=https://accounts.example.com
    

    Or leave it unset and configure Account → Account server at runtime.

    Downloads

    File Platform
    UniversalGaming-2.1.0-android.apk Android 7.0+ (universal, release-signed)
    UniversalGaming-2.1.0-android.aab Google Play upload
    UniversalGaming-2.1.0-ios-unsigned.ipa iOS 15+ (re-sign with Sideloadly/AltStore)
    UniversalGaming-2.1.0-macos.dmg macOS 12+ (universal, ad-hoc signed)
    UniversalGaming-2.1.0-web.zip Static web build

    SHA256SUMS.txt contains the SHA-256 digest of every artifact.

    Windows and Linux builds are source-only in this release; the build commands
    are in INSTALL.md.

    Notes

    • Existing 2.0 installs skip the new onboarding screen automatically.
    • The iOS IPA remains unsigned because no Apple distribution identity is
      available. See INSTALL.md for signing options.
    • The macOS app is ad-hoc signed and not notarized. Use Open Anyway on first
      launch.
    • Passwords are sent only to the account server you configure, over HTTPS, and
      stored as bcrypt hashes. There is no telemetry, advertising SDK, or gameplay
      upload.
    Downloads