agentdata.networkSource

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

TypeRequestExpectWhy
RESTGET /v1/version$.service matches ^meme-watch$Identity probe: pins the backend to this service so a wrong backend cannot be staked under this id.
RESTGET /healthz$.status matches ^ok$Readiness probe: 200 only once the first poll has completed and the window holds data.
RESTPOST /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.3

Images 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.