♠ ♥ ♣ ♦
Simply Cribbage

Change Log

Last updated: November 7, 2026 · App version 2.4.1
The short version Every release of Simply Cribbage, newest first, with what actually changed — not just marketing copy. Most releases are small fixes and polish; that's normal for an actively-maintained app.

2.4.1 Easy plays like a beginner, and Restart works any time

November 7, 2026

2.4.0 Launch release: the Gold card back and a steadier welcome tour

October 28, 2026

2.3.77 Steadier toasts, Restart and prompts, and a sharper Coach

October 27, 2026

2.3.76 Stats now follows Prefs during a hand

October 26, 2026

2.3.75 A simpler New Game screen, a pegging fix, and clearer Coaching

October 26, 2026

2.3.74 A Mac scrolling fix, and fun facts that wait for you

October 24, 2026

2.3.73 A welcome tour for new players, and a new icon

October 24, 2026

2.3.72 Softer text edges, and steadier buttons on the Mac

October 23, 2026

2.3.71 A cleaner look, and sounds that follow the Silent switch

October 22, 2026

2.3.70 A cleaner, steadier turn on the iPad

October 21, 2026

2.3.69 Wide screens for About and the guides, and a calmer turn on the iPad

October 20, 2026

2.3.68 The Stats screen uses the room on wide screens

October 20, 2026

2.3.67 The iPad plays in every orientation, its counting boxes get roomier, and two fixes

October 19, 2026

2.3.66 General improvements

October 18, 2026

2.3.65 Skunks get the perfect-29 confetti, the New Game fun facts hold the screen’s timers, and Stats shows pegging and crib averages

October 18, 2026

2.3.64 The Stats screen has a pill for your opponent, and skunks read Won and Lost

October 17, 2026

2.3.63 The “It’s your turn” screen shows the cards in play like the table does

October 17, 2026

2.3.62 Perfect 29s are marked in gold, and the 29 screens are tidied

October 17, 2026

2.3.61 Recent Messages no longer cuts off the hand breakdowns

October 16, 2026

2.3.60 A plainer New Game name box, and a light sweeps across the title

October 15, 2026

2.3.59 The USS Wahoo button links to the Navy’s own article

October 15, 2026

2.3.58 A perfect 29 gets a celebration, and the launch no longer jiggles

October 15, 2026

2.3.57 Raised cards stay clear of the board, and small screens fit better

October 14, 2026

2.3.56 Self Score keypad rework, and small iPad windows fit better

October 13, 2026

2.3.55 iPad: the Self Score keypad is complete on your first count

October 12, 2026

2.3.54 Small-screen polish, and the Game Review shows the difficulty

October 12, 2026

2.3.53 iPad window resizing, and the six-card hand fits small screens

October 12, 2026

2.3.52 iPad pegging board shown in full again

October 11, 2026

2.3.51 The whole game fits on small iPhones; iOS 26 or later

October 11, 2026

2.3.50 Short iPhones keep the message log above the buttons

October 11, 2026

2.3.49 “Swipe down to close” hint stays put; swipe-down no longer closes mid-page

October 9, 2026

2.3.48 Empty count entries no longer count as 0

October 9, 2026

2.3.47 Coaching Mode Play Review, rebuilt advice, and sharper Pro discards

October 2, 2026

2.3.46 Coaching Mode Hint fix and modal polish

October 2, 2026

2.3.45 App Lock setup fix and more Coaching Mode polish

October 2, 2026

2.3.44 Coaching Mode polish

September 29, 2026

2.3.43 Coaching Mode for iPad

September 29, 2026

2.3.42 Pegging pile fix & polish

September 28, 2026

2.3.41 AI counting accuracy tuning

September 28, 2026

2.3.40 Defaults, button states & more fairness fixes

September 27, 2026

2.3.39 Muggins Challenge fixes & fairness

September 27, 2026

2.3.38 Counting screen fixes

September 27, 2026

