- Shipped
- September 17, 2026 at 1:04 AM UTC
- Author
- Kamo
- Commit
- f42d1fa
A view counter now sits at the foot of every page, in the footer's bottom row beside Sitemap and Back to top: an eye whose iris is the site's hexagon, and the figure on odometer reels in the reader's own digits (Bengali's, Arabic's, Hindi's grouping). The first time the pill is on screen the reels spin into place from the left, and when this visit was the one just counted the last reel turns over by one as a +1 rises off it. Hover or keyboard focus opens a card with the figure and what it measures; a tap opens it on touch; a click spins the reels again. Reduced motion gets the figure and the card, and nothing that travels. It costs page load nothing: - Nothing about a view is read while a page renders. Every route is still prerendered (check-static-routes: 247, sentinels intact); the HTML carries a sized placeholder, so the swap does not move the row. - The count is one POST through the shared idle queue, after the page has loaded, and it counts and answers in the same request. A reader who leaves before the idle slot still counts: pagehide and in-site navigation send a beacon for an unsent view. - The reels, their motion and their stylesheet are a separate chunk, fetched only when the footer comes within 800px of the screen. - "No figure" answers 200 with views null, never 404 or 503, so a KBService restart cannot put a console error on every page. Where a view counts **************** a knowledge-base article counts on the article, by guid, so the figure is part of the article's data in KBService and follows it through renames and moves; every other page counts on its path without the locale, so /en/pricing and /fr/pricing share one figure. A path only counts if this site would serve it: the route exists and its slug names a real competitor, glossary term, service, blog post, published article (at its canonical path) or changelog entry. Crawlers, link unfurlers, audits and webdriver are shown the figure without adding to it, and the same browser sending the same page twice inside five seconds is one view. Each counter starts from a figure drawn between 312,384 and 1,200,384 when its row is created, placed by the page's sitemap priority so the homepage starts high and a changelog entry low. The sitemap's inline priorities moved into SITEMAP_PRIORITY so both read one list; kb-sections.ts replaces the two copies of the KB_SECTIONS check the counter would otherwise have made three. The footer's bottom row stacks the made-in mark under the copyright line: with the counter added, the three side by side no longer fit at 1440px. check-page-views.ts (prebuild and test) fails the build when a dynamic route is not in routes.ts, when a layout or the Footer stops mounting the counter, or when anything but its route handler imports the resolver. Proved by deleting a route entry, the Footer mount and inventing a stale entry: each fails. Needs KBService 167981e (the /internal/page-views endpoints) and the dictionary's footer.pageViews* keys (5909948c); until KBService is live the pill simply does not appear.