diff --git a/Changelog.md b/Changelog.md
index 5f017c2..920eeee 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -2,6 +2,19 @@
## [Niet vrijgegeven]
+### Gewijzigd
+- Het label bij een beschikbare update in "Over VibeFinance" is "Nieuwe versie"
+ (was "Nieuwste versie" in 1.0.0)
+
+### Opgelost
+- API-antwoorden sturen nu `Cache-Control: no-store`. Ze hadden alleen een
+ `ETag` en 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.md` heeft één centrale `## Tokens`-sectie met het tweetoken-model
(werkstation `write:*`, Docker-host `read:*`) plus de betekenis van een 401,
diff --git a/README.md b/README.md
index 87e3139..bd0d0f1 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ Eigen vermogen · Schulden · Voortgang · Gebruikersbeheer



-
+

diff --git a/backend/src/server.js b/backend/src/server.js
index 20685f4..2a7fdc7 100644
--- a/backend/src/server.js
+++ b/backend/src/server.js
@@ -56,6 +56,17 @@ if (config.NODE_ENV !== "test") {
app.use(pinoHttp({ logger }));
}
+// ── Geen browsercache op de API ───────────────────────────────────────────────
+// Zonder Cache-Control mag de browser zelf bepalen hoe lang hij een antwoord
+// hergebruikt (heuristische caching). Dat verschilt per browser en profiel: de
+// update-melding bleef in de ene browser op een oud antwoord hangen terwijl een
+// verse browser het goede kreeg. API-antwoorden zijn per gebruiker en per moment,
+// dus die horen nooit uit de cache te komen.
+app.use("/api", (_req, res, next) => {
+ res.setHeader("Cache-Control", "no-store");
+ next();
+});
+
// ── API-routes ────────────────────────────────────────────────────────────────
app.use("/api/health", healthRouter);
app.use("/api/update-check", updateRouter);
diff --git a/backend/test/app.test.js b/backend/test/app.test.js
index 9e846ca..b24c9ec 100644
--- a/backend/test/app.test.js
+++ b/backend/test/app.test.js
@@ -68,6 +68,15 @@ describe("API", () => {
assert.equal(body.latest, null);
assert.equal(body.disabled, true);
});
+
+ // Zonder expliciete header bepaalt de browser zelf hoe lang hij een
+ // API-antwoord hergebruikt, en dat verschilt per browser.
+ it("API-antwoorden komen nooit uit de browsercache", async () => {
+ for (const pad of ["/api/health", "/api/update-check", "/api/bestaat-niet"]) {
+ const res = await fetch(`${basis}${pad}`);
+ assert.match(res.headers.get("cache-control") ?? "", /no-store/, pad);
+ }
+ });
});
describe("Frontend serveren", () => {
diff --git a/frontend/src/components/NavBar.jsx b/frontend/src/components/NavBar.jsx
index ab7daa4..47b95e7 100644
--- a/frontend/src/components/NavBar.jsx
+++ b/frontend/src/components/NavBar.jsx
@@ -165,7 +165,7 @@ function OverPopup({ onClose, nieuweVersie, T }) {
{nieuweVersie && (