2.3.37 Reset Stats overhaul, navigation & consistency fixes

September 26, 2026

2.3.35 General improvements

September 25, 2026

2.3.34 Mac App Lock, Muggins fixes

September 25, 2026

2.3.33 Settings simplified

September 24, 2026

2.3.32 New Game screen reliability fix

September 24, 2026

2.3.31 Fixed a card border artifact

September 24, 2026

2.3.30 Native Mac menu bar, Pro Tips guide, and a peg-nudge fix

September 21, 2026

2.3.29 Card Faces renamed, message history always kept

September 21, 2026

2.3.28 General improvements

September 20, 2026

2.3.27 Mac window size, messages width, automation defaults

September 20, 2026

2.3.26 General improvements

September 20, 2026

2.3.25 General improvements

September 20, 2026

2.3.24 Count modal consistency + fairer Muggins

September 20, 2026

2.3.23 Recent Messages now covers the whole game

September 20, 2026

2.3.22 Manual Count and Muggins fixes

September 20, 2026

2.3.21 Correctness fixes following code review

September 20, 2026

2.3.20 Performance pass following code review

September 20, 2026

2.3.19 Layout polish following code review

September 19, 2026

2.3.18 Mac app gets its own native layout

September 19, 2026

2.3.17 Desktop card layout fix

September 19, 2026

2.3.16 Crib modal polish, layout fix

September 18, 2026

2.3.15 Fixed a floating-card glitch

September 18, 2026

2.3.14 Swipe-to-play fix

September 18, 2026

2.3.13 Longer count-modal auto-continue

September 18, 2026

2.3.12 App icon redesigned again

September 18, 2026

2.3.11 Recent Messages panel improvements

September 18, 2026

2.3.10 Pegging counter, reminder glow, Recent Messages

September 18, 2026

2.3.9 New Game screen fix

September 18, 2026

2.3.8 Richer win, loss, and skunk sounds

September 18, 2026

2.3.7 New app icon

September 18, 2026

2.3.6 Self Score fix, Muggins redesign, bigger crib cards

September 17, 2026

2.3.5 Pegging-row and starter-reveal fixes

September 15, 2026

2.3.4 Full-screen crib reveal, starter-card fix, restored modal borders

September 11, 2026

2.3.3 Consistent count-modal positioning + unified modal styling

September 11, 2026

2.3.2 App Store icon fix

August 2, 2026

Fixed a rejected App Store submission caused by the app icon carrying a transparency channel Apple doesn't allow on the large icon. While fixing it, also cleaned up a small rendering glitch where the rank marks on the icon's two playing cards were partially hidden behind each card's own rounded corner. No changes to the game itself.

2.3.1 Fix cramped difficulty-picker text on iPad

August 1, 2026

The difficulty description text was pinned to only half the card's actual width, wrapping 1-4 words per line on any tablet-width screen (iPad, Mac app). Fixed to use the full card width, with the difficulty name and pips reordered so the title lines up flush with the description below it.

2.3.0 About-modal Website section, developer contact QR, minor version bump

August 1, 2026

2.2.99 Personalize-prompt UX overhaul + modern card-face blur fix

August 1, 2026

2.2.98 Acknowledgements + Open Source license section

July 31, 2026

Added an Acknowledgements section to the About page crediting the tools and people behind this app's development (Claude Code/Anthropic, Xcode/Apple, GitHub, and David Bellot's open-source SVG playing cards that the classic card artwork is built on).

Also added an Open Source section with the full LGPL-2.1 license text for the card artwork, satisfying its attribution/license-availability terms — collapsed by default, expands in the app's normal body font (not the raw file's monospace layout, since only the wording itself is required to stay verbatim, not the formatting). Content integrity verified word-for-word against the original license file before and after reflowing.

Updated the What's New section to cover this and the previous release.

2.2.97 Add "Built to Last" section to the About page

July 31, 2026

