A new default look, and a lot of ways to change it. A fresh install starts on Confetti with masonry columns and Inter; twenty-four colour-burst themes arrive with three new backdrops; categories and widgets sit on glass, a card or nothing; a category can show tiles; Config and the list views are panes like the dashboard; Statistics gains a Server tab. The keyboard shortcuts sheet is easier to scan and search, and widget titles go back to a plain title over their card.
New defaults
- new — a fresh install starts on Confetti (
look-confetti-dark, its light half for auto dark mode), with masonry columns, a density that follows the screen (auto) and Inter for text; code, addresses and the // stay on the mono face. Category spacing follows its setting. An install that already has a theme keeps it. - new — category headers start small. The Size of a category header defaults to Small (it was Medium), for a fresh install and, once, for an install still on Medium; one that chose Large keeps it, and so does anyone who goes back to Medium after the pass has run (
CategoryHeaderSmallMigrated). Reset all in the look studio puts it back to Small, and the page carries the size from the first paint (data-cat-sizeon the body) so headers do not jump on load. - new — velvet themes are flat with a soft glow. Every velvet theme, including the Looks that use it, now ships at depth Flat with glow Soft on glass panes (it was depth Glass, or glow Off). The other characters are set below, under Themes and looks.
- new — one-time moves for existing installs. An install still on the old defaults (compact rows and the default layout; Source Code Pro; type size m) moves once to masonry and auto density, to Inter, and to type size lg. One that chose something else keeps it, and so does anyone who goes back after the pass has run (
GridDefaultsMigrated,FontSizeLgMigrated). - new — a one-time card to try Confetti. Someone with a dashboard already is asked once whether to switch. Try Confetti applies the dark half whatever theme they are on, and the card turns into Go back and Keep Confetti, so trying it costs one click to undo; Not interested is a final answer. Nothing is offered on Confetti itself or with a random theme rotating (
confetti-theme-notice.js, built onNoticeCard). - new — a start guide replaces the first-start card and the checklist. A fresh install opens on the dashboard with its example links; after a moment a Quick start bar slides in at the bottom with a soft pulse, and opens a modal in the middle. The modal holds the choice about the example links (Keep or Start empty, which asks before it removes anything), links to the manual and the theme studio, the language (it changes the dashboard and the guide at once, without a reload), the weather (a city and °C or °F, saved as the same settings Config uses) and nine next steps, in the order a reader would take them: take the tour; import bookmarks and get the browser extension; open the Bookmarks view and the Inbox; add a widget; turn on status checks and set up notifications; open Config → Overview. Three steps show at a time, the rest behind Show more. The modal opens by itself only the first time, three seconds after the bar is up, and from then on when the bar is pressed; Esc, a click outside, Close for now and the answers fold it back into the bar, which glows once so the eye finds it. The bar stays on the dashboard of page 1 (hidden in Config, other views and other pages) until every step is done, then says All set and waits for a click, or until it is closed for good with ×, which asks first. No other corner card is shown while it is there, and the non-essential ones wait fifteen minutes after it is finished (
quickStart.completedAt); an Undo for something just done still shows, and the bar steps aside for it (start-guide.js,start-guide.css). - new — a fresh install does not get cards that the guide already covers. The Confetti invitation, the clock-and-weather question, the theme-browser invitation and the automatic dashboard tour start answered on a new install; the tour is the guide's first step. An existing install keeps all of them (
freshDiscoverabilityStateinmodels.go). Config → Reset onboarding starts the guide over, steps included. - new — Config → Containers has a Tour button. On its band, where Widgets has one: it plays the Containers view's tour, seen or not (
data-containers-tour). - new — the dashboard tour starts with the action bar. A new first slide shows the nine buttons with their keys (
+,>,:,?,/,*,,,.,!), the bar docked at the edge of the page, where it stands and slides away by default, and how it comes back ('or Shift+O). The tour is eight steps now; the tip id is unchanged, so a reader who has seen it is not shown it again, and it plays from Config → Help or Shift+K (dashboard-tutorial.js). - new — the start card has two more buttons: Show me the manual first opens nextdash.cc/docs in a new window and Open the theme studio opens the theme browser. Neither answers the card, which stays until a choice is made.
- fix — the mobile info banners are gone from the dashboard and from config (
mobile-experience.js, its CSS and five locale strings in each language). - fix — config no longer greets a fresh install with a keyboard tip. The In config: j/k… tip that popped up the first time config opened is gone; the same tip stays in Help → Tips.
- fix — Space between columns applies to the default layout. The default layout kept its own 1.5rem column gap, so Airy (and Confetti, which follows the theme to airy) moved only a wide category's inner columns and left them off the grid. The gap now follows the setting.
- fix — Space between columns is not shown as changed on a fresh install. Its default is Follow the theme; Config → Appearance compared it with Balanced and put it first in the folded summary.
- fix — the terminal layout hides the category handle again under the clean header styles, where the grip drew back in and caught Tab.
Themes and looks
- new — twenty-four colour-burst theme families, a collection named Looks (
look-embertolook-holo), added to the New set. The theme browser gains a New segment next to All, Favourites, Light, Dark and Yours. - new — three backdrops: burst, splash and leak. A burst fans the theme's colours round one point, a splash is four large soft blots, a leak is light coming in from an edge. They are loud, so each is drawn over a scrim floor of theme tint (0.24, 0.22 and 0.2) that the reader's own Theme tint can raise but never go below. The hash that picks a backdrop for a theme still covers only the original 26, so no existing theme moves; the new three are reached by naming them.
- new — categories and widgets sit on glass, a card or open. Appearance → Surfaces → Category surface (and the theme studio's Surface tab) chooses what a category and a widget stand on: a see-through pane, a solid card, or nothing at all. Follow the theme lets each theme bring its own, as with depth and glow; flat depth defaults to open. It has its own ↺ and ℹ like depth and glow.
- new — Widget background. On an open category surface nothing framed a widget any more, and it looked like a category with another title. Appearance → Surfaces → Widget background (and the theme studio's Surface tab) chooses whether a widget draws a background of its own: Automatic (the default) makes it a card exactly where nothing else frames it, on open: a faint fill, a hairline and a shadow round the widget, and its title on a strip of its own with a line under it, the // inside it; Background always, also on glass and card (where the pane is the card and only the title strip comes); None never. Automatic follows the surface the page is drawn with, not a list of themes, so whatever makes a theme open (its own answer, paper, velvet or terminal, flat depth, or a surface you choose for one theme or for all) gives its widgets the frame; a category given a pane of its own card glass is framed already, and automatic steps back. The answer reaches the first paint from the server (
data-widget-bg), andsettings.widgetSurfaceisauto | background | noneWidget opacity, a slider next to it, sets how solid that card is, from 0 to 100% of the theme's surface colour, 50% by default: the card is mostly solid, so a widget reads as a card on any backdrop, and the title strip is a little more solid still (settings.widgetOpacity,--widget-bg). (widget_surface.go,category-surface.css,theme-loader.js). - fix — the // stands in the title again. A category hung its // in the gutter left of the column, where a neighbouring column's // ran over the edge of a widget's card; with four columns or more that was most widgets. The // is back in the title's row, for categories and widgets alike, and the card no longer has to keep clear of anything (
dashboard.css). - fix — a widget's title strip runs to the edge of its card. The strip and the body sat inside the category's side padding, so the card's border showed as a gap round the strip. Both now run to the edge, and the text lines up with the title (
category-surface.css). - new — Slate is rich and open. The default theme, Slate (dark and light), now has rich depth and an open category surface, so a fresh install shows categories without panes and widgets as cards. A reader who chose a depth or surface for Slate keeps it (
models.go). - new — Backups & data reads top to bottom. Config → Data & backups → Backups & data opens on a status (Your data is backed up, or No backup yet, or that the last automatic run failed) with Back up now and Download beside it and four figures under it: how many are stored, the size of the newest, what they take on disk and the bookmarks in it. Under that three groups, nothing folded away: Protect (automatic backups with their interval, local copies of pages, tokens and passwords), Restore (from a file, and the stored backups with Restore, Download and Delete) and Move (bookmarks as HTML or CSV or from a browser, and settings as JSON). The explanation that used to sit under each control is behind an ℹ on it (
dashboard-config.js,config-view.css). - fix — pointing at a category or widget header tints all of it. The tint covered only the part inside the block's side padding, so on a pane or a widget card a strip of the header stayed untinted, and a widget's title strip lost its fill and shrank from the left. The tint now runs from one edge of the block to the other, up to its top edge on a pane (which has padding above the title), a widget's strip keeps its fill and gets a little lighter and on a pane sits flush with the top of the card, and the text and the accent tab on the rule stay where they are (
dashboard.css,category-surface.css). - new — Gloss Chrome and Gloss Amber open on an open surface. Both (dark and light) now start with glass depth, an open category surface and glow off, so their categories sit without panes and their widgets are cards. A reader who chose a depth, surface or glow for them keeps it; the other Gloss themes are unchanged (
models.go). - new — the Health and Trend widgets of a new install sit at the bottom. A fresh dashboard opened on two widgets above the links. They now close the page, below the categories, and the example note takes the top right, so the first thing seen is what the dashboard is for. Existing installs keep their own order (
default_seed.go). - fix — the Appearance settings line up. In Theme & type every row now ends on one edge: the theme picker with its button, Quick mode, the toggle, Random theme and the theme editor, and the ℹ column stands in one place. In Surfaces Widget background and Widget opacity sit in the same control column as Depth, Glow and Effects; they started further right, and the opacity note stood beside the slider instead of under it. The button next to the theme picker is now Open theme studio (
config-tabs.css,dashboard-config.js). - new — a widget is told from a category on glass. On a glass or card surface a widget and a category were the same pane under a different title. A widget's title now sits on a lighter strip with a line under it, flush with the top of its pane; its handle is a small panel instead of the two slashes. Categories keep their slashes. Appearance → Surfaces → Widget background is Background (the default) or None now, because Automatic only ever differed on glass and card, and a stored Automatic reads as Background; on an open surface the widget is still a card as well. A collapsed widget closes to nothing again, strip aside. A plain page load also puts the answer on the body now, where the stylesheet reads it: until a setting was touched, the strip was not drawn (
widget_surface.go,dashboard-render-core.js,dashboard.css,category-surface.css,dashboard.html). - docs — the manual follows v1.20.0. First launch describes the Quick start bar and guide, the ten example links in the inbox and the new example page layout; Surfaces gets Widget background and Widget opacity; Layout gets Space between columns; Commands lists the new palette words; Data & backups is rewritten for the new tab; the tour has eight steps. New and retaken screenshots: the first launch and the guide, Backups & data, Surfaces, Layout spacing, Appearance, the Server tab and every widget tile. The texts that still named the quick-start card or its checklist (the Show quick start again button and its hint, three Help panels) are corrected in all six languages (
MANUAL.md,screenshots/,locales/). - docs — Config → Help and the translations are up to date. Seventy strings that only had an English fallback (the start guide, Backups & data, Widget background and opacity, the Containers tour hint) are in
en.jsonand translated into Dutch, German, French, Spanish and Chinese, and Browse… beside the theme picker reads Open theme studio in every language. Help describes the Quick start bar and guide, Open theme studio and the Surfaces settings (widget background and opacity), Space between columns, the new Backups & data tab, the widget's strip and handle, the new palette commands and the example links in the inbox (locales/). - new — a new install has ten links waiting in its Inbox. The Inbox was an empty view with a count of zero on day one. It now holds ten unread links to read, keep, promote or throw away (Caddy, Healthchecks, restic, Syncthing, Paperless-ngx, Immich, the Twelve-Factor App, SQLite, systemd and Julia Evans), with their preview text written in, so the list reads well without the network. None of them is on the starter pages. Start with an empty page in the start guide takes them away with the example links, except one you have already read or put to sleep; Reset all data puts them back; the minimal seed and the demo have none (
default_inbox_seed.go). - new — a card points to the theme studio. A one-time card in the corner names
Shift + Aand the two tabs a reader most often wants, Surface and Layout, and opens the studio on request. Everyone is asked once. A new install is not greeted on its first day: the card waits a day from the moment the settings file was written (firstRunAt), and an install without that stamp is asked at the next quiet moment. The card is translated into all six languages and has a spec of its own (theme-studio-notice.js,theme-studio-notice.spec.js). - new — the Quick start grows out of its bar. On a first visit the guide opens by itself, three seconds after the bar is up, and only that once in a browser. Opening the guide, the window now grows from the bar in the corner to the middle of the page, and Close for now,
Escor a click outside folds it back into the bar the same way. With reduced motion, or animations off, it opens and closes at once (start-guide.js). - new — Confetti draws its category headers clean. Category header → Style is one setting for the install, and on Follow the theme a theme may now state a header of its own: Confetti (dark and light) shows the name alone. Every other theme keeps the header it had, and a style you pick yourself is never replaced. Switching theme moves the header with it, and the first paint has it (
category_header_theme.go,theme-loader.js). - new — Confetti is airy between columns. Space between columns has a new first choice, Follow the theme, and it is the default: balanced everywhere, except on Confetti (dark and light), which draws its columns airy. A spacing you pick yourself is never replaced. Space between categories already reads balanced there, so it is unchanged.
- new — Confetti is airy between categories too. Space between categories gets the same first choice, Follow the theme, as its default: balanced everywhere, airy on Confetti.
- fix — Page margins now move the columns. The columns stop growing at a width and a wide window centres them, so Snug, Balanced and Airy only moved the page title. Snug now lets a column grow to 460 px, Balanced keeps 360 px, Airy pulls them in to 300 px.
- change — A fresh install starts on medium type. The default font size is M instead of Large medium; an install that has a size keeps it.
- new — Space between columns. Appearance → Layout gets a second spacing setting beside Space between categories: Snug, Balanced (the default) or Airy for the room across the page, between one column and the next (12, 24 and 40 px). Space between categories only ever set the room down the page, and across it a masonry page had a fixed 1 rem. It is in the theme studio's Layout tab as well, and
:columngapin the palette sets it. The default is 24 px, so the columns of a page that never chose move 8 px apart (settings.columnSpacing,data-column-spacing). - new — the Surfaces settings in the palette.
:surface(Category surface),:effects,:widgetbg(Widget background) and:widgetopacityjoin:depthand:glowunder Look & layout, so every setting in Appearance → Surfaces can be set from the keyboard (search-commands.js). - new — defaults per theme character. Every built-in theme of a character ships with the same surface settings: aurora with glow Off, opacity 20% and glass panes; paper with open panes, opacity 20% and the glass depth (glow Off); carbon with the glass depth, glass panes and effects Off; ink and neon with the glass depth, glass panes and opacity 20%; enamel at opacity 20%; lacquer with the glass depth, glass panes and opacity 35% (the Looks that use it keep 20%). They are the theme's own defaults: a theme file already saved on disk keeps the values it has.
- fix — a row's highlight strength shows when it is chosen. Changing the row highlight strength lights the first visible bookmark row for a moment in the strength just picked, so the choice is seen without moving the pointer off the panel.
Categories and widgets
- new — tiles per category. A category's menu has Show as tiles / Show as rows. Tiles draw the bookmarks as a grid: a large icon, the name under it, the status as a dot on the corner and the response time small below the name. The DOM is the row's, so drag, the context menu, the keyboard and inline editing work as in a row. Terminal and launcher keep their own designs (
category.view,dashboard-tiles.css). - new — icons live in titles. A category used to have an icon field; the icon is part of the title now. An emoji typed in the name is text; an app icon is written
:file.svg:(a file indata/icons/), drawn as the image it names, and the category menu has Insert icon…. Categories and widgets are titled the same way, and only the words are lower-cased, so a file name keeps its case (dashboard-title-icons.js). - new — Settings from a widget opens that widget's settings. Its row opens and every other row is closed, the search is cleared and the list moves to the widget's page, so it is clear which widget the fields belong to.
- fix — a category title starts where a widget's does.
- fix — the + that adds a category now shows where the name goes. It opened a name row at the end of the grid and hid itself, so on a long page the click seemed to do nothing. The row is scrolled into view, for the
ckey as well (dashboard-category-add.js). - fix — a popover answers from the moment it opens. The outside-click and Escape handlers of the action popovers (row tags, move, delete, and the multi-select Tags one) were bound on a 0ms timer, and a click or key a few milliseconds after the popover appeared was handled before they listened, leaving it open. They bind at once and skip the event that opened the popover by its time stamp (
_bindActionPopoverOutsideClose).
Config
- new — Config and the list views are panes. Config drew flat rectangles and left its tables bare, so it read as another application. Its panels, overview cards and tables now take the pane the dashboard draws, the same glass, card or open (open keeps a light frame); selects and inputs stay fields. The tag view, inbox, containers view and bookmarks view are one pane each, and the header of a list view is the top of its pane at rest, turning solid when rows scroll behind it. Config has two arrangements: loose panes (the default) and one pane round everything (
data-config-panes="one"). The opening text of a tab is a pane too. - new — Help tabs in labelled groups, one row. The fifteen tabs sat on one scrolling line, hiding most of them. The row keeps Basics; Dashboard, Status & checks and Data are a menu under More topics.
- fix — room under field notes. The gap between a control and the sentence under it is one token,
--config-note-gap(it had been a −4px margin against a 4px row gap, which left nothing). - fix — Share this page and Import a page are themed buttons in the page-template modal.
- fix — the rows of a widget list no longer sit on a lighter band. The rows of Health, its trend and the forecast were filled 9% lighter than the pane, so a few lines of text looked to have another background. They are unfilled now, with a hairline between them and a light wash when pointed at; the figures of a stats widget keep a faint chip (4%) (
category-surface.css). - fix — a click on a row in a widget leaves no ring round it. The keyboard cursor follows focus, and a click focuses the row it hit, so the cursor's 2px ring appeared round every clicked row. The ring now shows only when the cursor got there by key (
keyboard-selected-pointer,keyboard-navigation.js).
Statistics
- new — a Server tab. Six figures and panels for the machine behind the dashboard: containers running, unhealthy and waiting for an update, crashes over thirty days, container trouble and updates per day, the most restless containers, memory and CPU now with the total, Docker disk use by images, volumes, build cache and stopped containers (and what could be freed), the Unraid array, disks with temperature and read errors, parity, VMs, UPS and notices, automatic backups and container updates. A panel without a connection says what is missing and links to where to set it up. Overview's Needs attention gains server lines: unhealthy containers, waiting updates, an Unraid disk with errors, disabled, missing, hot or full, and a late or missing automatic backup.
- new — a Notifications panel on Health: open alerts and how long they have been down, what is held in quiet hours, push devices, webhooks, the alert service and the last weekly digest. How many were sent is not recorded.
- new — widgets by kind and per page on Collection.
- new — one route for every container's last thirty days.
GET /api/docker/historyreturns the fleet's events, update history and last disk measurement in one read, instead of asking the drawer's route once per container (docker_history.go). Nothing new is stored.
Keyboard shortcuts sheet
- new — two columns. The sections sit side by side (one column below 40rem) instead of in one long column, so the sheet fits a window without scrolling past every section (
.cheat-sheet-groups). - new — find by key or section. The filter also matches the key chips and the section name, and ignores spaces, so
shift + yfinds Shift+Y andtag viewshows the whole Tag view section. - new — topics. A row of chips under the filter narrows the sheet to Navigation, Bookmarks, Views, Search and commands, or Other, and opens every section of that topic. Typing in the filter still searches all topics.
- new — the view's own section leads. Opened from a view with a section of its own, that section moves to the top and spans the full width instead of sitting somewhere in the grid.
- new —
/jumps to the filter, next to Ctrl/Cmd+F. The filter stays at the top while the sections scroll. - fix — easier to read. Section titles are larger and no longer all lowercase, each shows how many shortcuts it holds, and the rows have more room.
Dashboard titles
- fix — widgets are not headers. v1.19.10 made a widget's title a strip on the card's own surface, joined to it. That is gone: the title is a title over the card again, as a category's is over its list (
.dashboard-widget > .category-titleand its collapsed-state rule are removed). - fix — the // sat in two places. A category hung it in the gutter left of the column and a widget kept it in the row, so a page with both had two columns of them. Both hang it at the same place now, 24.4px left of the block (
.category-reorder-handle, one rule for both). The row's own start padding moved from the label to the icon and the name, which is what lets the // sit alike. - new — a widget's name starts on its card's content. The card's border and padding in (1px +
--space-3), where the first line of the card starts; a category's name starts in the same place, so a page of both keeps one left edge for titles. - fix — a title jumped when pointed at. The general hover grew the title 4px to the left (padding and a negative margin) and painted it with the
backgroundshorthand, which also took the accent tab off the rule under it. Pointing at a title now tints it where it is, with a background colour, and the tab stays. The old tint was never drawn on the dashboard at all: it read--hover-bg, which only exists inside Config. It is--text-primaryat 7% now.
App discovery
- fix — Remove on the ignored list sticks when a run is going. A discovery run copies what it knows before it probes and saved that copy back afterwards, so a Remove made in those seconds was undone and the app was never offered again. The run now leaves out names taken away while it probed (
discovery.go). - fix — Undo all on the notice can be tried again. When one of several undos failed, a second click hit the ones already taken back and stayed on Could not take it back. Undo now counts those as done, retries only the rest and ignores a second click while it runs; Move keeps the notice when it cannot find the new bookmark, and a failed refresh is tried again on the next check (
app-discovery-notice.js). - fix — the question about new apps opens once. The start timer and a return to the tab could both open it; the second now waits for the first (
app-discovery-notice.js). - fix — a double click on Promote makes one category. Promoting an app proposal from the Inbox looks up its category first; a second click in that moment created it twice (
dashboard-inbox.js). - docs — two new tests guard these fixes.
TestDiscoveryUnignoreDuringRunSticksdoes a Remove in the middle of a run (throughdiscoveryBeforeSaveHook), and Undo all on the notice tries again only what a failed Undo left intests/app-discovery.spec.jsfails the second of two undos; both fail without their fix.go generaterefreshedasset_hashes_gen.go.
Docs
- docs — 147 interface strings that only existed as English fallbacks in the code are now in all six locale files (the Confetti card, the category menu, Statistics → Server, Notifications and Widgets, the Help tab groups, the category surface), translated into nl, de, fr, zh and es;
validate:locale-paritycould not see them because the keys were missing everywhere, not in one file. - docs — Config → Help follows this release: 188 theme families and the Looks collection, Confetti as the starting theme, 29 backdrops, the category surface, six Statistics tabs with Server, tiles and icons in titles, in six languages; the matching tips carry the new counts.
- docs —
static/data/whats-new/v1.20.0.jsonand its index entry, with two highlights (Confetti and the new Looks, the Server tab) and their pictures understatic/data/whats-new/media/;whats-new-stub.jsmovedDASHBOARD_RELEASEto v1.20.0, which leads the window again, andNEXTDASH_WHATS_NEW_DATA_VERSIONtowhats-new-v342. v1.19.10 and v1.19.11 lose theirhideFromModal, so every release shows in the window again.tests/whats-new-hidden-release.spec.jsnames v1.20.0 and expects nothing held back. - docs —
static/data/whats-new/v1.19.11.jsonand its index entry (hideFromModal);whats-new-stub.js'sNEXTDASH_WHATS_NEW_DATA_VERSIONmoved towhats-new-v341,DASHBOARD_RELEASEstays on v1.19.9.tests/dashboard-title-alignment.spec.jscovers the // position for a category and a widget, the missing strip and the hover (it fails on v1.19.10's CSS);tests/whats-new-hidden-release.spec.jsnames v1.19.11 as held back next to v1.19.10.go generaterefreshedasset_hashes_gen.go.