Skip to content

feat: improve device backup and restore#1124

Merged
wizzomafizzo merged 7 commits into
mainfrom
feature/device-backup-core-replay
Jul 20, 2026
Merged

feat: improve device backup and restore#1124
wizzomafizzo merged 7 commits into
mainfrom
feature/device-backup-core-replay

Conversation

@wizzomafizzo

@wizzomafizzo wizzomafizzo commented Jul 20, 2026

Copy link
Copy Markdown
Member

Expands the existing UserDB-only backup into a full device backup and
restore, so a user can capture their setup and bring it back after a
reinstall, SD swap, or hardware move.

What's included

  • Backup captures the Zaparoo config and database, device settings, input
    mappings, saves, and savestates.
  • Restore replays a backup onto the current device. It is transactional —
    rolling back to the previous state on failure — and Core restarts to apply.

Storage

  • Backups are written to device storage.
  • Devices linked to a Zaparoo Online account can also sync backups off-device
    and restore any compatible snapshot from the same account. These accounts
    can schedule automatic backups (daily or weekly); scheduled runs throttle
    while a game is running, pause fully during CD-based cores, and retry after
    a power loss.

API

  • New settings.backup.* methods and a backup.state notification (see
    docs/api).

Summary by CodeRabbit

  • New Features
    • Added portable full-device backup ZIP workflows (create/list/inspect/delete/restore/status).
    • Added online/cloud backup support (run/list/restore) with scheduling and remote restore.
    • Added auth linking with device-link status polling, verification, cancellation, and unlink flows.
    • Added a “Secure device” (secure/encryption) setup prompt when no clients are paired.
  • Bug Fixes
    • Enforced safer method-specific request timeouts and restore-gate protection during restores.
    • Improved backup pause/throttle behavior during active media and strengthened restore rollback/recovery safeguards.
  • Documentation
    • Expanded API docs for backup/auth methods and added documentation for auth.link.status and backup.state notifications.

Adds a full-device backup system: portable local ZIP backups with
transactional restore and Core restart, plus cloud backups through a
linked Zaparoo Online account (device link flow, scheduled uploads,
snapshot listing and restore, Warp availability gating).

- backup service with coordinator, collector, remote client, and
  restore gate; scheduler for daily/weekly/manual cloud backups
- API: settings.backup.* methods, auth.link flow, status with linked
  device identity; availability refresh runs in the background so
  status never blocks on the cloud API
- TUI: Online page (account status, Warp state, feature discovery)
  and Backup page with Local/Cloud sections; section headers and
  delayed loading indicator for async page builds
- MiSTer profile data collection for backup archives
…loss

Backup work now follows the same media pause policy as indexing: a shared
pauser throttles collection, hashing, packing, and uploads during most
games, pauses them fully during storage-sensitive CD cores, and resumes
when the game stops. Applies to scheduled and manual runs (API and TUI).
The scheduler skips starting a run while fully paused so it does not hold
the coordinator lease through a game session.

A run interrupted by power loss left "running" in the status file, which
delayed the next attempt by the full daily/weekly interval. Interrupted
runs are now marked failed at startup so the 1-hour failure retry applies;
content-addressed dedup means the retry skips objects already uploaded.

The cloud upload action no longer hard-blocks on the cached Warp
availability: the run's fresh server-side check is authoritative, so a
just-activated subscription works immediately. Cached "unavailable" and
"unknown" both use the 5-minute retry TTL; only "available" is cached for
an hour.

Adds a backup.state notification reporting a running operation's
pause/throttle transitions so clients can display it.
Restructure Settings > Online > Cloud backup > View backups into a
source-device list, per-device snapshot list, and a detailed restore
confirmation. Account backups from any linked device (and previously
linked, now-unlinked devices) are grouped by their source device: this
device first, other linked devices next, unlinked last, each showing
backup count and latest timestamp. Selecting a source lists its
snapshots newest first with type and size; selecting a compatible
snapshot confirms exactly what restore does — copies the immutable
snapshot onto this device, leaves the source backup and device
unchanged, keeps this device's own Online identity, and takes a local
safety backup before restarting.

Replaces the flat []map[string]any remote list with typed DTOs decoding
the camelCase settings.backup.remote.list response, including the new
sourceDevice metadata. Restore semantics are unchanged (existing
settings.backup.remote.restore); no restore grants or replace-vs-copy
modes. The link-success message now points at Cloud backup > View
backups.
@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2050c257-f0c4-4388-8cd2-cc617df30fb3

