# 2026-06-09 17:42 UTC: Stats self-check now normalizes whitespace and accepts the explicit live proof line for the recent-changes rule, so small wording or spacing drift is less likely to produce a false-red /stats verdict while the visible proof remains on the page.
# 2026-06-06 06:59 UTC: Stats live preview now shows the latest shipped note and live build together on the lightweight /stats route, so operators can verify the newest item faster without opening deep mode first.
# 2026-06-05 23:51 UTC: Stats changelog scan now reads the full file instead of a capped prefix, so the live recent-changes proof cannot miss the newest shipped note after the changelog grows past the old read limit.
# 2026-06-04 16:51 UTC: Premium upgrade tracking now sends explicit tool-context through the unlock buttons and checkout payload, so the live funnel report can separate the real tool trigger from the broader source path more accurately.
# 2026-06-05 19:51 UTC: Stats lightweight fallback now defines the full dashboard target before it is used in the lite-mode escape hatch, so a stale preview cannot trip over an undefined live target while still preserving the visible recent-changes proof.
# 2026-06-04 22:51 UTC: Status page selfcheck now uses the active host header instead of a hardcoded domain, so the live health view stays accurate when the site is opened through the deployed host or a staging-style context.
# 2026-06-04 10:00 UTC: Stats probe now prints the exact live target file name in the probe body, so deploy verification can confirm which versioned stats file is actually answering before trusting the recent-changes rule.
# 2026-06-04 02:51 UTC: Stats preview now exposes a direct live-probe button beside the full dashboard action, so operators can jump straight to the canonical verification response without losing the visible recent-changes rule on /stats.
# 2026-06-03 19:54 UTC: Stats probe now surfaces the changelog source note explicitly in the live proof body, so operators can jump from the recent-changes verification straight to the source file without guessing which log backed the newest shipped item.
# 2026-06-02 13:57 UTC: The lightweight /stats preview now exposes the exact live proof route beside the changelog source, so operators can jump straight into the probe URL without hunting through deep mode first.
# 2026-06-02 11:51 UTC: The lightweight /stats preview now shows the source note and live proof route alongside the newest shipped item, so the recent-changes proof is easier to verify without opening deep mode first.
# 2026-06-02 03:56 UTC: Connection-info now exposes an explicit best-endpoint reason alongside the hint, so the live API and its UI can explain why scripts should use the richer profile or fall back to the plain IP endpoint.
# 2026-06-01 22:10 UTC: Stats live probe v107 now shows the actual newest changelog note in the live proof line, so /stats verification points at the current shipped item instead of only a generic placeholder.
# 2026-06-01 20:05 UTC: Conversion funnel summary now breaks results down by source and tool context, so operators can see which acquisition path and which tool context are producing the strongest checkout and upgrade signals instead of only reading totals.
# 2026-06-01 01:13 UTC: Stats recent-changes selection now picks the newest dated changelog entry instead of the first bullet, so the live /stats preview shows the actual latest shipped note even if older notes or duplicated headers appear above it.
- 2026-05-31 16:57 UTC: The lightweight /stats preview now adds a direct link from the newest shipped item to the full dashboard, so operators can jump from the visible recent-changes rule to the live proof path without hunting for deep mode first.
- 2026-05-31 14:58 UTC: Public status page now shows the newest shipped note in a dedicated recent-changes panel with a direct link to live stats, so operators can see what changed before they inspect the health snapshot.
- 2026-05-31 11:18 UTC: IP location lookup now sorts multi-IP hostname results by provider agreement and confidence before picking the displayed endpoint, so the page shows the most trustworthy live location result instead of whichever DNS answer happened to come first.
- 2026-05-31 05:30 UTC: Stats live probe v102 now also accepts the exact read-only recent-changes rule line as visible proof, so the public /stats verifier is less brittle while the visible recent-changes rule stays explicit on page.
- 2026-05-30 17:20 UTC: Stats live probe now advances to v101 while still accepting the previous v100 marker and keeping the visible recent-changes rule in the probe body, so the canonical /stats verification stays aligned with the newest shipped dashboard without losing live proof visibility.
- 2026-05-30 13:15 UTC: Stats dashboard visible proof block now repeats the recent-changes rule together with the newest shipped item and the open-first action before the trail starts, so the live page makes the verification order obvious without hunting through the cards.
- 2026-05-30 07:13 UTC: Connection-info API now includes the client IP source in the JSON payload, so proxy-aware diagnostics can read the origin directly without inferring it from the provider block.
- 2026-05-29 18:12 UTC: API IP JSON now includes the detected IP source alongside the address, so proxy-aware checks can see whether the result came from Cloudflare, X-Real-IP, X-Forwarded-For, or the raw connection.
- 2026-05-29 14:11 UTC: Stats live self-check now also accepts the explicit latest shipped item target line, so the recent-changes rule stays visible while small wording variants on the newest proof line no longer cause false red live checks.
- 2026-05-29 13:14 UTC: Homepage and visit tracking now resolve the real client IP via proxy-aware header detection instead of relying on REMOTE_ADDR alone, so the core IP display is correct behind CDN or reverse-proxy setups.
- 2026-05-29 09:58 UTC: Stats live probe now also accepts the explicit latest shipped item trust line in the self-check, so small wording shifts in the proof block do not turn a healthy /stats into a false negative while the recent-changes rule stays visible.
- 2026-05-29 06:52 UTC: Stats live probe now also confirms the latest shipped item is rendered in the proof block, so a green /stats check proves both the recent-changes rule and the newest note itself are visible on the live page.
- 2026-05-29 05:52 UTC: Stats live probe now exposes an explicit latest shipped item target line and accepts it in the self-check, so the newest verification anchor is less likely to trip a false negative while the recent-changes rule stays visible on /stats.
# 2026-05-28 14:49 UTC: Stats live probe now exposes an explicit latest shipped item first line and accepts it in the live verifier, so the newest changelog item is visible as the first check target without relying on only the older open-first wording.
# 2026-05-27 15:40 UTC: Stats live self-check now falls back to the canonical host when the host header is missing, so the live /stats probe can still verify the recent-changes proof instead of skipping the live check in proxy-like contexts.
# 2026-05-27 05:39 UTC: Stats live page now shows an explicit open-first line for the newest shipped item under the recent-changes rule, so the first verification target is visible before older trail items.
# 2026-05-26 19:35 UTC: API Playground now exposes a live "open best endpoint" action that follows the current recommendation, so the strongest script-safe route is one click away instead of only shown in text.
# 2026-05-26 05:17 UTC: Stats live digest now makes the first live target explicit in both the opening line and the primary badge, so operators can jump to the newest shipped item faster before reading older trail entries.
# 2026-05-25 21:20 UTC: /api/connection-info now uses the shared client-IP picker before geolocation, so visitors behind proxies or CDN headers get the same real-visitor provider and location lookup as the public IP endpoints instead of being pinned to REMOTE_ADDR.
# 2026-05-26 03:16 UTC: Stats live probe now requires an explicit latest-shipped-item proof line, so the live /stats verification stays anchored to the newest changelog item instead of only trusting the route and generic recent-changes proof.
# 2026-05-26 01:16 UTC: Stats self-check fallback now keeps the rendered /stats proof active instead of letting the probe verdict overwrite it, so a healthy live dashboard can still pass when the probe body drifts but the visible recent-changes rule is intact.
# 2026-05-24 21:55 UTC: Recent-changes proof card now names the latest shipped item directly above the trail, so the live /stats page gives operators the newest verification target before older notes.
# 2026-05-24 13:45 UTC: Stats probe requests now skip the internal live self-probe during render, so the live verification path no longer stacks a second /stats fetch on top of the probe request while still keeping the visible recent-changes proof.
# 2026-05-24 12:45 UTC: Stats rendered fallback now also accepts the explicit live-route source line as proof, so a healthy /stats page is less likely to read back red when the visible route marker is the clearest signal after a probe miss.
# 2026-05-24 22:53 UTC: Stats self-check now falls back to the visible proof line plus live route source when the versioned probe body is otherwise good, so /stats stays greener through minor probe text drift while the recent-changes rule remains visible on the live page.
# 2026-05-24 07:41 UTC: Public /stats wrapper now clears file state and invalidates opcode cache before loading stats-live.php, so live deploys stop hanging onto an older compiled snapshot after a refresh.
# 2026-05-24 06:41 UTC: Stats live probe now includes an explicit live-route source line and accepts it in the self-check, so operators can confirm the canonical stats implementation backing the visible recent-changes proof without relying on the wrapper alone.
# 2026-05-23 16:35 UTC: Stats live probe now includes the canonical /stats route inside the visible proof block and accepts that line in the live self-check, so the newest shipped item proves both the rule and the exact entrypoint in one response.
# 2026-05-23 12:34 UTC: Stats live probe now exposes the canonical /stats route alongside the recent-changes proof, so the live verdict makes the exact verified entrypoint visible instead of only the proof wording.
# 2026-05-22 00:04 UTC: Stats dashboard now shows the recent-changes rule in a dedicated above-the-fold callout with live proof, so operators see the verification order immediately before reading the raw trail.
# 2026-05-22 08:20 UTC: Stats live probe bumped to v71 while still accepting the visible recent-changes proof line and the previous versioned markers, so /stats verification stays aligned with the live route without getting brittle on a token bump.
# 2026-05-22 22:26 UTC: Stats self-check now accepts the current extended live marker from stats-live.php, including the latest-focus and first-check lines, so the live verification stays aligned with the actual /stats payload instead of only the shorter older marker.
# 2026-05-23 02:26 UTC: Stats live probe bumped to v79 and the self-check now follows that marker while keeping the recent-changes proof line visible, so /stats verification stays on the newest shipped response instead of the older v76 token.
# 2026-05-20 18:51 UTC: Public status page now ranks offline and warning monitors ahead of healthy ones, so operators see the most urgent issues first instead of scanning an arbitrary database order.
# 2026-05-20 20:51 UTC: Robots sitemap validator now checks sampled live URLs from discovered urlset files and surfaces the results in a dedicated sample table, so sitemap health reflects real crawl-entry pages instead of only XML structure.
# 2026-05-21 01:52 UTC: Connection-info lookup now falls back sooner when the primary response is incomplete, so the homepage API playground can surface a usable provider/location profile more often instead of leaving partial fields behind.
# 2026-05-20 19:51 UTC: Stats live probe bumped to v61 and still keeps the visible recent-changes proof line in the same response, so the deployed /stats marker stays aligned with the live route while the proof line remains visible.
# 2026-05-21 04:52 UTC: Stats live probe bumped to v63 and still keeps the visible recent-changes proof line in the same response, so the deployed /stats marker stays aligned with the live route while the proof line remains visible.
# 2026-05-20 11:48 UTC: Stats live probe bumped to v58 and still keeps the visible recent-changes proof line in the same response, so the deployed /stats marker stays aligned with the canonical live route while the proof line remains visible.
# 2026-05-20 06:48 UTC: Stats live probe bumped to v57 and now accepts the recent v54-v56 markers in the self-check while keeping the visible recent-changes proof line, so healthy /stats deploys are less likely to fail on a token bump without losing the live proof.

