Privacy-first, self-hosted web analytics. No cookies, no fingerprinting, no personal data stored.
One script tag. One attribute. You own everything.
Website · Documentation · Installation · Free vs Pro
curl -fsSL https://fusionaly.com/install | bashOr with Docker:
docker pull karloscodes/fusionaly:latestSee the Installation Guide for full setup instructions.
Add the tracking script to your site:
<script defer src="https://your-domain.com/y/api/v1/sdk.js"></script>Page views and button clicks are tracked automatically. Want more? One attribute works on any element:
<button data-fusionaly-event-name="signup_clicked">Sign Up</button>
<a href="/pricing" data-fusionaly-event-name="pricing_viewed">Pricing</a>
<form data-fusionaly-event-name="contact_submitted">...</form>
<section data-fusionaly-event-name="testimonials_seen">...</section>The SDK does the right thing based on element type — click, submit, sendBeacon, or scroll into view. Read the docs.
- Page views & SPA navigation — automatic, zero config
- Button & link tracking — automatic or named with one attribute
- Form tracking — tracks on submit, suppresses button double-events
- Section tracking — fires when scrolled into view (50% visible)
- Revenue tracking — purchases with price, currency, metadata
- Custom events — JavaScript API for dynamic data
- Goal conversions — track signups, purchases, any event as a goal
- User flows — see how visitors navigate entry to exit
- Annotations — mark deployments, campaigns, incidents on your timeline
- Shareable dashboards — public links to your analytics
- Bot filtering & spam protection — clean data by default
- Subdomain tracking — first-party, ad-block proof
- Backend: Go, Fiber, GORM, SQLite
- Frontend: React, Inertia.js, Tailwind CSS, shadcn/ui
- Testing: Go testing, Playwright E2E
Requirements: Go 1.25+, Node.js 22+, SQLite
make install # Install dependencies
make db-migrate # Apply migrations
make dev # Start dev server (hot reload)Access at http://localhost:3000
make test # Unit tests (~3s)
make test-e2e # Playwright E2E (~5min)
make lint # Run linters
make build # Production binariesfusionaly/
├── cmd/
│ ├── fusionaly/ # Main server binary
│ ├── fnctl/ # CLI tool (migrations, admin tasks)
│ └── manager/ # Production manager (health checks, upgrades)
├── internal/ # Core business logic (Phoenix Contexts pattern)
├── api/v1/ # Public tracking API + SDK
├── web/ # React frontend (Inertia.js + Tailwind)
├── e2e/ # Playwright E2E tests
└── storage/ # Runtime data (database, GeoLite2)
Defaults work out of the box for development.
For production, set:
FUSIONALY_DOMAIN— your domain nameFUSIONALY_PRIVATE_KEY— generate withopenssl rand -hex 32
See Installation Guide for Docker setup and SDK Configuration for tracking options.
- Open an issue first — discuss features or significant changes before starting
- Bug fixes — PRs welcome with clear problem/solution description
- Run
make lintbefore submitting - Run
make testandmake test-e2eto verify changes
Website · Docs · Issues · Docker Hub