Changelog

What's new

New features, improvements and important fixes – ordered by release.

September 2026

New homepage hero

Improved

  • The homepage now says what it does: the heading names the action instead of the positioning, and the input field is the largest element on screen instead of a field off to the side
  • The button reads "Analyse website" and names its object — it previously just said "Check now"
  • The measurement location is now visible below the field, and one line answers the three questions people have before their first scan: how long, sign-in, cost
  • The daily-limit notice for guests only appears once the limit is reached, instead of sitting as a box above the form
  • The result preview in the hero now shows the scan's open findings next to the score — proving what the homepage promises instead of merely claiming it

August 2026

Connect the MCP server via OAuth

New

  • turbometrics can now be connected in Claude and ChatGPT with nothing but the server URL — sign-in and approval run through turbometrics, no API token needed any more
  • In Claude Code, claude mcp add --transport http turbometrics https://turbometrics.io/mcp is enough; the browser handles the sign-in
  • Connected apps are listed under Profile → API & apps and can be revoked there at any time — revoking cuts off access immediately
  • Your own applications can now connect via OAuth too: the user clicks Allow once, never copies a token, and access covers the whole REST API — details in the API documentation

Improved

  • The mcp-remote route with an API token remains available for clients without OAuth support
  • The approval dialog now names the address you will be sent to after allowing — an app's name is freely chosen, its destination is not

A link to the report straight from the API and MCP

Improved

  • REST API: GET /api/v1/scans and GET /api/v1/scans/{id} now return report_url — the ready-made link to the report that previously had to be assembled from the public_id
  • MCP server: get_latest_scan, list_scans and compare_domains return the link as well, so AI assistants can link to the report directly
  • The link points into the web interface and, for private scans, only works for the signed-in owner — to pass a report on to someone else, share_url remains the way to do it

Passkey sign-in now sticks

Fixes

  • Signing in with a passkey logged you out again after a short while — the "Stay logged in" option visually belonged to the password form and was hardly ever ticked on the passkey path
  • The passkey section now has its own "Stay logged in" option, selected by default

Alert titles appear in the language you selected

Fixes

  • Part of the alert list in the English weekly report was still in German — score drop, HTTP status, TBT and LCP were affected, as were the automatic live data alerts
  • Older alerts created before the language switch now show their title in the selected language as well

Alerts page now defaults to all open alerts

Improved

  • The alerts page now opens in the "Open" view, showing the same alerts the dashboard reports as open — including ones you have already read
  • The previous "New" view remains its own entry in the status filter and still shows unread alerts only

Fixes

  • An alert that had been read but not yet resolved disappeared from the alerts list even though the dashboard still counted it as open

Emails, reports and exports in the recipient's language

New

  • All emails — alert notifications, the weekly report, welcome and billing emails — are sent in the language set in your profile
  • PDF reports follow the same setting, including date and number formatting
  • CSV and Excel exports (scan detail, My scans, domain history, live data) use column headings and status labels in the selected language

Improved

  • Times in emails and reports use the time zone stored in your profile — regardless of where and when they are technically sent
  • Date, number and percentage formats follow the conventions of each language (e.g. 12 Aug 2026 rather than 12.08.2026)
  • The live data export uses the comma separator customary in English, so the file lands in columns without any rework

turbometrics now runs at turbometrics.io

New

  • New primary domain turbometrics.io — in preparation for the English-language version of the app

Improved

  • All previous addresses under turbometrics.de now redirect permanently to the new domain — links and bookmarks remain valid
  • The live data script and score badges on embedded websites continue to be served unchanged from the old domain and do not need to be updated
  • Status pages with a custom domain keep their existing CNAME target — nothing needs to change in your DNS
  • The "High JavaScript weight" notice now lists which files it counted
  • Values taken from the HTML source and values measured in the browser are now labelled as such on the scan page — previously both stood side by side without comment
  • If the browser loads considerably less JavaScript than the source declares, for example because scripts are deferred, the scan page now says so
  • Large scripts whose address carries no file extension, such as the Google Maps API, are now named by host and path instead of just "js"

Fixes

  • Error pages: the 404 and 503 pages now determine their own language. They are created before language detection runs and were therefore served in the default language
  • Monitoring status: a scheduled scan that has never run is now shown as "Not scanned yet" instead of "Healthy". This affected the domain overview and the summary badge of grouped URLs — the latter also reported "All healthy" for overdue targets
  • Visual regression: when an image comparison fails technically and no measurement is available at all, an open alert is no longer incorrectly marked as "resolved", and the baseline is no longer advanced to the changed state
  • JavaScript weight: scripts whose address contains numeric HTML entities in the source (the normal case for WordPress with several parameters) were counted twice — the reported JS weight and its score penalty were too high. The value is measured correctly from the next scan onwards; already stored scans keep their old figures
  • REST API: if starting a scan fails for an internal reason, POST /api/v1/scans no longer returns the internal error text. It now answers with HTTP 500 and a fixed message instead of 422; the cause is written to the server log. Requests rejected because of the URL, the rate limit or the plan are unchanged and keep returning 422 or 429
  • Billing: checkout, the customer portal and the invoices and receipts sent by Stripe now follow the language set in your account. Checkout previously followed the browser language, and invoices were always German regardless
  • The domain change ended all sessions; a one-time re-login is required. Stored passkeys are bound to the old domain and need to be set up again once

