{% set page_title = 'Links' %}
{% include '_header.html' %}
{#- The shared toolbox (ADR-0030). Not documentation and not a runbook — a
subject's runbook lives on the check that watches it — but the two or three
dashboards and tools somebody mid-incident wants *now*, without hunting
through a wiki. So: a launcher. One flat level of groups flowed into columns,
each entry a mark and a title, curated order preserved exactly as written.
Everything on it comes from the deployment's own `config/links.yaml`; this
file owns only how it looks. -#}
{%- macro icon_image(link, file, variant, favicon, side) -%}
{#- One image. `file` is what the search path resolved for this background;
where it resolved nothing we fall through to the entry's own origin
favicon, the step before the neutral glyph (ADR-0030 §3). A remote icon
keeps its own URL — the route never proxies one. -#}
{%- set source = (file.url or url_for('link_icon', variant=variant, name=link.icon))
if file else favicon -%}
{%- if source %}{% endif -%}
{%- endmacro -%}
{%- macro icon_mark(link, icon) -%}
{#- A brand logo does not theme: a black mark vanishes on the dark themes and
a white one on the light. So an icon that declared a **pair** emits both
files and CSS hides one — the choice cannot be made here, because under
the `auto` theme the server does not know what the OS will resolve to.
Anything else — one file, a favicon — rides a **theme-invariant light
chip**, which is what keeps a single-file mark legible in every theme.
The chip is the floor, the pair is the upgrade (ADR-0030 §4). -#}
{%- set live = icon if icon and not icon.suppressed else none -%}
{%- set light = live.file_for('on-light') if live else none -%}
{%- set dark = live.file_for('on-dark') if live else none -%}
{%- set paired = live and live.paired -%}
{%- set favicon = (link.url | site_origin) ~ '/favicon.ico'
if link.url | site_origin else '' -%}
{%- if paired -%}
{{ icon_image(link, light, 'on-light', favicon, 'light') }}
{{ icon_image(link, dark, 'on-dark', favicon, 'dark') }}
{%- else -%}
{#- One file serves both backgrounds, so one image serves both: a
second copy would be the same bytes fetched twice. -#}
{{ icon_image(link, light, 'on-light', favicon, '') }}
{%- endif -%}
{%- endmacro -%}
{{ failure.name }} did not answer:
{{ failure.verdict.detail }} ({{ failure.verdict.url }},
checked {{ failure.verdict.checked_at | since }})No links yet.
They come from this deployment's own configuration — one flat level of groups, each with an ordered list of entries:
groups:
- title: Toolbox
links:
- title: Grafana
url: https://grafana.example.org/
icon: grafana
Put that in {{ links_file }} and reload — the file is
re-read when it changes, so nothing needs restarting.
icon: takes a name, never a URL — a dozen
entries for one tool cost one mark, one fetch, one probe. These
names are already installed. Each is drawn twice, once for a
light background and once for a dark one, and the page picks by
theme:
| name | on light | on dark |
|---|---|---|
{{ name }} |
{%- for variant, side in (('on-light', 'light'), ('on-dark', 'dark')) %}
|
{%- endfor %}
To use a mark of your own, put an icons/ directory
beside that file and drop the file in:
firewall.svg is the name firewall.
Name it after one of the marks above and it replaces that one.
A pair — firewall-on-light.svg and
firewall-on-dark.svg — is one name with a drawing
for each background; a single file rides a light chip instead, so
it stays legible under every theme.
Nothing matches. Esc clears the filter.