<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Tally</title>
  <link href="https://juicer.build/themes/juicerlanding/demo/feed.xml" rel="self"/>
  <link href="https://juicer.build/themes/juicerlanding/demo/"/>
  <id>https://juicer.build/themes/juicerlanding/demo/feed.xml</id>
  <updated>2026-05-09T00:00:00Z</updated>
  <author><name>Tally</name></author>
  <entry>
    <title>Changelog</title>
    <link href="https://juicer.build/themes/juicerlanding/demo/changelog/"/>
    <id>https://juicer.build/themes/juicerlanding/demo/changelog/</id>
    <updated>2026-05-09T00:00:00Z</updated>
    <summary>Releases, in reverse chronological order. Major versions get a write-up; minor versions get a bullet.</summary>
    <content type="html">&lt;h4 id=&quot;v1-0-0-2026-05-09&quot;&gt;v1.0.0 — 2026-05-09&lt;/h4&gt;
&lt;p&gt;The first stable release. We’ve been running this in production for the
last six months across ~40 sites; the feature set hasn’t moved in three.
Time to drop the beta tag.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Stable API.&lt;/strong&gt; No more breaking changes between minor versions. The
&lt;code&gt;tally()&lt;/code&gt; function signature, the &lt;code&gt;data-site&lt;/code&gt; attribute, the dashboard
REST API — all locked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted parity.&lt;/strong&gt; The Docker image, the SQLite default, the
optional Postgres mode, the migration story — fully exercised by the
cloud product. Same image, same code path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single-page-app autopilot.&lt;/strong&gt; History API navigations are detected
without configuration in React Router, SvelteKit, Next.js App Router,
Vue Router, and Astro view transitions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSV export.&lt;/strong&gt; Raw-events export is now available from the dashboard
on every plan.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v0-9-4-2026-04-22&quot;&gt;v0.9.4 — 2026-04-22&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Fixed a regression where the daily salt rotation could fire twice on
servers with a clock that jittered backward at midnight UTC.&lt;/li&gt;
&lt;li&gt;Added a &lt;code&gt;--dry-run&lt;/code&gt; flag to the migration CLI.&lt;/li&gt;
&lt;li&gt;Documentation for the first-party-hosting proxy setup.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v0-9-3-2026-04-08&quot;&gt;v0.9.3 — 2026-04-08&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Real-time dashboard now updates via SSE instead of long-polling.
Dropped the upstream NGINX timeout requirement.&lt;/li&gt;
&lt;li&gt;Funnel definitions can now reference custom-event properties.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v0-9-0-2026-03-15&quot;&gt;v0.9.0 — 2026-03-15&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Custom events API. &lt;code&gt;tally(&apos;signup&apos;, { plan: &apos;pro&apos; })&lt;/code&gt; is now a thing.&lt;/li&gt;
&lt;li&gt;Funnels (closed beta).&lt;/li&gt;
&lt;li&gt;Breaking: the &lt;code&gt;t.js&lt;/code&gt; script is now under &lt;code&gt;/t.js&lt;/code&gt; instead of
&lt;code&gt;/track.js&lt;/code&gt;. Old path serves a 301 redirect; will be removed in v1.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;v0-8-0-2026-02-04&quot;&gt;v0.8.0 — 2026-02-04&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;New, smaller tracker script (was 1.4 KB, now 0.9 KB gzipped).&lt;/li&gt;
&lt;li&gt;Initial Postgres backend support.&lt;/li&gt;
&lt;li&gt;Breaking: dashboard moved from &lt;code&gt;/admin&lt;/code&gt; to &lt;code&gt;/dashboard&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>Privacy policy</title>
    <link href="https://juicer.build/themes/juicerlanding/demo/privacy/"/>
    <id>https://juicer.build/themes/juicerlanding/demo/privacy/</id>
    <updated>2026-04-01T00:00:00Z</updated>
    <summary>A short, plain-language description of what data Tally processes and what we do with it. The lawyer-friendly version is at /privacy/full/.</summary>
    <content type="html">&lt;p&gt;This is the version of the privacy policy written for humans. The