📥 Commits

Reviewing files that changed from the base of the PR and between e61f404 and e234b95.

📒 Files selected for processing (3)
  • pkg/service/service_test.go
  • pkg/ui/events/service.go
  • pkg/ui/events/service_test.go
🚧 Files skipped from review as they are similar to previous changes (1)
  • pkg/service/service_test.go

📝 Walkthrough

Walkthrough

This PR adds portable and remote backup services, transactional restore recovery, authentication linking, scheduling, API methods and notifications, runtime coordination, and TUI settings workflows. It also adds configuration, database-transfer, platform-provider, dialog, and concurrency support with broad tests.

Changes

Backup platform and persistence

Layer / File(s) Summary
Backup engine and restore transactions
pkg/service/backup/*, pkg/service/backup_scheduler.go
Adds local ZIP creation, inspection, deletion, manifest validation, transactional restore journaling, rollback, recovery, remote snapshot transfer, availability tracking, and scheduling.
Platform and database integration
pkg/platforms/*, pkg/database/*, pkg/config/*
Adds platform backup definitions, profile-aware mount preparation, portable database snapshots, client preservation, restore overrides, credential provenance, and backup configuration.

API and runtime

Layer / File(s) Summary
Authentication and backup RPCs
pkg/api/methods/*, pkg/api/models/*, pkg/api/notifications/*
Adds device linking, unlinking, claim redemption, backup operations, status models, permissions, notifications, and method registration.
Runtime coordination and transport
pkg/api/server.go, pkg/api/client/*, pkg/service/state/*, pkg/service/*
Adds method-specific request contexts, restore gating, backup pausing, media-launch coordination, scheduler startup, recovery, and coordinated shutdown.

TUI

Layer / File(s) Summary
Backup and online settings
pkg/ui/tui/settings.go, pkg/ui/tui/online.go, pkg/ui/tui/settings_service.go
Adds local and remote backup management, account linking and unlinking, snapshot restore flows, progress handling, status rendering, and restart detection.
Dialogs, prompts, and settings components
pkg/ui/tui/dialog.go, pkg/ui/tui/encryption_prompt.go, pkg/ui/tui/settings_components.go, pkg/ui/tui/utils.go
Adds reusable dialogs, secure-device setup, asynchronous page loading, selectable headers/navigation, cancellation handling, and modal migration.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 11.08% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: expanding device backup and restore functionality.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/device-backup-core-replay

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (6)
pkg/config/configlaunchers_test.go (1)

774-785: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use afero for filesystem setup in both permission tests.

  • pkg/config/configlaunchers_test.go#L774-L785: use an afero OS filesystem for directory creation, file writing, and Instance.fs; keep direct chmod only for permission manipulation.
  • pkg/config/configmappings_test.go#L38-L49: apply the same afero-backed setup and loading pattern.

As per coding guidelines, **/*.go: Use afero for filesystem operations in testable code.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/config/configlaunchers_test.go` around lines 774 - 785, Update the
permission-test setup in pkg/config/configlaunchers_test.go:774-785 to create
the afero OS filesystem, use it for directory creation and file writing, and
assign it to Instance.fs; retain direct os.Chmod only for permission
manipulation. Apply the same afero-backed setup and loading pattern in
pkg/config/configmappings_test.go:38-49.

Source: Coding guidelines

pkg/ui/tui/settings_test.go (1)

1408-1433: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider adding coverage that selects a specific source group (with two or more groups present) and asserts the correct device's snapshots open. This is the one path that would catch the loop-variable capture behavior flagged in pkg/ui/tui/settings.go (Line 1256).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/ui/tui/settings_test.go` around lines 1408 - 1433, Extend
TestRemoteBackupListPage_GroupsSources_Integration to select a specific source
group while multiple groups are displayed, then assert that opening it shows
only that device’s snapshots. Exercise the group-selection callback created by
buildRemoteBackupListPage so the test detects loop-variable capture and verifies
the selected group maps to the correct source.
pkg/service/backup/coordinator/coordinator_test.go (1)

31-108: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add coverage for CancelRestore, RemoteUnlinked/SetRemoteUnlinked, and Active.

