Skip to main content

Overview

The backup utilities module provides functions for managing application data backups. It handles exporting localStorage data to JSON files and restoring from backup files.

Storage Keys

The backup system tracks the following localStorage keys:
const STORAGE_KEYS = [
  "better-home-widget-settings",
  "better-home-todos",
  "better-home-todo-sort",
  "better-home-todo-filters",
  "better-home-quick-links",
  "mood-calendar-2026-data",
  "mood-calendar-show-numbers",
  "vite-ui-theme",
] as const;

Types

BackupData

interface BackupData {
  [key: string]: unknown;
}
Represents the backup data structure, which is a key-value map of localStorage entries.

Functions

createBackup

function createBackup(): BackupData
Creates a backup object containing all tracked localStorage data. Returns: BackupData - An object containing all current application data Example:
import { createBackup, downloadBackup } from "@/lib/backup-utils";

function BackupButton() {
  const handleDownloadBackup = () => {
    const backup = createBackup();
    downloadBackup(backup);
  };

  return <button onClick={handleDownloadBackup}>Download Backup</button>;
}
The function automatically parses JSON values and preserves raw strings for non-JSON data.

downloadBackup

function downloadBackup(backup: BackupData): void
Downloads a backup object as a JSON file. Parameters:
  • backup - The backup data to download
Behavior:
  • Creates a blob with formatted JSON (2-space indentation)
  • Generates filename: better-home-backup-YYYY-MM-DD.json
  • Triggers browser download and cleans up resources
Example:
const backup = createBackup();
downloadBackup(backup);
// Downloads: better-home-backup-2026-03-03.json

restoreBackup

function restoreBackup(backup: BackupData): void
Restores application data from a backup object. Parameters:
  • backup - The backup data to restore
Behavior:
  • Writes all backup entries to localStorage
  • Preserves theme value as raw string
  • Stringifies all other values as JSON
This function overwrites existing localStorage data. Consider prompting users before restoring.
Example:
import { parseBackupFile, restoreBackup } from "@/lib/backup-utils";

function RestoreButton() {
  const handleUploadBackup = (event: React.ChangeEvent<HTMLInputElement>) => {
    const file = event.target.files?.[0];
    if (!file) return;

    parseBackupFile(file, (backup) => {
      restoreBackup(backup);
      window.location.reload();
    });

    event.target.value = "";
  };

  return <input type="file" accept=".json" onChange={handleUploadBackup} />;
}

parseBackupFile

function parseBackupFile(
  file: File,
  onSuccess: (backup: BackupData) => void
): void
Parses a backup file and invokes a callback with the parsed data. Parameters:
  • file - The File object to parse
  • onSuccess - Callback invoked with parsed backup data
Behavior:
  • Reads file as text using FileReader API
  • Parses JSON content
  • Silently fails on invalid JSON
Example:
parseBackupFile(file, (backup) => {
  console.log("Backup loaded:", backup);
  restoreBackup(backup);
});

Complete Example

Here’s a complete backup/restore implementation:
import {
  createBackup,
  downloadBackup,
  parseBackupFile,
  restoreBackup,
} from "@/lib/backup-utils";

function BackupManager() {
  const handleDownload = () => {
    const backup = createBackup();
    downloadBackup(backup);
  };

  const handleRestore = (event: React.ChangeEvent<HTMLInputElement>) => {
    const file = event.target.files?.[0];
    if (!file) return;

    parseBackupFile(file, (backup) => {
      restoreBackup(backup);
      window.location.reload();
    });

    event.target.value = "";
  };

  return (
    <div>
      <button onClick={handleDownload}>Download Backup</button>
      <input type="file" accept=".json" onChange={handleRestore} />
    </div>
  );
}

Build docs developers (and LLMs) love