v2026.07.14.2
·
1470 commits
to main
since this release
Health repairs that stick, and a score that explains itself — the health page can clear a broken link, verify a redirect before trusting it, and show what each issue costs. Glass is retired.
Health
- fix Repairs are visible immediately —
invalidateHealthReportCache()existed but no health handler called it (onlybackup.go), so every mutation stayed hidden behind the 3-minute report TTL: a successful ping clearedLastErroron disk while the report kept reporting broken. All six mutating handlers now invalidate (handlers.go). - fix Retest reaches flagged bookmarks — the run skipped every bookmark with
checkStatusoff (the default) and still reportedcompleted, so a row rendered broken and scored −60 could never be cleared from a page that exposes nocheckStatustoggle.scope=allnow includes rows with a recorded error, a run that tests nothing says so, and a secondCheckStatusfilter in the write-back that discarded the results is gone. Capped at 250 pings per run — they are sequential at up to 3s each (handlers.go,health.js). - fix Redirects are verified before they are trusted —
AutoHealApplyclearedLastErroron the strength of "the URL changed" without contacting the replacement. It now pings the new URL before storing it and keeps the row red, with the reason, when it still fails (handlers.go,health.js). - new Score breakdown — the score badge expands (click or s) into the per-reason deductions and the total. Penalties travel from the server on each
HealthReasonas named constants beside the arithmetic, rather than being restated in JS where they would drift; a test pins them to100 - score(models.go,handlers.go,health.js,health.css). - new Keyboard navigation — the score badge was a
divand unreachable; reaching the first row cost 27 tab stops with 8 more per row, leaving the last of 100 bookmarks unreachable. Rows now use roving tabindex mirroringKeyboardNavigation.syncRovingTabStops: one stop per row,Tabwalks them and releases at either end, ands/x/p/f/m/g/Gcover the controls that left the tab order. Filter pills became one stop with arrow keys, as theirrole="toolbar"already promised.Enteron a row control no longer also fires the row's edit shortcut (health.js,health.css,templates/health.html). - fix Page cleanup — removed a dead
ifblock and the duplicate keyboard hint that listed only half the keys; the shortcut legend replaces it (templates/health.html).
Appearance
- fix Glass layout removed — one of three parallel layouts, each needing its own CSS for every visual change; dropping it removes ~3,100 lines. Stored settings migrate silently:
models.govalidateslayoutVersionagainst the allowed list and falls back toclassic, so droppingglassfrom that list is the migration, and localStorage device settings normalize the same way. Because both paths rewriteglasswithout a trace,theme-loaderrecords the raw value first and a one-time toast tells the user their layout changed (models.go,theme-loader.js,layout-beta-toast.js).
Dashboard
- fix One-time toasts no longer starve —
runPostOnboardingPromptsis a chain of early returns, and what's new returns until acknowledged, leaving the layout and Inbox intro toasts unreachable for anyone with an unseen release. Both own their storage keys and retry until a blocking modal closes, so they are now scheduled before the chain rather than at its tail (dashboard/dashboard-promos.js,layout-beta-toast.js,inbox-intro-toast.js).
Developer & docs
- fix Cache-bust coverage — 52 asset references moved onto the
Assetssystem (32 were untokened, sostatic_cache.goserved themmax-age=86400and a deploy stayed invisible for up to a day — the head scripts are the sharp end,write-api.jscarries write-token auth). Fixed a dual cache identity whereconfig-buttons.cssresolved to two URLs from different entry points (asset_versions.go,config.css, templates). - fix E2E tests — four specs failed on a clean tree because they outlived the code they check:
openShortcutSearchtyped>viapress('Shift+.'), which sends key.withshiftKey— a chord no keyboard produces — firing collapse-all and leavingnavigableElementsat 0; the backups tab asserted 3 sections after Automatic Backups made it 4; the layout nudge asserted the Glass button removed with Glass; and category reorder identified categories bydata-category-id, which derived buckets also carry while never being reorderable (e2e-helpers.js,config-tab-consistency.spec.js,dashboard-grid-shortcuts.spec.js,dashboard-recent-and-nudge.spec.js,dashboard-category-reorder.spec.js). - new Tests — 6 Go tests covering cache invalidation, retest scope, redirect verification and penalty arithmetic (
health_report_invalidation_test.go); 21 Playwright tests covering the score breakdown, the keyboard model, tab order, and retest loop guards (health-score-keyboard.spec.js,health-tab-navigation.spec.js,health-retest-loop.spec.js). - fix README, MANUAL & Config Help — v2026.07.14.2 notes.
- fix Cache-bust —
whats-new-v159data version (asset_versions.go,whats-new-stub.js),2026.07-dashboard-release-v118dashboard release token, and bumpedhealth.js/health.cssasset tokens.