July 2026

Visual regression detection for scheduled scans

New

  • Visual regression detection: turbometrics now automatically detects when a page's appearance changes significantly (e.g. due to broken CSS) and can optionally trigger an alert per scan
  • New alert thresholds configurable separately for desktop and mobile, in both automatic and custom mode
  • Score badge: display the performance score of a monitored domain via an embeddable SVG badge on your own website — with a public verification page

Improved

  • For deliberate design changes, the current state can be adopted directly from the alert as a new baseline, instead of continuing to raise alarms
  • REST API: filmstrip URLs (sequence of load-process screenshots) for desktop and mobile are now part of the scan response under screenshots.filmstrip
  • REST API: screenshots.filmstrip_frames additionally provides a timestamp and load event (FCP/LCP/Load/Done) for each filmstrip frame
  • CDN detection: the CDN provider in use (e.g. Cloudflare, Fastly, Akamai) is now identified by name instead of just yes/no — on the detail page and in the REST API under preflight.cdn
  • Browser caching is now measured on static assets (CSS, JS, images, fonts) instead of on the HTML document's Cache-Control — this assesses a real repeat visit far more accurately
  • Image formats: the "WebP/AVIF" tile now states the reference figure ("18 of 31 image files") instead of just a bare number
  • Image types now indicate that count and size are based on a sample of the images actually loaded ("Sample: 6 of 59 images") — previously the list looked incomplete

Fixes

  • "My scans": the filters for status (completed/running/failed), visibility and region had no effect — the selection didn't change the list. The filters now apply server-side across the entire scan history instead of just the displayed page, persist while paging, and can be combined
  • The "Nuremberg" region could be selected in "My scans" and on the domain detail page, but was ignored and continued to show all regions
  • "My scans": the Excel and CSV export ignored the active filter selection and always contained all scans. Both exports now respect status, visibility, region and search term — including scans without measurements when the status "Running" or "Failed" is selected
  • Domain detail page: the screenshot in the top right now shows the domain's homepage, provided a scan exists for it — previously it was the most recently scanned match for the domain, often a subpage. The URL actually shown is now also stated below the screenshot
  • Domain detail page: "Most important target" was shown even when all scheduled scans were healthy — in that case it simply showed the most recently created target. The row now only appears for a target with a problem status, selecting by severity and, in case of a tie, the homepage
  • Filmstrip frames (detail page and REST API) are now reliably displayed in chronological order — depending on the page, the LCP frame could previously appear at the wrong position in the timeline
  • Server detection: behind a CDN, the CDN name was incorrectly reported as the server (e.g. "cloudflare" instead of "LiteSpeed"). The detail page now shows the real origin server — and "Unknown" when it cannot be determined reliably. In the REST API, preflight.server likewise returns the origin server; if it cannot be determined, the field is omitted instead of reporting an incorrect value
  • Lazy-loading images: under the heading showing the number of images loaded via lazy loading, a list of all images on the page was shown. The list now shows exactly the images the number refers to
  • Lazy-loading images were counted multiple times when an image carried several lazy markers — this made the reported count noticeably too high
  • CDN detection incorrectly reported an upstream CDN for servers with their own cache (e.g. LiteSpeed). If none is present, it now shows "None detected"; if one is detectable but the provider can't be determined, "Detected"

April 2026

Domain comparison, custom domain for status pages, live data (RUM) & more

New: domain comparison

Compare the performance of two websites directly: score, categories, metrics and filmstrip side by side. Scans are triggered automatically and run from the same region. Go to comparison →

New: status page custom domain

Show your public status page under your own domain — e.g. status.mycompany.com. The CNAME and TXT record are shown directly in the domain settings, including copy buttons and automatic DNS verification. Go to the guide →

New: live data — real user measurements straight from the browser

Measure Core Web Vitals (LCP, CLS, INP, FCP, TTFB) from real visitors — one snippet, all metrics. With dashboard, alerts and API.

