Changelog
4.1.1 (1) — 2026-09-01
User-Facing Changes
- VoiceOver: tapping a board tile now announces its letter and point value, double-tapping announces it was added to your word, and completing a word announces its score — with a beat of breathing room before the next tile's announcement. Fixed VoiceOver going silent when focusing a tile, and a bare letter like "H" being mispronounced ("Cap H"). Voice Control can now dictate letters directly ("tap H"), tap Apply/undo letters by voice, and no longer offers buried, unreachable tiles as candidates.
- New in-app "What's New" screen shows what changed after an update, for everyone (not just testers) — pulled from the same curated notes as this changelog. TestFlight's "What to Test" is now generated from these notes too, instead of being retyped by hand for every build.
- Restyled the "I can't find a word!" nudge as a proper "Hint" button.
- Fixed a Duel/Challenge share sometimes naming the challenger "iPhone" instead of their actual name.
- New Premium trial welcome messaging, plus a softer, backed-off upsell nudge instead of repeating the same prompt.
- Leaderboard score submissions no longer get silently lost if Game Center authentication hadn't finished yet — they're queued and retried once it completes.
- Fixed "Zoom to Fit" resetting to a width-only fit instead of the actual deal-time zoom level (iOS and web).
- Stats screen simplified: shows finished games only, dropped average time and best/worst extremes.
- The App Store review prompt now fires on a genuine personal best, not just any top-10 finish.
- Simplified the Languages settings screen.
- Lexitaire Web (the PWA): new daily streak badge next to Score, matching the native app. Removed the tray's redundant "Tap tiles to spell a word" placeholder. Added a persistent DreamHost banner to the bottom chrome, and fixed it overlapping Full Bag's "more tiles" indicator.
Infra Changes
- Added `tools/extract-release-notes.py` and wired it into both the in-app "What's New" build step and fastlane's TestFlight upload, so both read from the same hand-curated CHANGELOG.md section.
- Wired the shared Rust core into the sim-free Package.swift target too.
- Added TelemetryDeck/GA4 events for the review prompt and game-started.
4.1.0 (23) — 2026-08-30
User-Facing Changes
- Game Center integration is now opt-in and off by default (Settings). New Achievements screen with GameKit streak achievements, word-score achievement tiers, an expanded streak ladder, and new Bilingual/Polyglot ladders for cross-language words. New Leaderboard menu entry, including a new Game Center leaderboard for Full Bag (English).
- Give-up/hint controls are now an always-visible help button instead of timer-gated; hints are down to just "Reveal Next Letter," and the "Stumped?" nudge is interactive and mentions it directly.
- Fixed rewarded-ad hints sometimes getting stuck after "Reward granted" instead of applying — they now grant on ad dismissal.
- Settings reorganized again: General split into General/Privacy, plus a new dedicated Notifications screen. Fixed the "Ad Privacy Options" button doing nothing when tapped.
- New Animation Speed setting (Settings → General) to control tile animation pace.
- New opt-in streak reminder notification (Settings → General), and fixed it never actually firing (it was self-cancelling every time the app backgrounded).
- New way to turn off the "screenshot taken" prompts.
- Fixed Top Scores defaulting to a settings guess instead of the game actually on screen (#566).
- Wired up Google's ad-consent flow (UMP) before requesting any ads.
Infra Changes
- Bumped fastlane to 2.238.0.
- Added an orientation-changed TelemetryDeck event on native.
- Documented the deploy_metadata "forbidden" error for brand-new App Store Connect locales.
- Added `just testflight-build`/`just testflight-upload` + `tools/asc-credentials.sh`, driving the archive/upload/What-to-Test flow through fastlane instead of Xcode's Organizer by hand.
4.1.0 (19) — 2026-08-26
User-Facing Changes
- Fixed a bug (#536) where quickly tapping a tray tile to undo a just-placed letter could sometimes add another letter instead of undoing it. Try it: tap a board tile to add it to your word, then quickly tap that same tile in the tray to undo it — including fast back-to-back taps — and confirm it always undoes correctly.
- New "Show Taps" setting (Settings → General) draws a dot wherever you tap on screen — handy for reporting any other tap-related glitches precisely, since a screen recording with it on shows exactly where your finger landed.
- Hints: using a hint now reliably shows a "Watch an Ad for a Hint?" dialog (Cancel or Watch Ad), the hint actually applies once the ad closes instead of occasionally getting stuck, and you still get the hint for free if no ad is available rather than being blocked. The separate full-screen interstitial ad between games is gone — just the bottom banner and this rewarded ad remain.
- A game's total time no longer counts time spent away from the board — backgrounding the app or having a menu/dialog open (Settings, My Games, New Game, etc.) no longer inflates it. The end-of-game results screen also now shows when the game started. Try it: start a game, background the app (or open Settings/My Games) for a while, come back, and finish it — the final time should reflect only time actually spent on the board.
4.1.0 (17) — 2026-08-14
User-Facing Changes
- New "Full Bag" board size: every tile in the language's letter bag on one board. It supports pinch-to-zoom (with a "Zoom to Fit" reset button), and starts already zoomed out enough to show every column instead of clipping the board. Try dealing a Full Bag board and pinching in/out.
- Fixed a bug where finishing the last word could leave the header showing a stale "N words remaining" count underneath the "No words left" dialog — it now correctly clears once the board is actually exhausted.
- Settings is now split into General / Appearance / Gameplay submenus instead of one long list of a dozen-plus rows.
- The Share dialog is back down to a single "Share…" button — the extra Recent Opponents/Choose Contact/Show QR Code picker was redundant with what the system share sheet (and Messages) already offer on their own.
- Lexitaire Web (the PWA): New Game's "still has playable words?" confirmation now also offers "See the words I missed," the same reveal the native app already has.
- New "Release Notes" row in Settings, always available (not just to testers), linking to this changelog.
Infra Changes
- Fixed the "Embed Git Info" Xcode build phase silently skipping itself on non-clean builds (Xcode's dependency-analysis caching turned out to be unreliable for git's own file timestamps) — this had been the reason the in-app "What's New" screen sometimes showed no commits.
- Replaced that in-app commit list with this hosted, hand-curated changelog process going forward.
- Fixed a stale dev-only board-solving script for the new Full Bag board size.
4.1.0 (16) — 2026-08-14
User-Facing Changes
- You can now delete in-progress games from My Games — swipe on a duel, team, solo, or challenge match to remove it. The match you're currently playing is protected from deletion here; end it in-game instead. Try it: swipe on an old match in My Games and confirm it's removed, and that your currently open game can't be swiped away.
- Starting a Duel or Team match now lives in the New Game dialog itself (alongside Board Size and Language) instead of behind the Share button. The Share button is back to its original job — sending your board to a friend to compare scores — with its QR code now behind a "Show QR Code" button instead of always showing. Try it: open New Game and pick a Game Mode; separately, try Share on an in-progress game.
Infra Changes
- Fixed the in-app "What's New" screen showing no commits for a build that had already been tagged as shipped.
- Fixed a UI test that had been failing on every PR since the countdown clock's accessibility label changed.
- Stopped uploading large UI-test result bundles as CI artifacts after hitting GitHub's storage quota.
4.1.0 (15) — 2026-08-13
User-Facing Changes
- The current-word tray got a full visual redesign: a mahogany wood tile rack with a raised front lip below the tiles, a recessed groove, and legible text against the darker background. Take a look at the tray and confirm it reads as a solid 3D rack, not just a flat bar.
- New accessibility setting: Settings → Accessibility → Large Tiles renders tiles at a fixed, comfortably large size instead of always shrinking to fit a big board — the board scrolls to reach anything that doesn't fit on screen. Try it on a large board size.
- Big VoiceOver/Voice Control pass: empty board slots no longer show up as unlabeled buttons while swiping through the board, tiles announce their point value and why they can't be tapped, and applying or misplaying a word is now announced out loud. Reduce Motion also now collapses the tile-fly animation to a quick fade. Worth a VoiceOver pass: swipe through the board, apply a word, try an invalid word, and toggle Reduce Motion.
- The App Store review prompt is now a custom in-app dialog (asking at your 10th/20th/40th/80th finished game) instead of Apple's native sheet, with three choices: write a full review, just leave a quick star rating, or dismiss — any of which permanently stops future prompts. There's also a direct "Write a Review" row in Settings any time you want it, and a dev/TestFlight-only "Reset Review Prompt" row to see the dialog again without a fresh install.
- The in-app "What's New" screen made its debut this build (the dev/TestFlight build-info row in Settings becomes tappable).
- Switching between in-progress My Games matches no longer double-counts as finishing/starting a game — it shouldn't trigger a stray ad interstitial or review prompt anymore. Try switching between two My Games matches a few times.
Infra Changes
- Build tags are now scoped by marketing version (e.g. `build-4.1.0-16` instead of just `build-16`), since TestFlight build numbers only have to be unique within one version.
- Fixed a flaky UI test around changing the language setting.
4.1.0 (14) — 2026-08-12
User-Facing Changes
- New Premium/TestFlight Hints menu with three hints: dim out letters that can't complete any remaining word, reveal the definition of the best remaining word (without revealing the word itself), or get a pulsing ring pointing at the next letter to play. A one-time warning explains that using any hint excludes that game from Top Scores, and hinted games are now correctly excluded even on-device. Try each of the 3 hints once and confirm the warning and the Top Scores exclusion.
- You can now rename a saved Top Score: after Face ID/Touch ID/passcode, swipe a Top Scores row to rename it, and the new name shows immediately. Try renaming one and confirm it updates without needing to leave and reopen Top Scores.
- My Games now tracks several duel/team matches at once (not just one), plus solo games and Challenge attempts, so starting or receiving a new match no longer silently discards whatever you had in progress. A "My Games" menu entry lists everything active.
- During a duel/team game, a translucent overlay now covers the board saying whose turn it is / that you're waiting on your opponent, instead of just a small text line.
- Starting a Duel or Team match now deals the board and sends your first move immediately — no separate "accept invite" step anymore (the turn itself doubles as the invite, and your opponent can still decline it normally). Try starting a fresh duel and confirm it sends right away.
- New GameKit achievements: one for completing a game, one for scoring 100+ on a single word (no leaderboards yet).
- New opt-out analytics (Settings toggle, on by default) covering games started/finished, words applied, and app launches — never anything that identifies you or the words you played.
- Switching between My Games matches no longer wrongly offers to save your score, since you're not actually ending a game.
Infra Changes
- Internal groundwork: a Rust "core" logic layer and Linux-portability work for the Swift model layer, both invisible to testers for now.
- Fixed a build issue that had silently dropped GameKit support from the build after a merge.
- TelemetryDeck analytics wired up to actually send data instead of silently no-op'ing.
4.1.0 (13) — 2026-08-10
User-Facing Changes
- Four new App Languages: Swedish, Danish, Norwegian (Bokmål), and Finnish, fully translated. Korean was also added, and Russian's translation was completed to full coverage.
- Every language in the App Language picker now shows an English gloss next to its native name (e.g. "Svenska (Swedish)"), not just non-Latin scripts.
- Ads now correctly stop for Premium purchasers everywhere — banner, interstitial, and the carousel ad card. Try buying/restoring Premium and confirm no ads appear anywhere.
- Sending a Challenge, Duel, or Team invite to someone you've contacted before now skips the generic share sheet and goes straight to a contact picker with a pre-filled Messages compose. Try sending to the same contact twice.
- New dev/TestFlight-only "Check TestFlight for Updates" Settings row.
Infra Changes
- CI now reuses an already-booted simulator instead of always cold-booting one, speeding up builds.
- New manual-trigger workflow to push App Store metadata updates via fastlane.
4.1.0 (12) — 2026-08-08
User-Facing Changes
- Duel and Team mode (see 4.1.0 (9) below) are now part of the main build to stay.
- New Premium unlock ($2.99, one-time): unlocks every tile style beyond the wood family, every background texture/photo, and Apple Intelligence word insights. Challenges and Duels stay free for everyone. A purchase made on iPhone or Mac is also recognized on Apple TV. Try opening Settings → Premium and confirm the paywall lists only tile styles, backgrounds, and future iCloud sync/ad removal — not Challenges, Duels, or Insights.
- Google AdMob ads arrive for the first time: a banner card in the insight carousel, and a full-screen interstitial every 3 finished games (iOS only). Note: Premium doesn't yet stop ads in this build — that's fixed in 4.1.0 (13).
- The App Store listing itself is now translated for Arabic, Catalan, Czech, Hebrew, Croatian, and Russian shoppers (store-listing only, not new in-app languages).
Infra Changes
- Ads are suppressed under automated UI testing so the interstitial doesn't break CI.
- Merge/tooling cleanup reconciling several feature branches into one build.
4.1.0 (11) — 2026-08-08
No changes since 4.1.0 (10) — a build-number-only re-upload, no code changes.
4.1.0 (10) — 2026-08-08
User-Facing Changes
- Tapping a played word in Words Played or Top Scores now opens one unified details page in a single tap (previously three separate tap targets). It now also shows a "Played" section (score breakdown, time played), and offers a dictionary-site button for the word's language beyond just Wiktionary (Merriam-Webster/Dictionary.com for English, RAE/SpanishDict for Spanish, and more). Try tapping a played word from Top Scores and Words Played.
Infra Changes
- Fixed a rare data race in the dictionary's definition cache that was causing flaky tests.
4.1.0 (9) — 2026-08-07
User-Facing Changes
- Duel mode (new): two players trade turns on one shared board over a share link — no server involved. Reachable from Share → "Start a duel…".
- Team mode (new): the same turn-by-turn mechanics as Duel, but cooperative — the outcome is framed as a combined team score rather than a winner. Reachable from Share → "Team up…".
- Sending a duel/team turn now shows a rich link preview (board + scores) in Messages instead of a bare URL. Try sending a turn and checking the preview.
Infra Changes
- Added missing translations for the new Duel/Team strings.
4.1.0 (8) — 2026-08-07
The first build of the 4.1.0 cycle — headlined by Lexitaire Web, a new installable browser version of the game.
User-Facing Changes
- **Lexitaire Web** launches: an installable, browser-based version of the game for desktop and Android (English only for now), later extended to iOS with pull-to-refresh and safe-area-aware layout for the notch/Dynamic Island. Visually matches the native app — wood tiles, the same tray and insight carousel, matching sound effects and tile animations.
- The web app gained its own Challenge feature, including scanning a QR code to accept one, and a "Stumped?" nudge toward Give Up after a while of inactivity. Note: unlike native, Give Up on web does qualify for a Top Score — an intentional difference, not a bug.
- Fixed two bugs where the web app could get stuck broken (empty board, unstyled tray, or invisible tile animations) after a new deploy while your browser had stale cached files — it now self-heals by clearing its cache and reloading. Worth a hard refresh mid-session to confirm nothing looks stale/broken.
- New wood-grained app icon on iOS, tvOS, and Mac (previously a flat "L"), plus fixes so the Mac icon actually compiles in and the Mac app is properly named "Lexitaire" (not "WordSpindleMac").
- Word lookups now resolve inflected words (plurals, past tense, etc.) to their real definition instead of just "plural of X", and built-in definitions now work on Mac too, with word-lookup overlays now available on Mac and Apple TV as well.
Infra Changes
- Version bumped to 4.1.0.
- New dev convenience scripts for running on Mac/Apple TV simulators.
- PWA deploy documentation and command fixes.