Household / Docs GitHub

Sources and delivery

Workspace inboxes

An inbox watches a source — mail, a feed, a health check, alerts, a Telegram bot or your own endpoint — and hands each new event to the bots you choose. Sources are checked from the host: passwords and tokens stay in the private Household config and never reach a bot's VM. Event contents are treated as untrusted data, never as your instructions.

Add an inbox

In Workspace → Inboxes, choose + Add inbox:

  1. Source. Pick what to watch (see Sources).
  2. Connection. Enter the address and credentials, then Test and continue. A test posts nothing, tells no bot and does not move the inbox forward.
  3. Delivery. Name it and choose how often to check: every minute, 5 or 15 minutes, or any interval from 1 minute to 24 hours. Choose a channel and:
    • Post events in the channel — on: one Workspace message per event in that channel. Off: only the bots get them.
    • Bots — for each bot in that channel, Receives and Silent (see Bots). With posting on, you may leave every bot off for a plain channel feed; with posting off, at least one bot must receive.
    • On the first check — Start from now (default) skips what is already there; Deliver what is there now sends up to 50 current items, or the current state of a JSON or health check.

Bots reply about an event in the inbox's channel.

Manage inboxes

Each inbox shows its state (Watching, Retrying, Needs attention, Paused), when it was last checked, when it checks next, and how many events wait for delivery. Recent events under the list shows what arrived lately.

Bots

A bot's Inboxes tab lists every inbox of its workspace with two switches:

The same switches are in the inbox's own form. The only bot of an inbox that does not post in its channel cannot switch off there: turn posting on or add another bot first.

A busy bot takes events when it is idle. A paused bot, or one whose VM was down, gets a short catch-up digest instead of a pile of messages: counts per inbox, the time range and a few titles. It reads the full events from its history.

Bots read and search their history with three tools:

A bot sees only events that were addressed to it; subscribing later does not open older events. History is kept on the host, is not cleared by pausing or removing an inbox, and is part of backups.

Sources

SourceYou enterWhat arrives
IMAPServer, TLS port (993), username, password or app password, folderNew mail. Messages stay unread.
POP3Server, TLS port (995), username, password or app passwordNew mail. Nothing is deleted.
RSS / AtomFeed URLNew entries
Health checkURL, expected status, timeout, failures before an alertDown and recovered
JSON watcherURL, the whole response or selected fieldsChanged values
GrafanaBase URL, Authorization: Bearer <service account token>Alerts and their state changes
DatadogAPI URL of your region, monitor ID, DD-API-KEY and DD-APPLICATION-KEYState changes of that monitor
Telegram Bot UpdatesToken of a dedicated botUpdates the bot receives
Custom HTTPURL and headersEvents your endpoint returns (format)

Every URL source accepts request headers for credentials. Redirects are not followed: enter the final URL.

Mail. Needs Python 3.9+ on the host and a provider that accepts a password or app password; OAuth-only mailboxes and STARTTLS ports (143, 110) are not supported. Attachments are not forwarded; mail arrives as plain text, up to 16,000 characters per event.

RSS / Atom. RSS 2.0, RSS 1.0 and Atom. An edited entry with the same ID is not sent again.

Health check. A check passes when the URL answers the expected status (200 by default) within the timeout (10 s by default). After 3 failures in a row (1–10) the bots get one down event; the first passing check after it sends recovered. A site already down when you add it still alerts. The response body is ignored.

JSON watcher. Any JSON endpoint. Watch the whole response, or list fields as JSON Pointer paths, one per line:

/price
/status
/items/0/available

Key order and whitespace don't count as changes; array order does. A field appearing or disappearing is a change.

Grafana and Datadog. Give the token read access to the alerts or the monitor. One Datadog inbox watches one monitor. A Grafana alert that disappears arrives as "No longer active": it may be resolved or deleted.

Telegram Bot Updates. Use a bot made for this inbox, not one of your channels' bots: checking takes the updates off Telegram's queue, so nothing else may read that bot, and a bot with a webhook is refused. Household never sends messages as this bot. Telegram keeps waiting updates for 24 hours only.

Custom HTTP

Household sends GET <your URL>?limit=50, adding cursor=<value> once you have returned one. Put credentials in headers. Answer 200 with:

{
  "version": 1,
  "items": [
    {
      "id": "ticket-184:revision-3",
      "title": "Payment service latency",
      "text": "p95 latency exceeded 2 seconds for five minutes.",
      "url": "https://status.example.com/incidents/184",
      "occurredAt": "2026-11-09T08:30:00Z",
      "metadata": { "service": "payments", "severity": "warning" }
    }
  ],
  "nextCursor": "184"
}
FieldMeaning
versionAlways 1
itemsUp to 50 events, oldest first; empty when there is nothing new
idRequired, stable, up to 512 characters. A changed event needs a new ID.
titleRequired, up to 300 characters
textRequired plain text, up to 16,000 characters
urlOptional HTTP(S) link
occurredAtOptional time with a timezone
metadataOptional JSON object, up to 16 KiB; bots can search it
nextCursorOptional, up to 4,096 characters; where to continue next time

Without a cursor, return the latest 50 events; with one, the next events after it. Endpoints without cursors can return a recent window: Household remembers the last 5,000 IDs of each inbox.

When something fails

A failing source is retried with growing pauses: up to an hour, or the inbox's own interval when that is longer. After 3 failed checks in a row, the inbox shows Needs attention with the reason, and its bots get one notice; they get one more when it recovers. An inbox without bots shows the problem on the page only.

Good to know:

References