A complete analytics pipeline - event collection, columnar storage, interactive dashboards - running on your laptop. No vendor invoices, no per-seat pricing, no data leaving your network. Just three open-source tools and a few Docker containers.
This guide walks you through setting up d8a as the collection layer, ClickHouse as the database, and Apache Superset as the visualization frontend. By the end you will have a working stack that ingests tracking events, stores them in a fast columnar engine, and lets you explore them through charts and dashboards.
Not much:
ClickHouse ships alongside d8a - no separate installation required. Superset runs in its own Docker Compose stack. If you can run docker compose up, you have everything you need.
Self-hosted analytics that is actually performant typically means stitching together multiple tools, each with its own deployment model, configuration format, and learning curve. Cloud analytics platforms hide that complexity but charge you for the privilege - and keep your data on their infrastructure under their terms.
The goal here is different: a stack where you own every byte of data, the infrastructure fits in a single command, and the query engine is fast enough to make dashboards feel instant. d8a handles collection and schema normalization. ClickHouse handles storage and fast analytical queries. Superset turns those queries into charts and dashboards. Three tools, one machine, full control.
Follow the getting started guide to install d8a with ClickHouse as the warehouse backend. The installer bundles ClickHouse, so running it gives you both the event collector and the database in one step.
Once d8a is running and configured to store events in ClickHouse, tracking is all about sending an HTTP request. Here is an example using the GA4 web tracking protocol (gtag):
/g/collect?v=2&tid=G-K7M2X9QP4R&dl=https%3A%2F%2Fexample.com%2F&dt=Home%20-%20Welcome%20to%20Example&en=page_view&cid=412053897.1741200134
This stores a page_view event for the https://example.com page. For demo purposes, fire multiple page view events using curl so there is enough data to visualize later:
curl "http://localhost:8080/g/collect?v=2&tid=G-K7M2X9QP4R&dl=https%3A%2F%2Fexample.com%2F&dt=Home%20-%20Welcome%20to%20Example&en=page_view&cid=412053897.1741200134" -X POST
Two ways to confirm events are landing in ClickHouse.
Option A: clickhouse client CLI
clickhouse client --host localhost --port 9000 --password verySecuredD8aDatabase --database d8a
Then run a quick select:
SELECT timestamp_utc, page_location, page_title FROM events order by timestamp_utc asc;
The clickhouse client output shows stored events directly from the events table (click to enlarge).
Option B: DBGate (or any database manager)
Use these connection details:
| Setting | Value |
|---|---|
| Connection type | ClickHouse |
| Database URL | http://localhost:8123 |
| User | default |
| Password | verySecuredD8aDatabase |
DBGate connected to the local ClickHouse instance (click to enlarge).
Either way, you should see your page_view events with the expected page_location values.
Note:
The curl calls above are just for testing. In a real deployment, events would be triggered by your GA4 installation configured via Google Tag Manager - see the GA4 source guide for setup details. You can also skip Google technology entirely and use the native d8a web tracker, which installs directly on your site with no gtag / GTM dependency.
Superset provides the visualization layer. The official quickstart guide covers the Docker-based setup. The only extra step is adding the ClickHouse driver.
git clone https://github.com/apache/superset.git
cd superset
echo "clickhouse-connect>=0.13.0" > ./docker/requirements-local.txt
docker compose -f docker-compose-image-tag.yml up
http://localhost:8088 and log in with admin / admin.Note:
For production setups, you would install clickhouse-connect via pip directly on the host machine rather than injecting it through Docker’s local requirements file. The Superset ClickHouse documentation covers driver options in detail.
With Superset running, add ClickHouse as a database connection.
| Field | Value |
|---|---|
| Host | host.docker.internal |
| Port | 8123 |
| Database | d8a |
| Username | default |
| Password | verySecuredD8aDatabase |
The host.docker.internal alias is the key detail here. Superset runs inside Docker, but ClickHouse is exposed on the host machine via port 8123. The alias bridges the container network to the host so Superset can reach the database. The database name is d8a - the same one d8a created during installation.
Test the connection, save it, and you are ready to query.
With the database connected, you can start building visualizations.
d8a schema, and pick the events table.page_location, page_title, and timestamp_utc to get a quick view of recent events.timestamp_utc as the x-axis, use COUNT(id) as the metric, and use timestamp_utc as the time filter. This gives you page views over time.Note: You can also add a dashboard-level time range filter from the left side of the dashboard to make both charts easier to explore.
The final Superset dashboard combines a table view with a time-based chart of page views (click to enlarge).
That is the full loop: events flow from the browser through d8a into ClickHouse, and Superset queries ClickHouse to render charts. Everything runs locally, and you own every piece of it.
This setup is designed for local development and evaluation. For production deployments, each component has its own operational considerations - high availability, backups, authentication, TLS, and more. Start with the dedicated guides:
If you want to explore d8a further, the full documentation is at docs.d8a.tech. The project is open source - contributions, feedback, and questions are welcome on GitHub.