sovereign-agentic-os
Health Warn
- License — License: Apache-2.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Sovereign Agentic OS — self-hostable, EU-sovereign agentic data platform on Kubernetes (pre-beta). One Helm chart, runs in your own cluster.
Sovereign Agentic OS — stack (umbrella chart)
The downloadable/installable artifact for the Sovereign Agentic OS: one umbrella Helm
chart (charts/sovereign-agentic-os) that brings up the platform (Layers 1–4 + a
secure-by-default baseline) on any Kubernetes cluster — self-contained and works out of the
box. Layer 4 (Science/ML) is opt-in and off by default.
Spec lives one level up in ../stackit/. Decisions there are settled — this repo
implements them.
Quickstart (one command)
# prereqs: docker (running), kind, helm, kubectl
kind create cluster --name agentic-os # or let install.sh create it
./install.sh # press Enter through every prompt
Pressing Enter through every prompt gives the fully self-contained install: every
backend bundled (Postgres/CloudNativePG, OpenSearch, ClickHouse, Valkey, MinIO object
storage) and a tiny local mock LLM — nothing external required. The wizard can instead opt
any backend into a managed/external service (or "all STACKIT managed").
When it finishes, install.sh prints the demo logins. The default Administrator-style
console login is Langfuse: [email protected] / langfuse-local-dev-admin
(plus Superset admin / superset-admin-local-dev, LiteLLM admin /litellm-admin-local-dev, Forgejo gitea_admin / forgejo-admin-local-dev, and Argo CDadmin). Non-interactive: ./install.sh --defaults. Remove: ./install.sh --uninstall.
Two front doors (port-forward, then open):
kubectl -n agentic-os port-forward svc/os-ui 8080:3000 # OS UI — product front door
kubectl -n agentic-os port-forward svc/admin-console 8081:8080 # Admin Console — operate the stack + docs
Presets: values.selfcontained.yaml (default) · values.stackit-managed.yaml (backends →
STACKIT managed) · values.example.yaml (the mode: bundled|external contract).
Deploy to STACKIT (recommended: single node). To run on STACKIT, follow
docs/stackit-deployment-guide.md— the primary,
verified path: oneg2i.8node, single AZ, all backends self-contained, pause off-hours
withdeploy/stackit off. (Managed-services Mode B and multi-node HA are known-blocked:
cross-node pod networking on SKE-in-an-SNA is broken — single node sidesteps it.)
The OS UI is a v1.0 front door (os-ui 0.5.99) — every sidebar tab is a real,
live surface. It ships with real, self-hosted authentication (scrypt-hashed passwords,
signed sessions, four roles) — see First-run sign-in below. A future swap to Ory keeps
the samecurrentUser/requireUserseam.
First-run sign-in (OS UI)
The OS UI ships with no real or demo users — only a secure first-run bootstrap:
- Bootstrap. On the very first run the identity store is empty, so a single default
admin exists:admin/admin. Open the OS UI and sign in with it. - Forced setup. You are immediately required to set a real username + email + a
strong password (min 12 chars, mixed character classes; weak passwords are rejected).
The instant you submit, theadmin/adminlogin is disabled. - Email verification. Setup returns a verification link (in a real deploy this is
emailed; on local-kind it is shown so you can click it). Verifying your email
permanently deletes the bootstrap admin —admin/adminis gone for good. - Recovery key. As an admin, go to Users → Account recovery and Generate a
master recovery key. It is shown and downloaded once; the server stores only a
hash. If you are ever locked out, use it at/recoverto reset any account's
password. Lose it and it cannot be recovered — store it offline.
Passwords are never stored in plaintext, never logged, and never returned to the browser.
The session secret is auto-generated into the os-ui-session Kubernetes Secret (never the
in-code dev fallback). Operators can pre-provision real users via osUI.usersSeed (a JSON
array; plaintext passwords there are hashed on ingest) — but the default ships none.
Local only. Real STACKIT provisioning stays gated on the SA key + cost sign-off
(../stackit/stackit.md).
What ships today
os-ui 0.5.99 · chart 0.2.11
Sidebar tabs (every one is live)
Five sections. All tabs are real surfaces — no mocks, no stubs.
Entry — Home (live stack status) · Cockpit · Tutorials · MCP (builder+) · About / Licenses
Plan — Strategy · Big Bets · Operating Model · Workflows · Marketplace (builder+)
Context — Knowledge · Files · Data · Connections · Metrics
Build — Agents · Software · Science · Dashboards · Console (builder+, Shell admin-only)
Govern — Policies & Approvals (builder+) · Monitoring (builder+) · Components (admin) · LLM Gateway (builder+) · Admin (builder+, admin-gated tiles)
Highlights
- Native ECharts dashboards. Tier-1 panels are server-rendered ECharts queried from Cube via
the governed SQL API with per-user RLS — no<iframe>. Tier-2 links out to Power BI, Tableau,
or Superset in a dedicated tab. - Connector catalogue. 30+ connectors in 11 categories: messaging (Slack, Gmail, Google
Calendar, Outlook, Teams), code & DevOps (GitHub, Supabase, Atlassian), docs & knowledge
(Notion), operational databases (PostgreSQL, MySQL, SQL Server, MongoDB via Trino federation),
data warehouses (Snowflake, BigQuery, Databricks, AWS Glue, Fabric), enterprise apps (Salesforce,
Airflow, Kajabi), cloud governance & ML (Microsoft Entra, Purview, Azure AI Foundry, AWS
SageMaker, GCP identity, Snowflake governance), and LLM providers. - FiveTran-style scheduled incremental sync. Full-refresh, append (
_loaded_at/_batch_id
lineage), and cursor-based incremental modes; a durable sync-runs store with cursor watermarks and
quarantine after 10 consecutive failures; per-dataset CronJob provisioning. - Software builder. Epic/story tree (Define stage picks from four templates — Application /
Website / APIs only / Empty; the Sovereign app template is the default scaffold with AppShell +
OS-delegated identity + MCP link); Build stage streams agent commits to Forgejo with sha-aware
writes; Publish runs a live security scan; Operate shows live tool activity. - Governed MCP front door. Every OS capability is reachable over the MCP protocol with the
same OPA-checked, RLS/DLS-filtered routes the UI uses. LiteLLM is the model/MCP gateway. - Monitoring with honest accounting. Token/cost tallies hydrated from live Langfuse traces on
read; per-model EUR/1M pricing admin-editable; detail expands in the main window. - Analytics-as-code. Promoted datasets dual-write to a Forgejo
analyticsmonorepo as dbt
models + Cube YAML. Cube can be switched to serve from git (cube.modelSync.source: git). - Agents builder — 5-stage flow. Define · Design · Build · Run · Evaluate. Template library,
interactive grant picker (read / read+propose / read+write per capability), per-agent context
attribution in Evaluate, PDF results and evaluation reports.
For the full user guide see docs/Sovereign-Agentic-OS-Guide.md (and PDF).
Platform foundations — how the base was built
The thinnest end-to-end slice that proves the system works:
| Component | Role | Packaged as |
|---|---|---|
| LiteLLM | model / MCP gateway | wrapped upstream chart |
| Langfuse v3 | observability / tracing | wrapped upstream chart |
| ↳ CloudNativePG Postgres | Langfuse metadata DB | operator + Cluster CR |
| ↳ ClickHouse | Langfuse analytics | bespoke template |
| ↳ Valkey (BSD-3, not Redis) | Langfuse queue/cache | bespoke template |
| ↳ MinIO (S3 API) | object-storage stand-in for STACKIT Object Storage (local dev only) | bespoke template |
| OpenSearch | retrieval backbone (vector + lexical) | wrapped upstream chart |
| mock-model | local OpenAI-compatible stub (sovereign/offline) | bespoke template |
| sample LangGraph agent | calls LLM via LiteLLM, traced in Langfuse, RAG over OpenSearch | bespoke template |
No pgvector (OpenSearch is the retrieval backbone). MinIO (AGPL) is the local S3 stand-in
only — never bundled/shipped; on STACKIT the real Object Storage endpoint is used. No Redis (SSPL) — Valkey.
Prerequisites
- A container runtime +
dockerCLI (Colima or Docker Desktop) kind,helm,kubectl- ~14 GB / 6 CPU available to the runtime VM (the slice is RAM-bound: OpenSearch +
ClickHouse + Postgres)
Run it locally
Recommended: use
./install.sh— it handles all steps below interactively. The manualhelm install -f values.local.yamlpath below is kept for reference; the wizard supersedes it.
# 0. validate the chart (no cluster needed)
helm lint charts/sovereign-agentic-os
# 1. create the local cluster
kind create cluster --name agentic-os
# 2. bootstrap cluster-scoped operators (CloudNativePG) — see scripts/bootstrap-local.sh.
# Operators ship CRDs + admission webhooks and must exist before the OS chart's
# CRs are applied (mirrors stackit.md §2).
./scripts/bootstrap-local.sh
# 3. build the two bespoke images and load them into kind
docker build -t sovereign-os/mock-model:0.1.0 images/mock-model
docker build -t sovereign-os/sample-agent:0.1.0 images/sample-agent
kind load docker-image sovereign-os/mock-model:0.1.0 sovereign-os/sample-agent:0.1.0 --name agentic-os
# 4. render + client-validate (CRDs from step 2 must be present)
helm dependency build charts/sovereign-agentic-os
helm template agentic-os charts/sovereign-agentic-os -f values.local.yaml \
| kubectl apply --dry-run=client -f -
# 5. install
helm install agentic-os charts/sovereign-agentic-os \
-n agentic-os --create-namespace -f values.local.yaml
# 6. watch it come up
kubectl -n agentic-os get pods -w
Teardown: kind delete cluster --name agentic-os.
Validate the slice (the success gate)
# RAG answer grounded in OpenSearch-retrieved context, traced in Langfuse:
kubectl -n agentic-os run ask --rm -i --restart=Never --image=curlimages/curl:8.11.1 -- \
curl -sS http://sample-agent:8000/ask -G \
--data-urlencode "q=What provides the retrieval backbone for vector and lexical search?"
# See the trace (uses the headless-provisioned dev keys):
kubectl -n agentic-os run lf --rm -i --restart=Never --image=curlimages/curl:8.11.1 -- \
curl -sS -u pk-lf-localdev0000public:sk-lf-localdev0000secret \
http://agentic-os-langfuse-web:3000/api/public/traces?limit=5
Open the UIs:
kubectl -n agentic-os port-forward svc/agentic-os-langfuse-web 3000:3000 # Langfuse
kubectl -n agentic-os port-forward svc/agentic-os-litellm 4000:4000 # LiteLLM
Pinned versions
| Thing | Version |
|---|---|
| Umbrella chart | 0.2.11 |
| OS UI | 0.5.99 |
| Langfuse chart / app | 1.5.36 / v3.194.1 |
| LiteLLM chart | 1.90.0 |
| OpenSearch chart | 3.7.0 |
| CloudNativePG operator chart | 0.28.3 (op 1.29.1) |
| Postgres image | 17.5 (digest-pinned) |
| ClickHouse / Valkey / SeaweedFS | 24.8 / 8.1-alpine / 3.97 (digest-pinned) |
| Agent deps | langgraph 0.3.34, langfuse 3.15.0, openai 1.109.1 |
Build order (incremental — thinnest runnable slice first)
Each step was added to the same chart, installed, and validated before the next.
Step 1 is complete — all eight are running and validated on kind:
- ✅ Umbrella scaffold (lint gate)
- ✅ kind cluster + object storage (SeaweedFS) — bucket + S3 put/get
- ✅ CloudNativePG operator + Postgres
Cluster—langfuseDB healthy - ✅ Valkey + ClickHouse — auth + DDL
- ✅ Langfuse v3 (wired to all four backends) — health OK, 70 PG + 12 CH tables
- ✅ LiteLLM gateway + local mock model — chat + embeddings via the gateway
- ✅ OpenSearch + sample knowledge index — kNN search
- ✅ Sample LangGraph agent → success gate: RAG answer + Langfuse trace
Layer 2 (Context / Foundations) — all 7 built and validated
Added incrementally on the same chart (light→heavy), each validated + committed:
- ✅ OPA — default-deny tool authorization (rag allowed, web_fetch denied)
- ✅ Docling — doc parsing (HTML→markdown)
- ✅ Haystack — RAG retrieval pipeline over OpenSearch (embeds via LiteLLM)
- ✅ Dagster — orchestrator on CNPG (arm64-native image; assets load in the UI)
- ✅ dbt — seed→staging→mart into the CNPG
warehouse - ✅ Cube — metrics over the dbt warehouse (revenue by day)
- ✅ OpenMetadata — catalog/lineage on CNPG + OpenSearch (175 tables, search indices)
Build-and-toggle (RAM): the full L1+L2 set is sized for a 96 GB STACKIT node;
on a 14 GB local VM, values.local.yaml turns Docling and OpenSearch
Dashboards off to make room for OpenMetadata. Product defaults (values.yaml)
keep everything enabled for STACKIT; flip the local toggles (or scale the VM) to
run them together.
Secure-by-default egress baseline (security.md) — done
Agents get no raw internet; outbound is granted, proxied, allowlisted, audited:
- ✅ Egress proxy (tinyproxy) — single outbound chokepoint, deny-by-default
domain allowlist (allowlisted → through; others → blocked). - ✅ Governed
web_fetchtool — the only sanctioned path to the web:
OPA-authorized per principal (grant-per-key), routed through the proxy, returns
sanitized content as DATA. Validated: ungranted → 403; granted+allowlisted →
200; granted+non-allowlisted → proxy-blocked. - ✅ Default-deny NetworkPolicies — shipped ON; deny egress except DNS /
intra-namespace / API-server, and only the proxy reaches the internet. (kindnet
doesn't enforce locally; Cilium enforces on STACKIT.)
Dagster → dbt — done
The Dagster image bundles dbt + dagster-dbt; dbt models load as Dagster assets
(daily_revenue/stg_orders/raw_orders) and materializing them runs dbt build against the warehouse (validated: RUN_SUCCESS).
Layer 3 (MCP tools + central Trino/Iceberg) and the OS UI (os-ui 0.5.99) are complete and shipped.
Data tier wiring (Layer 2)
dbt builds models into the CNPG warehouse → Cube serves metrics over them →OpenMetadata catalogs everything, searching via OpenSearch. Dagster
orchestrates (dbt-as-assets is the next wiring). Haystack + Docling feed the
knowledge RAG path the agents already use.
What runs (10 workloads)
seaweedfs · pg-1 (CloudNativePG) · valkey · clickhouse · agentic-os-langfuse-web
· agentic-os-langfuse-worker · agentic-os-litellm · mock-model · opensearch-master-0
· sample-agent. Pod requests sum to a few vCPU / ~7 GB; comfortable on a 6 CPU / 14 GB VM.
Notes & learnings (step 1)
- Operators are a bootstrap concern, not in-release. CloudNativePG ships a
Cluster
CRD + admission webhook; a singlehelm installthat also creates theClusterraces
the webhook. Split out intoscripts/bootstrap-local.sh(matchesstackit.md§2). Thekubectl apply --dry-run=clientgate therefore needs the CRDs present first. - Bitnami images are now paywalled/"legacy". Langfuse's and LiteLLM's bundled
subcharts default tobitnamilegacy/*. We disable them and wire our own permissive
backends (CloudNativePG / ClickHouse / Valkey / SeaweedFS) — which the spec mandates
anyway. This is the main reason to wire external backends explicitly. - CNPG rejects digest-only images (
spec.imageName) — it needs a tag for upgrade
detection. Usetag@digestto pin and satisfy it. - Langfuse requires Valkey
noeviction(it's a job queue) andclusterEnabled:false
for a single-node external ClickHouse (else it issuesON CLUSTERDDL that fails). - LiteLLM OOMs under ~1 GiB at startup (import-heavy). 1.5 GiB limit is stable. Run
DB-less for the thin slice; DB-backed virtual keys + cost caps (against CNPG) is a
fast-follow that security.md wants. - SeaweedFS all-in-one doesn't recover its raft leader after a kill, so it runs with
no livenessProbe (startup+readiness only) as an ephemeral local stand-in. - Local secrets are chart-created only under
profile: localand clearly marked dev
throwaways; nothing real is committed. On STACKIT every one of these is external.
Conventions
- No secrets in git. Secrets are external (k8s Secret / External Secrets references).
.gitignoreblocks key/secret patterns; the chart ships only sane secure defaults. - Pin upstream chart versions (
Chart.yaml) and image digests (values.yaml). - Only permissively-licensed components are bundled (see
../stackit/stack-decisions.md);
not-bundled boundaries honored (LangGraph Platform, Langfuse/ee, ELv2 tools). - Commits:
aborek <[email protected]>, small and clear.
License & Trademarks
- Core — Apache-2.0. Borek Data Ventures UG's own code (the OS UI, integration glue,
bespoke images, and the Helm chart) is licensed under the Apache License 2.0 — seeLICENSEandNOTICE. - Bundled components keep their own licenses. The platform aggregates independent
open-source components, each under its own license — we do not relicense them. The
full attribution manifest (component, version, SPDX id, and a pointer to the bundled
full license text underlicenses/) is inTHIRD-PARTY-LICENSES.md; a CycloneDX SBOM ships assbom.cdx.json. Notably, Forgejo (GPL-3.0-or-later) ships as a
separate service (mere aggregation) and Featureform (MPL-2.0) is optional; their
source records are inlicenses/source-offer.md. - Trademarks. "Sovereign Agentic OS" and "Data Masterclass" are trademarks of
Borek Data Ventures UG. All other names/marks are the property of their respective
owners. This project is not affiliated with, or endorsed by, the Apache Software
Foundation. - Enterprise Edition. Any future Enterprise features ship under
ee/with their
own commercial license (separate from Apache-2.0), gated behind a license key — seeee/README.md. The free core stays complete and open. - Contributing. Contributions are accepted into the Apache-2.0 core under a DCO
sign-off (git commit -s) — seeCONTRIBUTING.md.
Not legal advice — counsel should review before the public launch.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found