Skip to content

Architecture

Project Loom is an app-agnostic GitOps platform: a single k3s node (this instance is arm64) that provides edge, TLS, delivery, and databases, then lets apps plug in. The same provision + overlay process runs on the next server — only hosts and ApplicationSet rows change. Traefik is the sole public edge. Operators and workloads are reconciled from webb1es/loom by Argo CD. Each workload lives under workloads/<app> (Penvoice is one example).

The diagram below shows the platform layer plus a single generic <app> workload. Add more apps by dropping another workloads/<app> alongside it.

flowchart TB
  subgraph ext[Externals]
    SPA[App frontend<br/>e.g. Vercel SPA]
    Oracle[Oracle Object Storage<br/>Postgres backups]
    GHCR[GHCR<br/>container images]
  end

  Internet((Internet)) -->|"80 / 443"| Traefik

  subgraph node[k3s node]
    Traefik[Traefik edge<br/>+ cert-manager TLS]

    subgraph platform[platform layer]
      subgraph argocd[ns: argocd]
        Argo[Argo CD<br/>+ Rollouts / Workflows / Events]
      end
      subgraph cm[ns: cert-manager]
        CM[cert-manager]
      end
      subgraph cnpg[ns: cnpg-system]
        CNPG[CloudNativePG operator]
      end
      subgraph kcop[ns: keycloak]
        KCop[Keycloak operator]
      end
      subgraph kci[ns: keycloak-&lt;env&gt;]
        KCi[Keycloak instance]
        KCpg[(keycloak-pg)]
      end
      subgraph inf[ns: infisical]
        InfSecOp[Infisical Secrets Operator]
        InfSrv[Infisical server]
        Infpg[(infisical-pg)]
      end
    end

    subgraph app[ns: &lt;app&gt;-&lt;env&gt;]
      API[&lt;app&gt; Rollout]
      APIpg[(&lt;app&gt;-pg)]
      AppSec[(&lt;app&gt;-api-kc<br/>operator-owned)]
    end

    Traefik --> Argo
    Traefik --> KCi
    Traefik --> InfSrv
    Traefik --> API
    API --> APIpg
    KCi --> KCpg
    InfSrv --> Infpg
    InfSecOp -->|reads project| InfSrv
    InfSecOp -->|writes| AppSec
    AppSec --> API
  end

  SPA -->|JWT to| API
  SPA -->|PKCE login| KCi
  GHCR -->|pulls image| API
  APIpg -->|WAL + base backup| Oracle
  KCpg -->|WAL + base backup| Oracle
  Infpg -->|WAL + base backup| Oracle

You (the operator, not the software kind) edit secret values through Infisical’s browser UI — the Infisical Secrets Operator is what turns that into the plain Kubernetes Secret <app>-api-kc each Rollout already reads via envFrom. See Secrets.

80/443 are open to the internet (Traefik). Run kubectl on the node, or locally over Tailscale — Access.

Two delivery mechanisms: a one-time Helm bootstrap for the platform plumbing, then GitOps for everything else (the remaining operators + your apps). See GitOps & the app-of-apps for the reconcile model.

The platform layer is fixed; the app rows are templated — each app you onboard adds one GitOps row under workloads/<app>.

ComponentHowNamespace
cert-managerHelm — Provisioncert-manager
Argo CD / Rollouts / Workflows / EventsHelm — Provisionargocd
CNPG operatorGitOps — apps/cnpg-operatorcnpg-system
Keycloak operatorGitOps — apps/keycloak-operatorkeycloak
Keycloak instance + Postgres (per env)GitOps — ApplicationSetkeycloak-<env>
Infisical server + secrets operator + PostgresGitOps — apps/infisical*infisical
<app> + Postgres + Redis (per env)GitOps — workloads/<app>/overlays/<env><app>-<env>

The Helm layer is Argo CD + cert-manager (you cannot GitOps-install Argo with Argo). No metrics stack yet. Once Helm is up, bootstrap/root-app.yaml takes over and reconciles the rest — every operator and every workloads/<app>.

Exact chart/operator versions installed during the Helm bootstrap of the platform:

Chart / operatorVersion
cert-managerv1.20.2
argo-cd9.5.21
argo-rollouts2.41.0
argo-workflows1.0.15
argo-events2.4.21
CloudNativePG0.28.3 (operator v1.29.1)
Keycloak operator26.6.3
Infisical (server chart)1.10.0
Infisical Secrets Operator0.11.8

Platform consoles are fixed; app endpoints follow each app’s own domain.

URLWhatServed by
loom.webbies.devThis guideoff-cluster or static host
control.webbies.devArgo CD (apps portal)Traefik → argocd
uat.auth.webbies.devKeycloak UATTraefik → keycloak-staging
auth.webbies.devKeycloak prodTraefik → keycloak-prod
vault.webbies.devInfisical UITraefik → infisical
api.<domain><app> APITraefik → <app>-<env>
<domain><app> frontendexternal (e.g. Vercel)

The recipe — Dockerfile, CI to GHCR, ApplicationSet rows, overlays, optional CNPG, timed canary — is the Onboard an app playbook. A new node is Provision.