Light a candle for your deploy. Bless your CI with hope and memes 🙏
Push'n'Pray is a fun service that lets you "light a candle" before or after a release. It generates a blessed animated candle GIF with your message and a unique link you can share or embed in your Merge Request, Slack, or README.
- 🕯️ Animated candle with flickering flame
- ✍️ Custom message (emoji-safe, up to 100 characters)
- 🌐 Shareable, cacheable image URL
- 📎 Markdown embed code for Merge Requests
- 🟣 Docker-ready + CI/CD friendly
- Visit the web UI (or call API)
- Enter a wish (e.g. “Please no 500 on prod 🙏”)
- Click "Submit candle"
- Embed the result:
Build locally:
docker build -t push-n-pray .
docker run -p 8080:8080 -e DATABASE_URL="postgres://user:pass@host:5432/dbname" push-n-prayOr pull the prebuilt image from GHCR:
docker run -p 8080:8080 -e DATABASE_URL="postgres://user:pass@host:5432/dbname" ghcr.io/isqanderm/push-n-pray:latestVisit http://localhost:8080
DATABASE_URLis required. On startup the server retries the connection with exponential backoff (handy for cold-start databases like Neon) and exits if Postgres stays unreachable.
| Name | Description | Default |
|---|---|---|
PORT |
Port to run the server | 8080 |
DOMAIN |
Public base URL used to build image links (e.g. https://push-n-pray.tech-pioneer.info) |
(empty → relative URLs) |
DATABASE_URL |
Postgres connection string (required) | — |
TRUSTED_PROXIES |
Comma-separated proxy IPs/CIDRs to trust for X-Forwarded-For (set to your LB/Cloudflare ranges when running behind a proxy, so per-IP rate limiting sees the real client) |
(empty → trust none, use direct peer IP) |
Web UI with the candle form.
Create a new candle.
Form fields:
message— your wish or blessing (required, trimmed; truncated to 100 characters, emoji-safe)
Responses:
200(HTML) — preview with the image and a ready-to-copy Markdown embed400— empty message429— rate limit exceeded (per-IP, ~10 requests/min, burst 5)
Returns the animated candle GIF for a given candle id.
200(image/gif) — the blessed candle404— no candle with that id
Served with Cache-Control: public, max-age=31536000, immutable.
Candle images are immutable — a candle id maps to a deterministic GIF — so they carry a one-year immutable cache header and are safe to cache forever in browsers and at a CDN edge (no purging ever needed).
To offload generation to a CDN like Cloudflare, add a Cache Rule matching /candles/*/image with:
- Cache eligibility: Eligible for cache (required — the extensionless path is treated as dynamic otherwise)
- Cache key → Query string: Ignore all query strings (prevents
?x=randomcache-busting from hammering the origin)
This project includes a GitHub Action to build and publish Docker images to ghcr.io.
See .github/workflows/docker.yml
Made with memes, Go and love by your friendly DevOps priest.
Bless your pipelines. Amen. 🙏