New section between Privacy and Fair Play, reinforcing the app's zero-network design: no server, subscription, or account behind it, so nothing on our end can go down, expire, or get shut off — as long as the device can run it, the game runs. Same copy also added to the hosted privacy-policy page for consistency.

2.2.96 Name-driven crib-owner tag, quieter name box, longer timer

July 31, 2026

Game Review's Hand-by-Hand table (and the in-game running history table) showed a generic "(Y)"/"(C)" tag next to crib points — inconsistent with the rest of the app, which always refers to the opponent by their given or custom name, never "CPU". Both now use the actual first initial of whoever's name is in play instead.

Also: removed the redundant "(optional)" placeholder text from the "Give the opponent a different name?" input — the label above and the "Leave blank to keep..." hint below already say as much — and bumped that prompt's blank-path auto-continue timer by 1750ms (5000ms → 6750ms) for more breathing room before it defaults.

2.2.95 Fix AVAudioSession main-thread hang risk

July 31, 2026

Xcode flagged 3 "AVAudioSession Hang Risk" warnings during a real on-device debug session (iPadOS 27 Beta 2) — all synchronous setActive(true) calls made directly on the main thread (configureAudioSession, appDidBecomeActive, and the webView(didFinish:) delegate). Fixed by dispatching each call onto a background queue instead, which is the standard fix for this warning and works at the project's iOS 18.2 deployment target — an earlier attempt using the newer async activate() API turned out to require iOS 27, so it was replaced with this version-safe approach. No behavior change; verified via a clean Xcode build with no errors or warnings.

2.2.94 In-app "What's New" section on the About page

July 31, 2026

Added a curated, player-facing release-notes section near the top of the About modal, grouped by version (newest first). This isn't a full changelog — only genuinely player-visible changes get an entry (a new feature, a visible redesign, a pacing/feel change), skipping internal bug fixes and refactors. Seeded with the last few notable updates: the count-modal Detail-view redesign (2.2.93), slower/more natural pacing (2.2.88), and custom opponent naming (2.2.83).

2.2.93 Detail-view redesign for count modals + crib-card visibility

July 30, 2026

Clicking "Detail" on the self-count/muggins-challenge modals now replaces the whole modal with the full scoring breakdown (hiding the now-irrelevant entry/numpad/feedback) instead of appending it below a still-cluttered view; the existing Continue (>) button advances to the next count or hand exactly as before.

Restored the crib's cards in both count modals — unlike a player's own hand, the crib is never shown face-up anywhere else on the table, so without them the crib count was being judged blind. Card rendering stays hand-only-hidden/crib-shown, matching where the information is actually otherwise available.

Surfaced and fixed a real regression this uncovered: leaving a count step via Detail without returning to Summary first left the entry/feedback/claim elements permanently hidden for the next step, since their inline display state was never reset on the next showManualCount/showDealerCount call — fixed by resetting it explicitly each round.

Also fixed a genuine content-overflow bug the restored crib cards exposed (up to 130px on content-heavy hands): rather than keep shrinking padding to fight a fixed box height, extended the count-modal's box to use the full available screen height (encroaching into the player-hand area, which is fine since nothing there needs to be interacted with while the modal is open) and made the modal backdrop solid black to match, then let the box size to its actual content instead of always stretching to fill the taller ceiling.

Verified live across typical and worst-case (quad-five) hands in both modals, all four modal states (pre-submit, post-submit, Detail, post-Detail-exit-without-Summary), plus a clean 40-game pressure-test regression pass.

2.2.92 Keyboard-fallback safety net + quieter personalize screen

July 30, 2026