formal document lives at &lt;a href=&quot;/themes/juicerlanding/demo/privacy/full/&quot;&gt;&lt;code&gt;/privacy/full/&lt;/code&gt;&lt;/a&gt; and
governs in case of conflict.&lt;/p&gt;
&lt;h4 id=&quot;what-tally-collects&quot;&gt;What Tally collects&lt;/h4&gt;
&lt;p&gt;For each page view on a site that uses Tally, we receive:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;URL path&lt;/strong&gt; of the page (without query strings, unless the site
owner explicitly opts in).&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;referrer&lt;/strong&gt; (the page the visitor came from, if any), normalised
to the domain.&lt;/li&gt;
&lt;li&gt;A coarse &lt;strong&gt;country code&lt;/strong&gt; derived from the visitor’s IP address. The
IP itself is &lt;strong&gt;not stored&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;device class&lt;/strong&gt; (desktop / tablet / mobile) and the &lt;strong&gt;browser
family&lt;/strong&gt;, derived from the User-Agent string. The full UA string is
&lt;strong&gt;not stored&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;daily visitor ID&lt;/strong&gt; that is the SHA-256 of &lt;code&gt;(IP, UA, today&apos;s rotating salt)&lt;/code&gt;. The salt is regenerated every 24 hours and the
previous salt is discarded. This means we cannot link a visitor’s
activity across calendar days.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s everything. We do not set cookies. We do not fingerprint. We
do not retain anything that could be used to re-identify a specific
person.&lt;/p&gt;
&lt;h4 id=&quot;what-we-do-with-it&quot;&gt;What we do with it&lt;/h4&gt;
&lt;p&gt;We aggregate it into the dashboard the site owner sees. That’s the
entire purpose of the product.&lt;/p&gt;
&lt;p&gt;We do &lt;strong&gt;not&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sell data to third parties.&lt;/li&gt;
&lt;li&gt;Share data with advertisers.&lt;/li&gt;
&lt;li&gt;Use the data to train any model, ours or anyone else’s.&lt;/li&gt;
&lt;li&gt;Combine data across sites in any way that would let us build a
profile of an individual.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;where-the-data-lives&quot;&gt;Where the data lives&lt;/h4&gt;
&lt;p&gt;For Cloud customers: in our database in Frankfurt (Hetzner). Daily
backups go to a second region; both regions are inside the EU.&lt;/p&gt;
&lt;p&gt;For Agency customers: same, with optional region selection at
checkout.&lt;/p&gt;
&lt;p&gt;For Self-hosted: on your server. We never see it.&lt;/p&gt;
&lt;h4 id=&quot;your-rights&quot;&gt;Your rights&lt;/h4&gt;
&lt;p&gt;If you are an end user of a site that uses Tally:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We don’t have any data that could let us find your activity in our
database, because we explicitly designed it that way.&lt;/li&gt;
&lt;li&gt;The site owner who runs Tally on their own infrastructure may have
data subject to their privacy policy. Contact them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are a Tally customer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Export, delete, or modify your account data at any time from the
dashboard.&lt;/li&gt;
&lt;li&gt;Email &lt;code&gt;privacy@tally.dev&lt;/code&gt; for anything the dashboard doesn’t cover.&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  <entry>
    <title>About Tally</title>
    <link href="https://juicer.build/themes/juicerlanding/demo/about/"/>
    <id>https://juicer.build/themes/juicerlanding/demo/about/</id>
    <updated>2026-04-01T00:00:00Z</updated>
    <summary>Who&apos;s behind the product, what we believe, and why this product exists at all.</summary>
    <content type="html">&lt;p&gt;Tally is built by a two-person team out of Lisbon. We started it in
late 2024 because we wanted analytics for our own side projects without
re-litigating GDPR every time we shipped a new one.&lt;/p&gt;
&lt;h4 id=&quot;what-we-believe&quot;&gt;What we believe&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Privacy is a default, not a feature.&lt;/strong&gt; A consent banner that asks
permission to track is a worse experience than not tracking that data
in the first place. We aggregated everything we actually use — page
views, top sources, referrers, conversion funnels — and built a tool
around that subset, then stopped.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Open source is the substrate.&lt;/strong&gt; The product is MIT licensed; the
self-hosted version is the same code as the cloud version. If we go
away tomorrow, you have the source, the database schema, and a
migration path. We make it easy to leave because we want you to stay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Less product is more product.&lt;/strong&gt; We’ve turned down feature requests
for cohort analysis, A/B testing, session replay, and revenue
attribution. There are good tools for all of those things. None of
them belong in a tool whose job is “tell me what’s happening on my
site at a glance.”&lt;/p&gt;
&lt;h4 id=&quot;who-s-working-on-it&quot;&gt;Who’s working on it&lt;/h4&gt;
&lt;p&gt;Two people, full-time. Both founders. We answer support email, write
the code, ship the releases. There is no sales team because there is
no sales process — pick a tier, click the button, you’re billed.&lt;/p&gt;
&lt;h4 id=&quot;where-we-re-going&quot;&gt;Where we’re going&lt;/h4&gt;
&lt;p&gt;The roadmap is short on purpose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;More integrations.&lt;/strong&gt; First-class Cloudflare Worker / Vercel Edge
setup. A Caddy module for first-party proxying. A Hugo theme.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better self-hosted onboarding.&lt;/strong&gt; A one-command installer for
common VPS providers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A CLI.&lt;/strong&gt; For the people (us, mostly) who’d rather curl the API
than open a dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s it. We will keep this short.&lt;/p&gt;</content>
  </entry>
</feed>