# 2026-05-26 13:30 UTC: Stats live probe bumped to v89 and now adds an explicit operator action line that tells you to open the newest shipped item first before validating the live route, so the recent-changes rule is visible and actionable in the same live proof block.

# my-ip-is.com — Functionaliteiten

- 2026-05-20 03:48 UTC: SLA report now surfaces open incident count and the worst uptime target in the selected window, so operators can jump straight to the weakest live monitor instead of scanning the whole table first.
- 2026-05-20 01:48 UTC: Stats live probe bumped to v56 and still keeps the visible recent-changes proof line in the same response, so the published /stats verdict stays tied to the exact live marker without losing the proof line.
- 2026-05-19 16:48 UTC: Stats live probe bumped to v55 and keeps the visible recent-changes proof line in the same response, so the published /stats verdict and the live check stay on the exact same marker.
- 2026-05-19 08:47 UTC: Stats live probe bumped to v54 while keeping the visible recent-changes rule in the verdict, so the canonical /stats route now has a fresh live marker without losing the proof line operators use to verify the page.
- 2026-05-18 16:37 UTC: Stats live probe bumped to v49 while keeping the visible recent-changes rule in the verdict, so the canonical /stats route now has a fresh live marker without losing the proof line operators use to verify the page.
- 2026-05-18 07:37 UTC: Stats live sync now compares code and changelog against the newest shipped item instead of treating their mutual age gap as an automatic mismatch, so a healthy /stats deploy no longer gets mislabeled out of step when both files are aligned with the latest note.
- 2026-05-18 03:36 UTC: Stats self-check route-status now trusts the canonical wrapper when it is clearly pinned to stats-live.php, so a healthy live /stats proof no longer gets mislabeled stale just because the wrapper file is older than the latest changelog line.
- 2026-05-18 03:40 UTC: Stats self-check route-state now explicitly reads the wrapper marker before grading freshness, which removes the false stale verdict on the canonical /stats route while keeping the live proof requirement intact.

