github jordibrouwer/nextdash v1.22.0

4 hours ago

A new look. Every material now has a surface of its own, drawn through cards, headers, menus, dialogs and the side panel, and the themes were redrawn with it. New backdrops and patterns fit each theme. Aurora Glass is the default theme, and every existing install moves onto it once, with a dialog that offers the way back. Next to it: a Classic ThinkDashboard theme, a redesigned cheat sheet, a two-column bookmark form with a live preview, and a round of fixes in Config, the dashboard and Glances.

Look

  • new — signature material style. Each of the twelve materials (glass, paper, enamel, brushed metal, neon, ink, terminal and the rest) draws its own surface, category header and widget header, and every header keeps the //. Paper columns read as an index card, enamel as a glazed tile, neon with a glowing top edge, brushed metal and glass with a shine per column. Theme Studio → Surface → Material style keeps Classic as a choice for the flat, old look (material_style.go, theme-signature.css).
  • new — Aurora Glass is the default theme. A fresh install starts on Aurora Glass, on the dark or light half.
  • new — every install moves onto Aurora Glass once. The themes were redrawn for the new look, so keeping the old drawing beside it would mean two of everything. The move keeps the dark or light half you were on, and lookMigration remembers the theme you had. Bookmarks, categories, settings and own themes stay as they were. Covered by aurora_glass_migration_test.go.
  • new — a dialog explains the move. It shows the theme you had next to the one you have now, offers Go back to {theme} and Open the Theme Studio, and appears once, before any corner card (look-migration-notice.js). Opening the studio from it waits for the studio to load first.
  • new — backdrops chosen per theme. Each material has a pool of its own and each theme picks from it. Eighteen patterns replace the colour washes, with new recipes such as haze, veil, spotlight, silk, caustics, dawn, linen, dotgrid, ruled and grain, a blue sea for Ocean, bricks for Concrete, a small honeycomb for Bokeh, and rack and terminal backdrops for the four Unraid themes. Hexagons, chevron, prism, sunset, dunes, mountains and blueprint are drawn finer and the loud ones calmed. Every recipe carries the colour of its theme; a dark page carries more of it.
  • new — a quiet centre. A Quiet centre slider fades the backdrop behind the bookmarks. It is kept per theme, with the install-wide value as the fallback.
  • new — neutrals on one ladder. The eight neutral themes (Neutral, Stone, Gray, Zinc, Slate, Chalk, Concrete, Black) sit on one lightness ladder, each with a material and a backdrop of its own. Accent of the neutrals picks one of six colours for all of them, or the theme's own (neutral_accent.go). Covered by tests/neutral-accent.spec.js.
  • new — ThinkDashboard Classic. The ThinkDashboard theme from v1.0.0 returns with its colours and grid of dots; the current one is now ThinkDashboard Modern. Covered by tests/theme-thinkdashboard-classic.spec.js.
  • new — Unraid themes redrawn. Card panels and server colours, a calmer band, and old Unraid copies move to the new card drawing.
  • new — Gloss Chrome and Gloss Amber on glass, like the other lacquer themes; Gloss Chrome keeps its plain grey band. 65 dark themes move to colour recipes and textures get their colour back.
  • fix — the Theme Studio keeps your place. A picked backdrop keeps the focus and the scroll; theme card names keep their width beside the pills.
  • removed — the Berry, theme browser and clock and weather corner cards. Berry is no longer the default, and the dialog above covers the new look.

Overlays

  • new — overlays, views and Config take the look of the material, with four levels of elevation. Layers take the light of their material, ink layers carry a bar on the top edge, neon layers glow, and small layers are closed per material.
  • new — the action bar is a handle on the screen edge, in the surface of the material, with the mark of the head and hairlines between the groups.
  • new — the cheat sheet has a search field, topics in columns, and a dock that shows the keys of the row you pick and follows focus. Rows carry their keys for screen readers, and focus looks different from selected. Cards stay whole in Safari.
  • new — add and edit bookmark in two columns with a live preview. Two columns only with a fine pointer, tab order runs down each column, and the label is not read twice. The icon picker opens in the page, so the form no longer clips it.
  • new — the preview card shows the picture on the left; cards without a scrim get a closed fill.
  • new — Save this link, What's New, views and Config lie on the surface of the material: address, preview, choices, blocks, chips, summaries, cards, controls and table heads.
  • new — the popover arrow points at the control that was pressed, follows it when hidden and shown, and clears when the popover hides.
  • fix — layers respect your settings. Reduced transparency closes them, effects off is flat, animations off stays off, and the toast and preview have no blur. Shadows follow the light of the page.
  • fix — bookmark rows take one inset from one variable, so icons line up with and without a ping and each layout keeps its own padding.
  • fix — selects, lists and tutorial dots stay readable on the layers; the active tutorial dot is lit, and quick add and the palette show their focus.
  • fix — the Bookmarks view has no second blur layer under the plate, and its rail is lit like the other views. The Config bookmarks preview scrolls with the page.

