The platform observes, acts, and now reads as one coherent surface. End-to-end network visibility for any node (IP → switch → uplink → router → Traefik → Authentik → open ports), cross-adapter correlation surfaced on every pane and persisted at discovery, a single tabbed Network section, a de-sprawled top-level menu, and a follow-the-chain Approvals pipeline. Next, set by ADR-0032: a connector registry and multi-site onboarding.
dev/test/UAT app tiers, 3-node HA data tier, 4-node MinIO, observability + grafana tiers, edge + cache + frontend, meta — across pve1/pve2/pve3. Aros now discovers the full estate it lives on: ~46 VMs, 100+ containers, network devices, and the hardware beneath.
etcd + Patroni 4.x, 3-node, 2s failover via libpq multi-host. Validated at app layer, not just patronictl.
aros-docs · aros-infrastructure · aros-platform · aros-backend — Forgejo-hosted, Woodpecker-built.
Proxmox, TF AppRole, Forgejo, Woodpecker, PG-dev — KVv2 with per-service per-env layout.
One pane of glass
Aros is the operating system for self-sovereign infrastructure. One browser tab replaces twenty.
Today, operating a homelab estate means living across a dozen browser tabs — Proxmox for VMs, Portainer for containers, Unifi for networking, Vault for secrets, Grafana for metrics, PBS for backups, Traefik for routing, iDRAC for hardware, Cloudflare for DNS. Each tool is excellent at its job. None of them talk to each other. The operator is the integration layer, carrying context between tabs in their head.
Aros replaces that model. A single, tenant-aware control surface that absorbs every routine operation from every underlying tool — with better UX, a full audit trail, and the ability to hand routine work to AI agents under strict oversight.
The platform doesn’t replace the underlying tools; it wraps them behind adapter interfaces so the operator rarely needs to touch the native UIs for routine work. Proxmox, Unifi, iDRAC, Vault, PBS, Traefik, Cloudflare, ELK — they all become implementations of Aros capabilities, swappable without touching application code.
What's built vs. where it's going
The platform is being constructed in layers. Each sprint adds a structural component that the next sprint builds on. Nothing decorative until the foundations are load-bearing.
pve1, pve2, pve3
3 dev, 3 test, 3 UAT
aros-pg-dev-1/2/3, etcd + Patroni
plus 100+ containers, network devices, hardware — all correlated
Redfish per-host draw + inlet temp, charted over time
proxmox · unifi · traefik · redfish · docker · domains + 5 health
unit + e2e smoke, green every merge
Patroni leader kill, zero dropped requests
From commit to production, through three environments
Every code change follows the same path: push to Forgejo, build via Woodpecker, auto-deploy to dev, manual promote through test and UAT. The pipeline was validated with the hello-world reference service and has since carried the real aros-backend modular monolith.
The development pipeline is the first piece of Aros infrastructure that had to work before any application code could land. It was designed to be boring and repeatable — the same flow whether deploying a health-check skeleton or a full domain module.
The flow: a git push to Forgejo triggers Woodpecker CI. The pipeline builds a multi-stage Docker image, pushes it to Forgejo’s built-in OCI registry, and SSH-deploys to the dev cluster (aros-dev-1/2/3 on pve2). Promotion to test and UAT is manual — a TARGET-gated trigger in the Woodpecker UI. Test VMs span pve1/pve2/pve3 for real HA validation. UAT mirrors test topology.
Every VM in the pipeline was provisioned via Terraform, hardened via Ansible, backed up via PBS, and has its credentials stored in Vault. No hand-built infrastructure anywhere in the chain.
Three nodes, zero single points of failure
HA isn't bolted on. Every tier that matters is distributed across three Proxmox hosts from day one.
The architecture mandates three-node minimum for every tier. The three PVE hosts (pve1, pve2, pve3) form a quorum-capable cluster. App-tier VMs are distributed one-per-host in test and UAT. The data tier runs a 3-node PostgreSQL cluster managed by Patroni with etcd for consensus.
The HA proof point: during Sprint 1 closeout, the Patroni leader was deliberately killed while a curl loop probed the application’s health endpoint every 2 seconds. The leader flipped from .231 to .233 inside one probe interval. Every probe returned 200. Zero “(no response)” lines in the captured window. libpq’s target_session_attrs=read-write found the new leader on the next reconnect without the application doing anything.
This same pattern extends forward. Redis will run Sentinel across three nodes. MinIO will run erasure-coded across three nodes. Traefik will run one instance per node. When the network tier gets its VLAN segmentation and dual-switch MLAG, even the switching fabric will have no single point of failure.
What Aros will manage
The platform is structured as ten pillars — each independently navigable, each with its own data model and actions, all integrated through a common context model. Ask 'tell me everything about VM 102' and the answer draws from Infrastructure, Backup, Observability, Security, and Service Catalog.
The unified estate browser. Bare metal → hypervisors → VMs → containers → applications in a single navigable tree. VM lifecycle, container lifecycle, storage, networking, templates. Proxmox, UNRAID, Docker, Traefik, Unifi, iDRAC — all absorbed behind adapters.
Authentik-backed SSO across every managed service. Users, groups, tenants, roles, scopes. MFA, passkeys, API keys, service accounts. Federated identity. Session management. Every auth event audited.
Prometheus + Thanos for metrics, ELK for logs, OpenTelemetry for traces. Native dashboards for the daily view; embedded Grafana for deep dives. Replaces Uptime Kuma with built-in synthetic monitoring.
Terraform workspace management. Ansible playbook runner. Change management workflow. Runbook execution. Drift detection. The operator never runs terraform apply from a shell.
PBS integration, restic for offsite, restore drills on schedule, DR runbooks, health checks, SLO definition and tracking. Every protected resource has a verified, restorable backup.
Vault for secrets, CrowdSec for IDS, Trivy for vuln scanning, Falco for runtime security, cert tracking, lateral movement detection, compliance posture. Security of the entire estate on one screen.
Every service: health, URL, owner, docs, dependencies, SLOs. Service dependency map. Deploy new instances from blueprints. Impact analysis before changes.
Alert → incident → ticket → resolution → postmortem. Built in-house, not Jira. On-call schedule and routing. Status pages per tenant. MSP-ready customer comms.
Greenfield wiki with WYSIWYG editor. ADRs, runbooks, API docs (auto-generated from OpenAPI), per-tenant knowledge spaces. Deep links from estate resources to relevant docs.
Tenant CRUD with whitelabel branding. Resource quotas. Edge nodes at remote sites. Buddy backup, MSP customer sites, cloud drift backup. Sites operate autonomously when central is unreachable.
Absorbing the tools you already use
Every underlying tool is being absorbed in tiers. Tier 1: native UX better than the tool itself. Tier 2: functional UX, equivalent. Tier 3: SSO-protected passthrough to the tool's own UI. Over time, Tier 2 flows into Tier 1, and Tier 3 shrinks.
VM lifecycle, container lifecycle, backup jobs, Vault KV, Traefik routes, DNS records, alerts, power mgmt, …
ZFS advanced, UNRAID array, Vault policies, Unifi VLAN, firewall rules, restore drills, …
iDRAC BIOS, Unifi deep wireless, PVE cluster low-level
Proxmox, UNRAID, Docker, Portainer, Traefik, Unifi, iDRAC, Vault, PBS, Cloudflare, Grafana, Alertmanager, Uptime Kuma, ELK, CrowdSec
Swappable implementations, stable interfaces
Aros owns its abstractions. Underlying tools are adapters — implementations of capability interfaces. If Loki dies, the Logs adapter swaps to OpenObserve. If Authentik develops issues, the Identity adapter swaps to Zitadel. The application code never changes.
The adapter pattern is the architectural guarantee that Aros isn’t locked to any vendor or tool. Every external dependency sits behind a defined Python ABC (abstract base class) with capability declarations, health checks, and per-tenant configuration. The platform consumes adapters; it never consumes tools directly.
Concrete adapters in the v1 scope: Proxmox and UNRAID for Compute, ZFS and UNRAID and LVM for Storage, Unifi and Traefik and Cloudflare for Network, Authentik for Identity, Vault for Secrets, PBS and restic for Backup, ELK for Logs, Prometheus+Thanos for Metrics, CrowdSec for IDS, Trivy+Grype for Scanning, Falco for Runtime Security, Headscale for Mesh Networking.
Each adapter can be replaced independently. Each adapter declares its own sandboxing requirements. The same adapter interface that wraps Proxmox today could wrap a cloud hypervisor tomorrow — or a second homelab site across a Headscale mesh.
What Aros manages
The managed estate — everything beneath Aros that the platform observes, controls, and reports on.
PowerEdge servers via iDRAC for hardware health and power. Proxmox VE for virtualisation. Docker for containerised workloads. UNRAID KVM for NAS-resident VMs. Full lifecycle from provisioning to decommission, all in one tree view.
Pool management, dataset CRUD, snapshot schedules, scrub monitoring. UNRAID array + parity + cache. LVM volumes. ~80TB usable across the estate.
Unifi for switching and VLANs. Traefik for reverse proxy and TLS. Cloudflare for DNS and edge. Firewall rules managed from Aros, not spread across three UIs.
Every secret in KVv2, rotated, audited, scoped per tenant. Certificate tracking with expiry alerts. AppRole for machine identity. No secrets in environment variables or config files.
AI writes the code, AI proposes the fix, the operator approves
Aros is built to be operated by humans and AI agents interchangeably — same API, same audit log, same approval flows.
The agentic model is tiered. Routine, low-risk operations can self-heal automatically — a container that crashes gets restarted, a failed backup gets retried, a certificate nearing expiry gets renewed. Higher-risk operations get proposed by an AI agent and presented to the operator for one-click approval. The operator sets the policy boundary per tenant, per pillar.
AI agents are first-class identities with their own scope, audit trail, and cost budget. Every action an agent takes is logged with the same fidelity as an operator action. The platform tracks token usage per agent and alerts on cost drift. Agents can be local (Ollama) or cloud (Anthropic, OpenAI), with a complexity-scored routing engine that sends simple tasks locally and reserves cloud models for harder reasoning.
The end state: the operator gets a morning briefing from Aros showing what happened overnight, what was auto-resolved, what needs attention, and what the AI is proposing. The operator reviews, approves, rejects, or adjusts — then goes about their day knowing the platform is watching.
The three-year end state
What Aros looks like when the platform matures — from the operator's daily experience to the MSP-ready multi-site deployment.
- Year 1
Single-operator, single-site, full-stack visibility
All ten pillars at Tier 1 or 2 parity. One browser tab for the entire estate. Aros replaces the vm-provisioner, Portainer, Uptime Kuma, and most Grafana usage. Authentik SSO across every managed service. WYSIWYG dashboard builder for custom views. Full audit trail for every action. AI proposes routine remediations via the change pipeline. - Year 2
Multi-tenant, multi-site, whitelabel-ready
First non-system tenant onboarded. Whitelabel branding live. Buddy backup site federated via Headscale mesh. Edge nodes operating autonomously when central is unreachable. API consumed by external integrations (CLI, N8N, AI agents). Multi-tenant isolation verified. Cost tracking per tenant. - Year 3
MSP-capable, AI-native, self-managing
Aros manages itself. AI agent proposes, tests, and promotes a production fix end-to-end. 10+ self-healing patterns in production with verified positive outcomes. MSP-ready: customer-facing surfaces, per-tenant billing data, SLA tracking, whitelabel deployment. Multi-site federation with cloud drift backup. The operator's only browser tab during 95% of operational work.
What the operator's day looks like in three years
The concrete, daily experience that Aros is being built to deliver.
Open Aros in a single browser tab. The dashboard shows the entire estate: 4 bare metal servers, 30+ VMs, 100+ containers, network topology, storage pools, backup health, security posture, active incidents. Everything green, or the things that aren’t green are already being handled by the self-healing layer with an audit trail of what was done.
A morning briefing notification lists overnight events: two containers auto-restarted after OOM, a certificate was renewed 14 days before expiry, a Proxmox node ran a scheduled scrub and passed, a backup verification drill succeeded, an AI agent proposed a resource rebalance across the cluster (pending approval).
Click into Infrastructure and browse the estate tree: bare metal → hypervisor → VM → containers. Click a VM and see everything about it — CPU, memory, storage, network, backups, security scan results, dependencies, owner, runbooks, recent changes, active alerts — all from one view without switching tools.
Deploy a new service from a template: one click creates 3 VMs across 3 PVE hosts, installs the application stack via Ansible, configures Traefik routes, creates DNS records in Cloudflare, sets up monitoring, schedules backups, registers the service in the catalog, and posts to the changelog. The template parametrises everything the operator wants configurable and hardcodes everything they don’t.
When something breaks, the alert promotes to an incident with a timeline. The AI agent suggests a remediation based on similar past incidents. The operator reads the proposal, clicks approve, and the platform executes the fix through the same change pipeline that every other operation uses. The postmortem template is pre-filled with timeline, root cause candidates, and affected resources.
A tenant — a friend with a buddy-backup arrangement, or a future MSP client — sees their own branded view of the platform. Their own resources, their own users, their own SLOs, their own status page. They can’t see the operator’s resources or other tenants. They can request changes that route through an approval flow.
That’s the destination. Every sprint between now and then adds one more structural layer that makes the next layer possible.
The path so far, and what's next
The foundation sprints closed in roughly a week; then a process inflection traded sprint ceremony for autonomous runs. What follows is the real history and the queued work.
- Sprints 0–2
Foundation: pipeline, HA Postgres, app skeleton, multi-tenancy + audit
~30 VMs via Terraform, hardened by Ansible, backed by PBS, secrets in Vault. FastAPI modular monolith on a 3-node Patroni cluster (2s failover, zero dropped requests). tenant_id + row-level security from day one. A hash-chained, tamper-evident audit log from the first migration. - Sprints 3–4
Tasks, approvals, platform health — then discovery + monitoring
Dramatiq task framework, a policy + approval pipeline, tier-by-tier platform health. Then the adapter framework lands and Aros starts absorbing tools: Proxmox, UniFi, Traefik, Redfish, Docker, domains — discovering the estate into a containment hierarchy with cross-adapter correlation. - The inflection
Sprints → runs
A failure analysis found the process drift (ceremony free to produce, expensive to read; statuses marking themselves; operator enthusiasm absent from the risk register). Sprint ceremony died; the RUN — one operator-authored prompt, ratifications up front, ship-gated priorities each with a demo — became the unit of planning. Six working agreements ratified. - The runs
The platform speaks, then deploys
Health truth with reasons, a findings attention queue, platform/estate scope — then the ADR-0025 action framework live: Aros clones, configures, boots, and audit-chains its own VMs through a policy gate, human approval, and a single correlation chain from request to discovery. - This stretch
Correlation, consolidation, the Approvals pipeline
End-to-end network visibility for any node; the cross-adapter thread surfaced everywhere and persisted at discovery; Network + UniFi merged into one section; the top-level menu de-sprawled; entity-detail tabs consolidated with zero information loss; a follow-the-chain Approvals pipeline; a genuine tenant-creation crash and six type-suppressions cleared. - Next
Correlation backbone + connector registry + edge HA
ADR-0032, scoped and awaiting ratification: one normalized network-address table (consistent IPs, click-to-trace, route internals, hardware de-dup, and the resolver for east-west flows); a connector registry generalising the BMC pattern so any adapter is GUI-registered and Vault-backed — the unlock for multi-estate; and removing the edge single-point-of-failure, cheapest move first. - The horizon
Pillar build-out + multi-tenant, multi-site
Storage, Backup, Security adapters; service catalog; incident management; a GUI-driven install that takes an operator from bare metal to a running, tenanted Aros; first non-system tenant; sites federated across a mesh. The ten-pillar end state.
What's in the box today
What's still coming as pillars land
Foundation over features
The painter spends 80% of their time on prep. Aros prioritises brickwork over decoration.
The sprint cadence is deliberately slow at the foundation layers. Sprint 0 built infrastructure. Sprint 1 built the application skeleton. Sprint 1.5 hardened the pipeline and secrets model. None of this is user-facing. None of it ships a feature. All of it means that when the first real domain module lands, it lands on a platform that’s reproducible, version-controlled, HA-tested, and pipeline-validated — not on a pile of shortcuts that need unwinding at scale.
The discipline extends to every architectural decision. Multi-tenancy is designed in at the schema level from day one, even with a single operator. Adapter interfaces are defined before the first adapter is written. The audit log is append-only and tamper-evident from the first migration. These choices cost time now and save rewrites later.
This is the deliberate opposite of “ship fast and fix it later.” When Aros reaches its first real user-facing feature, the runway beneath it will be three sprints long and battle-tested.