Owly Post
Self-hosted

Troubleshooting

From symptom to cause to fix, starting with the four most common ones

Start with the logs. Almost every problem below leaves a line there.

Terminal
docker compose logs --tail=200 worker
docker compose logs --tail=200 app

No digest arrived

Cause

  • The slot was missed. A digest tick that fires more than 10 minutes late is skipped, with no catch-up. The host was asleep or off, or the worker was restarting. See Scheduling.
  • DIGEST_TIMEZONE is unset, so the slot is evaluated in UTC and lands at another hour than you expect.
  • The run failed. The Digests page shows a digest with status failed; open it and expand Raw model response or error.
  • There was nothing new. The Digests page shows an empty digest, and no email is sent for those by design.
  • The digest was generated but not mailed: status ready. See Email does not arrive.

Fix

  • Press Generate digest now on the Digests page; check docker compose logs app for Digest run finished or an error.
  • Set DIGEST_TIMEZONE=Europe/Amsterdam (your zone) in .env and docker compose up -d worker.
  • For a failed digest on a local model, see Digest failed on Ollama below; on an API provider, check the key and the account's credits.

A feed is not being fetched

Cause

  • The source is in status error: five consecutive failures. Its last error is shown under the source on the Sources page and on the dashboard under Sources in error. Errored sources are retried once a day.
  • Feed responded with HTTP 403 or 404: the site blocks bots, or the feed moved.
  • Blocked private address for …: the feed resolves to a private or local network address, which the fetch guard refuses by design. Feeds on your LAN cannot be followed.
  • Nothing is wrong: the feed answered 304 Not Modified, which is the normal case for a feed without new posts.

Fix

  • Press Resume on the source to reset the failure count and retry immediately.
  • Check the URL in a browser; if the feed moved, delete the source and add the new URL.
  • Read the exact message: docker compose logs worker | grep "Ingest failed".

The summary is empty

Cause

  • Not written yet. Summaries are produced in batches of 100 per fetch run, so a large backlog takes a few runs.
  • The model call failed for that item: Summary failed for item … in the logs. The item is retried on the next run.
  • The provider rejects every call: wrong key, no credits (Anthropic needs API credits, not a subscription), or a local server that is not reachable from the container.
  • The item genuinely has no content: a feed that only carries a title and a link, and a page the extractor could not read.

Fix

  • Wait for the next ingest run, or press Fetch now.
  • docker compose logs app worker | grep "Summary failed" and read the reason.
  • For a local server, confirm the container can reach it: docker compose exec worker node -e "fetch('http://host.docker.internal:11434/v1/models').then(r => console.log(r.status))" should print 200.

Email does not arrive

Cause

  • Email is not fully configured, so it is silently disabled. Resend needs RESEND_API_KEY; SMTP needs SMTP_HOST; both need DIGEST_EMAIL_FROM and DIGEST_EMAIL_TO.
  • Email skipped: SITE_URL is not configured.: the mail needs SITE_URL to build its links.
  • Resend error: …: usually the From address is not on a domain verified in Resend.
  • SMTP TLS mismatch: port 465 needs SMTP_SECURE=true; port 587 starts plain and upgrades with STARTTLS.
  • A relay on the Docker host is configured as localhost, which inside the container is the container itself. Use host.docker.internal (on Linux, add the extra_hosts mapping to the worker service).
  • The send failed after generation: the digest stays ready, the run does not fail, and the error is only in the logs.

Fix

  • docker compose logs worker | grep -i email shows exactly which of the above it is.
  • Fix .env, docker compose up -d, and press Generate digest now to test. A digest with status sent confirms delivery.

Less common

On this page