Files
wiki-jokes/README.md
T

2.4 KiB

Wiki Jokes

5 jokes every day, generated by an LLM from Wikipedia's Today's Featured Article.

How it works

  • A scheduled job (06:00 Europe/Copenhagen, plus immediately on cold start) fetches the day's featured article from the Wikipedia REST feed and asks any OpenAI-compatible endpoint for exactly 5 jokes as JSON.
  • Jokes are stored in SQLite (/data/jokes.db) and served instantly — no LLM call at request time.
  • On failure: retries every 15 min, up to 3 attempts per day. If still failing, the page keeps showing the latest batch with a "stale" note.

Run

cp .env.example .env   # set OPENAI_BASE_URL / OPENAI_MODEL / OPENAI_API_KEY
docker compose up -d --build
# open http://localhost:8080

Configuration (env vars)

Var Default Purpose
OPENAI_BASE_URL https://api.openai.com/v1 OpenAI-compatible endpoint (e.g. llamaswap)
OPENAI_MODEL gpt-4o-mini Model name
OPENAI_API_KEY (empty) Bearer token (optional for llamaswap)
GENERATE_HOUR / GENERATE_MINUTE 6 / 0 Daily generation time
MAX_ATTEMPTS 3 Retry budget per burst
RETRY_MINUTES 15 Retry interval
SLOW_RETRY_MINUTES 60 Cooldown after budget exhausted, then retries resume
WIKIPEDIA_LANG en Wikipedia language for the feed
DB_PATH /data/jokes.db SQLite location (volume-mounted)

Endpoints

  • GET / — today's 5 jokes + link to the featured article
  • GET /trmnl.json — JSON feed for TRMNL e-ink displays (see trmnl-plugin/)
  • GET /health — JSON: whether today's jokes exist / retries exhausted

TRMNL e-ink feed (BYOS — no TRMNL account)

GET /trmnl.json returns the day's jokes as JSON:

{
  "refresh_interval": 900,
  "day": "2026-10-05",
  "stale": false,
  "article_title": "White-headed fruit dove",
  "article_url": "https://en.wikipedia.org/...",
  "jokes": [{"text": "..."}]
}

This is the data source for trmnl-jokes-server (BYOS): a small server that renders the jokes into the 800x480 1-bit BMP the TRMNL firmware expects and answers /api/setup + /api/display directly, so the device never talks to the TRMNL cloud. See the trmnl-jokes-server repo README.

Optional access token: set TRMNL_TOKEN in .env; requests must then carry ?token=<token> or the header trmnl-token: <token>. Without the env var the endpoint is open — the jokes themselves are public anyway.