- 2026-05-17 07:31 UTC: Stats live probe bumped to v39 and kept aligned with the visible recent-changes rule on /stats, so deploy verification no longer trails behind the canonical live dashboard marker.

- 2026-05-16 09:31 UTC: Homepage stats CTA now sends anonymous visitors to the public status page instead of the locked stats dashboard, so the primary live link no longer dead-ends behind sign-in for first-time visitors.

- 2026-05-17 06:31 UTC: Stats live probe now returns a new v38 marker while still accepting the previous versioned responses in the self-check, so deploy verification stays aligned with the canonical live stats route and keeps the visible recent-changes rule as the proof line.
- 2026-05-16 08:31 UTC: Stats live probe now returns a new v29 marker while still accepting the previous v28-v25 responses in the self-check, so deploy verification stays aligned with the canonical live stats route and keeps the visible recent-changes rule as the proof line.
- 2026-05-16 01:33 UTC: Stats live probe now returns the new v26 marker while still accepting the previous v25 response in the self-check, so the live /stats verification stays aligned with the deployed probe and the visible recent-changes rule remains the proof line.
- 2026-05-15 21:31 UTC: Stats live proof now also accepts the exact "Rule: newest shipped item first" wording as a rendered recent-changes signal, so the /stats self-check stays green when the visible rule line is the proof instead of a looser fallback phrase.
- 2026-05-15 19:31 UTC: Stats live proof now also accepts the "Show all changes" wording as a rendered recent-changes signal, so the /stats self-check stays green even if the proof line is rephrased slightly.
- 2026-05-15 15:28 UTC: Stats self-check now shows an explicit rendered-proof badge for the recent-changes rule on /stats, so operators can confirm the live page itself exposes the proof line before trusting the verdict.

_Laatste update: 2026-05-14 03:21 UTC_