These are new public methods on the coordinator with no tests here (e.g., cancelling only restore/recovery kinds while leaving other active leases running, or the read/write toggle for remoteUnlinked).

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/service/backup/coordinator/coordinator_test.go` around lines 31 - 108,
Add focused tests for the coordinator’s CancelRestore, RemoteUnlinked,
SetRemoteUnlinked, and Active methods. Verify CancelRestore cancels only
restore/recovery operation leases while unrelated active leases continue
running, and verify SetRemoteUnlinked updates the value returned by
RemoteUnlinked. Also cover Active’s read/write state across relevant lease
acquisition and release transitions.

Source: Coding guidelines

pkg/service/profiles/dataswap.go (1)

307-311: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Restore-gate error is misreported as a data-swap failure.

When a restore completes successfully, AcquireRestoreAccess() returns ErrRestoreRestartRequired. That error then falls through to the default branch below (Lines 334-341), emitting a ProfilesDataFailed notification with reason "backup restore restart is pending" even though no swap was attempted and nothing was corrupted. Consider handling the restore-gate errors explicitly (skip the failure notification / log at debug) so clients don't surface a spurious failure right before the Core restart.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/service/profiles/dataswap.go` around lines 307 - 311, Update the error
handling around AcquireRestoreAccess and the subsequent swap-result switch to
recognize ErrRestoreRestartRequired as an expected restore-gate outcome. Skip
the ProfilesDataFailed notification and use debug-level logging (or equivalent
existing handling) for this case, while preserving failure reporting for actual
ApplyProfile errors and other unexpected errors.
pkg/api/methods/auth_link.go (1)

374-380: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Move authLinkTerminalError type near the top of the file.

