From b7ea67fb8f890ccfdda9f8093ba0c086b048997e Mon Sep 17 00:00:00 2001
From: bcrooker
Date: Sun, 1 Mar 2026 21:11:48 -0500
Subject: [PATCH] feat(backups): show estimated time remaining on backup
progress card
---
app/client/api-client/types.gen.ts | 1 +
.../modules/backups/components/backup-progress-card.tsx | 7 +++++++
2 files changed, 8 insertions(+)
diff --git a/app/client/api-client/types.gen.ts b/app/client/api-client/types.gen.ts
index 2d951cf6..73e53920 100644
--- a/app/client/api-client/types.gen.ts
+++ b/app/client/api-client/types.gen.ts
@@ -4005,6 +4005,7 @@ export type GetBackupProgressResponses = {
repositoryName: string;
scheduleId: string;
seconds_elapsed: number;
+ seconds_remaining: number;
total_bytes: number;
total_files: number;
volumeName: string;
diff --git a/app/client/modules/backups/components/backup-progress-card.tsx b/app/client/modules/backups/components/backup-progress-card.tsx
index 053ac28d..4e9734b0 100644
--- a/app/client/modules/backups/components/backup-progress-card.tsx
+++ b/app/client/modules/backups/components/backup-progress-card.tsx
@@ -46,6 +46,9 @@ export const BackupProgressCard = ({ scheduleShortId, initialProgress }: Props)
const currentFile = progress?.current_files?.[0] || "";
const fileName = currentFile.split("/").pop() || currentFile;
const speed = progress ? formatBytes(progress.bytes_done / progress.seconds_elapsed) : null;
+ const eta = progress?.seconds_remaining != null && progress.seconds_remaining > 0
+ ? formatDuration(progress.seconds_remaining)
+ : null;
return (
@@ -96,6 +99,10 @@ export const BackupProgressCard = ({ scheduleShortId, initialProgress }: Props)
{progress ? (progress.seconds_elapsed > 0 ? `${speed?.text} ${speed?.unit}/s` : "Calculating...") : "—"}
+
+
ETA
+
{progress ? (eta ?? "Calculating...") : "—"}
+