- 2026-05-14 20:27 UTC: Stats self-check v4 en de oudere self-check route kregen een vaste recent-changes fallback-structuur, zodat de live health endpoint niet meer op een ongedefinieerde variabele kan stuklopen en de deployverificatie weer betrouwbaar JSON teruggeeft.
- 2026-05-14 10:26 UTC: Stats dashboard now pins the recent-changes rule as a visible first-glance badge on /stats, so operators see the "newest shipped item first" rule immediately before reading the rest of the trail.
- 2026-05-14 08:22 UTC: Stats self-check now also verifies the rendered /stats page for the recent-changes rule, so a green verdict proves the rule is visible on the live page and not just present in source.
- 2026-05-14 04:21 UTC: Stats self-check now treats a live /stats probe plus visible recent-changes proof as synced for deploy health, so the dashboard avoids a false close state when timestamps lag slightly.
- 2026-05-14 11:26 UTC: Stats self-check probe now accepts the v22 marker as well as the previous v21/v20/v19 responses, so the live /stats verdict does not go red on a fresh probe-version bump.
- 2026-05-14 07:22 UTC: Stats probe marker bumped to v21 while the self-check still accepts the previous v20/v19 responses, reducing false negatives from a stale token during deploys.
- 2026-05-14 03:21 UTC: Stats self-check now performs a real live /stats probe with the newer v20 marker, so the dashboard verifies the actual response instead of only trusting static sync hints.
- 2026-05-13 18:21 UTC: Stats self-check toont nu ook een expliciete recent-changes zichtbaarheidssbadge in de live header, zodat de /stats proof line direct meetbaar is.
- 2026-05-13 17:21 UTC: Stats selfcheck now treats the /stats wrapper as synced when it intentionally forwards to stats-live.php, preventing a false stale route warning on the canonical dashboard entrypoint.
- 2026-05-13 13:21 UTC: Stats dashboard now shows a dedicated recent-changes visibility badge in the live self-check header, so the proof line is explicit instead of only implied.
- 2026-05-12 21:21 UTC: /api/stats-selfcheck controleert nu ook expliciet of de recent-changes regel op /stats live zichtbaar is, zodat de dashboard-verificatie de regel niet meer alleen indirect hoeft af te leiden.
- 2026-05-12 18:21 UTC: /stats selfcheck toont nu expliciet de recent-changes regel naast route sync en deploy sync, zodat de live verificatie niet meer alleen impliciet uit de nieuwste trail-item afgeleid hoeft te worden.
- 2026-05-12 20:22 UTC: /stats selfcheck behandelt de wrapper-route nu als synced zodra die expliciet naar de actieve live dashboardfile doorverwijst, zodat de live status geen valse route-gap meer meldt op de canonical stats entrypoint.

## Core
- Public IP check (IPv4/IPv6 detectie)
- Copy IP + keyboard shortcuts
- API playground op homepage
- Donker/licht thema met toggle + localStorage

## API & Agent-ready
- `/api/ip` (JSON)
- `/api/ipv4` (text)
- `/api/ipv6` (text)
- `/api/headers` (JSON)
- `openapi.yaml`
- `/.well-known/mcp.json`
- `/.well-known/ai-plugin.json`
- `/llms.txt`

## Tooling (site/tools)
- IPv4 Checker
- IPv6 Checker
- WebRTC Leak Test
- DNS Leak Check
- DNS Lookup
- Reverse DNS (PTR)
- TLS/SSL Checker
- MX Lookup
- SPF Checker
- DMARC Checker
- NS Lookup
- Port Checker
- DNS Propagation
- HTTP Headers
- Redirect Checker
- Whois Lite
- Bulk DNS Checker
- User-Agent Analyzer
- API Docs

## Stats / Logging
- Dagelijkse logging in `/log/YYYY-MM-DD.json`
- Password-protected `/stats/` dashboard

## SEO / Platform
- sitemap + robots
- structured data (WebApplication + FAQ)
- OG/Twitter metadata

---

## Nieuw toegevoegd / aangepast (changelog)

### 2026-03-06
- API docs: light mode leesbaarheid verbeterd (code/result-box contrast).
- API docs: menu gelijkgetrokken met hoofdmenu (Check/Tools/FAQ/API Docs/Stats/LLMs).
- Theme toggle iconen omgedraaid naar logische volgorde: 🌙 links, ☀️ rechts.
- Topbar/logo alignment aangescherpt (logo-height + centrering) voor nettere uitlijning.
- Light mode topbar contrast verbeterd.
- CSS cache-buster verhoogd naar `20260306-02` op homepage + API docs.
- Logo alignment fix v2: desktop topbar hoogte naar 68px, logohoogte naar 28px, brand-padding verwijderd; mobile logohoogte naar 24px.
- CSS cache-buster verhoogd naar `20260306-03` op homepage + API docs.
- Stats (`/stats/`) menu nu gelijkgetrokken met hoofdsite (Check/Tools/FAQ/API Docs/Stats/LLMs + juiste toggle-volgorde).
- Stats date-filter uitgebreid met optie **Alles** (aggregate van alle daglogs).
- Stats date-range toegevoegd (Van/Tot kalender) met aggregate over geselecteerde periode.
- Export-links (CSV/JSON) nemen nu date-range mee.
- Stats heatmap fallback toegevoegd: duidelijke melding als geolocatie-data ontbreekt.
- Stats topbar nu met hetzelfde logo als de rest van de site (consistente brand header).
- Logo render-fix: donkere modus zet logo niet meer via CSS-filter op invert (originele logo-kleuren blijven intact).
- CSS cache-buster verhoogd naar `20260306-04` (home + API docs).
- Logo-set vervangen met aangeleverde SVG's van Paul:
  - hoofdlogo -> `assets/img/logo-vector.svg`
  - schild-icoon -> `assets/img/shield-icon.svg`
  - favicon SVG -> `favicon.svg`
