A simple tool to parse and visualize transaction records exported from FinanzGuru.
- CSV/XLSX Import: Parse transaction exports from FinanzGuru
- Privacy-First: Anonymizes personal data before processing
- Smart Categorization: Rule-based categorization with AI fallback
- Recurring Detection: Identifies recurring transactions automatically
- Interactive Dashboard: View spending trends, category breakdowns, and top expenses
- Bulk Editing: Select and recategorize multiple transactions at once
- Google Sheets Export: Export to your existing yearly budget spreadsheet
- Node.js 18+
- OpenAI API key (for AI categorization)
- Google Service Account (for Sheets export, optional)
Create .env file in the api/ directory:
OPENAI_API_KEY=your-openai-api-key
GOOGLE_SERVICE_ACCOUNT_KEY_PATH=/path/to/service-account.json# Development
docker-compose up
# Production
docker-compose -f docker-compose.prod.yml up -dThe web app will be available at http://localhost:5173 (dev) or http://localhost (production).
# Install API dependencies
cd api
npm install
# Install Web dependencies
cd ../web
npm install
# Run both (in separate terminals)
cd api && npm run dev # API runs on :3003
cd web && npm run dev # Web runs on :5173- Export from FinanzGuru: Export your transactions as CSV or XLSX
- Upload: Drag and drop the file into the web interface
- Review: Check auto-categorized transactions, edit as needed
- Analyze: View charts and spending breakdowns
- Export: (Optional) Export to Google Sheets
├── api/ # Backend API (Hono)
│ ├── src/
│ │ ├── routes/ # API endpoints
│ │ ├── services/ # OpenAI, Sheets integration
│ │ └── lib/ # Anonymization logic
│ └── Dockerfile
│
├── web/ # Frontend (React + Vite)
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── lib/ # Parsers, categorization
│ │ └── types.ts
│ └── Dockerfile
│
└── docker-compose.yml # Development setup
All sensitive data is anonymized before processing:
- Names:
Person_ABC - IBANs:
DE**********5515 - Account Numbers:
Acc_XYZ123 - Emails:
j***@gmail.com - Phone Numbers:
+*********1234
Anonymization mappings are kept in memory only and never persisted.
- Go to Google Cloud Console
- Enable Google Sheets API
- Create a Service Account and download JSON key
- Share your Google Sheet with the service account email
- Open Settings panel
- Enter your Google Sheet URL or ID
- Set the target tab name (e.g., "2026")
- Map categories to sheet columns
- Frontend: React 18, Vite, TailwindCSS, Recharts
- Backend: Hono (Node.js)
- AI: OpenAI GPT-4o-mini
- Export: Google Sheets API
MIT