nextDash 1.3.0 is out with two dozen changes with one subject running through nearly all of them — the life of a link. How it gets in when you are nowhere near the machine with the extension. How you find out it has rotted, and how long it has been rotting. How the tidying becomes something you can actually finish instead of a number you learn to ignore. And how a page you saved a year ago can tell you it has published something since. Running alongside all of that is a fourth strand: the dashboard’s first load is about five times lighter than it was.
It also contains an apology. The change to how bookmark shortcuts open, which shipped in 1.2.0 and which this blog described approvingly at the time, was a mistake. It is reverted, and the reasoning is below.
1.3.0 bumps the release marker, so the What’s new modal will open once after you upgrade.
Source and downloads: github.com/jordibrouwer/nextdash — release notes: v1.3.0 on GitH
nextDash 1.3.0 — 19 August 2026
Getting a link in, from wherever you are
The browser extension has always been the way links arrive, and the browser extension only exists on the machines you installed it on. Everywhere else — your phone, a borrowed laptop, Safari, Firefox — the answer was to email yourself the address. This release fills that gap in four ways, all of them arriving in the Inbox.
- Your phone’s share sheet. Install nextDash as an app and it appears wherever you share a link. The link lands in the Inbox and the app opens on it. One detail worth naming, because it is the kind of thing that quietly breaks: Android often hands the address over inside the shared text rather than in the URL field, so the first
http(s)address in either is used — and trailing sentence punctuation is left with the sentence rather than glued onto the end of the address. - A bookmarklet, for everywhere else. Config → Help → Inbox builds one for you, carrying this install’s own address, so it works in browsers the extension will never reach. Both this and the share target are plain
GETrequests, because neither a share sheet nor a bookmarklet can set a header. On an install running a write token, capture gets a key of its own that opens these two routes and nothing else. - Ready-made pieces for the launcher you already use. A new
integrations/folder with a shell script, two Raycast commands (one for a URL, one for the frontmost tab across six browsers), a Dropzone action, a Ulauncher extension, and recipes for Alfred and Apple Shortcuts. No binary bundles — steps you can read before you run them. - Long-press the installed app to open the Inbox, Health or Config directly, rather than landing on the dashboard and navigating from there.
And a duplicate is now found wherever it lives. The check only ever looked at the page you were saving to, so a link already filed under Work went straight in again from Personal. It now searches everywhere, and answers with the conflicting bookmark’s name, page and category instead of a bare error code. Saving a second copy on the same page is still refused; a copy on another page is a question — “You already saved this on Work · Docs” — with the existing bookmark one click away and Save anyway if you meant it. Moves are exempt, since a move is an add followed by a delete and would otherwise trip over itself.
Links rot, and now you can watch it happen
- A broken link says how long it has been broken. The first failure of a run is recorded, so a row can read failing for three weeks rather than only broken. Those are different problems: one is a site having a bad morning, the other is a page that is not coming back. The figure carries into the filters, the row, the export and the report.
- A page that answers 200 while saying “not found” is caught. This is the polite kind of disappearance — a shop that removed a product, a documentation site that swallowed a page — and until now it read as perfectly healthy, because as far as HTTP is concerned it is. Detecting it costs one bounded read of the response body per check, which is why it is a switch beside the check timeout rather than something that is simply always on.
- One host down reads as one problem. Group the list by site and forty rows from the same server stop looking like forty separate emergencies.
- A dead link can be pointed at its last archived copy, with the original address kept in the note. That last part is deliberate: the archive capture is a reading of the page rather than the page itself, and the original address is where any later attempt to find the real thing has to start.
- The trend can be read over a longer window, and a window that the samples cannot fill now says so instead of quietly pretending.
- A Rot report in the toolbar. What has gone, what has moved or been rewritten, what has been failing for over a month, what is broken and was never opened in the first place, and what broke this week. Every one of those facts was already in the health view — what was missing was one place where they added up. The list is the work queue; this is the read.
One small embarrassment fixed along the way: the Rot report button had never been styled, and rendered as a bare browser-default button sitting between four styled ones.
Tidying that ends
Health has always been able to tell you that forty-three links need attention. That is a true number and a useless one, because forty-three is not a task — it is a mood. This release turns it into something with a beginning and an end.
- Ten links, two minutes. When enough links are waiting, a card in the corner of the dashboard names what they are — “10 links to review: 4 broken, 3 never opened, 3 not opened in a year” — and starts a bounded session over the worst ten, one card at a time. Fewer than five waiting links and it stays quiet, on the grounds that four stale links are not a session.
- The session ends. It reports how many you actually dealt with, offers Another ten while more are waiting, and Done for today puts the offer away until the next day. Skipping does not count as handling, so the number at the end is honest — which matters more than it sounds, because a progress figure that flatters you is one you stop reading within a week.
Fresh: what changed while you were away
Every smart collection nextDash has keys on something you did — what you opened, what you added, what you pinned. None of them can answer the one question that is about the page rather than about you: has this thing published anything since I last looked?
- Fresh. When a page you saved offers a feed, that feed is noted while previews are being fetched anyway, polled on the existing background re-check interval with a conditional request, and the bookmark carries a small count of what has been published since you last opened it. A Fresh collection lists those bookmarks, newest publication first.
- Opening the bookmark clears the count, and that is the whole of it. There is no article list, no titles, no read state to keep in order, no OPML. “Last opened” is the entire read model. This is deliberately not a feed reader — it is a bookmark that can say 3.
- Off by default, under Behavior → Status & health → Fresh. Switching it on polls once immediately rather than leaving you to wonder whether it is working until the next scheduled run.
Working where you already are
- Filter the page you are on with
Shift + F. A slim bar narrows the rows in place, hides the categories left empty, and keeps the layout, the cursor and any selection you had. Search takes you anywhere across every page; this one stays exactly where you are. - You come back where you were. A long page is a place you are somewhere in, not a document you always start at the top of. The scroll offset is remembered per page — across a view change, a trip into Health or config, and a reload — for as long as the tab is open. It can be switched off under Behavior → General.
- A selection can be pinned and switched to Periodic or Monitor in one action, and a bulk tag change can be taken back. A mixed selection pins rather than flipping each row into the opposite of whatever its neighbour was, which is the behaviour that looks clever and is never what anyone wanted.
- Move a bookmark into the category beside it with
Shift + Alt + ← / →, without opening anything. Smart collections are skipped in that walk, being a query rather than a place you can put something. - The printable cheat sheet now carries every key the app does. It used to be a curated selection policed by a one-page budget, which quietly made the paper a smaller product than the app: a key added to the interface was not necessarily on the sheet, and which keys made the cut was decided by whoever ran out of page first. It now runs to twelve sections and 164 rows across three A4 pages, with 32 one-off palette commands deliberately left off. The live sheet behind ! is unchanged.
The shortcut default, and getting it wrong
In 1.2.0 the way bookmark shortcuts fire was changed: instead of opening the moment your typing matched a shortcut exactly, the list narrowed and Enter opened the top result. The reasoning was that an instant shortcut can swallow an ordinary word — type github with a shortcut on git and the bookmark opens after three letters — and that which words survive depends on which other bookmarks you happen to own. That reasoning was correct, and this blog repeated it approvingly.
It was still the wrong trade. The collision is real but rare, and what the change actually did was charge every shortcut, on every use, an extra keystroke in order to prevent it — which removes most of the reason to have a shortcut at all. A rare problem was solved by making the common case worse, permanently, for everyone.
The default is back to opening the moment it matches. What the collision needed was a choice, not a new rule, so there are now three modes under Behavior → Search: open instantly, open after a short pause, or press Enter. Both alternatives cost nothing when the collision is not happening — and a shortcut that keeps eating a word you type can simply be renamed.
Getting that default back to existing dashboards took a migration, for the same reason 1.2.0’s change did: the setting was written into every settings file 1.2.0 touched, so changing the default alone would have reached nobody. Installs still carrying press Enter — the value nobody actively chose — are moved to instant once. Installs on short pause are left alone, because that value can only be there because a person picked it, and the migration marker means anyone who deliberately sets Enter back keeps it through the next restart.
Config that answers back
- Find a setting by what it is set to. “Which one is on 8099?” — “what did I set to Monitor?” That is the question you actually have when something behaves oddly, and until now search only matched setting names. The value is matched too, and shown beside the location, with switches read as On or Off.
- The settings that ignore the device rule say so. With Keep settings on this device only switched on, a handful stay server-wide by design. Those now carry an all devices mark, because they are precisely the ones that surprise you on the other machine.
- Duplicate a page or a category — with its categories, and optionally its bookmarks; a category copy brings its width, icon and sort. Copies start with a clean check and open history, since a copied uptime figure would be a claim about a link this copy has never once checked. They also start without the original’s shortcut, for obvious reasons.
- Edit a name or a shortcut where you read it. Double-click the title, or click the shortcut pill — including the faint + on a bookmark that has none. A key already in use is named as you type it and refused on Enter, checked across every page, rather than quietly breaking whichever bookmark had it first.
- Tips filters itself. Fifty-three tips in seven groups, and the search at the top of Help returns whole panels — the wrong grain entirely when you are hunting for the one key that does the thing. The new field narrows to the line, counts what is left, says so when nothing matches, and hides a group whose rows have all gone. Rows are hidden rather than re-rendered, so your cursor stays where you are typing.
- Help says where a topic continues. Health and Monitoring answer different questions on purpose — what is broken now, against how something behaves over time — but the split left no thread between them. Seven panels now carry a Continues in link straight to the right place on the other tab.
- Help draws what it describes. Every article now opens with a small picture of its own subject: the three search prefixes shown in the field you type them into, the health tiles in the colours the rows actually wear, a certificate meter with the day the warning starts marked on it, a maintenance window shaded into a day. Thirteen new shapes joined the drawing vocabulary so that config, help and the tours all render the same concepts the same way. Labels inside a drawing follow your language;
200 OKandShift + Hdo not, because those are not words. - The button bar has a tab of its own. Appearance → Button bar now holds both halves of one question: where the bar sits — each of the five positions drawn — and which buttons it carries. The position used to live on Layout and its eight buttons on Toolbar & tabs, two tabs further along, so moving the bar and hiding a button on it were separate errands. Toolbar & tabs keeps the header row, which is a different strip.
- The version panel reads the actual release instead of carrying the number as text in four translated strings. It sat on nextDash 1.1.0 for two releases after 1.1.0, because the fourth of those files was the one nobody remembered to update.
Two fixes worth naming. Help sometimes opened with empty panels — headings with nothing underneath, for as long as you stayed in the view. Its prose is a separate translation bundle fetched alongside the config module, and a later load of the main bundle could wipe it out from under an open view; every panel falls back to nothing, so the failure was silent and total. The main load now keeps the help text when the language has not changed, and every repaint checks whether the prose is really there rather than trusting a flag that said it was.
And on a narrow screen, a config section reached by a link or a restored visit now scrolls into view properly. The tab strip carries scroll snapping, which re-snapped the scroll to the nearest button boundary and left Help hanging 36 pixels over the right edge with 112 pixels of scroll still available — the browser doing exactly what it was told, to no one’s benefit.
Faster, on the same machine
None of this changes what the app does; it changes how much of the internet has to happen before it appears.
- First load: 169 requests and 915 KB → 30 requests and 685 KB. Ninety-nine scripts and forty-two stylesheets are served as two bundles, the generated theme is inlined, Help’s translations travel with Help, and each view’s stylesheet arrives when you open that view. If you would rather have the individual tags back — for debugging, or because you patch the files —
NEXTDASH_BUNDLE=offrestores them. - Config’s cold open: 74 ms → 55 ms, and the bookmark list now draws 1762 elements where it used to draw 2757. Most noticeable on a long list and a slow machine, which is the combination that was worst before.
- 240 dead translation strings are gone — sixty per language, 408 KB — all of them prose describing a config layout that was replaced two versions ago and that nothing in the app had read since. The English translation file went from 591 KB to 494 KB.
Help’s translations also gained a check of their own: a key that English has and another language does not now fails the build, because the fallback is the English wording and it renders as a translation nobody got round to. It caught an untranslated string in German and French on its very first run. Help is now 272 strings, complete in all four languages.
Upgrading
If you are running the Docker image:
docker compose pull
docker compose up -d
Building from a git checkout instead:
git pull
docker compose -f docker-compose.prod.yml up -d --build
Or straight from source, without Docker:
git pull
go build -o nextDash && ./nextDash
One default changes on existing installs, and it is a change back: if your dashboard is still on press Enter to open a shortcut — the value 1.2.0 gave you rather than one you chose — it moves to opening instantly. If you deliberately picked short pause, or you deliberately set Enter yourself after reading about it, you keep what you picked.
Everything else is quiet by default on an existing install. Fresh stays off until you switch it on, soft-404 detection stays off on an upgrade — it is on for fresh installs, and the switch sits beside the check timeout either way — and no card offers you a review session until enough links are genuinely waiting for one.
The full picture
Every entry above, along with the tests, translations and documentation that came with them, is in the changelog. The manual and the README cover the capture routes, the rot tooling, the review session and Fresh, and Config → Help gained this release’s subjects in every tab that owns one, plus eleven new tips in four languages. Config → Overview → New features carries the six headline items if you would rather be shown than told.
nextDash is a keyboard-first, self-hosted bookmark dashboard. No accounts, no cloud, no noise — and it tells you which of your links are already dead, and now, how long they have been.
Source and downloads: github.com/jordibrouwer/nextdash
Release notes for this version: v1.3.0 on GitHub