18 KiB
18 KiB
Changelog
[1.0.4] - 2026-09-10
Gewijzigd
- Git-tags krijgen weer een
v-prefix (v1.0.4), net als t/mv1.0.0. Sinds 1.0.1 was dat1.0.1,1.0.2,1.0.3— en omdat Gitea de tag op de release-pagina toont, stond daar het kale nummer terwijl de release-naam wélv1.0.3was. De image-tags in de registry houden bewust géénv; dat is de conventie voor container-tags. De update-check verdraagt beide: backend en frontend strippen een leidendevvoordat ze versies vergelijken
Opgelost
- Het omzetten van de changelog-kop slokte de lege regel eronder op, waardoor
## [x.x.x] - datumdirect tegen### Toegevoegdaan kwam te staan. Oorzaak was\s*$in het zoekpatroon:\smatcht ook newlines. Het patroon eindigt nu op[ \t]*(?=\r?$)— een lookahead, want dit bestand heeft CRLF en met alleen[ \t]*$matchte de kop helemaal niet meer (de\rzit ertussen). Zo blijft de match binnen één regel én blijft het regeleinde ongemoeid
[1.0.3] - 2026-09-10
Toegevoegd
release.ps1zet de changelog-kop## [Niet vrijgegeven]nu zelf om naar## [x.x.x] - datum, net zoals het al deed metfrontend/package.jsonen de README-badge. Handmatig omzetten hoeft dus niet meer- Staat er ook na die omzetting niets over deze versie in
Changelog.md, dan breekt het script af vóór de build met de melding wat je moet toevoegen. Eerder viel het stil terug op de tekst"Release x.x.x"en meldde het "Gepubliceerd" — dat overkwam 0.1.9 en 1.0.2, en is achteraf alleen met eenPATCHop de release te herstellen. Nieuwe switch-NoChangelogom bewust zonder release-notes te publiceren release.ps1zet na een geslaagde release de versie in de rootpackage.jsonopx.x.(x+1)-dev. Dat was voorheen de laatste handmatige stap van de release-workflow. Het staat bewust ná het publiceren, zodat een afgebroken release het nummer niet vooruit schuift
Opgelost
-DryRunin combinatie met-Forceverwijderde écht de Git-tag. De twee commando's in stap 4 (git tag -dengit push origin :refs/tags/x.x.x) liepen niet viaInvoke-Cmden hadden dus geen droogloop-controle. Gitea ruimt de release op zodra de tag verdwijnt, dus een droogloop kon een gepubliceerde release wissen — zo is de release van 1.0.2 verloren gegaan en opnieuw aangemaakt. Onder-DryRunworden beide nu alleen gemeld
Gewijzigd
- De changelog-controle staat vóór de drie auto-updates, zodat een afgebroken release geen gewijzigde bestanden achterlaat terwijl hij "er is niets gepubliceerd" meldt
- Stap 5 leest de release-notes uit het geheugen in plaats van opnieuw van schijf. Een droogloop schrijft de kop niet, en toonde daardoor de placeholder in de payload — precies wat je met een droogloop wilt uitsluiten
- De Quick Start in
README.mdbegint nu met het ophalen vandocker-compose.yml(clone, of alleen die twee bestanden viaraw). Zonder dat bestand antwoordtdocker compose pullmetno configuration file provided: not found, en die stap ontbrak. Beide foutmeldingen staan er nu bij met hun oorzaak
[1.0.2] - 2026-09-10
Gewijzigd
- De update-melding op het belletje toont alleen nog de kop, de versieregel en de
link naar de release. De release-notes stonden er als ruwe Markdown in — in een
kaart van 280px leverde dat zichtbare
###-koppen en afgekapte regels op./api/update-checkstuurtnotesnog wel mee, zodat ze later ergens met meer ruimte gebruikt kunnen worden BEHEER.mdlegt vast dat de release-link uit Gitea'sROOT_URLwordt samengesteld en niet per release wordt opgeslagen: na eenROOT_URL-wijziging plus herstart zijn álle releases in één keer goed, ook de oude. Verder staat er nu hoe je aan het verschil tussen401en403ziet of een token nog leeft, en hoe je anoniem over https fetcht als SSH niet meedoet
[1.0.1] - 2026-09-10
Toegevoegd
- Kolommen in de tabellen op Eigen Vermogen ("Geïnvesteerde Fiat") en Voortgang
zijn versleepbaar: pak de rechterrand van een kolomkop. De breedtes gaan per
tabel naar localStorage, dus ze overleven een tabwissel en een herlaad;
dubbelklik op de greep zet één kolom terug op zijn standaardbreedte. De logica
staat in de nieuwe hook
frontend/src/hooks/useKolomBreedtes.js, de greep zelf is.kolom-gripinApp.css
Gewijzigd
- De
Vibe-organisatie in Gitea staat op public, dus lezen vereist geen token meer:git clone,docker compose pullen de update-check werken anoniem.UPDATE_CHECK_TOKENin.envis daarmee optioneel — de code ondersteunt hem nog als vangnet voor het geval de organisatie weer privé wordt. Schrijven verandert niet:docker pushen het aanmaken van een release hebben nog steeds het werkstation-token nodig - Het tweetoken-model in
BEHEER.mdis teruggebracht tot één Gitea-token op het werkstation, metwrite:packageenwrite:repository. Het host-token is niet meer nodig (pull en update-check zijn anoniem),git pushgaat over SSH, enREGISTRY_TOKENhoeft niet apart:release.ps1endev.ps1vielen daar al terug opGITEA_TOKEN. Geen code-wijziging, alleen minder te beheren - De tabellen op Eigen Vermogen en Voortgang staan op
table-layout: fixed, nodig om ingestelde kolombreedtes te respecteren. Gevolg: lange tekst rekt een kolom niet meer op maar wordt afgekapt met een ellips. De Opmerkingen-cellen hebben eentitle, dus hover geeft de volledige tekst - Het label bij een beschikbare update in "Over VibeFinance" is "Nieuwe versie" (was "Nieuwste versie" in 1.0.0)
Opgelost
- De sticky kolomkop van die tabellen was in dark mode maar 30% dekkend: hij
gebruikte
T.card(rgba(22,23,27,0.30)), waardoor de rijen tijdens het scrollen zichtbaar door de koptekst heen liepen. NuT.popupBg, de ondoorzichtige variant die al in het thema stond - In dev bakte Vite de versie uit
frontend/package.jsonin in plaats van de versie uit de rootpackage.json.VITE_APP_VERSIONkwam alleen als build-arg mee, maar dedevelopment-stage in deDockerfiledeclareert dieARGniet — en Vite bakt de constante in bij het starten van de dev-server, niet bij het bouwen van het image. De variabele staat nu in de runtime-omgeving van de dev-container;vite.config.jsvalt met||(was??) terug oppackage.jsonals hij leeg is - API-antwoorden sturen nu
Cache-Control: no-store. Ze hadden alleen eenETagen geen cache-beleid, waardoor de browser zelf mocht bepalen hoe lang hij ze hergebruikte — per browser en profiel verschillend. Gevolg: de update-melding bleef in Brave op een oud antwoord hangen (nog van vóór het werkende token) terwijl een verse Edge het goede kreeg
[1.0.0] - 2026-09-09
Gewijzigd
BEHEER.mdheeft één centrale## Tokens-sectie met het tweetoken-model (werkstationwrite:*, Docker-hostread:*) plus de betekenis van een 401, 403 en 404 van Gitea; de Registry-, pull- en update-secties verwijzen daarnaar in plaats van de scopes elk apart uit te leggen.env.examplenoemt bijUPDATE_CHECK_TOKENde vereiste scope (read:repository) en wat je ziet als die ontbreekt- "Over VibeFinance" noemt de beschikbare update nu "Nieuwste versie" in plaats van "Nieuw beschikbaar"
README.mdbijgewerkt: de Quick Start noemt dedocker logindie een pull uit de privé-registry vereist (die stap ontbrak), de release-sectie verwijst naar.env.releaseenwrite:repository, enUPDATE_CHECK_TOKENnoemt zijn scoperelease.ps1werkt de versiebadge inREADME.mdbij, net als de versie infrontend/package.json— die badge stond drie releases achter. Een-DryRunmeldt de wijziging en schrijft nietREADME.mdheeft ruimte voor een screenshot onder de badges (docs/screenshot-dashboard.png);docs/staat in.dockerignoreen.pngen.jpgzijn in.gitattributesals binair vastgelegd- Badges
React_18→React_19(de app draait op React 19.2) BEHEER.mdlegt bij de release-workflow vast wat het script zelf bijwerkt (frontend/package.jsonen de README-badge), en dat de changelog-kop exact## [x.x.x]moet zijn — anders vallen de release-notes terug op"Release x.x.x", zoals bij 0.1.9 gebeurde- Projectboom in
README.mdbevatdocs/enfrontend/src/version.js
[0.1.9] - 2026-09-09
Gewijzigd
release.ps1leest een.env.releasenaast het script in (niet in git), zodatGITEA_TOKENen de registry-credentials niet elke shell opnieuw gezet hoeven te worden; een variabele die al in de omgeving staat wint, en alleen de namen worden gelogd.gitignorenegeert nu alle.env.*op.env.examplena —.env.releasezou anders door eengit add .in git belandenBEHEER.mdbeschrijft welke token-scopes waarvoor nodig zijn (write:packagevoor de registry,write:repositoryvoor een release) en hoe je een 404 in stap 5 nakijkt- De draaiende versie komt uit de build in plaats van uit een bestand: de
frontend leest
__APP_VERSION__via het nieuwesrc/version.js, niet meer rechtstreeks uitfrontend/package.json.vite.config.jsdefinieerde die constante al, maar niets gebruikte hem — een productie-image gebouwd terwijl er een-devinpackage.jsonstond, sloeg de update-check stil helemaal over
[0.1.8] - 2026-09-09
Gewijzigd
BEHEER.mdbeschrijft de registry-login die een deploy-machine nodig heeft om te kunnen pullen: het package is privé, dus ookdocker compose pullvraagt een token (read:package) — anoniem geeft de registry401 Unauthorized- Testsuite dekt nu het serveren van de favicon, de cache-headers daarop en de 404 op ontbrekende bestanden
release.ps1 -DryRunschrijft de frontend-versie niet meer echt weg: een droogloop meldde de sync wél en voerde hem óók uit, waardoor er na een-DryRuneen gewijzigdefrontend/package.jsonbleef liggen
Opgelost
- De favicon bleef weg in de browser:
favicon.svgenicons/*hebben geen hash in hun naam, maar kregen wel een jaarimmutablemee — een eenmaal verkeerd gecacht antwoord revalideerde daardoor nooit meer. Alleen de gehashte bundels in/assetshouden die cache; de rest revalideert /favicon.icoen/apple-touch-icon.pnggaven via de SPA-fallbackindex.htmlterug met status 200 entext/html— de browser kreeg HTML waar hij een icoon verwachtte en toonde stil niets, zonder zichtbare fout. Paden met een bestandsextensie geven nu een echte 404
[0.1.7] - 2026-09-08
Gewijzigd
- Versienummer opgehoogd naar 0.1.7
- Eerste release vanaf de opnieuw aangemaakte Gitea-repository, met
mainals hoofdbranch
[0.1.6] - 2026-09-04
Gewijzigd
- Migratie naar 2 containers: de Express-app serveert nu zelf de gebouwde
frontend op
/(met SPA-fallback naarindex.html); de aparte nginx-container is vervallen. Eén image, één origin, geen interne proxy — bedoeld voor self-hosting op een Raspberry Pi - Nieuwe multi-stage
Dockerfilein de root met targetstest,developmentenproduction;frontend/Dockerfile,frontend/nginx-spa.confenbackend/Dockerfilezijn verwijderd docker-compose.ymlbevat alleen nogappenpostgres; de app publiceertAPP_PORT(standaard 3400) naar containerpoort 3001- Dev-stack draait beide processen in één container (
docker/dev-entrypoint.sh): API metnode --watchen de Vite dev-server met hot reload - Rate limiting geldt alleen nog voor
/api— statische bestanden werden anders na 200 requests geblokkeerd - Content-Security-Policy via Helmet toegespitst op wat de frontend laadt (Google Fonts, inline styles, base64-avatars)
- Assets met hash worden een jaar
immutablegecached,index.htmlnooit - Schema-initialisatie zit nu in
initDb()in plaats van bij het importeren vandb.js, zodat de app zonder database te importeren is (tests) dev.ps1,release.ps1en de shell-wrappers werken met één app-image;dev.ps1 upwist de dev-database niet langer (alleendev.ps1 down)release.ps1draait de testsuite vóór het publiceren en bouwt voorlinux/amd64+linux/arm64- Dependencies naar de nieuwste versies: React 19.2, Vite 8.2, @vitejs/plugin-react 6.1, Express 5.2, Helmet 8.3, express-rate-limit 8.7, pino 10.3 / pino-http 11, pg 8.23, dotenv 17.4, bcryptjs 3.0, ESLint 9.39 (frontend) / 10.9 (backend)
- Express 5 vereist benoemde wildcards in routes;
app.use("/api/*")enapp.get("*")vervangen door een prefix-mount en pad-loze middleware dev.ps1 upgebruikt--renew-anon-volumes, anders blijven de oudenode_modulesin de dev-container staan na een upgrade- Vite 8 bundelt met Rolldown:
manualChunks(object-vorm) vervangen doorbuild.rollupOptions.output.advancedChunks release.ps1controleert vóór de build of origin bereikbaar is en of je op de registry bent ingelogd, in plaats van pas na een multi-arch build te stranden op401 Unauthorized. Logt zelf in metREGISTRY_USER+REGISTRY_TOKENwanneer die gezet zijn;dev.ps1 pushdoet dezelfde controle- Git-commando's in
release.ps1draaien metBatchMode=yes, zodat het script niet blijft hangen op een wachtwoordprompt van SSH release.ps1,dev.ps1entest.ps1eindigen expliciet met exitcode 0, en de slotregel van een-DryRunzegt nu dat er niets is gepubliceerd- Mislukte stappen in
release.ps1geven geen PowerShell-stacktrace meer maar een gerichte melding: bij een mislukte push wordt de registry-login opnieuw getest en volgt de bijbehorende instructie, bij een mislukte tag-push het https-alternatief
Toegevoegd
- Testsuite:
backend/test/app.test.js(11 tests metnode --test) voor de API-routes, SPA-fallback, cache-headers en security-headers test.ps1/test.sh: backend-tests, productiebuild en smoketest op de echte 2-container stack.env.example,.dockerignoreen.gitignoreSTATIC_DIRals omgevingsvariabele (map met de frontend-build)- Dependency-check als eerste stap van de testsuite:
docker/check-updates.mjsvergelijkt beidepackage.json's met het npm-register, met bewuste uitzonderingen indocker/update-exceptions.json(-Strictom te falen,-SkipDepsom over te slaan) - ESLint flat configs (
frontend/eslint.config.js,backend/eslint.config.js) —npm run lintwerkte voorheen niet, er was geen configuratie - Lockfiles voor beide packages (
backend/package-lock.jsonwas er niet) .gitattributes: shell-scripts en Docker-bestanden altijd met LF, anders faalt het shebang in de container
[0.1.5] - 2026-09-04
Toegevoegd
- Donut-grafieken: hover per categorie toont naam, bedrag en percentage
Gewijzigd
- Update-check loopt nu via de eigen backend (
/api/update-check) in plaats van rechtstreeks naar de Gitea API — de browser blokkeerde die call (geen CORS-headers) - Versievergelijking is semver-based: alleen een hoger versienummer meldt,
-devbuilds melden niets meer - Update-check herhaalt zich elk half uur en bij terugkeer naar het tabblad (was: eenmalig bij laden)
release.ps1maakt de Gitea-release aan met de changelog-sectie als release-notes (een kale Git-tag komt niet inreleases/latesten gaf dus geen melding)- Middenwaarde in de donut schaalt mee met de beschikbare ruimte
Opgelost
- Donkere spleten tussen de donut-segmenten (de tussenruimte liet de achtergrondbaan zien)
- De update-melding op het belletje bleef altijd leeg door de geblokkeerde API-call
[0.1.3] - 2026-04-16
Toegevoegd
- Versienummer met logo zichtbaar boven de logout-knop in de sidebar
Gewijzigd
- Registry verplaatst van intern IP (
10.0.3.108:3000) naar publieke DuckDNS-hostnaam (vibehoogie.duckdns.org) — toegankelijk via Nginx Proxy Manager - PostgreSQL productie geüpgraded van versie 16 naar 18 (volume mount aangepast naar
/var/lib/postgresql) - Witte rand rondom de app verwijderd (globale CSS reset toegevoegd,
App.cssgekoppeld aanApp.jsx)
Opgelost
- Login gaf "Kan geen verbinding maken met de server":
nginx-spa.confmiste een/api/proxy-blok naar de backend-container — alle API-calls kwamen niet aan
[0.0.4] - 2026-04-08
Toegevoegd
- Nog in ontwikkeling
[0.0.3] - 2026-04-08
Toegevoegd
- Gebruikersbeheer haalt accounts op uit de backend API (was: localStorage)
- Gebruikers bewerken: naam, e-mailadres en wachtwoord aanpassen via ✏️ knop
- Nieuwe gebruiker aanmaken vereist nu ook een wachtwoord
- Eerste geregistreerde gebruiker krijgt automatisch de Admin-rol
aangemaaktkolom toegevoegd aan deuserstabel (zichtbaar in gebruikersbeheer)- Custom dropdown component voor rolselectie (past donker thema)
- Voortgang overzicht gebruikt eigen
evVoortgangHistory— los van geïnvesteerde fiat
Opgelost
- Data ging verloren na container restart: PostgreSQL 18 gebruikt een ander
PGDATApad (/var/lib/postgresql/18/docker). Volume nu gemount op/var/lib/postgresql - Geïnvesteerde fiat invullen vulde automatisch ook het voortgangsoverzicht in
[0.0.2] - 2026-04-01
Toegevoegd
- PostgreSQL als persistente database (vervangt in-memory opslag)
- JWT authenticatie met instelbare vervaltijd
- Backup en restore via ZIP-bestand
- Rate limiting op auth-endpoints
- Helmet security headers
- Docker multi-stage builds (dev / productie)
- Dev script (
dev.ps1/dev.sh) voor bouwen, starten en pushen
Gewijzigd
- Gebruikersdata per account opgeslagen (niet meer gedeeld)
[0.0.1] - 2026-03-01
Toegevoegd
- Initiële release van VibeFinance
- Dashboard met overzicht van eigen vermogen, schulden en netto vermogen
- Eigen vermogen beheer met categorieën en historiek
- Schulden beheer met blokken en afbetalingsoverzicht
- Voortgangspagina met grafieken (EV en schuld over tijd)
- Gebruikersbeheer en authenticatie
- Dark mode ondersteuning