Skip to content

Redesigned Interface, Global Search, Air-Gapped Destinations, and Recently Deleted - #177

Merged
Skyfay merged 195 commits into
mainfrom
dev
Oct 4, 2026
Merged

Skyfay merged 195 commits into
mainfrom
dev

Conversation

@Skyfay

@Skyfay Skyfay commented Oct 4, 2026

Copy link
Copy Markdown
Owner

No description provided.

- Replace the fixed sidebar with the shadcn sidebar, which collapses to icons via a header button or Ctrl+B (⌘B on macOS) and becomes a slide-in sheet on small screens.
- Persist the collapsed state in a dedicated cookie so the layout renders it correctly on first paint.
- Move the user menu into a NavUser footer and show the update link there.
- Switch both themes to a zinc color palette.
- Add the shadcn MCP server config and the shadcn dev dependency.
- Update the sidebar tests and lower the dark-mode color baseline.
- Collapsed, the label stays in the layout at opacity 0 and slides
over the last icon of the group above, swallowing hover and clicks.
- Add pointer-events-none in icon-collapsed mode and note the
deviation in the file header.
- Move the Geist font variables from <body> to <html> so Tailwind's
  root font family resolves them instead of the system fallback.
- Resize the sidebar to the DBackup design: 13px entries, 34px rows
  with 2px gaps, 10px group padding and a 54px icon rail.
- Keep collapsed rows 34px wide so icons, logo and avatar stay centered.
- Match header, nav-user and footer sizes to the new sidebar scale.
- Introduce a `bg-page` token so the light dashboard gets a gray canvas with white cards on top, matching the dark theme's structure. Dark mode aliases it to `--background`.
- Make `--background` plain white in light mode, since dialogs, tabs, and outline buttons build on it.
- Darken `--muted-foreground`, sidebar secondary text, and `--input` in light mode so they stay readable on the gray page.
- Document `bg-page` versus `bg-background` in the components guide.
- Light-mode secondary, muted and accent move one step below the page canvas, so tab tracks and hover fills show up against it.
- Tab triggers now use muted text when inactive and a solid pill when active: white in light mode, a lighter gray in dark mode. Upstream's dark pill (input/30) barely differs from the track.
- Replace the stats cards, job status donut, storage chart and latest jobs list with a status banner, KPI cards with sparklines, a stats strip, a tabbed executions and jobs panel, per-destination storage and a 12-week calendar.
- Move the page model into src/services/dashboard/ with a one-minute process cache that a finished backup or storage refresh clears, so polling while a job runs does not rescan history.
- Add a warning color token and make the layout usable on phones.
- Drop the year picker and donut, and update the changelog, docs and tests.
- The calendar now measures its grid and shows as many weeks as fit, from 4 up to 53, and adds month labels above the weeks.
- The service loads a year of days instead of 12 weeks. Past days are cached for an hour and survive a finished backup, so only today's counts are re-read.
- The cache gets a `survivesInvalidation` option and drops expired entries, so date-keyed entries do not pile up.
- Update the changelog, the docs home page, and the data retention guide to match.
- A destination that cannot be listed during the storage refresh now keeps the size and backup count of its newest storage snapshot instead of a sum over the run history, which also counted backups that retention had already deleted.
- The dashboard marks such a destination as unreachable and shows how old its values are. A destination that was never scanned shows a dash.
- The local adapter skips files that disappear between readdir and stat, so retention running during a scan no longer fails the whole listing.
- Update the changelog, the API reference note, and the unit tests.
- Replace font-mono with tabular-nums so numeric columns stay aligned.
- Restyle the job and execution list headers as plain muted labels instead of uppercase mono on a tinted bar.
- Show the error in the status banner as regular text that wraps anywhere.
- Rename the jobs list column to "Last N runs" for clarity.
- Use text-xs for the sidebar version and user subtitle.
- Add encrypted jobs, offline connections and backed up 24h to the strip, so setup and health sit beside activity.
- Count only database and storage connections, since those are the ones the health check pings.
- Sum stored size for successful and partial backups, as a partial run still stored an archive.
- Lay the strip out in two, four or eight columns so no cell is left empty.
- Poll every 30s while idle so scheduled runs appear without a reload. Pause in hidden tabs and catch up when visible again.
- Add a route-group loading skeleton so the Overview paints at once without affecting other dashboard pages.
- Make job rows link to the latest run and add a "Run now" button for users with execute permission.
- Extract the run-job logic into a shared useRunJob hook used by the status banner and the jobs list.
- Add unit tests for the refresh timing and visibility behavior.
- Drop the "unreachable" count, warning colors, and muted bar from the storage widget, since air-gapped targets are offline on purpose.
- A destination that could not be listed now shows "last scanned <time>" with a tooltip, or "Not scanned yet" if it never had a scan.
- Connection problems stay flagged by "Offline connections" in the stats strip.
- Changelog entry no longer mentions the unreachable marker.
- Add an "Upcoming runs" card that plots the next 12, 24 or 48 hours of scheduled jobs and flags windows where more runs are due than the queue has slots.
- Show each of the first three unhealthy jobs in the status banner with its own error, last clean run and actions.
- Ignore cancelled runs when judging job health, so a failure followed by a cancel still counts as failing.
- Let the activity chart switch between 14, 30 and 90 days, and cache past days for an hour.
- A banner listing several failing or partial jobs now starts folded to a one-line summary of job names, so it no longer pushes the rest of the Overview down.
- A Show/Hide details button expands the full list with its per-job actions.
- The toggle aligns to the top when the list is open and centers when folded.
- Single-job and multi-job banners now share one layout: title and a
  one-line summary stay visible, and the error text and job actions sit
  behind the "Show details" toggle.
