Meme Watch: operators
What a supplier needs to serve meme-watch.
- Service ID
meme-watch- Required version
meme-watch >= 1.0- Image
ghcr.io/thefeloniousmonk/meme-watch:1.0.3- Minimum RAM
- 1 GB
- Minimum disk
- 1 GB
- RPC types
- REST (expected)
Backend
The meme-watch container (Node 22, no runtime dependencies; built from github.com/TheFeloniousMonk/portal-services, meme-watch/backend) behind the HA RelayMiner. It polls DexPaprika every 120 seconds under a hard monthly credit governor and holds the window in memory, mirrored to a CSV on a small persistent volume, so every relay is served from cache and never waits on an upstream call. Each supplier must set its own key in MW_DEXPAPRIKA_API_KEY; without one it falls back to the keyless tier and the feed thins. Light on CPU and memory.
REST
Backend: meme-watch container on :8080; mount at /
POST /v1/launches, GET /v1/version, GET /healthz, GET /v1/capabilities, and GET /v1/openapi.json are expected. Every response is a JSON object; when csv format is requested the table rides in the 'csv' string field, always last. All inputs are read from the POST body; no query string or caller header is relied upon.
Notes
Every request is a POST JSON body to /v1/launches, answered from memory in milliseconds. The response carries as_of and complete_before so a consumer can tell a quiet minute from one still being indexed upstream, and pending_identity for launches discovered but not yet named. SAGE operators: type generic (its name for passthrough), rpc_types ["rest"], relay_timeout at least 10s; see sage-service.yaml in the service repository.
Health checks
| Type | Request | Expect | Why |
|---|---|---|---|
| REST | GET /v1/version | $.service matches ^meme-watch$ | Identity probe: pins the backend to this service so a wrong backend cannot be staked under this id. |
| REST | GET /healthz | $.status matches ^ok$ | Readiness probe: 200 only once the first poll has completed and the window holds data. |
| REST | POST /v1/launches{"limit":1} | $.window_minutes matches ^60$ | Functional probe: exercises the query path and asserts the declared window. Structural rather than data-dependent, because the feed changes every poll. |
Running it
Build the backend from backend/, or pull the published image:
docker pull ghcr.io/thefeloniousmonk/meme-watch:1.0.3Images are tagged with the version the backend reports at GET /v1/version. Keep up with the required version above; an older backend can reject requests that newer callers send.
The service's deploy/ folder has:
The service's docs cover its settings and anything a supplier must provide.