Index: src/services/StatsService.js
===================================================================
--- src/services/StatsService.js	(revision 1794facfb2038892f72a7971dc25ad2d2e1faef5)
+++ src/services/StatsService.js	(revision bb82e7f535924ac5fd2cb71fd321257132f8b64d)
@@ -45,4 +45,13 @@
 }
 
+// Bekende bots/crawlers + link-preview-fetchers + scripts overslaan, zodat ze de
+// weergaven/bezoeker-dagen niet opblazen. Geen UA = vrijwel altijd geautomatiseerd.
+const BOT_RE = /bot|crawl|spider|slurp|mediapartners|bingpreview|facebookexternalhit|whatsapp|telegram|discord|twitter|linkedin|embedly|pinterest|redditbot|applebot|petalbot|yandex|baidu|duckduckbot|semrush|ahrefs|mj12|dotbot|uptimerobot|pingdom|statuscake|headless|lighthouse|gptbot|claude|ccbot|perplexity|bytespider|amazonbot|googleother|google-read-aloud|python-requests|scrapy|curl|wget|axios|node-fetch|go-http|java\/|okhttp|libwww|httpclient/i;
+function isBot(req) {
+  const ua = (req && req.headers && req.headers['user-agent']) || '';
+  if (!ua) return true;          // lege UA = script/bot
+  return BOT_RE.test(ua);
+}
+
 // Lazy prepares — tabellen bestaan pas ná initializeDatabase(); dit module wordt
 // geïmporteerd vóór die call.
@@ -81,5 +90,5 @@
 
 export function recordPageview(siteId, req) {
-  if (!siteId || isOperator(req)) return;
+  if (!siteId || isOperator(req) || isBot(req)) return;
   try {
     const d = today();
@@ -91,5 +100,5 @@
 
 export function recordPostView(post, req) {
-  if (!post || !post.id || isOperator(req)) return;
+  if (!post || !post.id || isOperator(req) || isBot(req)) return;
   try {
     stmts().bumpPost.run(post.id);