New

  • Domain comparison: compare two domains directly — score, categories, metrics and desktop filmstrip side by side
  • Domain comparison: automatic scan triggering from the same region for a fair result
  • Domain comparison: publicly shareable comparison URLs
  • "Compare domain" button on the scan detail page
  • Status page custom domain: make your status page reachable under your own domain (e.g. status.mycompany.com) — CNAME and TXT record in the domain settings, automatic DNS verification via Cloudflare
  • Demo mode: try turbometrics directly – a pre-filled demo account with 5 domains, realistic scan history, alerts and live data, no registration required
  • Live data (RUM): measure Core Web Vitals from real visitors – one JavaScript snippet, p75 values, trend chart and device/country breakdown
  • Live data dashboard: daily p75 trend, CWV rating (passed/not passed), slowest pages, breakdown by device and country
  • Live data alert rules: get notified automatically by email or webhook on threshold breaches (p75) – with a configurable window, minimum measurements and consecutive checks
  • Live data auto-alerts: automatic monitoring of all Core Web Vitals using Google's recommendations as thresholds
  • Live data API: retrieve sites, metrics, chart data and alerts via the REST API
  • Webhook events for live data: rum.alert.triggered and rum.alert.resolved configurable in the notification settings
  • Dashboard: a central overview of all monitored domains, alerts and live data at a glance
  • Weekly email report: a weekly summary with scan monitoring, live data and alerts – delivery day and content configurable
  • Scan authentication: scan protected pages using HTTP Basic Auth or a custom HTTP header (staging, password-protected areas)
  • API: Basic Auth and header auth also usable via the REST API
  • Bookmarklet: scan any website with one click directly from your browser – install via drag and drop
  • Scan history on the report: chart with score trend, back/forward navigation, and open comparison
  • Webhook authentication header: configure your own auth header for webhook receivers
  • Bulk scans on the domain overview: scan multiple URLs of a domain at once
  • Passkey sign-in (WebAuthn): sign in with a fingerprint, facial recognition or device PIN — no password required. Set it up under Account → Security
  • OAuth sign-in: log in and register via Google or GitHub — no separate password required. Existing accounts are linked automatically.
  • DPA page: data processing agreement pursuant to Art. 28 GDPR for live data users, available under /dpa
  • /live-data: new public landing page explaining Real User Monitoring, metrics and GDPR
  • FAQ: search function with highlighting, 12 new questions about live data and RUM
  • MCP server: connect turbometrics directly to Claude Desktop and other AI tools – query scans, alerts and live data in natural language, no copy-paste required

Improved

  • Frame timeline (filmstrip) on the scan report: visual load progress as a sequence of screenshots with time markers for FCP, LCP, Load and Done – separate for desktop and mobile, switchable via tab
  • AI-powered recommendations: opening the Recommendations tab automatically generates individual action recommendations based on the scan results
  • System status (/status): the overall status now factors in queue depth and scan success rate – not just worker availability
  • System status (/status): compact number formatting (~249k, ~1.2M) for scan and RUM counters
  • System status page extended with live data metrics: events today, average LCP and a 30-day bar
  • The notifications page now also shows live data alert deliveries with a metric badge and threshold
  • Alert search now also finds live data alerts by domain
  • Alert emails now link directly to the matching source filter (scans or live data)
  • Webhook documentation extended with live data events and payload structure
  • Webhook delivery: a maximum of 10 attempts on failure, after which it gives up automatically instead of looping indefinitely
  • Automatic cleanup of old live data events according to the plan's retention period
  • Docs navigation: sticky sidebar, accordion groups and full-text search
  • All docs pages reworked – new pages for scan authentication, PDF reports, CSV/Excel export, status page, comparison and more
  • Pagination on all views with sliding-window page numbers
  • Collapsible cards on scan targets, domain detail and comparison

March 2026

REST API, request waterfall, new region & UI overhaul

New

  • REST API: token-based access to scans, domains, alerts and account data (Laravel Sanctum)
  • New scan region: Nuremberg (de-nbg1)
  • Request waterfall in the developer tab: all resources with timing and type at a glance
  • Long tasks section: JavaScript blocking visualised
  • DOM size, blocking scripts, images without dimensions and resource breakdown in the developer tab
  • Recovery notifications: email and webhook when an alert resolves itself
  • scan.completed webhook event: can be triggered on every completed scheduled scan
  • Delivery status badges in the alert history: Pending, Delivered, Failed, with tooltip
  • TurboMetricsBot info page at /bot: user agent, IP addresses and behaviour

Improved

  • PDF report extended: score gauge, colour-coded figures, resource breakdown, side-by-side screenshots, top problems
  • Domain detail completely reworked: chart, screenshot preview, search field, TBT delta
  • My scans and My domains: more compact layout, dropdown filters, score badges, clickable rows
  • Scheduled scans: condensed form, icon buttons, dropdown filters
  • Top 100 page redesigned as a leaderboard
  • Scoring page: new tiles for frontend and fonts, visually reworked
  • JSON export extended with TBT, long tasks, navigation timing, page structure and asset weights
  • Score thresholds unified (90/75/60) consistently across all views

turbometrics has gone live

March 2026 – the official launch. Thanks for being here.