generated from coulomb/repo-seed
Replace the single "Services (TPSC)" nav entry with a Services section: Third Party (existing /tpsc cloud-third-party view), First Party (/services/first-party — Service Maturity Level + dev-repo columns, development_type=first_party), and Self Hosted (/services/self-hosted — self_hosted third-party OSS with upstream/host/runbook). New pages are filtered views over /services/catalog and degrade to an empty-state if the API is offline. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1.5 KiB
1.5 KiB
title
| title |
|---|
| Self Hosted Services |
Self Hosted Services Catalog
Services and webapps built on third-party / open-source software that coulomb
hosts and operates as part of the three-helix infrastructure
(hosting_type = self_hosted, development_type = third_party). coulomb runs
these but is not development-responsible for them.
First-party services that coulomb also self-hosts (e.g. the State Hub itself) are listed under First Party, classified by who develops them.
import {API} from "../components/config.js";
const services = await fetch(`${API}/services/catalog?hosting_type=self_hosted&development_type=third_party`)
.then(r => r.ok ? r.json() : [])
.catch(() => []);
const rows = services.map(s => ({
Service: s.name,
Slug: s.slug,
"Upstream OSS": s.self_hosted?.upstream_oss_project ?? s.owner_or_provider ?? "—",
"Helix Instance": s.self_hosted?.helix_instance ?? "—",
Host: s.self_hosted?.host_node ?? "—",
Runbook: s.self_hosted?.runbook_ref ?? "—",
Status: s.status,
}));
display(services.length === 0
? html`<div style="color:#64748b;padding:1rem;">No self-hosted third-party services registered yet. Add one with
<code>POST /services/catalog</code> (<code>hosting_type: "self_hosted"</code>,
<code>development_type: "third_party"</code>).</div>`
: Inputs.table(rows, {
columns: ["Service", "Upstream OSS", "Helix Instance", "Host", "Runbook", "Status"],
sort: "Service",
rows: 30,
}));