Keyboard

  • new — Shift+G opens Glances from every view. In lists, the last row is now End instead of G.

Config

  • fix — the Config band keeps filter and count in the same place on every tab.

  • fix — taking a tag off a bookmark no longer undoes a settings save. refuseRemovedTags (tag_refusals.go) read the settings, added the refusal and wrote them all back without settingsMu, so a Config save landing in between was lost or put back. It now holds the same lock as SaveSettings. TestRefusalWaitsForTheSettingsLock fails without it.

  • fix — POST /api/pages refuses a page id below 1. A 0 or a negative id was written as bookmarks-0.json, which no page list reads back, and stayed in pages.json. Now 400 Invalid page ID. Covered by TestSavePagesRefusesAnIDBelowOne.

  • fix — a page delete that fails no longer leaves a trash entry. DeletePage trashes the page before removing its file; when the removal failed, the entry stayed as a copy of a live page whose Restore answered 409. The entry is now taken back out. Covered by TestDeletePageThatFailsLeavesNoTrashEntry.

  • fix — a duplicate whose categories fail leaves no empty page behind. duplicatePage saved the copy first and, when the categories write failed, showed "Could not duplicate this page" over a page that did exist; a retry made a second one. discardDuplicatedPage deletes the copy and drops its trash entry.

  • fix — a category deleted on another device stays deleted. The categories editor sends the whole list, and addCategoriesMadeElsewhere only added what was new on the server, so the next edit here put a category deleted elsewhere back. _catOnServer remembers what the server last had; a category gone from it since leaves the list too.

  • fix — category saves for one page go out one at a time. Two quick toggles sent two whole lists at once and the older could land last, so the server kept the first click while the button showed the second. saveCategories now queues per page. The last three are covered by tests/config-structure-review-fixes.spec.js, each failing without its fix.

  • fix — a settings save that leaves keys out of the backdrop tuning keeps their defaults. SaveSettings decoded a missing calm, scale or brightness as 0 and clamped it, so a tab still running the page from before the quiet centre stored no quiet centre at all. It now fills the absent keys as a settings file does (fillMissingBackdropTuning); an explicit 0 stays. Covered by TestSaveSettingsFillsMissingBackdropTuning.

  • fix — restoring a backup with many local captures no longer runs the server out of memory. stagedFilesFromZipReader (auto_backup.go) read every capture under archives/ into memory before the restore applied, and captures are left out of the 1 GB total, so a backup with a few hundred of them needed gigabytes of RAM. A capture is now copied out of the archive when the staging directory is written, one at a time, and still held to the 64 MB entry limit there (copyImportEntry, backup.go). Covered by TestRestoreReadsCapturesWhenWritingThem and TestRestoreHoldsCapturesToTheEntryLimit; the first fails without it.

  • new — Overview → New in nextDash lists the features since v1.20.3. Eleven items, newest first: every theme redrawn, 75 backdrops and the quiet centre, Signature or Classic, the neutrals with one accent and ThinkDashboard Classic, the searchable cheat sheet, the two-column bookmark form, the Glances page, widget and insights, domain expiry and Add new bookmark in a category menu. Each has a button to where it lives. The texts are in static/data/overview-features.json and the 55 keys under config.overviewNewFeature* in all six languages. v1.21.2 and v1.21.3 are fixes held back from What's new and have no item.

  • new — Overview → Version links the manual to nextdash.cc/docs. "You can find the full changelog here and the manual here" sent the manual to MANUAL.md on GitHub; the changelog link stays there.

  • fix — a repaint from another section waits for that section's file. Statistics, Help, About, Overview, Logs, Data & backups (trash, webhooks) and Appearance repainted when this.section said they were open, even while the file that draws them was still loading, so a late answer could paint into a body that was not there yet. Each now asks inSection(id), which is true only when the section is open and its file has run (dashboard-config.js).

  • new — the section planner reads those gates. scripts/config-section-plan.mjs treats inSection() like the older this.section === checks when it works out which methods belong to which section, so the split of dashboard-config.js still comes out right; tests/config-section-plan.test.mjs covers it.

  • new — Data & backups and Appearance load from files of their own. About 2,900 and 2,400 lines of dashboard-config.js move to dashboard-config-data-backups.js and dashboard-config-appearance.js, fetched the first time the section is opened, like Statistics, Glances and Inbox before them. Config opens with less script to read, and nothing about either section changes. The specs that reach into these sections wait for their file first (config-archive-keys-stay, config-local-archives, config-silent-data-loss, config-import-roundtrip, category-header-theme, dashboard-category-spacing, dashboard-column-spacing, theme-choices-hold).

  • fix — a section opened from inside Config waits for its file. With Config already open, a jump to another section (from the command palette, or the Appearance tab a setting names) switched the heading before the section's file had landed, so render() threw and the old body stayed under the new heading. The jump now waits for the file and then draws (dashboard-command-palette-config.spec.js).

  • new — the section planner knows the lazy files. scripts/config-section-plan.mjs sees callers outside a section and the section files that already exist, and the extractor ends a static array at its semicolon (extract-config-section.mjs, lib/config-members.mjs), so the next sections can be split off the same way (tests/config-section-plan.test.mjs).

  • fix — Export CSV and the imports work before Data & backups has been opened. Since that section moved to its own file, the CSV export of ticked rows (dashboard and Bookmarks view), the browser import and the CSV import called functions that file had not loaded yet and did nothing. Each now loads the file first (dashboard-config.js).

  • fix — Home and End on a tab or a chart. End became "the last row" and "the last section" in v1.22.0, and Config's key handler took it from a focused tab and from a chart's day read-out. Tabs go to the first and last tab again, and a chart to its first and last day.

  • fix — a focused block title shows it. Under Signature the title's tint was cleared with the rest of its background, so moving through blocks with the keyboard showed no mark on the title that had the focus (theme-signature.css).

  • fix — Config tables. A name in a Structure, Pages or Finders table read as an input box at rest under Signature, and the collection whose editor is open lost its accent bar and line (theme-overlays.css).

  • fix — Collection health fits a 560 px window again. The modal's chrome is taller since the overlays took the material's surface, leaving a few pixels of scroll at 1000 × 560. A fifth step takes the air out of the cards (dashboard-bookmarks-health-modal.js).