- Logo cache-buster toegevoegd op alle pagina's die header-logo laden: `logo-vector.svg?v=20260306-05`.
- Dark mode logo-fix: aparte donkere logo-variant toegevoegd (`assets/img/logo-vector-dark.svg`) en toegepast op home, API docs en stats.
- Header hotfix: dubbele logo-weergave opgelost met expliciete `display`-prioriteit (light/dark logo toggling met `!important`).
- Alle toolpagina's gelijkgetrokken naar volledig hoofdmenu + consistente brand header (incl. ipv4/ipv6/dns-leak/webrtc pagina's die eerder geen topbar hadden).
- Hotfix dubbele logo-weergave: dark-logo standaard inline verborgen (`style="display:none"`) zodat zelfs met oude CSS-cache nooit twee logo's tegelijk zichtbaar zijn.
- Vereenvoudigd logo-beleid (v3): overal weer één origineel hoofdlogo; geen logo-swaps meer per theme.
- Dark mode leesbaarheid opgelost met subtiele lichte badge achter het logo i.p.v. een tweede dark-logo bestand.
- Logo-size update: headerlogo vergroot naar 34px desktop / 28px mobiel (home/tools/stats), met iets hogere topbar voor nette uitlijning.
- Herstel light/dark logo-wissel zonder dubbele rendering: 1 `<img>` per header met `data-light`/`data-dark`, src-switch via theme JS (home/tools/guides/status/ai + stats).
- Logo-size verhoogd (v4): 40px desktop / 32px mobiel + hogere topbar, inclusief stats-layout.
- Extra vergroting logo (v5): 60px desktop / 44px mobiel in hoofdsite-styles.
- Extra vergroting logo (v6): 82px desktop / 56px mobiel (home/tools/stats).
- Header hoogte gecorrigeerd na feedback: terug naar compactere 92px op tools/home (logoformaat behouden).
- Mobiele hamburger-menu toegevoegd voor hoofdsite (via `app.js`) en stats (inline handler).
- Site-wide cache-bust geforceerd voor CSS/JS op alle PHP-pagina's (`style.css?v=20260306-08`, `app.js?v=20260306-08`) zodat logo/layout-wijzigingen direct zichtbaar zijn.
- Nieuwe tool: `/tools/internet-speed-test` (ping + download + upload, browser-based).
- Nieuwe API-endpoints voor speedtest:
  - `/api/speed-download.php` (download payload)
  - `/api/speed-upload.php` (upload receiver)
