pullpulse is a lightweight, self-hosted watcher for Docker Hub repository pull counts.
This project is built and maintained in my free time.
If it helps you or saves you some time, you can support my work on
Thank you for your support!

Docker Hub only exposes a cumulative pull_count.
pullpulse periodically snapshots this value and derives deltas, rates and trends over time – stored locally in SQLite and ready for visualization.
No cloud, no tracking, no external dependencies.
Just pull counts → time series → insights.
pull_countYou control:
Define what should be tracked:
user → all public repos of a Docker Hub user/orgrepos → selected repositories only

docker rundocker run --rm -p 8080:8080 -v $(pwd)/data:/data floibach/pullpulse:latest
services:
pullpulse:
image: floibach/pullpulse:latest
container_name: pullpulse
ports:
- "8080:8080"
volumes:
- ./data:/data
restart: unless-stopped
Then open:http://localhost:8080
pullpulse stores all metrics in a local SQLite database, making it easy to visualize pull history and trends.
A step-by-step guide for setting up Metabase with pullpulse is available in the project wiki:
| Variable | Default | Description |
|---|---|---|
DB_PATH | /data/pulls.sqlite | SQLite database file |
LISTEN_ADDR | :8080 | Web UI bind address |
HTTP_TIMEOUT | 15s | Docker Hub API timeout |
USER_AGENT | pullpulse/1.0 | HTTP user agent |
DOCKERHUB_TOKEN | (optional) | Token for private repos |
Public repositories work without authentication.
pullpulse stores everything in SQLite → perfect for Metabase.
Example setup:
services:
pullpulse:
image: ghcr.io/YOUR_USER/pullpulse:latest
volumes:
- ./data:/data
metabase:
image: metabase/metabase
ports:
- "3000:3000"
volumes:
- ./data:/data:ro
Then in Metabase:
/data/pulls.sqlitetargets – what is being trackedrepos – discovered repositoriesrepo_snapshots – pull count over timerepo_deltas – derived deltas & ratesDesigned for analytics first, not OLTP.
Docker Hub applies rate limiting.
Recommended settings:
pullpulse logs API errors but keeps running.
This tool was developed in close collaboration with an AI chat assistant and refined iteratively through human–AI interaction.
The final design decisions, implementation, and maintenance remain entirely human-driven.
MIT License © 2025 Florian Ibach
Content type
Image
Digest
sha256:30d890aeb…
Size
41.1 MB
Last updated
9 months ago
docker pull floibach/pullpulse