Dashboard
- new — icon-only action buttons (category ⋯, sort chip, config row icons, and the bottom dock's
/>:?*.!★buttons) restyled for the newer themes: borderless, soft filled, circular where the content is a single glyph. Newstatic/css/action-btn-tokens.cssdefines--action-btn-bg/-bg-hover/-color/-shadowfrom the samecolor-mix()-against---text-primaryformulatheme-depth.cssalready uses for--hairline, so every theme gets the new look with no per-theme override. Full-word buttons (Quickstart, page tabs, Settings/Delete rows) are untouched. - new — a Lock layout setting (Config → Behavior → General, and
:lock-layout/:locklayoutin the command palette) turns off drag-and-drop reordering for both bookmarks within a category and categories on the grid. Reuses the existing sort-locked drag hint (attachSortLockedDragHintindashboard-render-core.js) with its own wording instead of a second hint mechanism, and marks the category grid's drag handle with a plain cursor via a newbody.layout-lockedclass. Sorting, adding, renaming, and deleting are unaffected — this only gates the drag gesture. The checkbox carries a small "New" badge (config-field-badge, a generic property any control can now set) so it stands out on the tab. - new — a Weather widget: current conditions beside a forecast, in its own "What's happening around you?" group in the widget catalogue. Reuses the location, source and unit already set for the header's own weather line (Behavior → Date & weather) rather than asking a second time — the widget's own settings hold only a Forecast range choice (3 days / 5 days / 24 hours), with a hint pointing back to where the location lives.
static/js/weather.jsgainedfetchForecast, one Open-Meteo request carrying bothcurrentanddaily/hourlyrather than two round trips, cached inlocalStoragealongside the header's own reading. Polls on the same 30-minute cadence as the header line (weatherentry inPOLLED_WIDGET_TYPES,dashboard-render-core.js) rather than a setting of its own. - new — a Calendar widget, beside Weather in the same "What's happening around you?" group: what is coming up, from one ICS feed set for the whole install (Behavior → Date & weather → Calendar feed URL, separate from the existing outbound calendar link). Fetched and parsed server-side (
internal/app/widgets_calendar.go) rather than in the browser, the same reasoning as the custom widget: most providers hand out a private feed address that is not meant for cross-origin JS, and it is not a thing to leave sitting in a script. A hand-rolled parser readsSUMMARY/DTSTART/DTEND, unfolds RFC 5545 line folding, and readsVALUE=DATEandTZID— recurring events (RRULE) show their own stated occurrence rather than being expanded, a deliberate v1 limit. One feed cache shared by every calendar widget (15-minute TTL,GET /api/widgets/calendar?pageId=&id=), each widget narrowing it to its own Look-ahead-days and row count. Reuses the existing.dashboard-widget-rowsrow styling — no new CSS. A saved widget setting or a changed feed URL redraws the tile immediately —forgetWidgetCaches(dashboard-render-core.js) now drops the calendar tile's own client cache too, andcalendarIcsUrlgets its own branch insetBehavior'sdatetimehandling (dashboard-config.js), the same shape the weather fields already use.
Config
- new — Hypr mode moved out of the General checkbox list into its own titled section, directly under Onboarding, with a full explanation of what it does. It was easy to mistake for the "Open links in a new tab" checkbox above it when it was just another one-line label + info icon.
Command palette
- new — a typed setting command now marks its current value visually, not just in the row text. Every toggle (
:animations,:lock-layout, …) and every multi-choice command (:density,:columns,:theme, …) paints its current-value row with a soft accent tint and a small "current" pill, on top of the existing "(current)"/"✓" text. Comes from two shared helpers —_buildOnOffRows/_handleSimpleToggleand the new_markCurrentRow(replacing_markCurrent, spread into the row instead of just naming it) insearch-commands.js— so every command built on them picked it up in one pass rather than a per-command edit. The list already re-renders in place after a change (_paletteRefresh→refreshCommandPaletteInPlace), so the highlight moves with it live.
Docs
- new — the manual and the in-app Help cover the Weather and Calendar widgets, Lock layout, and the Calendar feed URL. MANUAL.md gains a "What's happening around you?" table beside the other widget groups (nineteen types now, not seventeen), Lock layout notes under Reorder bookmarks and Reorder categories, a
:lock-layoutrow in the command table, a "Calendar widget shows nothing" entry under troubleshooting, and a header note keeping Calendar URL (the outbound link) apart from Calendar feed URL (what the widget reads). Help's widget catalogue, Behavior tour and widget intro say the same in all five locales —de,frandzhwere still missing the system-widget group as well, so their kind counts were wrong before this and are right now. - Release plumbing for v1.7.0. New
static/data/whats-new/v1.7.0.json, entry added first inindex.json, both tokens inwhats-new-stub.jsmoved (DASHBOARD_RELEASEto2026.09-dashboard-release-v1.7.0,NEXTDASH_WHATS_NEW_DATA_VERSIONtowhats-new-v280),helpVersionBodyrewritten for this release in all five locales, three spotlight entries withsince: "v1.7.0"instatic/data/overview-features.jsonfor Config → Overview and About → News & features, two new Help tips, andtests/whats-new-hidden-release.spec.jsrewritten around the new state. hideFromModalcleared on v1.6.1 and v1.6.2. They were held back so they would not displace v1.6.0 in front of readers who had already seen it. v1.7.0 leads the modal now, so both are ordinary entries again and a reader scrolling back finds no version missing between two that are there.