What's new

Recent changes to poke-memory. You're on version 0.10.33.

  1. v0.10.33

    2026-06-02

    Added

    • Practice screen now surfaces a dismissible nudge pointing to Settings > Offline when repeated slow sprite loads (3+) or five practice sessions without a download are detected, so users who experience slowness can discover the 166 MB pre-fetch feature without hunting through Settings.
    • Offline Settings section now shows whether downloaded content is "Up to date" or "Update available (N new)" by comparing a content manifest signature stored at download time against the current asset set. The Update button is disabled when content is already current, removing the blind-click guesswork.
    • Status bar pills (streak, protection tokens, mastery) now reveal their meaning on tap (touch) or hover/focus (desktop), so sighted users do not have to guess what the icons represent.

    Changed

    • Daily push notifications now cover all your learning languages, not just the active one. If you are learning multiple languages, the notification body shows a per-language due count (e.g. "English 12, 日本語 8") alongside the global total.
    • The child-facing privacy summary on the Privacy page now renders in your chosen app language (Japanese, Simplified Chinese, Traditional Chinese, and English), instead of always showing in English.
    • Pokédex entry rows in the species detail panel now show the source game name(s) instead of the repeated "Pokédex entry" label (e.g. "Red · Blue", "FireRed · LeafGreen · Emerald +2"). When the same text appears in multiple games, the row is shown once with all its games listed.

    Fixed

    • Fixed a crash in the Stats "Accuracy by card direction" chart where Recharts passing an empty payload array during chart transitions caused a TypeError.
  2. v0.10.32

    2026-06-02

    Added

    • Added a persistent profile status bar showing your streak, protection-token balance, and mastery progress at a glance on every page, including the Practice screen on mobile. The three signals render as consistent icon pills drawn from one shared source, and the streak and token pips that previously sat separately on the Practice and Stats screens are now carried by the bar.
    • Each language you are learning now has its own independent practice progress and daily new-card budget. Switching the Pokémon-name language from the status-bar pill draws that language's own queue, so studying Japanese names no longer touches your English progress (your streak and protection tokens stay shared across all languages). Typed-entry answering stays English-only for now and falls back to tap-to-reveal in other languages.
    • Enrolled learning languages now sync across devices and survive signing in on a new device: the union of all enrolled languages (and the tombstone of removed ones) is merged on every background pull, so adding Japanese on your phone is visible on your tablet after the next sync.
  3. v0.10.31

    2026-06-01

    Changed

    • Contact addresses updated to Frazzled Productions Google Workspace addresses: privacy@pokememory.com (legal/GDPR contact in the privacy notice, terms, and DPIA) and hello@pokememory.com (translation-feedback string, in-app and all locales).
  4. v0.10.30

    2026-06-01

    Changed

    • Improved Japanese and Chinese (Simplified and Traditional) onboarding copy: replaced technical jargon and machine-translated register with child-appropriate, natural-language phrasing across the first-visit modal. An in-app "machine-translated" banner and "preview" locale label remain in place until full native-speaker sign-off is completed.
    • Added an inline note in Settings (Audio section) and the first-visit onboarding modal that spoken Pokémon names use AI-generated audio still being improved, so some may be mispronounced. Removed the stale "Voice sounding robotic?" hint, which addressed a device-TTS fallback that is rarely heard now that pre-generated name audio is fully covered.

    Fixed

    • Fixed a crash where grading a card with an invalid FSRS state (stability 0 written by an older app version) threw FSRSValidationError and permanently bricked the Practice screen. Invalid states are now healed to a clean initial state on load, and the error boundary offers a "Reset local practice data" escape hatch as a last resort.
    • Stats "Last synced" and sync-error time stamps now render in 24-hour format (e.g. 20:03) rather than 12-hour (e.g. 08:03PM), consistent with the app's British-English convention.
  5. v0.10.29

    2026-06-01

    Changed

    • Streak protection token toast now matches the app's design language: uses the shared card panel, neutral icon background, and standard typography tokens instead of bespoke blue accent colours.

    Fixed

    • Push notification due-count now reflects only the cards in the user's active Pokémon name locale, preventing inflated counts for users who have practised in multiple locales.
    • Alternate-form Pokémon (Alolan, Galarian, Mega variants) no longer appear in the "Mark Pokémon I already know" quiz when alternate forms are disabled (the default). Previously, tapping those cards created FSRS states for cards that would never surface in practice.
    • The practice scope nudge now only appears after 3 completed sessions, and is suppressed permanently if the scope control was already used or a non-empty scope is already saved.
    • Settings: opening the "Mark Pokémon I already know" quiz now scrolls the heading and intro to the top of the screen instead of centring them (which hid the heading above the fold and left the user mid-list).
    • Fixed push notification over-reporting new cards when both forward-evolution and reverse-evolution are enabled. The notification now correctly shows the shared evolution bucket total rather than counting it twice.
  6. v0.10.28

    2026-06-01

    Added

    • Streak protection token events are now surfaced as just-in-time toasts at the moment a token is earned or spent, so you always know when your streak is being protected.
    • Token balance and a "days to your next milestone" countdown now sit alongside your streak on the Practice screen and the Stats page, so streak status shows up where you act on it. Token balance appears only when you hold at least one token (not colour-only); the milestone countdown shows when you have an active streak.
    • Locked Pokédex detail sections (Base Stats, Facts, Evolution Chain) now show an "Unlocks when you master this Pokémon" placeholder rather than appearing empty.
    • The theme/mascot picker on Settings shows a "Master your first Pokémon to unlock themes" prompt with a link to Practice instead of rendering nothing.
    • Pasture's empty state now explains its purpose as your mastered-Pokémon collection.
    • Journey page now shows a dismissible "What the rings mean" explainer near the mastery rings, explaining Locked, Learning, Mastered, and Introduced. The hint is a one-shot hint with its own flag, so existing users see it on their next visit.
    • Settings Practice tab now shows a dismissible nudge above the Quickstart quiz, pointing users at "Mark Pokémon I already know" to fast-track species they already recognise.
    • Practice screen now shows a one-shot dismissible nudge pointing at the Scope control below it, surfacing generation, type, and group filters to users who have completed first-visit onboarding. Both nudges use dedicated flags so they appear for existing users and reset with "Show onboarding again".
  7. v0.10.27

    2026-05-31

    Changed

    • Simplified onboarding copy to plain-English reading age: removed jargon ("spaced repetition", "scheduler", "surfaces each card") from the intro, grading note, and guest storage explanation. Updated all four locales (en/ja/zh-Hans/zh-Hant).
    • All user-facing strings across practice, stats, journey, settings, Pokédex, Pasture, and nav surfaces are now routed through next-intl, making them translatable into all four supported locales (English, Japanese, Simplified Chinese, Traditional Chinese).

    Fixed

    • Higher or Lower mini-game: the "Next pair" / "Play again" button now scrolls into view automatically after a guess, so it is reachable without manual scrolling on tall mobile viewports (iPhone 17 Pro and similar).
    • Fixed mastery counts disagreeing across surfaces: "Mastery over time" chart, "Completion projection", "Records" (average days to mastery, most mastered in 7 days), Journey "Collection timeline", share card "Mastered" count, and Pokédex tile mastered styling now all apply the species-level rule, requiring both the name and reverse cards to clear the FSRS gate before a species is counted as mastered.
  8. v0.10.26

    2026-05-30

    Changed

    • Improved Japanese and Chinese onboarding wording for clarity and age-appropriate register.
    • Progress bars on the Stats and Journey pages now emit consistent accessible meter semantics (role="meter" with aria-valuenow/aria-valuemin/aria-valuemax and an accessible label), improving the experience for screen-reader users.

    Fixed

    • Streak protection tokens now bridge a multi-day absence in a single app open. Previously, the auto-spend logic only covered a one-day gap, so a user ill for several consecutive days would lose their streak despite holding enough tokens. The fix walks back across the full run of missed days and spends one token per day in a single pass (all-or-nothing: if the gap is longer than the balance no tokens are spent and the balance is preserved).
    • Number formatting and pluralisation now respect the active locale. Counts on the Stats, Journey, Settings, and Pokédex pages were previously hardcoded to en-GB; review counts, card counts, streak labels, and similar strings are now formatted with Intl.NumberFormat (via useFormatter from next-intl) and pluralised with ICU plural rules in all supported languages, fixing grammatically incorrect output in Japanese, Simplified Chinese, and Traditional Chinese.
    • Localised the sync status strings on the Stats page ("Last synced", "N cards may be out of sync", "Sync failed", "Not synced yet", "Retrying", "Retry failed") into Japanese, Simplified Chinese, and Traditional Chinese.
  9. v0.10.25

    2026-05-30

    Added

    • README now includes an animated GIF of the practice card flip (Pikachu front -> Reveal -> name + grade buttons), generated with npm run animations.
    • Added a server-side weekly job (reconcile_grade_log_orphans) that auto-heals sync orphans: subjects with graduated grade_log entries but no card_reviews row are given a conservative placeholder row so future client reviews can restore correct FSRS state. Ships in dry-run mode by default; live activation is a deferred manual step after an observation period.
    • Machine-translation banner dismissals now sync across devices. Dismiss the banner on one device and it stays hidden on others after the next sync pull.

    Changed

    • Push reminders now honour each user's chosen notification hour. The pg_cron job runs hourly and the per-user UTC hour gate (added in #1315) activates for all users. Users with no preference continue to receive their reminder at 08:00 UTC as before.

    Fixed

    • Structural sync errors on the card_reviews primary path (SQLSTATE 42P10 ON CONFLICT mismatch, and other schema errors) now surface in the Stats page sync banner immediately instead of being swallowed silently. The banner reads "Sync error: a schema mismatch was detected. Your progress is safe locally." and has no Retry button, since retrying a schema mismatch always fails. Previously, these errors were logged only as console.warn and were indistinguishable from transient network failures (the root cause of the 19-hour silent outage in #1344).
    • Pokémon type-filter pill labels (Bug, Fire, Water, etc.) now localise when the app language is set to Japanese, Simplified Chinese, or Traditional Chinese. Previously they stayed in English after a locale switch.
    • Fixed a silent bug where duplicate keys in a message catalogue (e.g. practice.todayNew appearing twice with different values) were invisible to the lint gate - JSON.parse kept only the last value, so the first was dead code. The lint:i18n gate now scans the raw text before parsing and fails with the full dot-path and both line numbers for any duplicate found in any locale file.
    • Pokédex generation mastery count ("X / Y mastered"), Pasture biome stats labels, PastureZone landscape link and habitat names, practice scope section legends and preset labels, Stats trainer card, records, and streak protection labels, and Journey timeline, evolution wall, close-to-mastery, and milestone share button now all localise when the app language is switched.
    • Pasture page now honours the active Pokémon name locale when computing mastered species. Switching to Japanese or Chinese in Settings correctly shows only cards mastered in that locale, instead of always showing the English count.
    • Mastered Pokémon now appear in their correct biomes (Grasslands, Forest, Cave, and so on) instead of all falling into Wildlands. Previously, QA-seeded and freshly-loaded cards were missing habitat data, so every species defaulted to the "unknown" bucket and biome stats showed zero mastered.
  10. v0.10.24

    2026-05-30

    Added

    • Machine-translated the app UI message catalogues for Japanese (ja), Simplified Chinese (zh-Hans), and Traditional Chinese (zh-Hant), replacing all English placeholder values with locale-appropriate translations.
    • Journey page now shows a "Close to mastery" section listing species where the name card is mastered but the reverse card still needs work, sorted by closest to the 21-day interval gate first.
    • Stats page now shows a "By game" progress breakdown in a new Progress section, listing mastery percentage and count for each game (Red/Blue through Legends: Z-A), grouped by generation in expandable accordions.
    • Pokédex grid now supports three sort orders: National Number (default), Alphabetical, and Closest to mastery (learning species ranked by review progress, mastered species first, locked species last). Sort is URL-driven and composes with all existing filters.
    • Settings (Regional section) now has a "Daily reminder time" picker to choose your preferred hour for the daily practice notification. Full per-hour delivery will activate after a scheduled server update.
    • Pasture: a "Next arrivals" strip below the biome grid shows up to 5 reviewed-but-not-yet-mastered species ranked by closest to mastery (highest reps, then nearest due date), giving a motivational forward-looking nudge.
    • QA seed mode: a superuser-only developer tool that injects named scenario payloads into local storage for manual QA on preview deployments. Enable the "QA seed mode" flag in Settings > Advanced > Developer, pick a scenario, and click "Apply seed". Available scenarios: fsrs-locale-mastery (verify locale-aware FSRS reset), optimiser-stress (verify the FSRS optimiser endpoint), and pasture-progression (verify Pasture with real data). Local-only; sync write-guard prevents seeded data from reaching Supabase.
    • Added scripts/lint-i18n.mjs message-catalogue completeness gate (npm run lint:i18n), wired into npm run lint and CI, to catch missing or extra keys across the ja, zh-Hans, and zh-Hant catalogues before they reach production.
    • Added a dismissible machine-translation banner for non-English app locales, noting that the translation was created automatically and inviting feedback. Dismissed per locale and stored locally.
    • Added an English-only notice at the top of the Privacy Notice and Terms of Use pages when viewing in a non-English locale, clarifying that the documents are authoritative in English only.
    • Added full i18n catalogue keys for all user-facing strings across nav, auth, practice, settings, Pokédex, Pasture, Stats, Journey, error, onboarding, and banner namespaces, enabling the app language switcher to actually translate the UI.
    • App navigation and sign-in now respect the chosen app language: tab labels, the brand name, nav aria-labels, and auth button text (Sign in / Sign out / Signing in / Continue with GitHub / Continue with Google) are all wired to the i18n catalogue.
    • The onboarding modal now displays in the active app locale (Japanese, Simplified Chinese, Traditional Chinese). A machine-translation notice appears inside the modal for non-English locales.
    • Wired all Pokédex and Pasture UI chrome strings to useTranslations() so switching the app language now translates filter labels, sort controls, search inputs, aria-labels, headings, and count phrases on both surfaces.
    • Wired all Practice screen strings (review session, grade buttons, keyboard shortcuts, undo, loading, end-of-session states, cry card) to next-intl translations so switching the app language translates the Practice surface.

    Changed

    • README screenshots now show a realistic lived-in state: Pikachu is always the practice card, Stats shows a 30-day grade history with a populated accuracy chart, Pasture shows 30 mastered species, and the Pokédex grid shows a mix of mastered / in-progress / locked tiles.
    • FSRS optimiser now surfaces the HTTP status code when the server returns an unmapped error, making opaque failures diagnosable from a screenshot alone.
    • Settings page strings wired to next-intl catalogue keys so switching the app language now translates section headings, labels, descriptions, and button text across the entire Settings page.
    • QA seed: added "Mastery gaps" scenario that exercises the Pasture "Next arrivals" strip and Journey "Close to mastery" list with the specific in-between card states each feature requires.
    • QA seed: added an active-seed indicator to the Settings panel; the selected scenario label is shown after applying and restored on remount, cleared when "Clear seed" is clicked.

    Fixed

    • Pokédex detail page and Known Pokémon quiz now respect the Pokémon name locale setting (Japanese / Chinese) introduced in the Languages Labs flag. Previously, these surfaces rendered the English name directly instead of routing through the locale-aware hook.
    • Stats, Journey, and error pages now use useTranslations() so switching the app language actually translates all headings, labels, and status messages on those surfaces.
    • Language picker options now display each language in its own script (English, 日本語, 简体中文, 繁體中文) rather than English translations.
    • Pokédex grid tiles now display localised Pokémon names when a non-English name locale is active (previously only the detail page applied the locale; the grid stayed English). Closes #1327.
    • Pokédex sort selection (National Number / Alphabetical) is now persisted to localStorage and survives back-navigation to the grid. Closes #1314.
    • Fixed an intermittent practice-page test failure that depended on the calendar day: the Practice smoke checks now recognise sprite-picker and multiple-choice cards as valid first cards, not just the flip card.
  11. v0.10.23

    2026-05-29

    Added

    • Per-locale FSRS rows: switching Pokémon name language now gives each locale an independent progress slate (review history is preserved and restored when switching back). Mastery, Pasture, Stats, and badges all scope to the active locale.
    • Added a "Languages" Labs flag that reveals a locale selector in Settings, letting you view Pokémon names in Japanese, Simplified Chinese, or Traditional Chinese (machine-translated stubs; full translations coming in a follow-up).

    Fixed

    • Fixed app language and Pokémon name language being controlled by a single selector: they are now independent settings (#1260). A user can keep the app UI in English while practising Japanese Pokémon names, or vice versa.
    • Fixed evolution cards showing stale English names after switching Pokémon name locale: names are now resolved at render time so in-flight cards update immediately without a session rebuild (#1260).
    • Bottom nav bar is no longer unresponsive on the all-caught-up screen when the Higher or Lower mini-game is visible.
    • Fixed a rare sync gap where grades made near the end of a short mobile session could fail to reach cloud storage. The pending-grade queue is now written to localStorage before the unload beacon fires, ensuring the recovery path has the correct cards even if the beacon fails and the OS kills the page before the debounce timer runs.
  12. v0.10.22

    2026-05-27

    Added

    • Streak protection now records earn/spend events. The Stats page lists the last few, and a one-time message appears the first time a token is earned and immediately spent to cover a missed day so you know what happened.
    • When verified typed entry mode is on, brand-new name cards now use multiple choice (sprite, four options) during the learning-step phase, then switch to typed entry once the card graduates. Easier introduction without losing the verification gate on mature cards.
    • Optional verified typed entry mode for name cards. Turn on in Settings - Practice to type the name instead of grading yourself. Grades are decided automatically based on how close your answer is.
    • First-visit load time reduced on WebKit (Safari). The bundled seed data chunk is now 1.2 MB instead of 2.9 MB after splitting out flavor texts and deduplicating evolution chains. Flavor texts are fetched in the background after first render so they don't block the practice session from starting.
    • When you turn on Verified Typed Entry, you will see a brief explanation that new cards start as multiple choice during the learning phase and switch to typed entry once they graduate. A one-time tip also appears above the first multiple-choice card.

    Changed

    • A species is now mastered when **both** its name card and its reverse card have reached the FSRS mastery gate (reps >= masteryRepetitions and scheduledDays >= 21). Previously only the name card was required.
    • Reverse cards are now a required practice direction. The per-direction toggles for name and reverse have been removed from Settings. Evolution and cry remain opt-in. Existing users with reverse turned off will see reverse cards on their next session.
    • Streak protection tokens can now be spent on consecutive days. The previous one-token-per-gap cap has been removed; scarcity (1 token per 30 review days, balance capped at 3) is now the only limit, so a 3-token balance bridges a 3-day gap.
  13. v0.10.21

    2026-05-24

    Added

    • Streak protection tokens. Earn one token for every 30 consecutive review days (capped at 3) and an unused token is spent automatically on a missed day to keep your streak alive, with no two protected days in a row allowed. Balance and history are shown on the Stats page.

    Fixed

    • Monitoring no longer alerts on in-step cards: the grade_log vs card_reviews divergence check now applies a 2-day persistence window to the "row never written" query, and adds a second query that catches the "row exists but is stuck" failure shape.
    • Monitoring divergence check: Option B now applies the same 2-day persistence window as Option A, so re-learning sessions after a pull-normalisation reset no longer trigger spurious "row stuck stale" alerts. Also documents Option A's 4-day detection floor in the script header.
  14. v0.10.20

    2026-05-24

    Changed

    • Added an end-to-end smoke test covering the reverse-card feedback delay setting.
    • Tightened the storage-error banner unit test so it specifically exercises the grade-path failure rather than the mount-time path.

    Fixed

    • The undo button no longer activates when a grade fails to persist; the visible state now matches the persisted state.
    • Pasture tab no longer appears after mastering a non-name card (reverse, cry, or evolution). Affected users' nav state is reset automatically on next load.
  15. v0.10.19

    2026-05-23

    Fixed

    • Reverse card feedback delay control on the Settings page now only appears when reverse cards are enabled, matching the hide-when-off pattern used by every other per-reverse-card sub-setting.
    • Removed a redundant aria-label from the reverse card feedback delay fieldset on the Settings page; the <legend> now provides the accessible name as per the ARIA spec.
    • CI: Visual Regression and Integration Tests workflows no longer fail on the decide step when a PR contains a large sprite-file diff (e.g. a quality regen).
  16. v0.10.18

    2026-05-23

    Added

    • Settings - Audio: new "Reverse card feedback delay" control lets you shorten or disable the pause after tapping a sprite-picker answer. Options: Off (no pause), Fast (250 ms / 500 ms), Default (600 ms / 1200 ms). Existing users keep the original behaviour automatically.

    Changed

    • Trimmed pre-generated sprite WebP quality from 75 to 65, saving roughly 2.4 MiB of repo size and bandwidth with no visible regression at the painted sizes the app uses.

    Fixed

    • Stopped recording grade-log entries when the session cards blob fails to persist, preventing a split-write where the grade log advanced past the saved session.
  17. v0.10.17

    2026-05-23

    Changed

    • Practice: grading now swaps to the next card immediately, with saving the session, recording the review, and refreshing the bottom-tab badges all happening in the background. Reduces the perceived delay between grading and seeing the next card.
    • Practice: added a "Wait for audio before next card" toggle in Settings (Audio section). When off, the next card appears immediately after grading and any in-progress cry or spoken name continues playing under it. Default on, preserving existing behaviour. Also tightened the sprite-decode ceiling on the grade critical path from 500 ms to 150 ms and removed two redundant settings reads per grade.
  18. v0.10.16

    2026-05-22

    Fixed

    • Fixed a sync glitch where closing one of two open practice tabs could allow a background cloud pull to fire in the remaining tab mid-session. The session-active flag is now a reference count so both tabs must close before background sync resumes.
    • Offline download no longer stops when navigating to another page within the app. Starting a download and then going to Stats or any other section and back now shows live progress on return.
    • Fixed offline sprite cache being progressively culled during a long offline session. The sprite cache entry cap was raised from 1,300 to 12,000 to accommodate the full offline-download pack (~9,225 URLs across all species and width variants), preventing broken images when practising offline after completing an offline download.
    • Sprite images are now served as pre-generated static WebP files, eliminating Vercel Image Optimisation transformation costs.
  19. v0.10.15

    2026-05-22

    Added

    • New Offline section in Settings with a one-tap "Download for offline use" button. Pre-fetches every sprite and cry so you can practise without a connection. Shows progress, supports stop and resume, and skips already-cached assets.

    Changed

    • Daily push reminders now respect your practice scope (gens, types, games, presets, form categories) so the "cards due" count matches what you'd actually see on device.
    • PWA now updates silently in the background when you switch away from the tab, instead of showing a refresh banner. Mid-practice the update is deferred so an in-progress card is never interrupted.
    • Show an offline-aware message on the error screen when you're not connected, with a clear "Go to practice" route to previously seen cards.

    Fixed

    • Offline practice now correctly serves sprites and cries from the cache. Previously, optimised sprite URLs and cry audio fell through to the network-first bucket and failed offline.
  20. v0.10.14

    2026-05-21

    Fixed

    • Daily Web Push reminder now counts only cards matching the user's enabled card types and alternate-forms setting, and includes an estimate of new cards ready to practise, so the notified count aligns with what the Practice page shows.
·What's new·Privacy·Terms·v0.10.33

Unofficial fan project, not affiliated with or endorsed by Nintendo, Game Freak, or The Pokémon Company. Pokémon and all related names, sprites, and cries are the property of their respective owners. Sprite and species data sourced from PokéAPI.

  • Practice
  • Stats
  • Journey
  • Pokédex
  • Settings
poke-memory
  • Practice
  • Stats
  • Journey
  • Pokédex
  • Settings
  • Practice
  • Stats
  • Journey
  • Pokédex
  • Settings