This type is declared after the functions that use it. As per coding guidelines, "Define Go types and consts near the top of the file, before functions and methods."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/api/methods/auth_link.go` around lines 374 - 380, Move the
authLinkTerminalError type and its Error method from the bottom of the file to
the top-level declarations section, before the functions and methods that
reference it. Preserve its fields and error behavior unchanged.

Source: Coding guidelines

pkg/api/server_restore_gate_test.go (1)

72-87: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Strengthen this test to actually exercise gate contention.

TestHandleRequestAllowsRestoreMethodToOwnExclusiveGate calls handleRequest for MethodSettingsBackupRestore without any restore gate being held. Since TryAcquireRestoreAccess would trivially succeed here even without the apiMethodManagesRestoreAccess special-case (there's no contention to reject), this test can't distinguish correct behavior from a regression that removes the skip-list entry for this method. Consider first calling st.BeginRestoreGate() (as the sibling test does) and then verifying the restore method can still run/complete while the shared gate is held.

♻️ Suggested strengthening
 func TestHandleRequestAllowsRestoreMethodToOwnExclusiveGate(t *testing.T) {
 	t.Parallel()
 	st, _ := state.NewState(nil, "test-boot")
 	defer st.StopService()
 	methodMap := &MethodMap{}
 	require.NoError(t, methodMap.AddMethod(
 		models.MethodSettingsBackupRestore,
 		func(requests.RequestEnv) (any, error) { return "restore", nil },
 	))
+	// Hold the shared restore gate to prove the restore method bypasses it
+	// rather than merely succeeding due to no contention.
+	finishRestore, err := st.BeginRestoreGate()
+	require.NoError(t, err)
+	defer finishRestore(false)
 
 	result, rpcErr := handleRequest(methodMap, requests.RequestEnv{
 		Context: context.Background(), State: st,
 	}, models.RequestObject{JSONRPC: "2.0", Method: models.MethodSettingsBackupRestore})
 	require.Nil(t, rpcErr)
 	assert.Equal(t, "restore", result)
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/api/server_restore_gate_test.go` around lines 72 - 87, Strengthen
TestHandleRequestAllowsRestoreMethodToOwnExclusiveGate by calling
st.BeginRestoreGate() before handleRequest, matching the sibling contention
test, and defer or otherwise ensure the gate is released. Keep the existing
assertions verifying the restore method completes successfully while the shared
restore gate is already held.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pkg/config/tui_test.go`:
- Around line 63-64: Update the test setup around the EncryptionPrompted and
other prompted field mappings to use separate boolean variables with distinct
true/false values. Assert each resulting field independently so the test
verifies both source-to-field mappings and catches wiring either field to the
wrong source.

In `@pkg/service/service.go`:
- Around line 63-83: Bound the second shutdown wait in waitForBackupShutdown
with a hard outer deadline instead of using context.Background(), while
preserving the existing lease-release grace period. When that deadline expires,
log or alert the timeout and return an error so StartResult.Stop cannot block
indefinitely; update related shutdown tests, including
TestWaitForBackupShutdownDoesNotTearDownBeforeLeaseRelease, to verify both lease
preservation and bounded termination.

---

Nitpick comments:
In `@pkg/api/methods/auth_link.go`:
- Around line 374-380: Move the authLinkTerminalError type and its Error method
from the bottom of the file to the top-level declarations section, before the
functions and methods that reference it. Preserve its fields and error behavior
unchanged.

In `@pkg/api/server_restore_gate_test.go`:
- Around line 72-87: Strengthen
TestHandleRequestAllowsRestoreMethodToOwnExclusiveGate by calling
st.BeginRestoreGate() before handleRequest, matching the sibling contention
test, and defer or otherwise ensure the gate is released. Keep the existing
assertions verifying the restore method completes successfully while the shared
restore gate is already held.

In `@pkg/config/configlaunchers_test.go`:
- Around line 774-785: Update the permission-test setup in
pkg/config/configlaunchers_test.go:774-785 to create the afero OS filesystem,
use it for directory creation and file writing, and assign it to Instance.fs;
retain direct os.Chmod only for permission manipulation. Apply the same
afero-backed setup and loading pattern in
pkg/config/configmappings_test.go:38-49.

In `@pkg/service/backup/coordinator/coordinator_test.go`:
- Around line 31-108: Add focused tests for the coordinator’s CancelRestore,
RemoteUnlinked, SetRemoteUnlinked, and Active methods. Verify CancelRestore
cancels only restore/recovery operation leases while unrelated active leases
continue running, and verify SetRemoteUnlinked updates the value returned by
RemoteUnlinked. Also cover Active’s read/write state across relevant lease
acquisition and release transitions.

In `@pkg/service/profiles/dataswap.go`:
- Around line 307-311: Update the error handling around AcquireRestoreAccess and
the subsequent swap-result switch to recognize ErrRestoreRestartRequired as an
expected restore-gate outcome. Skip the ProfilesDataFailed notification and use
debug-level logging (or equivalent existing handling) for this case, while
preserving failure reporting for actual ApplyProfile errors and other unexpected
errors.

In `@pkg/ui/tui/settings_test.go`:
- Around line 1408-1433: Extend
TestRemoteBackupListPage_GroupsSources_Integration to select a specific source
group while multiple groups are displayed, then assert that opening it shows
only that device’s snapshots. Exercise the group-selection callback created by
buildRemoteBackupListPage so the test detects loop-variable capture and verifies
the selected group maps to the correct source.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 551d0175-ded1-47be-9ab1-3fa408b7949d

📥 Commits

Reviewing files that changed from the base of the PR and between 7085532 and 0d2c107.

📒 Files selected for processing (97)
  • docs/api/methods.md
  • docs/api/notifications.md
  • pkg/api/client/client.go
  • pkg/api/client/client_test.go
  • pkg/api/methods/auth.go
  • pkg/api/methods/auth_link.go
  • pkg/api/methods/auth_link_test.go
  • pkg/api/methods/auth_test.go
  • pkg/api/methods/backup.go
  • pkg/api/methods/backup_test.go
  • pkg/api/methods/permissions.go
  • pkg/api/methods/settings.go
  • pkg/api/methods/settings_test.go
  • pkg/api/models/models.go
  • pkg/api/models/params.go
  • pkg/api/models/requests/requests.go
  • pkg/api/models/responses.go
  • pkg/api/notifications/notifications.go
  • pkg/api/request_priority.go
  • pkg/api/request_priority_test.go
  • pkg/api/server.go
  • pkg/api/server_post_test.go
  • pkg/api/server_restore_gate_test.go
  • pkg/api/server_startup_test.go
  • pkg/api/server_ws_e2e_test.go
  • pkg/api/ws_dispatcher.go
  • pkg/api/ws_dispatcher_test.go
  • pkg/cli/cli.go
  • pkg/config/auth.go
  • pkg/config/auth_test.go
  • pkg/config/config.go
  • pkg/config/configbackup.go
  • pkg/config/configbackup_test.go
  • pkg/config/configlaunchers.go
  • pkg/config/configlaunchers_test.go
  • pkg/config/configmappings.go
  • pkg/config/configmappings_test.go
  • pkg/config/configservice_test.go
  • pkg/config/tui.go
  • pkg/config/tui_test.go
  • pkg/database/database.go
  • pkg/database/userdb/backup.go
  • pkg/database/userdb/backup_test.go
  • pkg/database/userdb/clients.go
  • pkg/database/userdb/sql.go
  • pkg/platforms/mister/backup_test.go
  • pkg/platforms/mister/platform.go
  • pkg/platforms/mister/profiledata_backup.go
  • pkg/platforms/mister/profiledata_backup_test.go
  • pkg/platforms/mistex/platform.go
  • pkg/platforms/platforms.go
  • pkg/service/backup/backup.go
  • pkg/service/backup/backup_test.go
  • pkg/service/backup/collector.go
  • pkg/service/backup/coordinator.go
  • pkg/service/backup/coordinator/coordinator.go
  • pkg/service/backup/coordinator/coordinator_test.go
  • pkg/service/backup/mister_integration_test.go
  • pkg/service/backup/remote.go
  • pkg/service/backup/restore.go
  • pkg/service/backup_scheduler.go
  • pkg/service/backup_scheduler_test.go
  • pkg/service/inbox/inbox.go
  • pkg/service/indexpause.go
  • pkg/service/indexpause_test.go
  • pkg/service/profiles/dataswap.go
  • pkg/service/profiles/dataswap_test.go
  • pkg/service/profiles/profiles.go
  • pkg/service/profiles/profiles_test.go
  • pkg/service/queues.go
  • pkg/service/service.go
  • pkg/service/service_test.go
  • pkg/service/state/state.go
  • pkg/service/state/state_media_test.go
  • pkg/service/state/state_test.go
  • pkg/testing/helpers/db_mocks.go
  • pkg/ui/tui/dialog.go
  • pkg/ui/tui/dialog_test.go
  • pkg/ui/tui/encryption_prompt.go
  • pkg/ui/tui/encryption_prompt_test.go
  • pkg/ui/tui/exportlog.go
  • pkg/ui/tui/main.go
  • pkg/ui/tui/mock_api_client_test.go
  • pkg/ui/tui/online.go
  • pkg/ui/tui/online_test.go
  • pkg/ui/tui/profiles.go
  • pkg/ui/tui/settings.go
  • pkg/ui/tui/settings_components.go
  • pkg/ui/tui/settings_components_test.go
  • pkg/ui/tui/settings_service.go
  • pkg/ui/tui/settings_test.go
  • pkg/ui/tui/settings_tui.go
  • pkg/ui/tui/utils.go
  • pkg/ui/tui/utils_test.go
  • pkg/zapscript/commands.go
  • pkg/zapscript/launch.go
  • pkg/zapscript/launch_test.go

Comment thread pkg/config/tui_test.go Outdated
Comment thread pkg/service/service.go Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pkg/service/service_test.go`:
- Around line 94-105: Bound the wait in the select around waitForBackupShutdown
so the test fails if completion exceeds the intended 50ms hard deadline. Replace
the one-second time.After case with a shorter upper timeout that includes
scheduling slack, such as 250ms, while preserving the existing error assertions
and timeout failure behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 21ce26af-4c31-464b-bf9f-99856d777079

