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.svelte — PersistedState only, no server sync, AUTO_BACKUP_DELAY = 3000 defined but unused
src/lib/budget-tracker/states.svelte.ts — PersistedState for budgets, selectedExpenses, budgetStrikethrough
src/lib/remote/budget-tracker.remote.ts — only 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
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.mdCurrent state
src/routes/apps/(app)/budget-tracker/+page.svelte—PersistedStateonly, no server sync,AUTO_BACKUP_DELAY = 3000defined but unusedsrc/lib/budget-tracker/states.svelte.ts—PersistedStateforbudgets,selectedExpenses,budgetStrikethroughsrc/lib/remote/budget-tracker.remote.ts— only sharing functions (getBudgetShareSettings,setBudgetSharing,regenerateBudgetShareLink) — no backup/load functionsMigration steps
createReactiveDB:PersistedStatewithdb.budgets.liveAll(),db.expenses.liveAll()selectedExpensesandbudgetStrikethroughas local-only state (UI state, not synced)budget-tracker.remote.ts:createLoadQueryforloadBudgetData(new — loads budgets + expenses)createBackupFormforbackupBudgetForm(new)createBackupCommandforbackupBudgetCommand(new)SyncManagerwithauto-backuptrigger:+page.svelte— addsync.syncOnMount(data), backup button, sync button+page.server.ts— load budget data for authenticated users (new file)bun check+svelte-autofixerWhat stays app-specific
getBudgetShareSettings,setBudgetSharing,regenerateBudgetShareLink)selectedExpenses,budgetStrikethrough) — local-only, not syncedBudget,Expense)Prisma models (existing)
Budget→ storebudgetsExpense→ storeexpenses(nested in budget)Blocked by