# Pyxis > Privacy-first product analytics. A browser tracker and an API record page views, named > events and the results of a site’s own API calls without cookies, IP addresses or > personal data; a dashboard shows overview, funnels, visits, features, requests, > acquisition and devices. Open source under the MIT license. Pyxis stores no cookie, no IP address and no user agent, and keeps the approximate city only for a project whose owner turns it on (off by default). URLs are reduced to path templates and lose their query strings, except utm_source, utm_medium and utm_campaign. Global Privacy Control and Do Not Track switch the tracker off. The hosted API keeps its data in São Paulo, Brazil, for 13 months. ## Install the tracker - [pyxis-analytics on npm](https://www.npmjs.com/package/pyxis-analytics): `npm install pyxis-analytics`, zero dependencies, under 5 KB gzipped, ES module with types. - Call `init({ key: 'pyxis_pk_…', endpoint })` once in the browser; every page and every History API route change becomes a `page_view`. Without a key every function is a no-op. - The hosted endpoint is https://api.pyxis-analytics.dev. Its keys come with an account: sign up at https://app.pyxis-analytics.dev/sign-up (free plan: 10,000 events a month on one site, no card). Anyone can [run their own](https://github.com/samuelcsantana/pyxis-api/blob/main/docs/RUNBOOK.md). - [SDK README](https://github.com/samuelcsantana/pyxis-sdk#readme): `track`, `identify`, `reset`, `trackRequest`, `optOut`, `optIn`, `trackingStatus` and every option. - [Playground](https://samuelcsantana.github.io/pyxis-sdk/): the real tracker in dry-run mode. ## Rules an integration must follow - Never send personal data in events: no names, e-mails, phone numbers, tax ids or text typed by visitors. The server drops values that look like them, as a second barrier. - Event names: lowercase letters, digits and underscores, starting with a letter, up to 64 characters; `page_view`, `identify` and `api_request` are reserved. - Up to 10 properties per event; keys of up to 40 lowercase letters, digits or underscores; values are strings of up to 100 characters, numbers or booleans, never nested. - `identify(userId)` takes the site’s internal account id, never an e-mail; call it on every load of the signed-in area and `reset()` on sign-out. - Paths with readable slugs need `pathRules` (`'/blog/:slug'`) to group into one page; numbers, UUIDs and e-mails become `:id` on their own. - If the site has a Content-Security-Policy, add the API endpoint to `connect-src`. ## Install with an AI agent A coding agent with the site’s repository open (Claude Code, Cursor or another) installs the tracker with these steps. No tool writes to Pyxis: a person creates the project first. 1. A person signs up and creates a project in the dashboard, with the site’s address as its allowed origin. The project’s Settings show its public key (`pyxis_pk_…`, not a secret) and its allowed origins; through the MCP server below, `project_settings` returns both. 2. Find the code that runs once in the browser on every page: the client entry of a single-page app, a client component rendered by the root layout in the Next.js App Router, a `.client` plugin in Nuxt, `hooks.client.ts` in SvelteKit. Add `pyxis-analytics` with the project’s package manager and call `init` there, once, never on the server. A site without a bundler uses the `