📥 Commits

Reviewing files that changed from the base of the PR and between 0d2c107 and e61f404.

📒 Files selected for processing (17)
  • pkg/api/methods/auth_link.go
  • pkg/api/methods/backup_test.go
  • pkg/api/server_restore_gate_test.go
  • pkg/config/configlaunchers_test.go
  • pkg/config/configmappings_test.go
  • pkg/config/tui_test.go
  • pkg/platforms/mister/profiledata_backup_test.go
  • pkg/platforms/mister/profiledata_test.go
  • pkg/service/backup/backup_test.go
  • pkg/service/backup/coordinator/coordinator_test.go
  • pkg/service/backup_scheduler_test.go
  • pkg/service/profiles/dataswap.go
  • pkg/service/profiles/dataswap_test.go
  • pkg/service/service.go
  • pkg/service/service_test.go
  • pkg/ui/tui/settings_api_test.go
  • pkg/ui/tui/settings_test.go
🚧 Files skipped from review as they are similar to previous changes (9)
  • pkg/config/tui_test.go
  • pkg/api/server_restore_gate_test.go
  • pkg/service/backup_scheduler_test.go
  • pkg/config/configmappings_test.go
  • pkg/service/service.go
  • pkg/ui/tui/settings_test.go
  • pkg/config/configlaunchers_test.go
  • pkg/api/methods/auth_link.go
  • pkg/service/backup/backup_test.go

Comment thread pkg/service/service_test.go
@wizzomafizzo
wizzomafizzo merged commit 694dd93 into main Jul 20, 2026
19 of 21 checks passed
@wizzomafizzo
wizzomafizzo deleted the feature/device-backup-core-replay branch July 20, 2026 12:00
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