Dashboard

  • fix — a category save keeps the default category's name in every language. A new page's default category is stored as the key dashboard.others; the dashboard held it translated ("Others", "Overig"), and a category drag or resize sent that back, so the name stayed in the language it was saved in. clonePageCategories keeps the stored name next to the drawn one and DashboardData.storedCategory() puts it back on save, unless the category was renamed since (dashboard-render-core.js, dashboard-persistence.js, dashboard-block-page-move.js). Covered by tests/dashboard-review-fixes.spec.js, which fails without it.
  • fix — the first settings change made on another device now shows up. The revision poll only noticed a settings change against a settings revision it already held, and nothing set one at load, so the first change after opening the dashboard was taken as the starting point. fetchAndStoreDataRevision seeds it.
  • fix — revision checks no longer run side by side. Focus and visibilitychange were throttled to one call per 500 ms, and on a slow server a full settings refresh outlasted that. refreshIfDataRevisionChanged now hands a second caller the check already running, and the listener catches its rejection. These two are covered by the same spec, each failing without its fix.
  • removed — the one-time key hint along the bottom. After the quick start, > search · : commands · ? finders · + bookmark wiped in from left to right under the grid, once per browser. It no longer fits a dashboard whose actions stand in the header or on the edge. Gone: #search-flow-hint, initializeSearchFlowHint and its initializeButtonTipsRotation entry point, and the .sfh-seg styles. An empty .button-container now drops its plate through :empty (search.css).
  • fix — the header falls back to four page tabs, like the server. pageTabCap used 5 when maxPageTabs was missing, while the server default and the command palette use 4. tests/dashboard-page-strip.spec.js now holds the default to four.
  • fix — a client that refuses gzip gets no gzip. clientAcceptsGzip (gzip.go) looked only at the name in Accept-Encoding, so gzip;q=0, which means "not gzip", was answered compressed. A weight of 0 is now read as a no. TestGzipRefusedWithZeroWeight fails without it.

