Opening the panel gave one identical dropdown per game, naming none of them, at
the bottom of a page the Checklist did not link to. Named chips show one game's
titled rows and dated strips, and the Checklist's buttons land on the section.
The page-change scroll reset now skips these arrivals: a child's effect runs
first, so it was undoing the jump.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The old panel resolved titles and days inline, which is how raw IDs reached
readers: a followed pass is placed under a feed-cycle ID no lookup knew. A pure
model lets every rule be tested without React. The count starts at a reader's
first tick because nothing records when they began following an item.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shop's five permits restock when the character and weapon banners change together, which no week, month or fixed cycle can express: rotations ran 21 days and then 19. A rotation is not a game version, so it gets its own table and caption, and follows the version rule that only a recorded end resets the count. The dates and reset rule are the owner's in-game reading, as no page states them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Account creation order leaked into daily rows and routine groups even when the reader had arranged their games. Apply the shared display rule while preserving each game's server and task order.
Route source-classified activities into an independent Miliastra lane and
show dated battle passes once under Cycles. Genshin's About tab can disable
TCG tracking without deleting progress or history.
Activate routing and presentation together so no intermediate version moves
saved progress while still rendering its old owner. Preserve identities,
clock revisions and deletion timestamps across late writes and backups.
With no recorded end, the pinned row, the timeline labels, the routine
dialog and a group's "Next reset in" treated the estimate as a reset,
and read "ended" once it passed. They now print the version caption, and
the band reaches today.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A routine that resets with the version is offered, tallied and switched
with the cycles everywhere routines are sorted by kind, not only in the
strip.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A code redeemed on its last server sweeps in the game's colour and greys
in place for 0.8 s, then lands in Redeemed or expired. A completed event
greys and shines while its Moved to Archive notice holds, now 0.9 s
rather than 1.5 s, which read as unresponsive; an ignored one only greys.
Settings → Appearance gains Motion & celebrations as three What to track
cards: Reduce motion (stops every animation and the fireworks, adding to
the device's own setting), Fireworks, and Shine. Reduce motion locks the
other two off without forgetting them.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Theme and Timeline design pills sat 1px under their help text and, in
Relaxed, in a dark well at 12px/32px beside 13px/37px outlined buttons,
which read as off-centre. Under a help line they now sit 16px below it,
like the scheme choices, and in Settings take the buttons' type, height
and a hairline tray.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codes in one game now opens Codes in the next. The reader app holds the
tab and GameSettings reads it, instead of each game page minting its own.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Game8 still lists Y1INABQB6DEX, 2BJ64QRZ7RT8 and PLDXIB886Y1S as active
Genshin codes after the game refused them. CODE_CHECKS records the
owner's in-game check; build-codes stamps the matching code confirmedDead,
and the Codes tab shows it expired: "Confirmed expired in game, 2026-10-20."
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The redesign only celebrated a finished section, so ticking one daily or
completing an event drew nothing. Now a daily ticked, a routine met, an
amount typed to its target and an event marked completed each fire the
small burst; the item that finishes every daily or a game's routines gets
only the grand celebration. Settings → Appearance → Celebrations
(prefs.celebrations, on unless false) turns every firework off.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tour opens on a welcome over the dimmed Checklist, then shows the bar
along the top, then the Checklist and Timeline with their looks, Routines,
Archive and Settings. Codes get three steps that walk the way in (the game
in Settings, its Codes tab, the codes), and the last step points at Replay
the introduction. A replay now dims and locks the page like the first run,
keeping only Close tour. Subjects out of sight scroll into view, and the
ring stays inside the window.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A game's Codes tab lists the codes still to use first; a code redeemed on
every server played, or past its stated expiry, is greyed in a "Redeemed or
expired" section below. A date-only expiry passes once that date has ended
everywhere. Settings → Your games marks a followed game with its count of
unseen, still usable codes until its Codes tab is opened.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner feedback on the forced tour. Each step rings what it is about and,
while forced, dims the rest of the page around it. "Pick a layout" and the
Timeline step hold Continue until both options have been on screen, scroll
their subject to the top of the window and, on wide screens, move the card
to the right edge so the page has room to show the difference.
Guards for the reported snap-back and endless tour, which did not
reproduce: the effect that moves an unseen reader to Relaxed fires at most
once per page load and never after the tab saw the tour done, and setup
saves only the prefs it changed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Follow-up to the 2026-10-18 review of the v1→v2 migration. Start-up
(finishing a pending restore, then migrating or reconciling) now runs under
the lock every save takes, so a second tab's save cannot be overwritten;
where no lock exists it opens unlocked, as before. The automatic backups get
a size cap like Back up now's: past it the oldest are dropped, never the
newest, leaving the main save room to grow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tour now floats over the page it describes and must be finished
before the app can be used: new readers straight after setup, returning
readers on their next visit, and anyone who saw the earlier tour. The
page behind stays visible and scrollable but inert.
"Pick a layout" (on the Checklist) and the Timeline step switch Relaxed /
Structured and New / Classic in place; the selected look is kept.
Returning readers start on Relaxed. A replay from Settings stays
optional and closable.
redesignTourSeen now records new / returning / replay / 2026-10-tour-2;
any other value means not yet taken.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Game8 codes pages for Star Rail, ZZZ, Wuthering Waves, Endfield, NTE,
P5X, Chaos Zero Nightmare and Umamusume, read by one table parser told
each page's active-codes heading. Each page was fetched once and pinned
as a fixture. Infinity Nikki's page is stale (still titled July 2025)
and is left out.
The Codes tab links the publisher's own redeem page where one exists
(Genshin, Star Rail, ZZZ) and gives the in-game route for every game,
and names the server on a redeemed checkbox only when there are two.
Settings uses the width of a large screen: content up to 1320px and the
menu column running the full height.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The new reader app replaces the old UI: Checklist with a rail (focus
pills, Next to expire, today's dailies, pinned routines), Timeline in a
new and a classic look, Routines, Archive and a Settings area, in a
Structured (default) and a Relaxed interface. It follows the approved
Round 6 B and Round 7 mockups, corrected screen by screen with the owner.
Reader data moves to a v2 store (gacha-tracker:v2:*). Existing v1 data
is migrated on first load, a recovery copy is written first, and the v1
keys are never removed, so a rollback finds them unchanged. Redeem codes
for Genshin arrive as their own feed.
Also: live's urgency ramp, editable per theme; completion and
section-complete fireworks; a returning-user tour; the design mockups,
specs, plans, reviews and handoff record.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Beyond the Rails rolls on Asia's reset, and the header took the soonest
reset of every chip, so a Europe NTE reader read "next reset in 1h" at
20:00 UTC when their day rolls in seven. The countdown now counts the
reader's own clocks. Found in the whole-branch review.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Routine gains clock?: Region, code only. Its day key, its countdown and
its catch-up days are cut on that server's reset rather than the
reader's: for a cycle that ends at one instant on every server. Make it
mine leaves it behind.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add a task gains "Every N days": a length of 2 to 366 days and the date a
cycle began. Editing one keeps its length and start, and "days needed" is
capped at the cycle's length.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A third period, { unit: "cycle", days, from }, cut in day-key space like
weeks and months, so each game's per-server reset carries over. Tasks on
it are tallied and switched apart (showCycleTasks, on by default), show
the days left in their chip, and the lower row's heading now names the
periods it holds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Most shops sell both banners' pulls. A shop's premium line is offered like any
built-in; its standard line (Acquaint Fates, Star Rail Pass, Master Tapes,
Resonite Crystals) only when the reader switches on Include standard-banner
pulls under the built-ins switch. A new pref, standardPulls, absent meaning
off, so no install gains anything until it asks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Built-ins now include monthly items, so the strip's question, Settings and Your
own say "weekly and monthly". The per-game tooltip quotes the oldest source
date when a game has several.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The strip's Edit panel lists each game's chore, then its built-ins, then its
events, each with Stop tracking, and Track · N offers everything a game could
track and does not. Your own lists every built-in of the games that are on,
untracked ones included and marked, so none is off with no way back.
Renames Remove from dailies / Add an event to Stop tracking / Track.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new pref, routinesHidden, lists built-ins stopped one at a time by id. It
narrows the game's answer and never widens it, so stopping one changes nothing
else, and a built-in shipped later still arrives. Tracking one of a game that
is off turns the game on with that item alone (trackRoutinePatch).
Absent means none; ticks and numbers stay under the id.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When merge fuses two sources' copies, the loser's id leaves the calendar, and it may already hold a reader's ticks from a day it was published alone. Until now that needed a hand-edited RETIRED_IDS entry per fusion.
The survivor now lists what it absorbed in an optional mergedIds field. When a feed arrives the client turns those into carry-forward pairs, skipping any id the feed still publishes, and an import takes the same table. Optional, so an older cached feed still validates and an older bundle drops it unread. RETIRED_IDS stays for parser changes, whose old ids no feed will name again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Game8 heads Genshin's pass "Battle Pass - Moontrace"; Fandom lists "Moontrace" and files the category in a column. The label minted a second id for one event, so every battle pass since the Fandom source landed has been on the calendar twice, and a reader reported it.
Both sources now mint the same id and merge fuses them by id. The two Game8 ids that moved, Frostfarer and Moontrace (the only ones git history shows ever shipped), go in RETIRED_IDS so readers' marks follow.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An event id is a localStorage key, so a fix that changes one orphans every tick, note and ignore filed under it. retiredIds.ts holds an explicit table of old id -> new id, and the progress, daily and ignored stores move entries across on load and on import.
It moves rather than copies: a copy left under the old id would be carried forward again on every load and bring back a mark the reader had cleared. When both ids hold an entry, each store's own import merge decides, except that progress keeps any field only the older row held. The table starts empty; the change that moves ids adds its entries.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With "Comes back after a wait" and "I don't know when it ends" both
chosen, the end field is hidden, yet the still-needed line asked for "an
end date". It now names the way out: an end date, or another repeat.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Readers who knew what they wanted could not see which answers in Add an
event or Add a task produced it. Both add forms now open with a row of
examples (templates.ts) that set the form's shape only: kind, how often,
how it repeats, how it is measured. Never a name, date, target or game,
and no date is guessed, so nothing an example set can be saved unread.
Both forms also had a pass: plain words and pills for how often and
repeat, the name asked first and the kind after the dates, each message
beside its field, and a "Still needed" line read from the same check that
disables Save. The event form's derived state is now one pure function,
eventFormState, so the examples are proved to complete into a saveable
event without a click.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What you see drew a checkbox per game for built-ins, a list that grows
with every game and every built-in, and offered no per-game answer for
chores at all. Each now has one switch, a line naming the games that
differ, and Choose games to change them, in the focus chip's colours.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Chores had one global switch and built-ins only a per-game opt-in, so the
two answered the same question two different ways. perGame.ts is now the
one rule for both: a global answer, then the games that differ.
Nothing is migrated. routineGames keeps its meaning as the built-ins'
on-list and an absent showRoutines still reads as off, so every reader's
answers, and an older cached tab, see what they saw before. The strip
stops asking about one game once the reader has answered for all.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Giving Genshin's "To Temper Thyself and Journey Far" its five-of-seven goal
meant finding it in the list, opening its sheet, saying it repeats and only
then setting the goal. The strip now has an Edit mode beside Catch up that
lists its events by game with their goals, opens the sheet's goal control in
place, and adds any running event a game at a time. It calls the same
setDaily/setGoal the sheet does, so it can store nothing the sheet would not.
Weekly and monthly tasks are not due tonight, so they move to a row under the
dailies, and each period can be switched off (showWeeklyTasks,
showMonthlyTasks; default on, so nothing disappears on upgrade).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A new reader should see what's coming before deciding they don't want
it. It's set at first-run setup rather than in the defaults, so an
existing install whose saved prefs predate the field keeps its answer
instead of having it switched on underneath it.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the network failed behind the service worker, it answered from its
own store. Check for new data then said nothing newer was published when
the server was never reached. The worker now marks that copy, and a fresh
check treats it as unreachable; ordinary loads still use it offline.
The built-in tasks entry linked to a follow-up fix instead of the
feature, and the changelog spec's details now match what shipped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A card above the lists shows the entries the reader hasn't seen, five at
most; Got it records the newest. The footer opens the changelog: release
notes with their commit range and specs, the short entries each covers,
and the rest by month.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
First-run setup marks a new reader up to date, since changes mean nothing
before you've used the app. An absent marker therefore means an install
from before the changelog, which is what lets the launch be announced to
existing readers once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Make it mine's copying was inline in App and untested; it is now a pure
function with a test, so a change to either store can't make the copy
silently arrive empty. The question's buttons now say what they answer
when heard out of context. The prefs block and the spec now match what
shipped.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A reload can be served the browser's cached feed for minutes. The button
beside the data's age asks the server past that copy, swaps in a newer
feed without reloading, and says honestly what came back. Newer is
judged on events and sources, never the build stamp. The age now says
"just now" rather than "ended ago" when a fresh feed is a moment ahead
of the page's clock.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The switch sits beside the daily chores and answers the strip's question
too. Built-ins are listed with a link to their dated source. Make it mine
copies one into the reader's tasks, numbers and ticks included, and hides
the original while the copy exists. It's additive, so deleting the copy
brings the original back as it was.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The strip asks once, in one line, about a game on screen that has
built-ins. Yes puts them beside its dailies, drawn and counted like the
reader's own tasks, with a tooltip giving the source's date.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both prefs are absent unless the reader answers, so built-ins are opt-in
for every install, old ones included. The question is asked only about a
game on screen, and only once. A built-in the reader made their own
stays hidden while the copy exists.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review found that import and edit rebuilt a task from this build's parse.
That stripped any field it didn't know, and import dropped a newer
version's task entirely. Both now keep the record as stored and validate
only to display it.
An event whose goal is points can't be ticked, so it no longer counts as
waiting today: it counts with its week. The month-day field reset
itself to 1 when emptied; it now keeps a draft.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>