Repository navigation
Technology Stack
Krasnikov Maksim edited this page Nov 3, 2026
·
6 revisions
Decided choices link to their architecture decision record (ADR).
| Layer | Choice | Why |
|---|---|---|
| Host OS | Ubuntu 26.04 LTS (Podman 5.7) for development, CI and production; Fedora Server and Debian 13 as secondary targets. Generation stays SELinux-aware (:Z always). |
Newest Podman among the LTS options and an in-place upgrade for the current server. ADR-008, supersedes ADR-003 |
| Runtime | Podman 5.x, crun, netavark, aardvark-dns | Rootless, DNS by name, fast start |
| Orchestration |
systemd --user + Quadlet |
Restarts, dependencies, auto-update with rollback |
| Control plane and agent | Rust: tokio, axum, zbus for systemd D-Bus, Podman REST client generated from its OpenAPI spec, sqlx. One binary, static musl build. |
Type-enforced plan/apply, memory safety in the root agent. ADR-001, ADR-002 |
| Panel database | PostgreSQL from the first commit, versioned migrations | Accounts, roles and audit land right after the data layer. ADR-004 |
| API | ConnectRPC over a Protobuf schema in proto/; Rust server, TypeScript clients |
One schema for UI, CLI, MCP and bots; browser-friendly, gRPC-compatible. ADR-005 |
| UI | SolidJS SPA built with Vite, embedded in the binary; own component kit in packages/ui on Kobalte primitives |
No Node runtime on the host; kit to be published separately later. ADR-006 |
| Edge | Caddy in two tiers, both driven through the admin API: a rootful host edge for TLS and domains, a rootless workspace edge per environment for routes, expose, blue-green and canary. Optional HAProxy on L4. | Public tier stays small; version switches never leave the workspace. ADR-009, ADR-010 |
| Auth | Local accounts with argon2id, server-side sessions, scoped API tokens, roles, audit log | Offline-capable; OIDC added later as a second login. ADR-011 |
| Registry | zot or distribution | Light local OCI registry |
| Cache (catalogue) | Dragonfly by default, Valkey as an option | Dragonfly uses all cores on big hosts; Valkey for exact Redis compatibility |
| Backups | restic + rclone, pg_dump, clickhouse-backup
|
Dedup, encryption, any S3 |
| Logs | journald | Rotation and rate limiting out of the box |
| Events | In-process from podman events and the journal; NATS considered at Beta when external consumers appear |
No bus needed on one host at Alpha |
| AI | Vercel AI SDK or LiteLLM; MCP server | Any provider by key, single access path for clients |
| Dev environment | toolbx / distrobox, tmux or zellij, SSH | Mutable container with shared home, persistent sessions |
The panel must run on a small VPS (1 vCPU, 1 GB) as well as on bare metal. The starter set is therefore the panel, PostgreSQL and Caddy. Registry, Dragonfly, VictoriaMetrics, VictoriaLogs and the rest are catalogue services the user adds when needed.
crates/ Rust workspace: control plane, agent, quadlet generator, validator, CLI
proto/ ConnectRPC schema, source of truth for the API
packages/ui Solid component kit (to be extracted later)
packages/web Panel SPA
docs/ ADRs and working notes (Obsidian vault)
CLI: one binary, three entry points as safety tiers. marik for read and reversible actions, maurice for everything with confirmation on destructive actions, maurice-odysseus-stella for forced scripted recovery behind an extra guard. The server unit is maurice.service; the project's full name is Maurice Odysseus Stella. ADR-007
Maurice PaaS · Apache 2.0 · Repository · Task board