- `.htaccess` routes toegevoegd voor `/tools/internet-speed-test`, `/api/speed-download`, `/api/speed-upload`.
- Homepage tools-grid uitgebreid met “Internet Speed Test”.
- Speedtest UX upgrade: visuele meter (gauge) toegevoegd en testvolgorde aangepast naar: download → upload → ping.
- Speedtest timing vertraagd/verbeterd: per fase 3 rondes + minimale testduur, zodat de meter rustiger en beter zichtbaar loopt.
- Gauge schaal toegevoegd met verdeling van 0 t/m 1500 (ticks + labels).
- Speedtest uitgebreid met connection details: publiek IP, provider/ISP en locatie (best effort via ipwho.is).
- Social share toegevoegd op speedtest-resultaat (native share, X, LinkedIn en copy-text).
- Speedtest meter upgraded naar echte wijzer/naald met vloeiende uitslag.
- Testduur verlengd (grotere payloads + langere minimale fasetijd) zodat meting minder "te snel" klaar is.
- Connection details betrouwbaarder gemaakt via server-side endpoint `/api/connection-info` (IP/provider/locatie) i.p.v. browser-direct call.
- Speedtest testsize verhoogd naar zware profielen: 500 MB of 1 GB download.
- Testresultaten worden nu server-side opgeslagen via `/api/speed-result-save` in `log/speedtests-YYYY-MM-DD.jsonl`.
- Sharing gebruikt nu unieke result-URL per test (`/speedtest/result/<id>`) i.p.v. generieke speedtest-link.
- Speedtest profiel aangepast: vaste testgrootte 250 MB (geen keuze meer in UI).
- Upload/ping betrouwbaarheid verbeterd: fase-fouten blokkeren de rest niet meer (download/upload/ping lopen sequentieel door met fail-state per fase).
- Share-flow aangescherpt: share-knoppen pas actief ná opgeslagen resultaat met unieke URL; generieke fallback-link verwijderd.
- Tools-overzicht: drag-and-drop "Arrange tools" toegevoegd op homepage + lokale opslag van toolvolgorde + reset-optie.
- Mobiele reorder-fix: touch fallback toegevoegd met Up/Down knoppen per toolkaart in Arrange mode.
- Speedtest health/transparantie toegevoegd via `/api/speed-health` (node/time/tests-today).
- Speedtest history toegevoegd via `/api/speed-history` (laatste 10 tests van jouw IP).
- Rate-limit guard toegevoegd op speed endpoints (`speed-download`, `speed-upload`, `speed-result-save`).
- Speedtest resultpagina verbeterd met rijkere metadata (OG/Twitter desc + canonical per unieke result URL).
- Realtime naald verfijnd: tragere/smoother gauge-animatie + upload progress op basis van echte upload-progress events.
- SEO-content/FAQ upgrade afgerond voor `ipv6-checker` en `dns-leak-test`.
- Stats: nieuwe default grafiek toegevoegd met automatisch de laatste 7 dagen traffic trend.
- Stats: Top paths chart voorzien van duidelijke uitlegtekst.
- Stats: IP heatmap verbeterd met server-side geo-fallback + cache (`log/ip_geo_cache.json`) zodat OpenStreetMap markers ook zonder bestaande `ip_meta` data gevuld worden.
- Stats bugfix: datumselector toont nu alleen echte dagbestanden (`YYYY-MM-DD.json`) en niet meer `ip_geo_cache.json`.
- Stats 7-day chart uitgebreid met tweede lijn: `Unique IPs` naast `Total visits`.
- Stats trendgrafiek omgezet naar Google Charts line chart met interactieve mouseover tooltips.
- Stats uitgebreid met interactieve pie chart voor Top Browsers.
- Stats layout polish: Top Browsers tabel + pie chart nu netjes gecombineerd in één paneel voor rustiger overzicht.
- Stats visual polish pass: consistente heading-spacing, rustigere tabelstijl, subtiele row-hover en betere leesbaarheid in panelen.
- Stats charts uitgebreid naar Google Charts voor: Top Paths, Top Browsers (pie), Agent Classes (pie), Top LLM/Bot Signals (pie), Journey Graph en Honeypot Pressure.
- Speedtest quality update: ping nu op median + jitter + packet loss metrics; node profile endpoint toegevoegd (`/api/speed-nodes`).
- Blok 2B: nearest-node selectie toegevoegd via `/api/speed-node-select` + gedeelde node-definities (`inc/speed_nodes.php`) en automatische node-keuze in speedtest flow.
- Blok 3 start: speedtest result sharing verbeterd met dynamische OG image endpoint (`/speedtest/result-image/<id>.svg`).
- Blok 3 SEO: structured data (WebApplication + FAQ) toegevoegd op internet-speed-test pagina.
- Blok 3 afronding: SEO interne linking uitgebreid op `ipv6-checker` en `dns-leak-test`.
- Blok 3 afronding: speedtest-result UX polish met copy-share-link knop + duidelijke CTA naar eigen speedtest.
- Blok 4 start: monitoring endpoint `/api/speed-monitor` + monitorblok op speedtestpagina.
- Blok 4: history compare toegevoegd (laatste test vs vorige test) voor snellere trendinzichten.
- Blok 4 final: alert-hook toegevoegd bij monitor spikes (`log/alerts/speed-alerts-YYYY-MM-DD.jsonl`) + UI alert-indicator op speedtest monitor.
- Stats segmentatie uitgebreid: view-filters `Possible bot` en `Likely LLM/Crawler` toegevoegd naast `All` en `Human`.
- Stats heatmap upgraded met Leaflet marker clustering voor betere leesbaarheid bij veel IP-locaties.
- Toolbox uitgebreid met 8 nieuwe tools: website-pagespeed, uptime-response-checker, ip-reputation-lookup, port-range-scanner, geo-latency-estimator, dnssec-validator, tls-expiry-monitor, security-headers-score.
- Uptime checker fix: geen HEAD-only check meer; gebruikt lichte GET probe + duidelijke verdict (403 nu niet meer als “ok” geclassificeerd).
- SEO/LLM pass over 8 nieuwe tools: OG/Twitter metadata + FAQ schema + related-tools interne linking toegevoegd.
- LLM funnel update: `llms.txt` uitgebreid met alle nieuwe tool-routes en korte agent-usage context.
- Toolbox uitgebreid met nog 8 extra tools: traceroute-viewer, asn-lookup, cidr-subnet-calculator, reverse-ip-lite, robots-sitemap-validator, http2-http3-checker, email-deliverability-check, cdn-waf-detector.
- Tools UX upgrade: iconen per toolcard + extra categorie-filters (`performance`, `monitoring`) voor beter overzicht.
- Icon pass fix: volledige icoonmapping uitgebreid over alle tools + fallback per categorie i.p.v. één generieke fallback.
- Premium/Regular opzet live: toolsplit op homepage met premium badges, unlock-CTA en premium note (incl. mail-tester API roadmap verwijzing onder premium mail tool).
- Icon mapping fix v2: href normalisatie naar pathname + oude icon cleanup + cache-bust naar `app.js?v=20260306-16` op homepage.
- Project TODO toegevoegd: `my-ip-is/TODO.md` met Mail-tester premium tool roadmap.
- Premium zichtbaarheid fix: fallback-render in frontend toegevoegd zodat premium toolcards altijd zichtbaar zijn.
- Premium quick-win tools toegevoegd: bulk-security-headers-premium, tls-watchlist-premium, domain-drift-monitor-premium, mail-tester-api-premium (roadmap page).
- Premium set/filters/icon mapping uitgebreid voor nieuwe premium tools + backlog aangevuld in `my-ip-is/TODO.md`.
- Premium UX v2: aparte `/premium` plannenpagina, premium filter-chip, premium/regular counters op homepage, en unlock CTA nu gericht naar `/premium?tool=...`.
- Cache-bust homepage script naar `app.js?v=20260306-17`.
- 5 extra premium tools live gezet: email-auth-audit-premium, multi-port-monitor-premium, bulk-dns-propagation-premium, response-waterfall-lite-premium, dnsbl-ip-check-premium.
- Routes, icon mapping, premium set en llms-index bijgewerkt voor deze 5 tools.
- Stripe voorbereiding toegevoegd: `STRIPE_SETUP.md`, `site/inc/stripe-config.example.php`, API endpoints voor checkout/portal/webhook, en `/premium` knoppen die checkout starten zodra config staat.
- Legal/compliance update: nieuwe pagina's `/cookie-policy` en `/privacy` toegevoegd + links in footer.
- Bedrijfsvermelding toegevoegd op site: `pk Holding B.V. - Mgr. van de Weteringstraat 1 1211GG - Hilversum - NL850613735B01 - KvK: 52822125`.
- Cookie consent popup toegevoegd (akkoord / alleen noodzakelijk) met link naar `/cookie-policy`.
- Cache-bust voor cookie/privacy/home/premium naar `style.css/app.js?v=20260306-18`.
- Legal cleanup: bedrijfsnaam gecorrigeerd naar **PK Holding B.V.** en full bedrijfsgegevens verplaatst naar nieuwe `/legal` pagina.
- Footer opgeschoond (links naar Cookie Policy / Privacy / Legal i.p.v. volledige adresregel in footer).
- Stripe config pad gefixt: `inc/stripe-config.php` is nu op live aanwezig (met ingevulde price IDs voor Pro/Team; keys nog veilig te vervangen via secure sessie).
- Conversion target (1% paid) vastgelegd met uitvoerplan in `CONVERSION_SPRINT.md` + TODO-updates voor instrumentatie, funnel endpoint, paywall prompts en A/B tests.
- Conversion tracking fase 1 live: `/api/conv-event` + `/api/conv-funnel` toegevoegd en premium CTA flow gekoppeld aan events (view/click/checkout_created/failed).
- Stripe webhook spiegelt nu `checkout_completed`/`checkout_failed` naar conversion logs voor funnel reporting.
- Tracking hardening: `inc/track.php` beschermt nu tegen silent reset bij JSON parse-fouten en schrijft atomisch (`.tmp` + rename) om dataverlies in daglogs te voorkomen.
- Extra stats-guardrails: hourly backup snapshots van daglogs (`/log/backups/YYYY-MM-DD-HH.json`) en nieuwe health endpoint `/api/stats-selfcheck`.
- Fix: `website-pagespeed` breekt niet meer bij PSI quota/API errors; tool toont nu Lite fallback audit (TTFB/total/bytes) + duidelijke notice i.p.v. hard failure.
- Premium labeling split live: `Premium Ready` vs `Premium Beta` badges op homepage tools, met duidelijke beta-note en aangepaste CTA.
- Premium sectiecopy aangescherpt en cache-bust homepage JS naar `app.js?v=20260306-19`.
- Webapp fase 2 start live: MariaDB-config + schema bootstrap + magic-link auth endpoints (`/api/auth-magic-request`, `/auth/verify`) en app shell op `/app`.
- Magic-link mailer aangesloten op SMTP (`mail.my-ip-is.com:587`, STARTTLS) met `noreply@my-ip-is.com`; auth request endpoint stuurt nu echte e-mail i.p.v. dev-link output.
- `/app` uitgebreid met werkende fase-2 kern: ingelogde users kunnen nu Projects en Monitors aanmaken en direct beheren/lijsten vanuit MariaDB.
- Mobile menu fix: hamburger toggle werkte niet wanneer knop al server-side aanwezig was; JS bindt nu altijd click/close handlers.
- Cache-bust voor app.js naar `v=20260306-20` uitgerold over sitepagina's.
- PWA install basis toegevoegd: service worker (`/sw.js`) + install-prompt op `/app` via `beforeinstallprompt`.
- Webmanifest geüpdatet voor app-start op `/app` en sitewide cache-bust naar `style/app v=20260306-21`.
- Uptime monitor runner toegevoegd: `/api/monitor-runner` verwerkt actieve `uptime` monitors, bewaart state in monitor-config JSON en schrijft offline/recovery alerts naar app-notifications.
- `/app` toont nu monitor state/last-check + Alerts & notifications feed.
- Interval policy live gezet: **free monitors elke 3 uur (180 min)**, **premium monitors elke 1 minuut** (op basis van actieve subscription plan pro/team).
- PWA conversion tracking toegevoegd: install prompt shown/click/completed/fallback events gaan nu naar `/api/conv-event` en zijn zichtbaar via funnel-data.
- `/app` update: knop `Test push in app` toegevoegd met permissieflow en directe browser-notificatie test voor ingelogde gebruiker.
- Premium push upgrade: web push subscription flow toegevoegd (`Enable downtime push`), backend endpoints `/api/push-subscribe` + `/api/push-test`, service worker push handler, en monitor runner probeert nu push te versturen bij offline/recovery alerts.
- Push troubleshooting/hardening: uitgebreide push logs (`/log/push/*.jsonl`), endpoint logging (`push-subscribe`, `push-test`), gedetailleerde push-result codes, en per-monitor push aan/uit toggle in `/app`.
- Session Diagnostics verplaatst naar inklapbare `Advanced` sectie om homepage rustiger te maken.
- Stats mobile cleanup: form-controls full-width, chart heights geharmoniseerd, tabellen horizontaal scrollbaar en nested grids op 1 kolom.
- Nieuwe toolbox tool: `/tools/ip-location-lookup` (IPv4/IPv6 geolocatie + ISP/ASN details).

