Widgets
- Every figure on a custom widget can have its own size —
Normal,Large,SmallorBar, stored per figure. The custom widget was the only tile drawing its own flat rows rather than using the panel and parts every other tile uses, which is why it looked flat beside them. The bar is offered on a percentage and nowhere else: it draws a share of a whole, and a count carries no whole to be a share of. Its colour comes from the theme's own tokens.dashboard-widget-custom.js,dashboard-widget-presets.js,dashboard-config.js,dashboard.css. - A
Millisecondsformat takes a value in seconds and shows whole milliseconds — the AdGuard tile printedavg_processing_timeas0.0051589999999999995under a label reading "avg ms": the field was formatted as text, which prints a float's full tail, and the value is in seconds, so the label was off by a factor of a thousand. The AdGuard preset uses the new format; any other service answering in seconds can. A widget already on a page keeps the format it was saved with.internal/app/widgets_custom.go. - A figure on a custom widget can be edited again — opening one for editing left the form empty, so correcting a figure meant deleting it and adding it back.
- The figures down a widget's rows line up — each row measured its own numbers, so a column of them sat at a different distance from the edge on every line.
Dashboard
shortcutDisplayreplaces theshowShortcutsboolean —always | hover | never, defaulting tohover. The boolean answered one question (is the letter on screen) and the useful answer was a third one. Inhoverthe label is out of the row's flow, so the grid's shortcut track collapses and the name takes that width back — about five characters a row — and it floats in over the right end of the name while the pointer or keyboard selection is on it. Thearia-labelnames the shortcut in all three modes,neverincluded. The control carries thechromehandler it always needed, so it comes off theKNOWN_BROKENlist inconfig-behavior-realtime-coverage.spec.jsand takes effect without a reload.- The shortcut letters are on for every install — a fresh one starts at
always, andShortcutDisplayAlwaysMigratedturns them on once for existing installs, including those whose legacyshowShortcutsboolean said no and theneverthat would otherwise have been derived from it. AshortcutDisplayalready in the settings file is an answer to this question and is left alone, so someone who pickedhoverkeeps it; the marker keeps the migration to one run, so switching the letters off afterwards sticks. - The floating button bar stops letting the page read through it — bookmark rows scrolling underneath showed through the bar.
- A row builds only the marks it draws, and search waits for the key that opens it — two rendering costs paid on every load that nothing asked for.
- The rollout flag that only ever said yes is deleted.
Search
interleaveModemoves from Appearance → Layout to Behavior → Search, as Switch Search Mode — the checkbox read "Interleave categories across columns" and no renderer has ever read the field:search.jsis its only consumer, the Go comment on it says search, and the statistics page already called it "Interleave search mode". Ticking it to rearrange columns changed how a bare query is read and moved nothing.Shift+Qtoggles the search mode from the dashboard —toggleSearchMode()on the dashboard writes the same stored value the checkbox does, tells the running search component directly rather than waiting for a reload, and raises a toast naming the mode. A failed save puts the setting back rather than leaving the screen and the file disagreeing. The key is registered indashboard-setup.jsbeside the other global Shift+letter keys, and is on the cheat sheet.- The Switch Search Mode info panel said
;— left over from the prefix introduced and withdrawn earlier the same day. It reads/in all four locales, and the sentence explaining that/does the same as;went with it. - A missed shortcut points at the names it did not search — with Switch Search Mode off a bare query looks for a shortcut only, so typing a bookmark's name reported nothing while the bookmark sat on the page behind the overlay. When the shortcut search comes back empty and a name search would not, the overlay appends one row naming the count and the key;
Enteror a click runs the query the other way. With no name match either, "nothing found" stays the answer. - A query that arrives from outside is searched by name — a query from the address bar (
opensearch.go), a deep link or a shared URL was matched against shortcuts only. Arrived queries are widened to names; shortcut matches keep the top of the list. ;was introduced as a second mode-switch prefix and taken back out in the same release — it already opens the inline editor on a bookmark row and has since v1.1.1. The check that cleared it read the cheat-sheet registry, where that binding is deliberately undocumented, so the wrong list gave the wrong answer./is the only mode switch, as before. The_hasModeSwitchPrefix/_stripModeSwitchPrefixhelpers introduced alongside it are kept: they fold four scatteredstartsWith('/')tests into one question.tests/search-mode-switch-prefix.spec.jspins that;is not a prefix.
Health
- A round of checks is one write, and it follows the bookmark — each result was written on its own, so a round interrupted halfway left the report describing a mix of two runs.
Assets
- A stack trace out of the bundle names the file it came from — source maps survive the bundling step.
- The stylesheets and scripts changed this week are served — the hash table had drifted from the files on disk.
Docs
- Release notes
static/data/whats-new/v1.4.3.jsonand itsindex.jsonentry, extended with the search-mode move and the shortcut-letter migration; both tokens inwhats-new-stub.js(DASHBOARD_RELEASE,NEXTDASH_WHATS_NEW_DATA_VERSION); the constants spec; threeoverview-features.jsonentries carryingsince: "v1.4.3"with their 60 locale keys; this changelog;MANUAL.md; and the Config → Help paragraphs in all four locales. - The cheat sheet gains
ivUnreadandivTags, which had been added to the inbox section without a locale string and printed as raw fallbacks in lowercase.nextDash-cheatsheet.htmland both PDFs regenerated.
v1.4.2.4 — 29 August 2026
The browser's Back button works, a triage run can be finished, and the two
list views lost the wall of controls between their heading and their first row.
Navigation
-
new — Back and Forward move through nextDash. Opening the inbox, health or config, or switching bookmark page, now leaves a history entry. Before, none of it did:
history.lengthnever moved, so Back stripped the address bar and left the view standing — the URL said one thing and the screen another. Worse, from a full-container view a numeric hash was actively reverted, so Back to a bookmarks page did nothing at all.What counts as a step is deliberately narrow. A filter is not a step: change the inbox filter three times and one Back leaves the inbox rather than walking back through them. A config section is not a step either — a config visit is a rummage through several sections, and an entry each would turn one Back into six, so Back leaves config the way
Escapedoes.Two things it does not do, recorded rather than discovered: Back does not close a modal, and refusing the "discard your unsaved changes" dialog during a Back leaves the address bar one step ahead of the screen. The edit stays where it is; the next navigation puts the address right.
Inbox
-
fix — a triage run can be finished. Three faults at once. The queue held every link the filter showed including ones already read, so an inbox of 5 unread and 35 read handed back all 40 and asked you to decide again on work already done; it now walks only the unread, with the active filter still applying. The last card ends the run — "That is the lot. You went through 12 links." — instead of silently looping back to the first. And promoting a link returns you to the run where you left it: before, promoting closed triage, so clearing a backlog of 40 meant pressing
tforty times. -
new — the inbox header reads like the health view's. The two are siblings — same pills, same
j/k, same shape of list — so the work that pulled health's rows up the page reached the inbox too. The count moved down to the subtitle line, where it sits level with health's score badge instead of a line above it. Triage and a new ⋯ get their own full-width row under the filters, so the button that matters most is where its health counterpart is. Mark read, Clear read, CSV, JSON, Import and Stats moved behind the ⋯, and the ℹ went to the far right where it cannot be hit while reaching for an action. -
fix — five things the inbox knew and did not say. Rows show where a link came from — extension, import, share sheet — with
pasteleft unlabelled, since that is how most links arrive and saying so on every row is noise. A weekly trend line reads "N arrived and N were dealt with this week", with a link through to the full chart. Mark unread and tags were right-click only, which a phone has not got: they are nowuandl, both listed in the keyboard legend. An empty filtered list gains a Clear filters button. And a tag filter matching nothing no longer claims "Inbox zero, nothing is waiting" while the links sit there hidden — the empty-state check counted the search box and the site filter and forgot the tag. -
fix — the promote rate counts what left, not what was read. It is labelled "of the links you decided on, how many became bookmarks", but the denominator also held every mark-read — and a link marked read is still sitting in the inbox with the decision to come. Two consequences: links that had gone nowhere counted as decisions, and any link read before being promoted counted twice. A store of 40 added links reported 43 of them decided. Promoted and deleted are the two ways a link leaves, and they are the whole denominator now. The figure on your install will change, in some cases substantially.
Health
-
fix — the summary reads as a line, not a wall of cards. Ten bordered tiles became one compact strip of figures, asserted under 48 pixels tall. Six of the ten repeated a filter pill sitting directly beneath them. Clicking a figure still filters, and the strip wraps rather than scrolling sideways.
-
fix — every filter is on screen. The pill row wrapped instead of scrolling: at 1280 pixels four filters — Missing category, Missing preview, Certificates and Healthy — were cut off past the right edge with nothing to say they existed. Fifteen pills, roughly seven visible. The one-time "this row scrolls" hint went with it, since there is nothing left to explain.
-
new — the toolbar keeps what you use and files the rest. Work through and Rot report stay on the bar; Export rows, Re-test, Checking off, Open broken, Merge duplicates, the bulk-enable buttons and the settings link moved behind a ⋯. Eight buttons across two lines became two and a menu. The menu opens under its own button rather than at the window's far edge, where it read as belonging to something else.
-
fix — the filter note explains a filter you chose. "Every bookmark, whatever its state" told a reader of an unfiltered list what they were already looking at. It stays on every other filter, where it explains a real rule — what makes a bookmark stale, why one counts as unused.
-
fix — three ways the view moved without being asked. A re-check finishing after you left no longer wipes the bookmark grid and paints the health list over it: health owns the app's slow work, a re-check of an unreachable host runs 10-20 seconds, and the render that landed afterwards never checked whether health was still on screen. The Monitored list keeps your place across its sixty-second refresh and its refresh on returning to the tab — measured, a reader at 400 pixels was put back at 266. And the duplicate-group menu no longer leaves a click handler bound for the life of the page, or a merge waiting on a promise that never settles, when a re-render takes it away.
Config
-
fix — previewing a theme shows that theme's backdrop. Scrolling the themes changed the colours and left the texture behind, so the preview showed a new palette wearing the old theme's pattern — a combination matching no theme at all. The backdrop's shape (scanlines, grid, hatch, dots) is chosen by rules that key on the theme's name, and the preview kept the old name. Both routes were affected, the dropdown and Browse…; picking Random never was, and that is what pointed at the fix.
-
fix —
Escapecloses the theme picker on the first press. With a promo card on screen — the ordinary state until they have been dismissed — the first press cleared the promo and left the picker open, still previewing; only a second press closed it and put your theme back. The picker was opened deliberately and is showing a live preview, so it takes the key first. -
fix — four ways config said one thing and did another. One click on Export produced two CSV files, every stats action button having been given two click listeners. Changing an Appearance control dropped focus to the page body, so the next
Tabrestarted at the top. Switching page threw away unsaved Widget edits without asking — Widgets being the one section that does not save as you go — and now asks, putting the page selector back if you decline. And the archive URL said "Saved" while the server had quietly substituted the default, which it does when the address carries no{url}placeholder; the field now shows what was actually stored. -
fix — eight settings can tell you they changed. A setting with no declared default reports itself unchanged whatever it holds, so it never offered its ↺ and never counted towards the Overview's "N settings differ from the default". Of the 93 fields the Behavior schema renders, 90 had a default and nine did not; eight now do. Keep settings on this device only stays the documented exception, since it lives in this browser rather than in the settings file and there is no stored default to compare against.
Housekeeping
- fix — the inline bookmark editor is gone: 757 lines of JavaScript and 193 of CSS that could not run. Editing moved to a modal long ago and left the old editor behind with its gate permanently shut. Nothing changes on screen.
Docs
-
hideFromModalis lifted from every release that carried it — v1.4.2.1, v1.4.2.2, v1.4.2.3 and v1.2.1. Each was held back while it was fresh, so a round of additions would not push aside a large release. Four had accumulated, which is more than the flag was meant to cover: between them they hold the guided-tour replay and every theme's backdrop, neither of which is a footnote. They are announced now, along with v1.4.2.4 itself, so the modal says what this changelog has said all along. -
Release notes
static/data/whats-new/v1.4.2.4.jsonand itsindex.jsonentry, the constants spec, this changelog,MANUAL.md§4.5, and the Config → Help navigation and keyboard paragraphs in all four locales. -
Both tokens move.
DASHBOARD_RELEASEgoes tov1.4.2.4— with nothing held back, the modal leads with the newest release and an install whose stored value is older sees the notes once.NEXTDASH_WHATS_NEW_DATA_VERSIONgoes towhats-new-v265, without which a browser holding the old index never learns v1.4.2.4 exists. -
A patch on the v1.4.2 line, not a minor release. The work here is corrections and two additions to views that already existed; nothing changes what nextDash is. v1.4.3 stays unused — that number was taken by a round later corrected to v1.4.2.2, and reusing it would make two different sets of notes answer to one tag.
v1.4.2.3 — 29 August 2026
A tour can be asked for one at a time, and the two hundred themes that all
looked alike underneath now carry a texture of their own.
Behavior
-
new — each guided tour can be replayed on its own. Six tours exist and five could be seen exactly once: Health, Inbox, Fresh, Widgets and the column-spread hint each record a tip id on first run and never offer themselves again. The only way back was Show quick-start card again, which calls
clearSeenTips()and empties the list wholesale — right when handing an install to someone else, far more than "show me the Health one again" asks for.DashboardConfig.GUIDED_TOURSis the six in one list; they had been scattered across six files, two as constants and four inside the tutorial that owned them, so anything wanting to enumerate them had to repeat the set and stay in step by hand.renderTourReplayRowdraws a button per tour andreplayTourclears one id through the newDiscoverabilityState.forgetTip(id), which leavestipsNotBeforealone: that gap belongs to the rotating toasts, and a tour asked for by name should not reopen the tip firehose with it. The welcome card is the exception — it has no tip id, soquickStart.dismissedis cleared instead, andonboardingCompletedis deliberately left alone since the reset button above is the one that starts the whole first run over.Two states the panel draws rather than hides: a tour whose id is not in the seen list is
disabled, because its button would claim to restore something never taken away; and whenenableSessionTipsis false the note turns warning-coloured and says no tour will appear at all, since otherwise six buttons do nothing visible.
Appearance
-
new — all 107 theme families choose a backdrop.
--theme-pattern-imagedefaults to dots for every theme and the block below it named fourteen exceptions, so 200 of 214 variants painted dots — the theme browser changed the palette and left the texture identical, which reads as three backdrops that do not work. Each family now names one intheme-depth.css, assigned by character: hatch for paper, cloth and earth, grid for circuitry, editors and steel, lines for screens, neon and signal, dots for mist, water and cool. Final spread across the 214: 56 hatch, 54 grid, 54 lines, 50 dots.data-pattern="auto"still means "whatever the theme asks for", and anything chosen in Appearance → Backdrop still overrides every theme.Selectors name both variants of a family in one block, so light and dark cannot drift apart.
-
fix — four screen themes lost their scanlines in their light half.
retro-crt,neon-grid,cold-cathodeandstatic-noisenamed only their-darkselector, so switching one to light dropped the lines and left it looking like any other theme wearing the same name. Both halves are named now. Found by the new spec rather than by eye — at 214 variants, reading the file is not a check. -
new —
tests/theme-backdrop-variety.spec.jswalks every one of the 214 variants and fails on two things that are otherwise invisible: a family nobody assigned (falls back to dots and looks deliberate) and a family whose halves disagree.
Docs
- Release notes
static/data/whats-new/v1.4.2.3.json, theindex.jsonentry carryinghideFromModal, the constants spec, this changelog,MANUAL.md, and the Config → Help paragraphs in all four locales. NEXTDASH_WHATS_NEW_DATA_VERSIONmoves towhats-new-v264andDASHBOARD_RELEASEdoes not. Fourth hidden release in a row: this counts toward the version number and leads Config → Overview, while the modal keeps leading with v1.4.2.- This round was first written as v1.4.3 and corrected before anything was pushed. It is a patch on the v1.4.2 line — a replay button and a texture assignment are not a minor release — and the mistaken commit was removed from history rather than superseded, since nothing had left the machine.
go generate ./...for the changed CSS and JS.