Security & Threat Model

Last updated: June 23, 2026 · Applies to Tempo 1.x

The short version: Tempo protects your tokens and your data at rest, runs no cloud and no telemetry, and assumes the network it sits on is a home LAN you control. By default the ingestion port speaks plain HTTP — a deliberate, documented choice for a trusted LAN, not an oversight. Since 1.1 you can also turn on a native TLS listener and require it per sender. This page states all of that without hand-waving. Secure by option, honest by default.

The trust boundary Tempo assumes

Tempo is built for homelab and self-hosted setups: Home Assistant, a NAS, UniFi controllers, backup and monitoring stacks, your own scripts — usually running on dedicated hosts, not on the same Mac as Tempo. To receive their events, Tempo's ingestion listener binds 0.0.0.0 and is reachable from other machines on your local network. The threat model treats your LAN as a semi-trusted zone: the devices on it are ones you own or have admitted, and you are the network's administrator. This is the same posture most homelab tooling takes, and it is the assumption everything below is calibrated against.

If that assumption does not hold for your network, the in-transit and hardening sections tell you exactly what changes and what to do about it.

What is protected at rest

These protections ship in Tempo 1.x today. The architecture & security post covers the reasoning in more depth; the summary:

In transit, by default: cleartext HTTP

This is the part a careful reader most needs stated plainly, so here it is: by default, Tempo's ingestion listener speaks plain HTTP. (Since 1.1 you can turn on native TLS — see encrypted ingestion below; this section is about the default.) A device that can capture packets on the same LAN segment — a machine running tcpdump or Wireshark, a compromised switch, an attacker on the same Wi-Fi — can read the per-provider token in the request header and the JSON payload, including any sensitive fields you put in the event (hostnames, IPs, account identifiers, message bodies). HTTP does not encrypt any of that.

Why is the default plain HTTP, given how carefully the tokens are protected at rest? Two concrete reasons, not laziness:

So the HTTP default is a documented decision for a trusted LAN — but it is a real limit, and it is stated as one rather than glossed over. If your network is not one where you trust every device that can see the wire, read on.

When the HTTP default is fine — and when it is not

Fine, as-is:

Reconsider, and harden:

Hardening you can do today

All of these work with the current release. Pick what fits your network:

Encrypted ingestion (since 1.1)

Tempo 1.1 added a native TLS listener. It is off by default — the plain LAN path stays the frictionless default — and you turn it on in Settings → Ingestion → Secure (TLS). How it works:

The cleartext default does not go away — it stays the frictionless path for simple, trusted LANs. You opt an individual sender into TLS when its data or its network warrants it. That is what secure by option, honest by default means in practice. (This supersedes the "TLS is a v2 item" note in the earlier architecture post.) Loading your own certificate in place of the self-signed one is planned for a later 1.x update.

What Tempo does not defend against

Stated explicitly, so the boundaries are clear:

Reporting a vulnerability

If you find a security issue, please report it privately first at [email protected] rather than opening a public issue, and give a reasonable window to fix it before disclosure. General security questions and feedback are welcome on the tempo-scores GitHub repo and in the Discord.

Changes to this page

This is a living document. When the security posture changes in a substantive way, the date at the top will change and the change will be noted in the release notes of the version that introduced it.