---

## Werkafspraak
- Bij elke nieuwe wijziging in my-ip-is: deze file updaten met **wat nieuw is toegevoegd/gewijzigd**.

### 2026-05-10
- Stats health sync: live probe marker and public wrapper refreshed together so the dashboard self-check can stay green again.
- Homepage API Playground: `/api/connection-info` toont nu expliciet IP-versie, fallbackgebruik, lookup-latency en lookup-notes; de samenvatting verlaagt trust wanneer fallbackdata nodig was.

### 2026-05-13
- Homepage API Playground: connection profile toont nu live badges voor source, confidence en fallback naast de bestaande uitleg, zodat fallback-lookup direct zichtbaar is zonder eerst de ruwe payload te lezen.
- Stats dashboard: recent-changes heeft nu een expliciete eerste-open-link bovenaan de read-only kaart, zodat de nieuwste shipped item direct als eerste live target zichtbaar is.
# 2026-05-14 06:27 UTC: Mail-tester premium compare flow now auto-selects the latest previous same-domain report, so the delta shows up immediately without an extra compare click.
# 2026-05-14 03:21 UTC: Stats self-check now performs a real live /stats probe with the newer v20 marker, so the dashboard verifies the actual response instead of only trusting static sync hints.
# 2026-05-22 09:20 UTC: Stats live probe bumped to v72 and keeps the visible recent-changes proof line in the same response, so the deployed /stats verification stays aligned with the live route while the proof line remains explicit.
# 2026-05-22 21:26 UTC: Stats live probe bumped to v78 and keeps the visible recent-changes proof line in the same response, so the deployed /stats verification stays aligned with the live route while the proof line remains explicit.
# 2026-05-24 09:44 UTC: Stats self-check now accepts the rendered /stats page as a fallback proof when the probe response misses, so transient live probe failures no longer turn a healthy dashboard red while the visible recent-changes rule still proves the page.
# 2026-05-24 19:53 UTC: Stats live probe now adds an explicit public-route proof line alongside the recent-changes proof, so live verification can confirm the response came from the canonical /stats route instead of only trusting the version marker.
# 2026-05-25 03:54 UTC: Stats probe response now adds an explicit live proof line tying the version token, recent-changes rule, latest shipped item, and route source together, so /stats verification is easier to trust when you check the live probe first.
# 2026-05-27 02:39 UTC: Stats live self-check now runs for real on the /stats page instead of staying disabled behind a hardcoded false guard, so the live dashboard can verify its own canonical route and recent-changes proof on every normal render.
- 2026-05-29 20:12 UTC: Stats self-check now also recognizes the explicit latest shipped item line as valid recent-changes proof, so minor wording changes in the live dashboard keep the recent-changes rule visible without tripping a false red check.
- 2026-05-29 22:12 UTC: Stats probe and rendered self-check now also accept the explicit latest shipped item target line, so the live recent-changes proof survives small wording drift without forcing a false alarm.
# 2026-05-30 03:13 UTC: Homepage API Playground now adds a clearer fallback advisory for weak connection profiles, so operators are steered back to /api/ip for automation when the richer lookup is only best-effort.
- 2026-05-30 15:15 UTC: Stats live self-check now probes the canonical HTTPS /stats route directly, so live verification is less sensitive to mixed-scheme or proxy-host drift while the recent-changes proof stays visible.
# 2026-05-30 18:24 UTC: Stats live proof line now echoes the recent-changes rule in a stricter visible-proof format and the self-check accepts that exact live marker, so /stats verification has a harder proof signal without changing the dashboard workflow.
- Surface: stats dashboard, Improvement: the most active surface card now opens the resolved live target directly when a route can be derived, so the highest-signal page is one click away from the trail summary, Impact: operators can jump from the stats overview to the page that deserves verification fastest instead of retyping or copying the surface name first.
# 2026-06-03 02:51 UTC: Public status page now shows a live stats health block from the self-check endpoint, so operators can confirm the recent-changes rule and route state without opening deep stats first.
# 2026-06-09 04:55 UTC: The IPv4 and IPv6 API endpoints now return a clear 404 with a short not-detected message when the current connection uses the other family, so scripts no longer have to guess from an empty 200 response which makes the IP API easier to trust.
