# π VibeFinance
**Persoonlijk vermogensdashboard**
Eigen vermogen Β· Schulden Β· Voortgang Β· Gebruikersbeheer






---
## π€ Gebouwd met Claude.ai
Deze applicatie is volledig ontworpen en ontwikkeld met behulp van [Claude.ai](https://claude.ai) β de AI-assistent van Anthropic. Van architectuur tot gebruikersinterface: alles is stap voor stap tot stand gekomen in samenwerking met Claude.
---
## β‘ Quick Start
> Vereisten: Docker Engine 24+ en Docker Compose v2+
**`.env`** β kopieer `.env.example` en vul in:
```env
POSTGRES_USER=vibefinance
POSTGRES_PASSWORD=kies_een_sterk_wachtwoord
JWT_SECRET=minimaal_64_willekeurige_tekens
FRONTEND_PORT=3300
```
```bash
# Genereer een veilige JWT_SECRET
openssl rand -hex 64
```
```bash
docker compose pull && docker compose up -d
```
Navigeer naar `http://:3300` en registreer je account. De **eerste** geregistreerde gebruiker krijgt automatisch de Admin-rol.
### Development (hot reload)
```powershell
.\dev.ps1
```
Frontend bereikbaar op **http://localhost** (poort 80 β Vite dev server op 5173).
> **Let op:** `.\dev.ps1 up` en `.\dev.ps1 down` wissen de development-database (volumes). Gebruik voor een gewone herstart `docker compose -f docker-compose.dev.yml down` gevolgd door `docker compose -f docker-compose.dev.yml up -d --build`.
---
## ποΈ Functionaliteit
| Scherm | Wat het doet |
|---|---|
| π **Dashboard** | Overzicht van totaal eigen vermogen, schulden en netto vermogen |
| π° **Eigen vermogen** | Vermogensposten per categorie beheren + geΓ―nvesteerde fiat historiek |
| π **Schulden** | Schulden bijhouden per blok met afbetalingsoverzicht |
| π **Voortgang** | Grafieken en trends van EV en schuld over tijd (apart bij te houden) |
| π₯ **Gebruikers** | Accounts aanmaken, bewerken en beheren (Admin-rol vereist) |
---
## ποΈ Architectuur
```
vibefinance/
βββ docker-compose.yml # Productie orchestratie (pre-built images)
βββ docker-compose.dev.yml # Standalone dev stack (hot reload)
βββ .env.example # Kopieer naar .env en vul in
βββ package.json # Versienummer β single source of truth
βββ dev.ps1 # Dev script (bouwen, starten, pushen)
β
βββ frontend/ # React / Vite SPA
β βββ Dockerfile # Multi-stage: dev β build β nginx
β βββ nginx-spa.conf # SPA fallback binnen de container
β βββ vite.config.js
β βββ src/
β βββ App.jsx # Root β wiring + idle-logout
β βββ main.jsx
β βββ constants/ # Kleuren, tabs, begindata
β βββ utils/ # Formatters, helpers
β βββ hooks/ # useTheme
β βββ context/ # AppContext (global state + API sync)
β βββ components/
β β βββ ui/ # Primitieve UI (VCard, DonutChartβ¦)
β β βββ LoginPage.jsx
β β βββ NavBar.jsx
β β βββ ProfielPopup.jsx
β β βββ GebruikersBeheer.jsx
β βββ pages/
β βββ DashboardTab.jsx
β βββ EigenVermogenTab.jsx
β βββ SchuldTab.jsx
β βββ VoortgangTab.jsx
β
βββ backend/ # Express REST API
βββ Dockerfile # Multi-stage: dev β production (non-root)
βββ src/
βββ server.js # Entry point
βββ db.js # PostgreSQL connectie + schema migraties
βββ config/ # Omgevingsvariabelen
βββ constants/ # Begindata (initialData.js)
βββ middleware/ # auth.js, errorHandler.js
βββ routes/ # auth, data, users, health
βββ stores/ # userStore, dataStore
```
**Stack:** React 18 Β· Vite Β· Node.js 22 Β· Express 4 Β· PostgreSQL 18 Β· JWT Β· bcrypt Β· Docker Compose v2
---
## π API
Beveiligde endpoints vereisen `Authorization: Bearer `. Rate limiting: 20 req/15 min op auth-routes, 200 req/15 min globaal.
| Route | Methoden | Omschrijving |
|---|---|---|
| `/api/auth/register` | POST | Account aanmaken (eerste user = Admin) |
| `/api/auth/login` | POST | Inloggen, JWT token terug |
| `/api/auth/me` | GET, PATCH | Profiel ophalen en bijwerken |
| `/api/auth/me/password` | POST | Wachtwoord wijzigen |
| `/api/data` | GET, PUT, DELETE | FinanciΓ«le data per gebruiker |
| `/api/users` | GET, POST, PATCH, DELETE | Gebruikersbeheer (Admin only) |
| `/api/health` | GET | Status + uptime |
---
## ποΈ Database
| Tabel | Omschrijving |
|---|---|
| `users` | Accounts met bcrypt hash, rol, actief-vlag en aanmaakdatum |
| `user_data` | FinanciΓ«le data per gebruiker (JSON) |
| Omgeving | Volume | Mount pad |
|---|---|---|
| Productie | `vibefinance_pgdata` | `/var/lib/postgresql` |
| Development | `postgres_dev_data` | `/var/lib/postgresql` |
> PostgreSQL 18 gebruikt `PGDATA=/var/lib/postgresql/18/docker` β het volume is daarom gemount op `/var/lib/postgresql` (niet `/data`).
---
## βοΈ Omgevingsvariabelen
| Variabele | Standaard | Omschrijving |
|---|---|---|
| `POSTGRES_PASSWORD` | β | **Verplicht** |
| `JWT_SECRET` | β | **Verplicht** β minimaal 64 tekens |
| `POSTGRES_USER` | `vibefinance` | Database gebruikersnaam |
| `POSTGRES_DB` | `vibefinance` | Database naam |
| `JWT_EXPIRES` | `7d` | Geldigheidsduur token |
| `CORS_ORIGIN` | β | Externe domeinnaam |
| `FRONTEND_PORT` | `3300` | Externe poort frontend |
---
## π Beveiliging
- Wachtwoorden gehasht met bcrypt (cost factor 12)
- JWT authenticatie met instelbare vervaltijd
- Backend uitsluitend bereikbaar via nginx proxy
- Database bereikbaar alleen binnen het interne Docker netwerk
- Containers draaien als non-root
- Helmet security headers
- Rate limiting op alle endpoints
---
## π οΈ Beheer
Zie `BEHEER.md` voor commando's voor lokale ontwikkeling, releases, logs en database-toegang.
---
PrivΓ© gebruik Β· gebouwd met [Claude.ai](https://claude.ai)