Real-device testing traced a "keyboard never appears" report to a third-party keyboard extension (Grammarly) hanging on this app's name field — an iOS platform limitation (apps can't select/override the active keyboard), not a game bug. Since a first-time player with no saved-name pill would otherwise be stuck at the very first screen with no way to proceed, added an idle-timeout fallback to name entry (mirroring the existing difficulty/personalize screen's pattern): if nothing's typed or tapped for 25s, show a brief note and continue with a default name after 12s. Added a matching "Keyboard Not Appearing?" section to the in-app About page for permanent reference.

Also toned down the difficulty-selection personalize prompt, which read as loud/bright relative to the rest of the screen: dimmed the label to match the existing quiet italic treatment used elsewhere in this exact same UI slot, replaced the bright bordered "No" pill with a "Yes ›" text link (input field now only appears once tapped, editing an already-named opponent still shows it immediately as before), and removed stray underlines.

Verified live end-to-end (idle-timeout hint + auto-continue, Yes-reveal + focus, existing-name edit path unaffected, About page rendering) plus a clean 150-game pressure-test regression pass. Device-tested and confirmed working.

2.2.91 Fix Mac app New Game screen content clipping

July 30, 2026

The tablet media query (min-width:700px) caps setup/settings/stats/etc. modal boxes at a percentage of viewport height tuned for iPad's fixed portrait dimensions. The Mac app's window is arbitrarily resizable and much shorter relative to its width than iPad ever is, so that same percentage left far less usable room, silently pushing content below the fold on the welcome screen, the rotating facts, and the difficulty/personalize screen.

Give the Mac target (html.mac-app) its own override using nearly the full window height instead of a fixed vh fraction, since that's the actual constraint that matters. Verified zero overflow across the welcome screen, all 40 rotating facts, and the difficulty/personalize screen; confirmed iPad is unaffected since the override only applies under the Mac-only flag.

2.2.90 Fix dead message-level default, fix fresh-install self-registration

July 30, 2026

Message level's "off for Hard/Pro" default was baked into localStorage on first boot before any difficulty was ever chosen, permanently short-circuiting the derivation on every future launch. setDifficulty() now re-derives it (unpersisted) whenever the player hasn't made an explicit choice, so it keeps adapting to difficulty until they do.

Defaulting PLAYER_NAME to "Alex" also caused a genuinely fresh install to silently register "Alex" into the recent-players list before the user typed or clicked anything, showing "or enter another name" with a pre-selected pill on an untouched device. Boot-time player-list bookkeeping now only runs when a name was actually stored.

2.2.89 Fix personalize-screen clipping on iPhone

July 30, 2026

User reported the lower portion of the New Game "select a difficulty" screen was clipped on iOS once a difficulty was picked. Root cause: the two unselected bios stay in the layout (just dimmed via opacity), still holding their full 140px height, and the new per-difficulty personalize prompt (name field + Start button) pushed total content ~100-155px past the visible area on phone widths, with no visual cue that the box was scrollable.

Fixed by collapsing the two dimmed bios to just their pips+name row once a difficulty is picked, freeing enough space that everything fits without scrolling. Scoped to max-width:699px so the iPad's side-by-side layout is untouched — confirmed unaffected directly.

User-tested and confirmed working on both iPhone and iPad.

2.2.88 Rework game-speed pacing (backlog #37)

July 30, 2026

Beta testers reported the game feels rushed even at "slow" speed. Root cause was two separate problems: several of the most-repeated pacing delays (the pause after every peg play, the post-31 reset, the discard→cut transition, the auto-discard confirm) were hardcoded and never responded to the speed setting at all; and even where the setting was applied, "slow" was just the 1x unaccelerated baseline, never actually tuned to feel patient.

Fixed both: routed the hardcoded delays through _gs() (mostly via a single fix inside the shared _scheduleAfterPeg() helper), and shifted the whole speed scale one notch more patient — {slow:1, normal:0.6, fast:0.3} → {slow:1.5, normal:1, fast:0.6}. Today's "normal" becomes the new "fast," today's "slow" becomes the new "normal," and "slow" is a genuinely new, more patient tier. Since GAME_SPEED already defaults to "slow," every new install gets this pacing by default.

2.2.87 Fix native launch-screen mismatch, Xcode 27-beta build errors

July 29, 2026

Investigating the App Launch modal jitter (backlog item 35): user found the real transition was the native iOS LaunchScreen handing off to the SwiftUI splash view, not the web-side sequence. The SwiftUI splash rendered the logo at 350pt wide vs. the native LaunchScreen's actual 398x73pt asset, and ignored the safe area where the native screen respects it — a real, measurable mismatch causing a visible pop at handoff. Fixed by rendering the logo at its natural size and scoping ignoresSafeArea() to just the black background layer, so both screens render identically.

Also fixed two build failures surfaced while testing on the just-updated Xcode (for macOS 27 Beta 2 support):

2.2.86 Add per-difficulty message defaults, fix sound-pill bug

July 29, 2026

Fix: setMessageLevel() cleared msg-active on every .msg-btn-styled toggle in Settings (sound, auto-cut/deal/discard/continue, learn mode, adaptive AI, self-score, board visibility), not just the message-level buttons, since it selected by the shared class instead of the mlevel dataset. Scoped to [data-mlevel], matching the existing [data-soundlevel] pattern.

New defaults (only applied when nothing's been explicitly chosen): message level off for Hard/Pro (Easy stays full), player name "Alex", game speed "slow", and a 1m App Lock timeout set at the moment of biometric consent (never bypassing the consent flow itself). Also reworded the name-entry divider now that "Alex" shows as a default pill: "or enter your name" → "or enter another name".

2.2.85 Add boot-sequence diagnostic logging

July 28, 2026

Investigating a real on-device report: the App Launch modal jitters briefly (<500ms) on a fresh install before settling. Couldn't reproduce true cold-install timing in the dev preview (no first-JIT penalty, no first-install disk I/O), so added lightweight timing instrumentation instead of guessing at a fix.

Web side: _bootDiagLog() records each boot milestone (fonts.ready, first/second fit pass, gameReady send) to localStorage, surfaced in the About modal's debug panel as "Boot Diagnostics" and included in Copy Debug Log.

Native side: ContentView.swift logs the splash lifecycle (onAppear, minHoldElapsed, gameLoaded received, actual dismiss, safety fallback) to the Xcode console with relative timestamps, so the two timelines can be cross-referenced to see whether the splash crossfade overlaps with the web side still mid-layout.

2.2.84 Fix personalize-prompt double-launch bug, add decline pill

July 27, 2026

Fix: the personalize-name input stayed in the DOM after the setup modal visually closed, so a stray blur event could re-arm the fallback timer and fire a second setupStartGame()/_launchNewGame() call mid-game, racing the first (the "several things fired at once" symptom on fresh install). Added a _cpuNameResolved guard so the whole personalize flow can only resolve once per wizard cycle.

Also: blank-path auto-start timer 2.5s → 5s; added a touch-friendly "No" pill so players can explicitly decline personalizing instead of only being able to wait out the timer; and fixed a related gap where clearing an existing custom name during the "(change?)" edit flow never actually removed it from storage (setCustomCpuName is now always called, not only when the submitted value is non-blank).

2.2.83 Add per-difficulty opponent naming, fix bios leak bug

July 27, 2026

Fix: renaming the AI opponent from Settings was overwriting all three difficulty-selection bios (Nob/Noddy/Nubb) and win/loss records with the one custom name, instead of only the currently active difficulty.

Replace the single global custom-name override with a name scoped to each (player, difficulty) pair, offered once right after picking a difficulty in the New Game wizard instead of via Settings (removed):

2.2.82 Dedupe win-hole formula and starter-hole spacing constant

July 27, 2026

Code-review follow-up: hoist the win-hole x formula into a shared _winHoleX() used by both _boardXY() and initBoard(), and collapse _startHoleXY()'s two identical pairSpread/rowOffPlayer constants into one, removing duplication that risked silent drift between the drawn hole and the peg's actual resting position.

2.2.81 Add the Mac app to the BBB release ritual

July 27, 2026

Folds the standalone macOS wrapper (main.swift → Simply Cribbage.app) into the same version-bump ritual as iOS from now on, rather than treating it as separately-pinned, uncommitted work:

2.2.80 Fix board label centering and starter-hole placement/spacing

July 27, 2026

2.2.79 Make post-game coaching tips more robust (backlog #31)

July 23, 2026

2.2.78 Increase peg-hole visibility across the board (backlog #30)

July 23, 2026

2.2.77 Shift the 121 win-hole cluster closer to hole 120

July 23, 2026

Moved the "121" text label and its peg-hole circle together (same relative offset preserved) 15 units closer to hole "120" — the cluster was sitting a bit too close to the board's left/bottom edge. Gap to hole 120 shrinks from ~40 to ~25, gap from the divider line grows from ~6 to ~21.

2.2.76 Unify peg and player-chip colors on primary red/blue

July 23, 2026

Player/comp board pegs (bpeg-p/c-front/back) and the you-card/cpu-card chip left-border accent now share the exact same colors instead of two independently-tuned blues and reds: primary blue #2266ee (was chip #4488ee, peg #5aa0ff) and primary red #ee2626 (was chip #e05050, peg #ff5a5a), with proportionally darker #1a4db3/#b31d1d for the trailing peg. Everything else that happens to reuse the old blue/red (progress bars, glow animations, analyzer charts, message log, card-suit-red rendering) is intentionally left untouched — scoped to just the peg/chip identity-color pairing per explicit request.

2.2.75 Relocate pegging holes into the arch + reclaim starter-hole space

July 23, 2026

2.2.74 Polish arch-board label alignment + relocate win-hole marker

July 23, 2026

2.2.73 Relocate pegging holes into the arch + reclaim starter-hole space

July 22, 2026

2.2.72 Fix swipe-play ghost card, peg arch scaling, automation hot-toggles + UI polish

July 22, 2026

2.2.71 Add "play a card" stall reminder + fix resume-game timer gap

July 21, 2026

New: after 6 seconds of the player not acting during their peg turn, the player's score chip gets a soft gold glow (2.5s dim-to-bright, 2.5s back, using the app's existing accent color) as a gentle nudge to play a card. Clears on card play, or when the existing 90-second "It's your turn" modal takes over. Enabled in all difficulties, including Pro.

Also fixed a real, pre-existing gap found while verifying the above: resumeSavedGame()'s peg-phase/player's-turn branch set buttons directly but never called refreshPegButtons(), so neither the new nudge nor the pre-existing 90-second "It's your turn" modal ever armed after resuming a game — only after a turn that started fresh mid-session.

2.2.70 Fix peg-row's own overflow-clip boundary + stale zone-width constant

July 21, 2026

_fitPegRow() previously translated the whole active-series wrapper as a rigid unit to keep the trailing card clear of the board/row, which could drag the group's own leading boundary card too close to (or past) the previous completed group. Now caps the shift to preserve a minimum boundary gap, using the boundary card's own measured position rather than the wrapper's — and the boundary check now runs independently of whether a rightward (overflow) correction is needed at all, since the natural flex-end packing of a short trailing group could leave the boundary gap broken even when the row/board clearance was already fine.

Removed the "_preCount" FLIP settle-animation (_pegFlip/_lastSeriesKeys): it animated a newly-dimmed card from its old mid-pegging (wrapper-packed) position to its new bare-card position, but that old position was itself an artifact of flex-end packing in a mostly-empty wrapper, not a meaningful position worth animating from — this was the direct cause of a small but real "card slides into place" visual reported repeatedly.

Separately, _fitPegRow's own corrective transform was being applied with the CSS transition still active, so even a fully correct correction visibly slid into place over ~130ms. It now applies instantly (transition disabled for the whole measure-and-correct pass), eliminating that residual movement too.