{"id":50496622,"url":"https://github.com/iceglober/counted","last_synced_at":"2026-06-02T08:00:29.964Z","repository":{"id":361708119,"uuid":"1254706976","full_name":"iceglober/counted","owner":"iceglober","description":"Privacy-first analytics with composable dashboards. No cookies, no PII, ~3KB SDK.","archived":false,"fork":false,"pushed_at":"2026-06-01T00:05:21.000Z","size":1197,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T00:07:21.045Z","etag":null,"topics":["analytics","dashboards","nextjs","open-source","privacy","sdk","typescript"],"latest_commit_sha":null,"homepage":"https://counted.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/iceglober.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-30T22:56:26.000Z","updated_at":"2026-06-01T00:05:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/iceglober/counted","commit_stats":null,"previous_names":["iceglober/counted"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/iceglober/counted","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iceglober%2Fcounted","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iceglober%2Fcounted/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iceglober%2Fcounted/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iceglober%2Fcounted/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/iceglober","download_url":"https://codeload.github.com/iceglober/counted/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/iceglober%2Fcounted/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33812204,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-02T02:00:07.132Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analytics","dashboards","nextjs","open-source","privacy","sdk","typescript"],"created_at":"2026-06-02T08:00:26.948Z","updated_at":"2026-06-02T08:00:29.956Z","avatar_url":"https://github.com/iceglober.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"app/icon.svg\" width=\"48\" height=\"48\" alt=\"Counted\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eCounted\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  Privacy-first analytics with composable dashboards.\u003cbr/\u003e\n  No cookies. No fingerprinting. No PII. Under 3KB.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://counted.dev\"\u003eWebsite\u003c/a\u003e ·\n  \u003ca href=\"https://app.counted.dev\"\u003eDashboard\u003c/a\u003e ·\n  \u003ca href=\"https://www.npmjs.com/package/@counted/sdk\"\u003enpm\u003c/a\u003e\n\u003c/p\u003e\n\n---\n\n## Quick Start\n\n```bash\nnpm install @counted/sdk\n```\n\n```typescript\nimport { Analytics } from \"@counted/sdk\";\n\nconst analytics = new Analytics({ projectKey: \"A-US-...\" });\nanalytics.track(\"page_view\", { path: \"/\" });\n```\n\n### React\n\n```bash\nnpm install @counted/react\n```\n\n```tsx\nimport { AnalyticsProvider, useAnalytics } from \"@counted/react\";\n\nfunction App() {\n  return (\n    \u003cAnalyticsProvider projectKey=\"A-US-...\"\u003e\n      \u003cMyApp /\u003e\n    \u003c/AnalyticsProvider\u003e\n  );\n}\n\nfunction SignupButton() {\n  const { track } = useAnalytics();\n  return \u003cbutton onClick={() =\u003e track(\"signup_click\")}\u003eSign Up\u003c/button\u003e;\n}\n```\n\n## What Counted Does\n\n- **Event tracking** — track any event with custom properties\n- **Composable dashboards** — build your own view with metrics, time series, and breakdowns\n- **Privacy by design** — no cookies, no IP storage, no fingerprinting, GDPR-compliant without a consent banner\n- **Lightweight SDK** — under 3KB gzipped, no dependencies\n\n## What Counted Does NOT Do\n\n- Set cookies or use localStorage for tracking\n- Store IP addresses or any PII\n- Fingerprint browsers (no canvas, WebGL, font probing)\n- Auto-track without explicit opt-in\n- Sell or share data with third parties\n\n## Self-Hosting\n\nOne command:\n\n```bash\ngit clone https://github.com/iceglober/counted.git\ncd counted/self-host\ncp .env.example .env\n# Edit .env with your auth secret\ndocker compose up -d\n```\n\nSee [self-host/README.md](./self-host/README.md) for the full guide, production checklist, and backup instructions.\n\nFor development setup, see [CONTRIBUTING.md](./CONTRIBUTING.md).\n\n## Packages\n\n| Package | Description | Size |\n|---------|-------------|------|\n| [`@counted/sdk`](packages/sdk) | Vanilla JS event tracking | ~3KB |\n| [`@counted/react`](packages/react) | React provider + hook | ~1KB |\n| [`@counted/claude-code`](packages/claude-code) | Claude Code plugin | ~1KB |\n| [`@counted/opencode`](packages/opencode) | OpenCode plugin | ~1KB |\n| [`@counted/gemini-cli`](packages/gemini-cli) | Gemini CLI agent hooks | ~1KB |\n| [`@counted/codex-cli`](packages/codex-cli) | Codex CLI agent hooks | ~1KB |\n| [`counted`](packages/python) | Python SDK | — |\n| [`counted`](packages/go) | Go SDK | — |\n| [`counted`](packages/rust) | Rust SDK | — |\n| [`@counted/migrate`](packages/migrate) | Aptabase migration CLI | — |\n\n## Migrating from Aptabase\n\n```bash\n# Option A: drop-in compat (zero API changes)\nnpm remove @aptabase/web\nnpm install @counted/sdk\n# Change import: '@aptabase/web' → '@counted/sdk/aptabase'\n\n# Option B: native API\nnpm remove @aptabase/react\nnpm install @counted/react\n# AptabaseProvider → AnalyticsProvider\n# useAptabase → useAnalytics\n# trackEvent → track\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md).\n\n## License\n\nMIT — see [LICENSE](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficeglober%2Fcounted","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ficeglober%2Fcounted","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficeglober%2Fcounted/lists"}