Skip to content

5-minute Quickstart

Boot the entire Azothedge Pulse stack on your machine with Docker Compose, then verify it's healthy. This is the fastest path from a fresh clone to a running CDP.

Prerequisites

  • Docker and the Docker Compose plugin (docker compose version).
  • GNU Make (the repo's make targets wrap Compose).
  • About 4 GB of free RAM for the full stack.

For a host-native development loop (running the API or worker outside containers), you'll also want uv and Node 24 LTS — see Local Development.

1. Clone and boot

git clone git@github.com:azothedge/pulse.git
cd pulse
make up          # builds + boots the stack, waits up to 90s for health

make up starts the API, the ingestion worker, Postgres, Redpanda (Kafka API), MinIO (object storage), and the full observability stack (Grafana, Prometheus, Loki, Tempo), plus Mailpit and the web portal. It then polls container health for up to 90 seconds and reports when everything is ready.

2. Smoke-test the API

curl -s http://localhost:8000/health
# {"status":"healthy","service":"azothedge-pulse-api"}

curl -s http://localhost:8000/ready
# {"status":"ready","checks":{"postgres":true,"kafka":true,"minio":true}}

/health is a liveness probe; /ready checks that Postgres, Kafka, and MinIO are all reachable.

3. Open the consoles

Service URL Credentials
API (Swagger UI) http://localhost:8000/docs
Web portal http://localhost:3001
Grafana http://localhost:3000 admin / admin
Redpanda Console http://localhost:8080
MinIO Console http://localhost:9001 pulse / pulsepulse
Mailpit http://localhost:8025

Port 3001, not 3000

The web portal is published on host port 3001 (it maps to container port 3000) because Grafana already owns 3000. The full port map is in Local Development.

4. Send your first event

You have a running CDP, but no data yet. The next page walks the full path — create a tenant, register a schema, materialize a dataset, and collect an event end to end.

Your First Event

Stopping the stack

make down        # stop containers, keep data volumes
make clean       # stop AND delete volumes (DESTRUCTIVE — wipes all local data)