{#if loading && !model} {:else if model}
{#each HEALTH_ORDER as h} {#if model.counts[h]} {/if} {/each}
{#if problemMode || healthFilter} {/if}
{#each [['Hosts', model.nodes.filter((n) => n.kind === 'host').length], ['Containers', model.nodes.filter((n) => n.kind === 'container').length], ['Services', model.nodes.filter((n) => n.kind === 'service').length]] as [label, count], i}
{label} · {count}
{/each}
{#each model.edges as e} {/each} {#each model.nodes as n (n.slug)} {/each}
{#if !detailNode && problemMode}
status
Problems
{problemCount}
{problemCount === 1 ? 'entity' : 'entities'} not healthy
{#each problemGroups as g}

{HEALTH_LABEL[g.h]} · {g.items.length}

{#each g.items as it} {/each}
{/each}
{:else if !detailNode && healthFilter}
status
{HEALTH_LABEL[healthFilter]}
{healthItems.length}
{healthItems.length === 1 ? 'entity' : 'entities'}

{HEALTH_LABEL[healthFilter]}

{#each healthItems as it} {/each}
{:else if detailNode}
{detailNode.slug}
{detailNode.name}
{HEALTH_LABEL[detailNode.health]}
0}>{detailBlast.length}
{detailNode.kind === 'service' ? 'downstream service' : 'service'}{detailBlast.length === 1 ? '' : 's'} affected if this goes down

Attributes

{#if detailNode.kind === 'container'}
type{detailNode.type}
{/if} {#if detailNode.role}
role{detailNode.role}
{/if} {#if detailNode.ip}
ip{detailNode.ip}
{/if} {#if detailNode.publicHost}
url{detailNode.publicHost}
exposure{detailNode.fauth ? 'forward-auth gated' : detailNode.fauth === false ? 'no auth gate' : 'public'}
{:else if detailNode.url}
url{detailNode.url}
{/if} {#if detailNode.mounts.length}
mounts{detailNode.mounts.join(', ')}
{/if} {#if detailNode.repo}
config{detailNode.repo}
{/if}
{#if detailRunsOn.length}

Runs on

{#each detailRunsOn as it} {/each}
{/if} {#if detailDeps.length}

Depends on

{#each detailDeps as it} {/each}
{/if} {#if detailProvides.length}

{detailNode.kind === 'host' ? 'Hosts' : 'Provides'}

{#each detailProvides as it} {/each}
{/if} {#if detailNode.kind === 'service' && detailBlast.length}

Depended on by

{#each detailBlast as it} {/each}
{/if}
{:else}

Health

{#each HEALTH_ORDER as h}
{HEALTH_LABEL[h]}
{/each}

Lanes

Hosts — physical machines
Containers — LXCs & VMs
Services — what you actually use

Every service flows right from the machine that runs it. Hover any node to trace its chain and blast radius — what breaks if it goes down. Click to open it in a window. Dashed arcs are service-to-service dependencies.

{/if}
{:else}
Failed to load graph
{/if}