Skip to content

[Sync Framework] Migrate budget-tracker to sync framework (add sync for first time) #29

Description

@Michael-Obele

Overview

Migrate budget-tracker to the centralized sync framework. This app currently has no server sync (only sharing features implemented) — this migration adds sync for the first time using the framework.

Design doc: docs/plans/2026-06-21-sync-framework-design.md

Current state

  • src/routes/apps/(app)/budget-tracker/+page.sveltePersistedState only, no server sync, AUTO_BACKUP_DELAY = 3000 defined but unused
  • src/lib/budget-tracker/states.svelte.tsPersistedState for budgets, selectedExpenses, budgetStrikethrough
  • src/lib/remote/budget-tracker.remote.tsonly sharing functions (getBudgetShareSettings, setBudgetSharing, regenerateBudgetShareLink) — no backup/load functions

Migration steps

  • Create app DB with createReactiveDB:
    const db = createReactiveDB({
      name: 'budget-tracker',
      version: 1,
      stores: {
        budgets: { keyPath: 'id' },
        expenses: { keyPath: 'id' },
      },
    });
  • Replace PersistedState with db.budgets.liveAll(), db.expenses.liveAll()
  • Keep selectedExpenses and budgetStrikethrough as local-only state (UI state, not synced)
  • Add sync to budget-tracker.remote.ts:
    • createLoadQuery for loadBudgetData (new — loads budgets + expenses)
    • createBackupForm for backupBudgetForm (new)
    • createBackupCommand for backupBudgetCommand (new)
    • Keep existing sharing functions
  • Create SyncManager with auto-backup trigger:
    strategy: timestampMerge,
    trigger: 'auto-backup',
    autoBackupDelay: 3000,  // keep existing intended delay
  • Update +page.svelte — add sync.syncOnMount(data), backup button, sync button
  • Add +page.server.ts — load budget data for authenticated users (new file)
  • Run bun check + svelte-autofixer
  • Test sync (first time this app has cloud sync!)

What stays app-specific

  • Sharing features (getBudgetShareSettings, setBudgetSharing, regenerateBudgetShareLink)
  • UI state (selectedExpenses, budgetStrikethrough) — local-only, not synced
  • Data types (Budget, Expense)

Prisma models (existing)

  • Budget → store budgets
  • Expense → store expenses (nested in budget)

Blocked by

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions