The open-source Google Analytics + Hotjar you can self-host in one docker compose up.
Traffic analytics, session replay, heatmaps, funnels, revenue, on-site popups and an AI analyst.
Cookie-free by default, and it runs on just PostgreSQL and S3.
Live demo · Quick start · How it compares · Roadmap · Contributing · Seentics Cloud
Click around the live demo. No account needed.
If Seentics saves you a Hotjar bill, a ⭐ helps other people find it.
Most teams pay for a traffic tool, a replay and heatmap tool, and a popup tool, and send visitor data to all three. Seentics does all of that in one place, on your own servers, and no data leaves your infrastructure.
- Real-time analytics: live visitor map, active pages, traffic as it happens
- Session replays: full recordings with rage-click and JS error detection
- Heatmaps: click maps, scroll depth, captured page screenshots, AI findings per page
- Funnels: multi-step conversion analysis with drop-off rates
- Revenue: orders, AOV, ARPU, UTM channel attribution
- Behavioral automations: popups, forms, banners, webhooks and redirects triggered by behavior, with leads sent to Mailchimp, Klaviyo, HubSpot or Zapier
- Events and goals: page, event or CSS-selector conversions
- Seentics AI: ask questions in plain English and get charts back (
⌘K)
| Seentics | Plausible CE | Umami | PostHog (self-hosted) | Hotjar | |
|---|---|---|---|---|---|
| Open source | ✅ AGPL-3.0 | ✅ AGPL-3.0 | ✅ MIT | ✅ MIT | ❌ |
| Self-hosting | ✅ Supported | ✅ | ✅ | ❌ | |
| Minimum infrastructure | PostgreSQL + S3 | PostgreSQL + ClickHouse | PostgreSQL | 4 vCPU / 16 GB RAM VM | — |
| Cookie-free by default | ✅ | ✅ | ✅ | ❌ | ❌ |
| Traffic analytics | ✅ | ✅ | ✅ | ✅ | ❌ |
| Session replay | ✅ | ❌ | ✅ | ✅ | ✅ |
| Heatmaps | ✅ | ❌ | ✅ | ✅ | ✅ |
| Funnels | ✅ | Cloud only | ✅ | ✅ | ✅ |
| Revenue tracking | ✅ | Cloud only | ✅ | ✅ | ❌ |
| On-site popups and forms | ✅ | ❌ | ❌ | Surveys only | Surveys only |
| Ask questions in plain English | ✅ | ❌ | ❌ | ✅ | — |
Compiled in October 2026 from each product's public docs. These products change fast, so if a cell is wrong, open an issue and we will fix it.
git clone https://github.com/Seentics/seentics.git
cd seentics
docker compose up -d --buildBrings up PostgreSQL, objex (S3-compatible storage), the API on :8001 and the dashboard on :4000.
Create a website in the dashboard, then add the tracking script below.
For production, see DEPLOYMENT.md.
To test real tracking across the full OSS stack, see Session recording E2E
or Heatmap E2E. From web/, run npm run test:e2e:recording
or npm run test:e2e:heatmap; each creates an isolated test stack and removes its disposable data afterward.
Add to your <head>:
<script
defer
src="https://your-seentics-domain.com/trackers/seentics.js"
data-website-id="YOUR_WEBSITE_ID"
></script>Pageviews, scroll depth, exit intent and rage clicks are captured automatically.
YOUR_WEBSITE_ID is the id shown on your website's settings page.
// Custom event, with optional properties
seentics.track('signup_click');
seentics.track('purchase', { value: 49.99, currency: 'USD', order_id: 'ORD-1234' });
// Identify a visitor. Note the argument order: id first, then traits.
seentics.identify('user_123', { email: 'user@example.com', plan: 'pro' });
seentics.page(); // manual pageview, if auto-tracking is off
seentics.flush(); // send queued events immediatelyRevenue reporting keys off value and currency on any event; goals are configured
in the dashboard rather than in code.
seentics/
├── core/ Bun + Hono API — a modular monolith
│ ├── app/ Composition root, where the graph is wired
│ ├── modules/ Domain modules, one table each
│ ├── platform/ Cross-cutting; owns no table
│ ├── infrastructure/ Event bus, transactional outbox
│ └── db/ Drizzle schema and migrations
├── web/ Next.js dashboard, plus public/trackers/seentics.js
└── ui/blocks/ @seentics/ui — embeddable React blocks (MIT)
Modules talk to each other through explicit interfaces for synchronous calls and
typed domain events for asynchronous ones. Read
core/ARCHITECTURE.md before changing core/ — it covers the
module boundaries, the event bus guarantees, and the known gaps.
Browser ──┬─ tracker ──▶ POST /api/v1/tracker/collect ─┐
└─ dashboard ─▶ Next.js :4000 ───────────────┤
▼
Bun API :8001
│ │
PostgreSQL S3 / objex
(events, meta) (replays, heatmaps)
Tracker events are buffered in memory and flushed in batches, so /collect returns
without waiting on the database. Replay chunks and heatmap screenshots go to
S3-compatible storage.
| Layer | Stack |
|---|---|
| API | Bun · Hono · Drizzle ORM |
| Dashboard | Next.js 15 · Tailwind · shadcn/ui |
| Data | PostgreSQL 16 · S3-compatible object storage |
| Replays | rrweb |
cd core
bun install
bun run check # typecheck — expected to be clean
bun test # ~630 tests, no database or S3 required
bun run devCI runs check and test on every pull request, and both are expected to pass.
Tests use in-memory doubles of the module interfaces, so no services are needed.
Two things worth knowing before you write tests: mock.module is process-global in
Bun, so an incomplete stub becomes the real module for every later test file — make
stubs complete. And core/ARCHITECTURE.md lists the current known gaps if you are
looking for something to pick up.
See CONTRIBUTING.md for the PR process.
New here? Issues labelled good first issue
are scoped to a single file or two. Adding an integration provider, for example, means adding one file under
core/modules/integrations/providers/ and one line in its registry.ts. The roadmap lists what is
planned, and Discussions is the place for questions and ideas.
GNU AGPL v3.0 — self-host freely; modifications must be released under
the same license. The @seentics/ui package is separately
MIT.
Don't want to run it yourself? Seentics Cloud is the same product, hosted.
Built by the Seentics team ·
Report an issue