A beautiful year-in-review application for your Actual Budget data, styled like Spotify Wrapped. View your income, expenses, top categories, transaction patterns, and more with stunning visualizations and animations.
⚠️ Note: This project was vibe coded - it was built for fun and to scratch a personal itch. Don't expect production-grade code quality, extensive error handling, or perfect architecture. It works, but it's not perfect. Use at your own discretion! 😅
- 📊 Comprehensive Statistics: Income vs expenses, top categories, top payees, transaction statistics
- 📅 Calendar Heatmap: GitHub-style contribution graph showing transaction frequency
- 📈 Beautiful Charts: Interactive charts powered by Recharts
- 🎨 Spotify Wrapped Style: Vibrant gradients, bold typography, smooth animations
- 🔒 Privacy First: All processing happens in your browser - your data never leaves your device
- ⌨️ Keyboard Navigation: Navigate with arrow keys (← →)
- 📱 Responsive Design: Works on desktop and mobile devices
- 🧪 Well Tested: Unit tests with Vitest and E2E tests with Playwright
- ⚙️ Flexible Filtering: Toggle to include/exclude off-budget transactions, on-budget transfers, and cross-account transfers
- 💱 Currency Override: Change currency display without modifying your budget data
- 🔄 Smart Transfer Labeling: Transfers are automatically labeled with destination account names (e.g., "Transfer: Savings Account") in both categories and payees lists, instead of showing as uncategorized or unknown
See CHANGELOG.md for a detailed history of changes.
- Node.js 20+ and Yarn 4.12.0+
- An exported Actual Budget file (zip format)
This application runs entirely in the browser with no backend server required. The app:
- Uses sql.js (WebAssembly SQLite) to read the Actual Budget database directly in the browser
- Processes data client-side using JSZip to extract the database from the exported zip file
- Requires no server, no API calls, and no internet connection after initial load
- All your financial data stays completely private on your device
- Clone or download this repository
- Install dependencies:
yarn installBefore you can use the app, you need to export your budget from Actual Budget:
- Open Actual Budget
- Go to Settings → Advanced → Export budget
- Save the exported
.zipfile to your computer
Start the development server:
yarn devThe app will open at http://localhost:5173 (or the next available port).
yarn buildThe built files will be in the dist directory and can be deployed to any static hosting service.
Preview the production build locally:
yarn preview- Upload Your Budget: Click "Choose File" and select your exported Actual Budget
.zipfile - Wait for Processing: The app will extract and process your 2025 budget data (this happens entirely in your browser)
- Adjust Settings (optional): Click the settings menu (☰) in the top-right corner to:
- Include/exclude off-budget transactions
- Include/exclude budgeted transfers (transfers between on-budget and off-budget accounts)
- Include all transfers (includes all transfer types, including between two on-budget accounts)
- Override currency display
- Navigate Through Pages: Use the Next/Previous buttons or arrow keys (← →) to navigate through the wrapped pages
- React 19 with TypeScript
- Vite 7 for build tooling
- Framer Motion for animations
- Recharts for data visualization
- sql.js for in-browser SQLite database processing
- JSZip for zip file extraction
- date-fns for date utilities
Run unit tests:
yarn testRun tests in watch mode:
yarn test:watchRun E2E tests:
yarn test:e2eFormat and lint code:
yarn lintCheck linting without fixing:
yarn lint:checkThe build script automatically runs TypeScript type checking. To check types manually:
npx tsc --noEmitThis application is designed with privacy as a core principle:
- No Server Required: All processing happens locally in your browser
- No Data Transmission: Your budget file is never sent to any server
- No Tracking: No analytics, no cookies, no tracking scripts
- Open Source: You can audit the code yourself
Your exported budget file is loaded into memory, processed, and never stored permanently. Once you close the browser tab, the data is cleared.
- Ensure you're uploading a
.zipfile exported from Actual Budget - The file must contain a
db.sqlitefile inside - Check browser console for detailed error messages
- Ensure you have transactions in 2025
- Verify your exported budget file is complete and not corrupted
- Try re-exporting your budget from Actual Budget
- Check browser console for errors
- Ensure you have data for the selected year (2025)
- Try uploading your budget file again
- Large budget files may take longer to process
- The app processes data in your browser, so performance depends on your device
- For very large budgets, consider closing other browser tabs to free up memory
This project is licensed under the MIT License - see the LICENSE file for details.
Built for Actual Budget users who want to see their financial year in review. Inspired by Spotify Wrapped.