Theme studio

  • fix — Cancel while Apply is saving waits for the save. Escape, the ×, Cancel or a click beside the panel during Apply put the old look on screen while the save stored the new one, and the next unrelated save sent the old one back; a second Apply posted the colours twice. theme-browser.js now ignores every way out while Apply runs.
  • fix — a second Shift+A while the studio loads opens the same one. openLookStudio checked isOpen before its loads, so a second call took a new snapshot over the first: Cancel no longer went back to the look from before, and config did not come back on close. One opening runs at a time (_lookStudioOpening), and the check runs again after the loads.
  • fix — a settings change from another device no longer wipes the preview. refreshIfDataRevisionChanged loaded the settings under the open studio, which replaced the previewed look with the stored one. It now leaves the settings revision as it was while the studio is open, so the first poll after it closes applies the change.
  • fix — Reset all also resets the rest of the Surface tab. lookDefaults() (look_defaults.go) left out categorySurface, widgetSurface, widgetOpacity, materialStyle and neutralAccent, and a forced value of those held for every theme after Reset all. Covered by TestLookDefaultsCoverTheSurfaceTab.
  • fix — a theme's own look clears the glass and backdrop of the look before. A theme's look is stored without the parts that follow the theme, and applying it left those as they were, so after Neon the theme's cards kept Neon's edge and see-through glass. themeLookAnswers fills the left-out backdrop, depth and glass with "follow the theme".
  • fix — a studio with nothing to show hands back to config. When ThemeBrowser.open had nothing to draw, config had already stepped aside and never came back. Covered, with the four above, by tests/look-studio-edge-cases.spec.js.
  • fix — Material style no longer snaps back, and no longer picks Classic for every theme. With "Use these for every theme" off, the select offered "Follow the theme" and read a per-theme answer that nothing wrote; picking it stored Classic install-wide and the select showed it again on the next paint. It is install-wide in every scope now, as the setting is (materialStyleValue, dashboard-config-look.js). Covered by tests/appearance-background-surface.spec.js.
  • fix — a look keeps the theme's own quiet centre. The quiet centre is a theme's own answer in theme scope, so Save as theme with its look left it out, and a look applied over it was outranked by it. currentLookAnswers now saves the one shown and applyLookAnswers takes the theme's own over. Covered by tests/look-studio-calm.spec.js.

Inbox

  • fix — Undo after pasting the same link again keeps one row. With "no duplicate URLs" on, RestoreInboxLinkEvicting (inbox.go) only compared ids, so deleting a link, pasting its URL again and then pressing Undo left two rows with the same address. It now answers with the item already there when the setting is on; PutInboxItem passes the setting in. Covered by TestUndoKeepsOneRowWhenTheURLCameBack.
  • fix — cancelling Promote on a found app leaves no empty category. discoveryCategoryFor makes the category the app's kind names so the form can preselect it, and closing the form without saving left it on the dashboard. The category is remembered (_pendingDiscoveryCategory) and releaseDiscoveryCategory takes it away again once the form closes with nothing in it, without a trash entry (removeEmptyCategory in dashboard-structure-create.js). Covered in tests/app-discovery.spec.js.
  • fix — adding a found app no longer undoes a category edit made at the same time. addDiscoveredBookmarks (discovery.go) read the page's categories and saved them back later, so a rename or delete in Config in between was written back as it was. The read and the save now happen under one store lock, through the new MutateCategoriesByPage (models.go). TestMutateCategoriesByPageHoldsTheLockFromReadToSave fails without it.

Containers

  • fix — Remove stopped needs the names it was asked about. pruneStoppedContainers (docker_disk.go) treated a request without names as "every stopped container", so a call with no body removed them all. It now answers 400 names-required; the Disk tab always sends the list its question showed. TestDockerPruneStoppedContainers covers both.
  • fix — a usage alert that ends without "back to normal" stops its reminders. checkDockerUsage (docker_usage_alerts.go) forgot a high-CPU or memory spell when the container stopped, was muted or usage alerts were switched off, but sent no "up", so the reminder register kept it open: up to three "still has a problem" reminders for a load that was gone, and a later spell found it open and got none of its own. Those spells now leave the register through closeOpenAlerts (notify_quiet.go). TestDockerUsageSpellEndedSilentlyLeavesTheRegister fails without it.

