<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Documentation on Feasible</title>
    <link>https://feasible.lol/docs/</link>
    <description>Recent content in Documentation on Feasible</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <atom:link href="https://feasible.lol/docs/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Installation</title>
      <link>https://feasible.lol/docs/installation/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/installation/</guid>
      <description>&lt;p&gt;One script tag, on every page you want counted. No build step, no consent gate to wire up first.&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;&amp;lt;script defer src=&#34;https://app.feasible.lol/js/fs-k7m2q4x5r3n6t2v5.js&#34;&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;&#xA;&#xA;&lt;p&gt;That&amp;rsquo;s 3,377 bytes gzipped - a handful more for your copy, which has your domain baked into it -&#xA;and it&amp;rsquo;s deferred, so it never blocks rendering.&lt;/p&gt;&#xA;&lt;p&gt;There are no cookies and nothing stored in the browser to identify anyone, which is why most sites&#xA;won&amp;rsquo;t need a consent banner for it. &lt;a href=&#34;https://feasible.lol/docs/privacy/&#34;&gt;Privacy and GDPR&lt;/a&gt; has the facts to hand your&#xA;lawyer - and if you&amp;rsquo;re somewhere strict, ask them rather than us.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Integrations</title>
      <link>https://feasible.lol/docs/integrations/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/integrations/</guid>
      <description>&lt;p&gt;The tracker is a script tag, so anything that lets you add one is supported. What follows is the list&#xA;people ask about, and the one step each platform hides. The setup screen inside the product carries&#xA;the same instructions with your own snippet already filled in.&lt;/p&gt;&#xA;&lt;h2 id=&#34;wordpress&#34;&gt;WordPress&lt;/h2&gt;&#xA;&lt;p&gt;There&amp;rsquo;s a plugin, &lt;strong&gt;feasible.lol Analytics&lt;/strong&gt;. It does more than paste the snippet: it serves the&#xA;script and the events endpoint from your own domain on randomized paths, which is the part that&#xA;survives ad blockers, and it adds the two measurements a theme can&amp;rsquo;t give you - site-search&#xA;terms and 404s.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Script options</title>
      <link>https://feasible.lol/docs/script-options/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/script-options/</guid>
      <description>&lt;p&gt;Every option is a &lt;code&gt;data-&lt;/code&gt; attribute on the script tag, and they all work on either form of the&#xA;snippet. It&amp;rsquo;s the same bundle whichever filename you load - no build flags, no feature variants to&#xA;choose between, and nothing you can forget to turn on.&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-value-is-required-not-just-the-attribute&#34;&gt;A value is required, not just the attribute&lt;/h2&gt;&#xA;&lt;p&gt;This trips people up, so it goes first. A bare attribute does nothing:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;script defer data-hash src=&amp;#34;…&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;          &amp;lt;!-- ignored --&amp;gt;&#xA;&amp;lt;script defer data-hash=&amp;#34;true&amp;#34; src=&amp;#34;…&amp;#34;&amp;gt;&amp;lt;/script&amp;gt;   &amp;lt;!-- on --&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Any non-empty value switches a flag on, including the string &lt;code&gt;&amp;quot;false&amp;quot;&lt;/code&gt;. To turn something off, leave&#xA;the attribute out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Proxying</title>
      <link>https://feasible.lol/docs/proxying/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/proxying/</guid>
      <description>&lt;p&gt;Ad blockers block analytics by hostname. Serving the script and the events endpoint from your own&#xA;domain is the only reliable way around that, and it costs you two proxy rules.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s also better for your visitors: the request goes to a host they already trust and reuses a&#xA;connection their browser has open.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-to-proxy&#34;&gt;What to proxy&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;The script&lt;/strong&gt; - a static file, cacheable. It&amp;rsquo;s served at &lt;code&gt;/js/script.js&lt;/code&gt;, or at your site&amp;rsquo;s own&#xA;&lt;code&gt;/js/fs-&amp;lt;token&amp;gt;.js&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;The events endpoint&lt;/strong&gt; - &lt;code&gt;POST /api/event&lt;/code&gt;, never cached. Proxy the whole prefix rather than the&#xA;exact path, so the no-script pixel at &lt;code&gt;/api/event/pixel.gif&lt;/code&gt; is covered too.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;caddy&#34;&gt;Caddy&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;example.com {&#xA;    handle /stats/js/* {&#xA;        uri strip_prefix /stats&#xA;        reverse_proxy https://app.feasible.lol {&#xA;            header_up Host app.feasible.lol&#xA;        }&#xA;    }&#xA;    handle /stats/api/event* {&#xA;        uri strip_prefix /stats&#xA;        reverse_proxy https://app.feasible.lol {&#xA;            header_up Host app.feasible.lol&#xA;        }&#xA;    }&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Caddy sets &lt;code&gt;X-Forwarded-For&lt;/code&gt; itself, which is all we need.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The dashboard</title>
      <link>https://feasible.lol/docs/dashboard/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/dashboard/</guid>
      <description>&lt;p&gt;One screen. No report picker, no menu of saved views to get lost in. Everything is on it, and&#xA;everything is filterable by clicking.&lt;/p&gt;&#xA;&#xA;&lt;figure class=&#34;my-8&#34;&gt;&#xA;  &lt;div class=&#34;frame overflow-hidden&#34;&gt;&#xA;    &lt;img&#xA;      src=&#34;https://feasible.lol/images/app/dashboard-light_hu_52c9adeb62dd7e99.webp&#34;&#xA;      srcset=&#34;https://feasible.lol/images/app/dashboard-light_hu_74461fb8925729dc.webp 700w, https://feasible.lol/images/app/dashboard-light_hu_52c9adeb62dd7e99.webp 1200w, https://feasible.lol/images/app/dashboard-light_hu_b151711e3ac5437f.webp 1800w&#34;&#xA;      sizes=&#34;(min-width: 1024px) 704px, 100vw&#34;&#xA;      width=&#34;2880&#34;&#xA;      height=&#34;2150&#34;&#xA;      alt=&#34;The Feasible dashboard: six top-line numbers, a graph, and the first two report cards&#34;&#xA;      class=&#34;block h-auto w-full&#34;&#xA;      loading=&#34;lazy&#34;&#xA;      decoding=&#34;async&#34;&#xA;    /&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&lt;h2 id=&#34;the-numbers-along-the-top&#34;&gt;The numbers along the top&lt;/h2&gt;&#xA;&lt;p&gt;Six figures: &lt;strong&gt;Unique visitors&lt;/strong&gt;, &lt;strong&gt;Total visits&lt;/strong&gt;, &lt;strong&gt;Total pageviews&lt;/strong&gt;, &lt;strong&gt;Views per visit&lt;/strong&gt;,&#xA;&lt;strong&gt;Bounce rate&lt;/strong&gt; and &lt;strong&gt;Visit duration&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Metric definitions</title>
      <link>https://feasible.lol/docs/metrics/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/metrics/</guid>
      <description>&lt;p&gt;Most of these are what you&amp;rsquo;d expect. The four at the bottom are the ones that surprise people, and&#xA;they surprise people in every analytics product. We&amp;rsquo;d rather write them down, with the arithmetic,&#xA;than let you find them in a meeting.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-metrics&#34;&gt;The metrics&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Unique visitors&lt;/strong&gt; - distinct visitor identifiers in the period. Read the section below before you&#xA;use this number in a sentence containing the word &amp;ldquo;people&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Total visits&lt;/strong&gt; - a visit is a run of activity that ends after 30 minutes of silence. Nothing else&#xA;ends it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Total pageviews&lt;/strong&gt; - one per page load, plus one per client-side route change.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Events&lt;/strong&gt; - everything that isn&amp;rsquo;t a pageview: your own custom events, outbound clicks, downloads,&#xA;form submissions.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Views per visit&lt;/strong&gt; - pageviews divided by visits.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bounce rate&lt;/strong&gt; - the share of visits with one pageview and no other interaction. An&#xA;engagement measurement isn&amp;rsquo;t an interaction; an outbound click is.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Visit duration&lt;/strong&gt; - last activity minus first activity within a visit. A single-page visit has a&#xA;duration only if the tab reported time on page.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Time on page&lt;/strong&gt; - accumulated by the script only while the tab is both visible &lt;em&gt;and&lt;/em&gt; focused, so a&#xA;page sitting behind another window doesn&amp;rsquo;t bank hours.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Scroll depth&lt;/strong&gt; - the furthest point reached, 1 to 100, as a percentage of the document height at&#xA;the moment it was measured. Never below 1, so &amp;ldquo;never reported&amp;rdquo; and &amp;ldquo;didn&amp;rsquo;t scroll&amp;rdquo; stay&#xA;distinguishable.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Exit rate&lt;/strong&gt; - the share of visits that ended on a page, out of the visits that included it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Conversion rate&lt;/strong&gt; - converting visitors divided by all visitors in the period. See&#xA;&lt;a href=&#34;https://feasible.lol/docs/goals-funnels/&#34;&gt;goals&lt;/a&gt; for what changes that denominator.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Group conversion rate&lt;/strong&gt; - the same idea across a set of goals rather than one.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Total revenue&lt;/strong&gt;, &lt;strong&gt;average revenue&lt;/strong&gt; and &lt;strong&gt;revenue per visitor&lt;/strong&gt; - for goals that carry money.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Six of these are on the dashboard tiles. All fifteen are available through&#xA;&lt;a href=&#34;https://feasible.lol/docs/api/&#34;&gt;the query API&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Goals and funnels</title>
      <link>https://feasible.lol/docs/goals-funnels/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/goals-funnels/</guid>
      <description>&lt;p&gt;Goals, properties and funnels are managed in site settings and reported together at the bottom of the&#xA;dashboard. The Explore tab turns the same events into an open-ended journey report. The API uses the&#xA;same definitions as the screens.&lt;/p&gt;&#xA;&lt;p&gt;All of it is in every plan. There&amp;rsquo;s no conversions add-on.&lt;/p&gt;&#xA;&lt;h2 id=&#34;goals&#34;&gt;Goals&lt;/h2&gt;&#xA;&lt;p&gt;A goal is a page somebody reached, a custom event they sent, or a scroll depth reached on a page.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Custom properties</title>
      <link>https://feasible.lol/docs/custom-properties/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/custom-properties/</guid>
      <description>&lt;p&gt;A custom property is a key and a value attached to an event, so you can break a report down by&#xA;something only your application knows - a plan name, a category, a variant.&lt;/p&gt;&#xA;&lt;p&gt;They&amp;rsquo;re in every plan, with no cap on how many you register and no &amp;ldquo;custom dimensions&amp;rdquo; allowance to&#xA;buy. Send them with the &lt;a href=&#34;https://feasible.lol/docs/script-options/#calling-it-yourself&#34;&gt;tracker&amp;rsquo;s own API&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;feasible(&amp;#39;Signup&amp;#39;, {&#xA;  props: { plan: &amp;#39;yearly&amp;#39;, referred_by: &amp;#39;partner&amp;#39; }&#xA;})&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A pageview takes them under &lt;code&gt;p&lt;/code&gt; rather than &lt;code&gt;props&lt;/code&gt;, which is a wart of the wire format we match for&#xA;compatibility:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Excluding traffic</title>
      <link>https://feasible.lol/docs/shields/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/shields/</guid>
      <description>&lt;p&gt;Two settings decide what gets counted and what it&amp;rsquo;s called. They live at&#xA;&lt;code&gt;/settings/sites/&amp;lt;your domain&amp;gt;/shields&lt;/code&gt; and &lt;code&gt;/settings/sites/&amp;lt;your domain&amp;gt;/paths&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If traffic you &lt;em&gt;do&lt;/em&gt; want is missing rather than traffic you don&amp;rsquo;t, start at&#xA;&lt;a href=&#34;https://feasible.lol/docs/installation/#if-nothing-arrives-at-all&#34;&gt;installation&lt;/a&gt; instead.&lt;/p&gt;&#xA;&lt;h2 id=&#34;shields---traffic-you-dont-want-counted&#34;&gt;Shields - traffic you don&amp;rsquo;t want counted&lt;/h2&gt;&#xA;&lt;h3 id=&#34;blocked-addresses&#34;&gt;Blocked addresses&lt;/h3&gt;&#xA;&lt;p&gt;An address or a CIDR block. Checked in the ingestion tier, which is the only place the raw address&#xA;still exists - after that it&amp;rsquo;s been discarded and there&amp;rsquo;s nothing left to match on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Import and export</title>
      <link>https://feasible.lol/docs/import-export/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/import-export/</guid>
      <description>&lt;p&gt;Bring history in from wherever you were before, and take everything out at any time. Both live at&#xA;&lt;code&gt;/settings/sites/&amp;lt;your domain&amp;gt;/imports&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;export&#34;&gt;Export&lt;/h2&gt;&#xA;&lt;p&gt;Press &lt;strong&gt;Prepare an export&lt;/strong&gt; and a background job builds a ZIP containing:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;the ten roll-up tables as CSV - visitors, sources, pages, entry pages, exit pages, locations,&#xA;devices, browsers, operating systems and custom events;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;raw_events.csv&lt;/code&gt; - &lt;strong&gt;every event, one row each&lt;/strong&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The raw file is in every plan. Data you generated on your own site is yours, and putting the only&#xA;complete copy of it behind a plan is how a customer finds out they can&amp;rsquo;t leave.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The APIs</title>
      <link>https://feasible.lol/docs/api/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/api/</guid>
      <description>&lt;p&gt;Two APIs: one to send events, one to read numbers back. Both are HTTP and JSON, both are documented&#xA;here in full, and there&amp;rsquo;s no paid tier for API access. There isn&amp;rsquo;t a plan check in the API code at&#xA;all.&lt;/p&gt;&#xA;&lt;h2 id=&#34;sending-events&#34;&gt;Sending events&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST /api/event&#xA;Content-Type: application/json&#xA;&#xA;{&#xA;  &amp;#34;n&amp;#34;: &amp;#34;pageview&amp;#34;,&#xA;  &amp;#34;d&amp;#34;: &amp;#34;example.com&amp;#34;,&#xA;  &amp;#34;u&amp;#34;: &amp;#34;https://example.com/pricing&amp;#34;,&#xA;  &amp;#34;r&amp;#34;: &amp;#34;https://duckduckgo.com/&amp;#34;&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;No authentication. The tracker runs in a browser, so a credential here would be a credential&#xA;published on your website. The site is identified by &lt;code&gt;d&lt;/code&gt;, and an event for a domain we don&amp;rsquo;t hold is&#xA;dropped.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Webhooks</title>
      <link>https://feasible.lol/docs/webhooks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/webhooks/</guid>
      <description>&lt;p&gt;A webhook is us calling you when something happens, so you don&amp;rsquo;t have to poll for it. They&amp;rsquo;re managed&#xA;under &lt;code&gt;/api/v1/webhooks&lt;/code&gt; with a key carrying the &lt;code&gt;webhooks:write&lt;/code&gt; scope.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;POST /api/v1/webhooks&#xA;Authorization: Bearer feas_…&#xA;&#xA;{&#xA;  &amp;#34;url&amp;#34;: &amp;#34;https://example.com/hooks/feasible&amp;#34;,&#xA;  &amp;#34;event_types&amp;#34;: [&amp;#34;site.created&amp;#34;, &amp;#34;traffic.spike&amp;#34;]&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The response carries the signing secret - &lt;code&gt;whsec_&lt;/code&gt; followed by 43 characters - and that&amp;rsquo;s the only&#xA;time you&amp;rsquo;ll see it. Listing or fetching a webhook never returns it. An empty &lt;code&gt;event_types&lt;/code&gt; means&#xA;every type.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The MCP server</title>
      <link>https://feasible.lol/docs/mcp/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/mcp/</guid>
      <description>&lt;p&gt;There&amp;rsquo;s a Model Context Protocol server built in, so an AI assistant can read your analytics and ask&#xA;follow-up questions without anybody writing an integration.&lt;/p&gt;&#xA;&lt;p&gt;It&amp;rsquo;s the same query engine the dashboard uses, behind the same &lt;a href=&#34;https://feasible.lol/docs/api/#api-keys&#34;&gt;API keys&lt;/a&gt; and&#xA;the same rate limits. It&amp;rsquo;s in every plan and every build, hosted or self-hosted.&lt;/p&gt;&#xA;&lt;h2 id=&#34;connecting-over-http&#34;&gt;Connecting over HTTP&lt;/h2&gt;&#xA;&lt;p&gt;The endpoint is &lt;code&gt;POST /mcp&lt;/code&gt;, streamable HTTP, protocol version &lt;code&gt;2025-06-18&lt;/code&gt;. Authenticate with&#xA;&lt;code&gt;Authorization: Bearer …&lt;/code&gt;, carrying either an API key or an OAuth access token.&lt;/p&gt;</description>
    </item>
    <item>
      <title>SDKs and plugins</title>
      <link>https://feasible.lol/docs/sdks/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/sdks/</guid>
      <description>&lt;p&gt;Five server-side SDKs, a browser loader, a WordPress plugin, a Tag Manager template and a Looker&#xA;Studio connector.&lt;/p&gt;&#xA;&lt;p&gt;The source for every one of them is in the product&amp;rsquo;s&#xA;&lt;a href=&#34;https://github.com/Feasible-Analytics/app.feasible.lol&#34;&gt;repository&lt;/a&gt; under &lt;code&gt;ecosystem/&lt;/code&gt;, each with&#xA;its own README and its own tests. If your package manager doesn&amp;rsquo;t have one yet, that&amp;rsquo;s where to get&#xA;it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-server-side-sdks&#34;&gt;The server-side SDKs&lt;/h2&gt;&#xA;&lt;p&gt;They exist for events that happen away from a browser: a payment webhook, a background job, an&#xA;offline conversion, an API-only product with no pages at all.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Self-hosting</title>
      <link>https://feasible.lol/docs/self-hosting/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/self-hosting/</guid>
      <description>&lt;p&gt;One binary and one directory. No Docker, no external database, no queue, and no feature that only&#xA;exists in the hosted version.&lt;/p&gt;&#xA;&lt;p&gt;The software is &lt;strong&gt;AGPL-3.0-or-later&lt;/strong&gt;. You can run, modify and self-host it freely. If you offer it&#xA;to others as a network service, you have to make your source available to those users.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;./feasible db migrate&#xA;./feasible serve&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That&amp;rsquo;s the whole deployment.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;serve&lt;/code&gt; runs the dashboard, the API, the tracker and ingestion in one process, which is what almost&#xA;every self-hoster should run. The other commands are &lt;code&gt;ingest&lt;/code&gt;, &lt;code&gt;db backup&lt;/code&gt;, &lt;code&gt;rollup&lt;/code&gt;, &lt;code&gt;seed&lt;/code&gt;,&#xA;&lt;code&gt;api-key&lt;/code&gt;, &lt;code&gt;mcp&lt;/code&gt;, &lt;code&gt;billing&lt;/code&gt;, &lt;code&gt;comp&lt;/code&gt; and &lt;code&gt;account&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Privacy and GDPR</title>
      <link>https://feasible.lol/docs/privacy/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      <guid>https://feasible.lol/docs/privacy/</guid>
      <description>&lt;p&gt;The short version: no cookies, no persistent identifier, no cross-site tracking, no data sold or used&#xA;for advertising, and no IP address ever written to disk.&lt;/p&gt;&#xA;&lt;p&gt;This is the technical page. The argument is on&#xA;&lt;a href=&#34;https://feasible.lol/privacy-friendly-analytics/&#34;&gt;privacy-friendly analytics&lt;/a&gt;, the legal one is the&#xA;&lt;a href=&#34;https://feasible.lol/privacy/&#34;&gt;privacy and data policy&lt;/a&gt;, and the processor contract is the&#xA;&lt;a href=&#34;https://feasible.lol/dpa/&#34;&gt;data processing addendum&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-visitor-identifier-is-pseudonymous-not-anonymous&#34;&gt;The visitor identifier is pseudonymous, not anonymous&lt;/h2&gt;&#xA;&lt;p&gt;To tell a returning visitor from a new one within a single day, we compute one number:&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
