From 8e24c6a8d8fd7677c938e5aa890c3f7e9e1e2c4c 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
---
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 4e107974..ad7ab3ea 100644
--- a/app/client/api-client/types.gen.ts
+++ b/app/client/api-client/types.gen.ts
@@ -4141,6 +4141,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...") : "—"}
+