Glances

  • fix — a host removed and added again under the same name is started once. Every host loop reported its end on exited, also a loop that was stopped, and the sampler then stopped whatever ran under that id: the new loop, which reported its own end, and so on without stopping, each round a beat that recorded the host as down. A stopped loop now reports nothing (StartGlancesSampler, glances_history.go). TestGlancesReaddedHostStartsOnce fails without it.
  • fix — a new disk or sensor gets a graph on a machine that has filled its series. The machine's own series (disks, interfaces, temperatures, mounts) had a limit of 96 and never gave a place back, so a disk renamed at a reboot or a sensor that left held its slot for good and anything new was silently not recorded. roomFor now drops the one that has been silent longest once it has been silent a day, as processes and containers already did. TestGlancesSilentMachineSeriesMakeRoom fails without it.
  • fix — Insights weighs the load against every processor. The core count was the number of core:* series, which stops at 32, so on a bigger machine a load of 40 counted as over the cores. The sampler keeps the count the host reports (glancesHost.cores) and glancesComputeLoad uses it. TestGlancesLoadCountsEveryCore fails without it.
  • fix — the last beat of a removed host does not bring it back. glancesNotify and glancesSlowReads looked the host up again by id, which made a new one for a host removed in between, and a host added again under that name inherited its notice cooldown. Both now take the beat's own host. TestGlancesNoticeOfARemovedHostMakesNoNewOne fails without it.
  • fix — Insights gives the real length of an outage still going on. The availability note counted an ongoing outage but added nothing for it, so a host down for two hours read "1 min in all", and a past outage that began before the range counted in full. Each outage now counts from the start of the range to its end, and one still going on to now (dashboard-glances-insights.js). Covered in tests/dashboard-glances-view.spec.js.

Domains

  • fix — with IANA unreachable, domain lookups no longer ask for the server list each time. A failed refresh of the RDAP bootstrap list kept the old one but not its age, so every lookup asked again and waited out the ten-second timeout under the client's lock. The old list now serves another hour first (serverFor, health_domain.go). TestRDAPBootstrapFailureIsNotRetriedPerLookup fails without it.

