---
title: First Party Services
---

# First Party Services Catalog

Services **coulomb is development-responsible for** (`development_type = first_party`),
whether deployed to a cloud or self-hosted on coulomb infrastructure. The
**Service Maturity Level** column tracks each service against the
[Service DoM](/policy/service-dom) (1 · Core → 2 · Standard → 3 · Mature).

```js
import {API} from "../components/config.js";
```

```js
const services = await fetch(`${API}/services/catalog?development_type=first_party`)
  .then(r => r.ok ? r.json() : [])
  .catch(() => []);
const repos = await fetch(`${API}/repos/`)
  .then(r => r.ok ? r.json() : [])
  .catch(() => []);
const repoById = new Map(repos.map(r => [r.id, r.slug]));
```

```js
const LEVEL = {1: "1 · Core", 2: "2 · Standard", 3: "3 · Mature"};

const rows = services.map(s => ({
  Service: s.name,
  Slug: s.slug,
  Hosting: s.hosting_type === "self_hosted" ? "self-hosted" : "cloud-hosted",
  "Maturity Level": s.maturity_level ? LEVEL[s.maturity_level] : "—",
  "Dev Repo": s.first_party?.repo_id ? (repoById.get(s.first_party.repo_id) ?? "(unlinked)") : "—",
  Domain: s.first_party?.owning_domain ?? "—",
  Status: s.status,
}));
```

```js
display(services.length === 0
  ? html`<div style="color:#64748b;padding:1rem;">No first-party services registered yet. Add one with
      <code>POST /services/catalog</code> (<code>development_type: "first_party"</code>).</div>`
  : Inputs.table(rows, {
      columns: ["Service", "Hosting", "Maturity Level", "Dev Repo", "Domain", "Status"],
      sort: "Service",
      rows: 30,
    }));
```
