- Rust 97.7%
- Nix 2.1%
- Shell 0.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
Some checks failed
moira/ci moira/ci — succeeded
moira/threads moira/threads — definitions compiled
moira/flake/env.flake.eeb9c92140c77a3b@x86_64-linux env.flake.eeb9c92140c77a3b — built
moira/flake/env.path.c1f3897f9a716964@x86_64-linux env.path.c1f3897f9a716964 — built
moira/flake/packages.default@x86_64-linux packages.default — built
moira/flake/packages.moira@x86_64-linux packages.moira — built
moira/flake/checks.moira-git-integration-container@x86_64-linux checks.moira-git-integration-container — queued
moira/flake/checks.moira-server@x86_64-linux checks.moira-server — queued
moira/flake/checks.moira-smoke@x86_64-linux checks.moira-smoke — queued
moira/flake/checks.moira-smoke-container@x86_64-linux checks.moira-smoke-container — queued
moira/flake/checks.moira-test@x86_64-linux checks.moira-test — queued
moira/flake/packages.moira-agent@x86_64-linux packages.moira-agent — queued
moira/flake/packages.moira-agent-image@x86_64-linux packages.moira-agent-image — queued
moira/flake/packages.moira-server@x86_64-linux packages.moira-server — queued
moira/flake/packages.moira-server-image@x86_64-linux packages.moira-server-image — queued
moira/flake/checks.moira-agent@x86_64-linux checks.moira-agent — queued
moira/flake/checks.moira-agent-labels@x86_64-linux checks.moira-agent-labels — queued
moira/flake/checks.moira-agent-labels-container@x86_64-linux checks.moira-agent-labels-container — queued
moira/flake/checks.moira-binary-cache@x86_64-linux checks.moira-binary-cache — queued
moira/flake/checks.moira-cancellation@x86_64-linux checks.moira-cancellation — queued
moira/flake/checks.moira-cancellation-container@x86_64-linux checks.moira-cancellation-container — queued
moira/flake/checks.moira-cli@x86_64-linux checks.moira-cli — built
moira/flake/checks.moira-clippy@x86_64-linux checks.moira-clippy — queued
moira/flake/checks.moira-fmt@x86_64-linux checks.moira-fmt — queued
moira/flake/checks.moira-gate-approval@x86_64-linux checks.moira-gate-approval — queued
moira/flake/checks.moira-gate-approval-container@x86_64-linux checks.moira-gate-approval-container — queued
moira/flake/checks.moira-git-integration@x86_64-linux checks.moira-git-integration — queued
moira/publish moira/publish — failed
eb119f5's evaluation was claimed by an aarch64-darwin agent that had
just joined the fleet -- its first ever -- so it holds no x86_64-linux
jobs, and `publish` failed naming `packages.moira-{server,agent}-image`
as absent. Reuse is system-blind (`evaluations::has_all_jobs` selects
`DISTINCT attr` and never `system`) and the run path asks it only about
environment jobs, so re-triggering reuses that evaluation forever: the
commit needs a new sha to be evaluated again. Worth its own change --
an evaluation is not system-agnostic and reuse treats it as if it were.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYBVJAWmq1ay1gjY46athR
|
||
| .moira/envs | ||
| crates | ||
| docs | ||
| grafana | ||
| k8s | ||
| nix | ||
| openspec | ||
| scripts | ||
| .gitignore | ||
| AGENTS.md | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| devenv.lock | ||
| devenv.nix | ||
| flake.lock | ||
| flake.nix | ||
| README.md | ||
| renovate.json | ||
| zensical.toml | ||
Moira
Alpha software. Moira is under active development — interfaces, config schemas, and APIs may change without notice between commits. Run it, break it, report what you find, but don't depend on stability yet.
moira is a unified automation fabric for infrastructure engineers who believe the git repository is the only legitimate source of truth. It merges the concerns of CI pipelines, scheduled automation, workflow orchestration, and IaC execution into a single declarative system — hermetically sealed by Nix, driven by Rust, and accountable to nothing but your repo.
The mythology
Hydra builds moira.
In Hesiod's Theogony, the three Moirai — the Fates — are daughters of Nyx, the primordial goddess of night. They weave the thread of every mortal life: Clotho spins it into being, Lachesis measures its length, Atropos cuts it with inexorable finality.
Your infrastructure has the same shape. Intent is declared. Work is measured and scheduled. Execution is final, hermetic, irreversible. And it all runs on Nix — named, knowingly or not, for the same primordial darkness the Fates were born from.
Hydra — the many-headed — spawns Moira. Moira, daughters of Nyx, runs on Nix.
The lore wrote itself.
Internal architecture: the three sisters
The moira runtime is divided internally along the mythological grain:
| Sister | Role |
|---|---|
| Clotho (CLI) | Git watcher and intent compiler — she reads your declared threads and spins them into executable task graphs |
| Lachesis (Server) | Scheduler and reconciler — she measures, allots work to agents, manages approval gate state, and ensures reality converges to declaration |
| Atropos (Agent) | Step executor — she cannot be turned aside; hermetic, deterministic, she runs the step and cuts the thread when done |
These are internal names. Users interact only with moira.
Documentation
Full docs live in docs/. To serve locally:
zensical serve
Standard library
moira-modules — curated environments, typed modules, and thread constructors. Import as a flake input and use directly in your pipelines.
Modules — HTTP, git, SSH, S3, container push, compression, crypto, JWT, TOTP, ntfy, SMTP, OpenTofu/Terraform, Vikunja, CalDAV, Home Assistant. Each declares typed inputs and outputs; credentials are secret-typed and injected at runtime.
Thread constructors — rustCi, nodeCi, goCi, pythonCi, container, containerManifest, s3Site, notify. Applied to an options attrset, with withDefaults for per-site values.
Derived threads — fromProject { src = self; } reads a repo's own manifests at eval time and returns one thread per project it finds, so a monorepo gets per-project path filters without hand-written config.