- Details render below the header at full width, indented to the text
  column, so per-job buttons line up with the toggle instead of
  crowding the title row.
- A single failing job with no recorded error now shows a fallback
  message when expanded instead of an empty area.
Rebuild the chart, data-shaping, and axis logic as separate reusable modules with
tests, replace the Select-based range picker with a segmented Tabs control that
switches without refetching, and load the full year of data once. Add a
CLAUDE.md guide for src/app/dashboard covering the redesign's visual language.
Replaces the static databases/storage/notification adapter tables with a card-style
data table showing status, address, usage, last backup, and 24h health per connection.
Users can toggle, reorder, and resize columns, and the layout persists per-account via a
new UserPreference model. Adds connection counts and status filters to the tabs, and
splits the row actions into a dropdown menu shared across all four connection kinds.
Adds a details sheet for database, storage, and notification connections: usage by jobs/templates, 24h health timeline, version history, and settings, reachable by clicking any row. Backs it with a new API route and service, and extends the data table with row-click support.
- Connection lists can now switch between a table and a card grid, with the choice saved per user via a new view-mode preference (schema, service, action).
- Phones always show cards since there's no room for a table.
- Shared row-click detection moved into `row-click.ts` so both the table and cards use it.
Adds a third view alongside table and cards: a slim connection list beside
the details panel of whichever connection is picked, with issues grouped
first. Extracts the details body from the sheet into a shared component
so the sheet and split view render the same content.
Hides the rows-per-page picker below sm so pagination controls fit on
phones, and wraps the Connections tabs in a horizontal ScrollArea so
they scroll instead of widening the page. Adds useIsMobileState so
layouts that differ by screen size wait for measurement instead of
flashing the desktop view first.
- Pass inSheet through to SheetHeaderOr instead of always forcing it true
- Force the ScrollArea viewport wrapper to display:block so long hosts, errors, and names wrap or truncate instead of stretching the layout
Truncated connection addresses were cutting off longer cloud host
names with no way to see the full value. Increases the max width and
adds a title attribute so hovering reveals the untruncated address.
- Add adapterTypeIcon helper so faceted filters can show each connection type's brand icon.
- Freeze filter option order on open instead of re-sorting on every selection, so items don't jump under the pointer.
- Widen the filter popover, restyle checkboxes/badges, and move the Reset button before extra toolbar controls.
Prevents full-width tables from handing spare space to the checkbox and
actions columns, which pushed the name column further right on tables
with fewer columns.
Wide tables pushed the whole dashboard page past the window edge because
Radix's scroll area wraps content in a display:table div that grows with
its widest child. Also caps long names, hosts, and other cell values with
truncation and a title tooltip instead of letting them push column width.
Lets users switch health check notifications and restore exclusion for several database connections at once, via a new "More" menu in the card-style connections table. Adds the supporting API action, service function, and docs.
Widen the checkbox cell so clicks near it toggle selection instead of
triggering the row's onClick handler on a near miss.
Introduces ConfirmDialog and DialogItemList as shared primitives so
destructive/bulk confirmations and failure reports share one look.
Bulk actions and the single connection delete now show each item's
icon and type instead of just its name.
Reworks bulk delete/confirm dialogs to list ineligible rows with reasons before the action runs, instead of reporting them as failures afterward. Adds a tone-aware dialog header, refreshes the connection delete flow to check usage client-side, and invalidates the dashboard cache when jobs or notification templates change.
Skyfay added 25 commits October 3, 2026 13:09
- New hero with live backup run animation, feature cards, counters and adapter marquee, replacing the old static sections.
- Blog gets a table of contents, reading progress bar, cover art, filterable index and an RSS feed.
- Adds shared fx components (glows, spin borders, spotlight cards) and light-mode CSS tokens for the redesign.
…ys (#166)

Incremental jobs with an Rsync source now skip unchanged files instead of
re-transferring the whole tree, and cancelling a run kills an in-flight
rsync transfer instead of waiting for it to finish.
- Replaces the roadmap's separate milestones/list/shipped sections with a single
  two-sided timeline (shipped on the left, planned/ideas on the right) with
  filtering by kind and category.
- Swaps the static copy-command block on the home hero for a live GitHub
  contributors pill.
- Extracts shared date formatting into `lib/utils.ts` and removes the unused
  `Reveal` and `SectionHeading` components.
Replaces the static compose/run code blocks with a playing terminal
simulation: cursor blink keyframe, tokenized code lines, editor/terminal/
browser panes driven by a tick loop, and in-browser key generation for the
two secrets.
Inline $(openssl rand ...) in docker run regenerated both secrets on every
restart, silently breaking logins and sessions. Docs and the home page quick
start now write the secrets once to .env and reference it with --env-file.

Also adds recent roadmap items (single-database restores, Azure SQL, 300 stars)
and bumps the next star milestone to 500.
- Replaces the shadcn Sheet-based mobile menu with a custom MobileMenu
  component: radial-glow panel, icon tiles colored per nav link, theme
  switcher, and staggered drop/rise entrance animations.
- Adds caption and icon metadata to NAV_LINKS and extracts useActiveHref
  so both desktop nav and the new mobile menu share active-state logic.
- Shrinks the contributors pill on small screens to a fixed avatar count
  and hides secondary text so it fits beside the header actions.
- Replace plain breadcrumb with a back-to-blog pill and a tag chip
  linking to the filtered list (color driven by the post's cover tone)
- Make the tag filter on the blog index shareable via a `?tag=` query
  param, synced on load and on tag click
- Collapse the copy-link button to an icon-only circle on small
  screens, with an aria-label for accessibility
- Swaps the autoplaying video for a static PNG showing the
  redesigned interface on desktop and phone.
- Adds the matching changelog entry under Documentation.
- Replaces the single email template with a themed, icon-rich layout (banner, stats, destinations, problem details) shared across backup, restore, storage, and system notifications, matching dark mode and the app's visual language.
- Adds instance branding (name, base URL, timezone) and a "why you got this" reason line to every notification channel, plus richer run/job context (trigger, destinations, encryption key) feeding the templates.
Node's execFile defaults to a 1 MB output buffer and 30s timeout, too small for a `find` over tens of thousands of files. Raises the limit to 256 MB / 10 minutes for listing operations only, and turns the resulting failures into readable messages instead of raw exec errors.
Updates Next.js to 16.3.8 to close a critical RCE in next/og, bumps nodemailer to v10 and 13 other packages to patched releases, and picks up pending patch/minor versions (React 19.3, Better Auth 1.6.33, Zod 4.6, Vite 8.3, ESLint 10.12, AWS SDK).
Dropped now that rsync-process.ts replaces the typed rsync module usage.
Warns admins to back up the database and keep the container running
until migrations finish, since an interrupted migration leaves the
database in a failed state.
- New instances with nothing to back up land on Quick Setup after signing in, instead of an empty Overview
- Adds a reusable ListEmpty component and wires it into jobs, connections, credentials and keys tabs
- Fixes a Docker build failure from a script the Dockerfile copies but .dockerignore excluded
- api-docs/openapi.yaml + public/openapi.yaml: add Search, Database Explorer, and History runs endpoints, rework notification-logs filters to arrays with facets/stats, and switch nullable fields to `type: [x, "null"]`.
- docs/changelog.md: add entries for the new endpoints and several small fixes (schedule picker timezone, template preview, API key prefix, certificate checks, etc.).
- docs/user-guide/installation.md: restructure the update steps to back up the db folder before stopping the container and warn against stopping mid-migration.
- website/src/lib/roadmap.ts: remove the shipped "Mobile Responsive UI" idea and add "Redesigned Interface" as a shipped v4.0.0 item.
- GET /api/notification-logs and /api/notification-logs/{id} now return
  403 when the caller lacks history:read, instead of masking the
  PermissionError as a generic 500.
- Logs unexpected failures via the shared logger instead of silently
  swallowing them.
- Kay's $500 one-time sponsorship no longer gets a logo by default, so
  his README entry moves to a hand-kept exception (LOGO_BY_HAND) with
  a direct image link instead of his GitHub avatar.
- Adds a namedXL preset so other $500 one-time sponsors render with a
  larger avatar in the generated image.
- Notes GitHub Sponsors support in the changelog's thank-you blurb.
- Bumps version to 4.0.0 across package.json, docs/package.json, and both openapi.yaml files
- Moves the vNEXT changelog entry to the v4.0.0 release block and updates Docker tags
- Adds a changelog anchor link to the shipped roadmap item
Links to GitHub Sponsors next to the theme toggle, and adds a
matching footer link. Also swaps the dark-mode-refinement roadmap
item for a high-contrast mode idea.
- Hero banner now links to the roadmap's latest shipped release and shows the v4.0 headline, instead of the removed static Docker volumes link.
- Update test for highest-stable-version selection to use the shared version bump helper rather than hardcoded tags.
- Builds amd64 and arm64 images on native runners without pushing
- Starts the image and polls the health endpoint before passing
- Catches a broken image at merge time instead of at release tag
@codecov

codecov Bot commented Oct 4, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

- Lints and builds the website on every pull request alongside docs.
- Docker image builds for PRs into main now wait for maintainer approval via the docker-build environment, avoiding redundant image builds on every push.
@Skyfay
Skyfay deployed to docker-build October 4, 2026 12:25 — with GitHub Actions Active
@Skyfay
Skyfay deployed to docker-build October 4, 2026 12:25 — with GitHub Actions Active
@Skyfay
Skyfay merged commit bdb737f into main Oct 4, 2026
14 checks passed

This branch was successfully deployed

1 active deployment
docker-build — 265c0360 Deployed Oct 4, 2026 by Skyfay via Docker Build (arm64) #110
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant