{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-06-18-stats-store-privacy-first-sparkle-analytics/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "![](https://steipete.me/assets/img/2025/stats-store/hero.png)\n\n**tl;dr**: I built a [free, open source analytics backend](https://stats.store) for Sparkle because all existing solutions are ancient, and I wanted to know how many people use [VibeTunnel](https://vibetunnel.sh) without being creepy about it.\n\nI’m philosophically against deep app analytics. Everything I make is open source and free, and integrating an analytics SDK just didn’t feel right. Sparkle has this neat little [system profiling](https://sparkle-project.org/documentation/system-profiling/) feature that’s perfect for people like me - it just tells you the macOS version and how many people opened your app this week. No IP addresses, no invasive tracking, just enough to stay motivated.\n\nThe problem? When I checked for backend implementations, [everything was ancient](https://sparkle-project.org/documentation/system-profiling/). So naturally, I thought: “How hard can it be?”\n\n## Building stats.store with agents\n\nI fired up [Google’s AI Studio](https://aistudio.google.com/) and wrote a simple spec (you can see it on [GitHub](https://github.com/steipete/stats-store/tree/main/docs/spec.md)). Then I fed it into [v0](https://v0.dev) - they use Next.js, Supabase, Tailwind, and [shadcn/ui](https://ui.shadcn.com/), a stack I already know and love.\n\nAfter about five or six rounds of typing “continue” into v0, I had something workable. But v0 is great for frontend, less so when things get complex. It started making mistakes it couldn’t fix. So I [synced to GitHub](https://github.com/steipete/stats-store) and let [Claude Code](https://steipete.me/posts/2025/claude-code-is-my-computer/) take over. Claude added tests, dark mode, improved the design, and fixed the API flow.\n\nTotal time? Six hours. All while working on the next VibeTunnel release. Plus an hour picking the perfect domain (I really like stats.store).\n\n## What is stats.store?\n\nIt’s exactly what I needed: a modern, privacy-first analytics backend for Sparkle. You get basic update statistics, macOS version distribution, and a clean dashboard - all while respecting user privacy.\n\n**What gets collected:**\n\n- **System info:** macOS version, CPU type (Intel/Apple Silicon), Mac model, core count, RAM, system language\n- **App usage:** Version numbers, update timestamps, daily unique users (via salted IP hashes)\n\n**What doesn’t get collected:**\n\n- No IP addresses, names, or emails\n- No usage patterns or behavior tracking\n- No location data beyond language preference\n- No device IDs or fingerprinting\n\nEverything is designed to answer simple questions: How many people use my app? What macOS versions should I support? When do people actually update? The whole thing is [open source and MIT-licensed](https://github.com/steipete/stats-store).\n\n## Free for Open Source\n\nHere’s the deal: if you’re building open source Mac apps, it’s completely free. I’ll cover the hosting (Vercel and Supabase make this pretty cheap anyway).\n\nWant in? Just [email me](mailto:peter@steipete.me). I’ll add your app to the backend - and by backend, I mean I’ll literally go into Supabase and edit the table. We’re keeping it scrappy. All you have to do is [redirect the appcast URLs](https://github.com/steipete/stats-store#how-it-works-), stats.store will fetch the correct one and pass them along.\n\nIf enough people join, we’ll have a nice community dataset showing how fast Mac users update their OS and what hardware they’re running. Could be interesting!\n\n## Try It\n\nCheck out [stats.store](https://stats.store). If you have a Sparkle-based Mac app and want simple, privacy-respecting analytics, let me know. Together we can build something useful for the Mac developer community.\n\n*Questions? Hit me up on [Twitter](https://twitter.com/steipete) or [email](mailto:peter@steipete.me).*\n",
  "authors": [],
  "captured_at": "2026-09-27T19:29:15.293681927+00:00",
  "category": "programming",
  "content_html": "<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://steipete.me/assets/img/2025/stats-store/hero.png\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p><strong>tl;dr</strong>: I built a <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://stats.store\">free, open source analytics backend</a> for Sparkle because all existing solutions are ancient, and I wanted to know how many people use <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://vibetunnel.sh\">VibeTunnel</a> without being creepy about it.</p>\n<p>I’m philosophically against deep app analytics. Everything I make is open source and free, and integrating an analytics SDK just didn’t feel right. Sparkle has this neat little <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://sparkle-project.org/documentation/system-profiling/\">system profiling</a> feature that’s perfect for people like me - it just tells you the macOS version and how many people opened your app this week. No IP addresses, no invasive tracking, just enough to stay motivated.</p>\n<p>The problem? When I checked for backend implementations, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://sparkle-project.org/documentation/system-profiling/\">everything was ancient</a>. So naturally, I thought: “How hard can it be?”</p>\n<h2>Building stats.store with agents</h2>\n<p>I fired up <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://aistudio.google.com/\">Google’s AI Studio</a> and wrote a simple spec (you can see it on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/steipete/stats-store/tree/main/docs/spec.md\">GitHub</a>). Then I fed it into <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://v0.dev\">v0</a> - they use Next.js, Supabase, Tailwind, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://ui.shadcn.com/\">shadcn/ui</a>, a stack I already know and love.</p>\n<p>After about five or six rounds of typing “continue” into v0, I had something workable. But v0 is great for frontend, less so when things get complex. It started making mistakes it couldn’t fix. So I <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/steipete/stats-store\">synced to GitHub</a> and let <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://steipete.me/posts/2025/claude-code-is-my-computer/\">Claude Code</a> take over. Claude added tests, dark mode, improved the design, and fixed the API flow.</p>\n<p>Total time? Six hours. All while working on the next VibeTunnel release. Plus an hour picking the perfect domain (I really like stats.store).</p>\n<h2>What is stats.store?</h2>\n<p>It’s exactly what I needed: a modern, privacy-first analytics backend for Sparkle. You get basic update statistics, macOS version distribution, and a clean dashboard - all while respecting user privacy.</p>\n<p><strong>What gets collected:</strong></p>\n<ul>\n<li><strong>System info:</strong> macOS version, CPU type (Intel/Apple Silicon), Mac model, core count, RAM, system language</li>\n<li><strong>App usage:</strong> Version numbers, update timestamps, daily unique users (via salted IP hashes)</li>\n</ul>\n<p><strong>What doesn’t get collected:</strong></p>\n<ul>\n<li>No IP addresses, names, or emails</li>\n<li>No usage patterns or behavior tracking</li>\n<li>No location data beyond language preference</li>\n<li>No device IDs or fingerprinting</li>\n</ul>\n<p>Everything is designed to answer simple questions: How many people use my app? What macOS versions should I support? When do people actually update? The whole thing is <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/steipete/stats-store\">open source and MIT-licensed</a>.</p>\n<h2>Free for Open Source</h2>\n<p>Here’s the deal: if you’re building open source Mac apps, it’s completely free. I’ll cover the hosting (Vercel and Supabase make this pretty cheap anyway).</p>\n<p>Want in? Just <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"mailto:peter@steipete.me\">email me</a>. I’ll add your app to the backend - and by backend, I mean I’ll literally go into Supabase and edit the table. We’re keeping it scrappy. All you have to do is <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/steipete/stats-store#how-it-works-\">redirect the appcast URLs</a>, stats.store will fetch the correct one and pass them along.</p>\n<p>If enough people join, we’ll have a nice community dataset showing how fast Mac users update their OS and what hardware they’re running. Could be interesting!</p>\n<h2>Try It</h2>\n<p>Check out <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://stats.store\">stats.store</a>. If you have a Sparkle-based Mac app and want simple, privacy-respecting analytics, let me know. Together we can build something useful for the Mac developer community.</p>\n<p><em>Questions? Hit me up on <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://twitter.com/steipete\">Twitter</a> or <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"mailto:peter@steipete.me\">email</a>.</em></p>\n",
  "content_markdown": "![](https://steipete.me/assets/img/2025/stats-store/hero.png)\n\n**tl;dr**: I built a [free, open source analytics backend](https://stats.store) for Sparkle because all existing solutions are ancient, and I wanted to know how many people use [VibeTunnel](https://vibetunnel.sh) without being creepy about it.\n\nI’m philosophically against deep app analytics. Everything I make is open source and free, and integrating an analytics SDK just didn’t feel right. Sparkle has this neat little [system profiling](https://sparkle-project.org/documentation/system-profiling/) feature that’s perfect for people like me - it just tells you the macOS version and how many people opened your app this week. No IP addresses, no invasive tracking, just enough to stay motivated.\n\nThe problem? When I checked for backend implementations, [everything was ancient](https://sparkle-project.org/documentation/system-profiling/). So naturally, I thought: “How hard can it be?”\n\n## Building stats.store with agents\n\nI fired up [Google’s AI Studio](https://aistudio.google.com/) and wrote a simple spec (you can see it on [GitHub](https://github.com/steipete/stats-store/tree/main/docs/spec.md)). Then I fed it into [v0](https://v0.dev) - they use Next.js, Supabase, Tailwind, and [shadcn/ui](https://ui.shadcn.com/), a stack I already know and love.\n\nAfter about five or six rounds of typing “continue” into v0, I had something workable. But v0 is great for frontend, less so when things get complex. It started making mistakes it couldn’t fix. So I [synced to GitHub](https://github.com/steipete/stats-store) and let [Claude Code](https://steipete.me/posts/2025/claude-code-is-my-computer/) take over. Claude added tests, dark mode, improved the design, and fixed the API flow.\n\nTotal time? Six hours. All while working on the next VibeTunnel release. Plus an hour picking the perfect domain (I really like stats.store).\n\n## What is stats.store?\n\nIt’s exactly what I needed: a modern, privacy-first analytics backend for Sparkle. You get basic update statistics, macOS version distribution, and a clean dashboard - all while respecting user privacy.\n\n**What gets collected:**\n\n- **System info:** macOS version, CPU type (Intel/Apple Silicon), Mac model, core count, RAM, system language\n- **App usage:** Version numbers, update timestamps, daily unique users (via salted IP hashes)\n\n**What doesn’t get collected:**\n\n- No IP addresses, names, or emails\n- No usage patterns or behavior tracking\n- No location data beyond language preference\n- No device IDs or fingerprinting\n\nEverything is designed to answer simple questions: How many people use my app? What macOS versions should I support? When do people actually update? The whole thing is [open source and MIT-licensed](https://github.com/steipete/stats-store).\n\n## Free for Open Source\n\nHere’s the deal: if you’re building open source Mac apps, it’s completely free. I’ll cover the hosting (Vercel and Supabase make this pretty cheap anyway).\n\nWant in? Just [email me](mailto:peter@steipete.me). I’ll add your app to the backend - and by backend, I mean I’ll literally go into Supabase and edit the table. We’re keeping it scrappy. All you have to do is [redirect the appcast URLs](https://github.com/steipete/stats-store#how-it-works-), stats.store will fetch the correct one and pass them along.\n\nIf enough people join, we’ll have a nice community dataset showing how fast Mac users update their OS and what hardware they’re running. Could be interesting!\n\n## Try It\n\nCheck out [stats.store](https://stats.store). If you have a Sparkle-based Mac app and want simple, privacy-respecting analytics, let me know. Together we can build something useful for the Mac developer community.\n\n*Questions? Hit me up on [Twitter](https://twitter.com/steipete) or [email](mailto:peter@steipete.me).*\n",
  "dateCreated": "2026-09-27T19:29:15.293681927+00:00",
  "date_created": "2025-06-18T09:00:00+00:00",
  "date_modified": "2025-06-18T09:00:00+00:00",
  "date_published": "2025-06-18T09:00:00+00:00",
  "description": "How curiosity about VibeTunnel users led me to build stats.store - a free, open source analytics backend for Sparkle using AI tools, all while cooking dinner.",
  "external_url": "https://steipete.me/posts/2025/stats-store-privacy-first-sparkle-analytics/",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/steipete-me/2025/06/2025-06-18-stats-store-privacy-first-sparkle-analytics.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/steipete-me/2025/06/2025-06-18-stats-store-privacy-first-sparkle-analytics.md"
  },
  "id": "urn:aggr:item:823e57bcd946c16e49abd96ae6373231d166a76b",
  "isBasedOn": {
    "@id": "https://steipete.me/posts/2025/stats-store-privacy-first-sparkle-analytics/"
  },
  "mainEntity": {
    "@id": "https://steipete.me/posts/2025/stats-store-privacy-first-sparkle-analytics/",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-06-18-stats-store-privacy-first-sparkle-analytics/#webpage"
    },
    "dateModified": "2025-06-18T09:00:00+00:00",
    "datePublished": "2025-06-18T09:00:00+00:00",
    "headline": "stats.store: Privacy-First Sparkle Analytics",
    "timeRequired": "PT3M",
    "url": "https://steipete.me/posts/2025/stats-store-privacy-first-sparkle-analytics/",
    "wordCount": 511
  },
  "name": "Archived snapshot: stats.store: Privacy-First Sparkle Analytics",
  "preview": null,
  "reading_minutes": 3,
  "replicated_at": null,
  "source": "steipete-me",
  "source_name": "Peter Steinberger",
  "summary": "How curiosity about VibeTunnel users led me to build stats.store - a free, open source analytics backend for Sparkle using AI tools, all while cooking dinner.",
  "tags": [],
  "temporalCoverage": "2026-09-27T19:29:15.293681927+00:00",
  "title": "stats.store: Privacy-First Sparkle Analytics",
  "url": "https://aggr.aymericbeaumet.com/items/steipete-me/2025-06-18-stats-store-privacy-first-sparkle-analytics/",
  "word_count": 511
}