Docs

  • docs — MANUAL.md follows the new look. A new chapter, 16A The new look, says what changed against the old design and why, that every existing install moved onto Aurora Glass once, how the new and changed backdrops work, and three ways back to the old look (Go back to ‹theme› in the dialog, the theme studio, or Material style → Classic). §16 has the 190+ families, the 75 backdrops, Material style, the accent of the neutrals and Quiet centre. The cheat sheet, the preview card, the action bar, the Unraid themes, the Glances load, the Config band, the icon picker, the two-column bookmark form and the keys (Shift+G, End, g chords) are described as they work now.
  • docs — all 131 screenshots in MANUAL.md are taken again in Aurora Glass dark, five new ones for 16A, three for Collection health and one for the container timeline. They run over the demo data the server seeds itself (NEXTDASH_DEMO=1, now 101 links with favicons and previews), never over data-demo. The dashboard shows the health, Jellyfin and Glances tiles; the Jellyfin titles and posters come from tests/helpers/media-mock.js and are made up. SHOT_THEME is aurora-glass-dark, and tests/manual-screenshots-v1-22.spec.js takes the 16A shots.
  • new — the demo looks like months of use (demo_seed.go, demo_health_seed.go, demo_inbox.go). The inbox holds 24 links over six weeks, read, snoozed, with notes and tags. Opens run over 90 days with a working rhythm and fewer on weekends, so Usage and its heatmap have a shape. Health has 11 monitors with outages and a slow site, and a 90-day trend whose score climbs while the unchecked links go from 40 to none. TestDemoSeedsThreePagesOfPublicSites expects 90 trend points, and about 100 links.
  • docs — the manual's shots follow the demo's own clock. NOW in tests/helpers/manual-shot-kit.js is the moment the seed was made (its health-history.json says when), and the dates in the fixtures follow, so charts end on the day shown in the header. tests/helpers/docker-history.js gives Containers and Statistics → Server thirty days of crashes, failed health checks and nine updates. New shots: Collection health on its Monitors and Trend tabs (11-collection-health-monitors.jpg, -trend.jpg) and a container's Timeline (14-container-timeline.jpg).
  • new — the demo seeds 50 more sites for nerds and hackers (demo_seed.go, demo_previews.go): Security, Linux and Play on Dev, Makers on Homelab and Privacy on Self-hosted. TestDemoSeedsThreePagesOfPublicSites now expects about 100 links.
  • docs — Config → Help follows the new look, in all six languages. The Themes panel names Aurora Glass as the default, more than 190 families and 75 backdrops, and the theme studio instead of the theme browser. New in it: the Signature and Classic material styles, the eight neutrals and their accent, ThinkDashboard Classic, Quiet centre, and a paragraph on the move to Aurora Glass. Appearance lists the new Surfaces settings and the eighth backdrop slider. Keyboard adds Shift+G and the new cheat sheet, and uses a lowercase g for the chords. Bookmarks, Inbox and Config list g/End for first and last. The bookmark form is described in two columns. Five tips follow (tipTuneThemeBrowser, tipTuneThemeBrowserWidth, tipTuneGloss, tipTuneLooks, tipTuneBackdrop).
  • docs — README.md follows the new look. It names Aurora Glass as the default, 192 theme families (384 themes), the twelve materials and the three collections, the signature and Classic material styles, 75 backdrops with a quiet centre, and calls the panel the theme studio. All 22 pictures are taken again over the demo data the server seeds itself; the dashboard is in Aurora Glass, the bookmarks view in its light half and the command palette in ThinkDashboard Classic, the rest in a theme each.
  • docs — the theme studio is called the theme studio. The Overview news item about it said "look studio"; its title now says theme studio in all six languages.
  • docs — the Quiet centre, Material style and the accent of the neutrals are translated in Dutch, German, French, Spanish and Chinese: 20 keys under config (backdropCalm, materialStyle*, neutralAccent*), so validate:locale-parity passes again.
  • new — What's new leads with the redrawn themes. static/data/whats-new/v1.22.0.json has three highlights, each with its own picture or recording: every theme redrawn (a screenshot, with a button to the theme studio), 75 backdrops with a quiet centre (a recording) and the searchable cheat sheet (a recording). The plan is in tests/fixtures/whats-new-media/v1.22.0.js, the files in static/data/whats-new/media/, and whats-new-stub.js names v1.22.0 as the release the window opens for.
  • docs — nextdash.cc follows the new look. Every feature page has new pictures in Aurora Glass dark, with six on Statistics (all tabs) and two more on Tags (the tag picker and the tags offered on a new bookmark). The theme gallery shows all 192 families in dark and light with the backdrop each comes with, and has a Classic group for ThinkDashboard Classic. The hero and the slider open on Aurora Glass.
  • new — scripts refill the demo data and retake the manual's shots (scripts/make-manual-seed.sh, run-manual-shots.sh, validate-manual-shot-refs.cjs). The first lets the server seed itself and fetches the favicons, the second takes the four shot specs with eight workers and reads the real exit code, the third checks that every picture MANUAL.md names exists and that every file is used. They refuse data-demo and port 8080.
  • fix — every fixed wait in the tests says why. validate-test-waits (the validate-json job in CI) failed on 31 waitForTimeout calls without a // reason directly above them: the overlay, material-header, neutral-accent, view-entrance and look-migration specs, the manual-shot spec for 16A and the What's new media plan. Each now says what it waits for, or that it is pacing for a capture or the check is that nothing happens.
  • fix — the e2e specs follow the new look. 31 specs pinned the old drawing: the widget title strip, the depth ladder, the glow ring, the title offsets and handle, the glass, card and open panes of Config and the list views, the sheets that hang from the header, the cheat sheet's folded topics, the Help text, and the number of backdrops. Each now tests what it protects under Signature, or puts the page in Classic without saving it where the old drawing is the point. The ℹ popover spec waits for the page to hold still and presses the button again if a late scroll closed the popover, the About diagnostics spec waits for the platform, the Glances entrance spec only counts blocks that were drawn while the entrance window was open (a slow runner gets them without a rise), and the two Look studio specs that timed out on the CI runner get more room.

Don't miss a new nextdash release

NewReleases is sending notifications on new releases.