Multi-input, multi-output backup service for Forgejo and derivatives
  • Rust 98%
  • Nix 2%
Find a file
NotAShelf d617e7bb35
nix: use nightly rustfmt
Signed-off-by: NotAShelf <raf@notashelf.dev>
Change-Id: I6eaf1601eb69ef59c0fb5f20e03a5a416a6a6964
2026-03-17 16:18:15 +03:00
nix nix: use nightly rustfmt 2026-03-17 16:18:15 +03:00
src initial working prototype 2026-03-17 16:18:13 +03:00
.envrc nix: initial tooling 2026-03-17 16:18:11 +03:00
.rustfmt.toml chore: add formatter configurations 2026-03-17 16:18:14 +03:00
.taplo.toml chore: add formatter configurations 2026-03-17 16:18:14 +03:00
Cargo.lock initial working prototype 2026-03-17 16:18:13 +03:00
Cargo.toml initial working prototype 2026-03-17 16:18:13 +03:00
flake.lock nix: initial tooling 2026-03-17 16:18:11 +03:00
flake.nix nix: initial tooling 2026-03-17 16:18:11 +03:00
README.md docs: very basic README 2026-03-17 16:18:12 +03:00

Konservejo

Declarative, pipeline-based backup orchestrator for Forgejo with a focus on backpressure tolerance, cryptographic verification, and fan-out concurrency.

Name Origin

The name is derived from similar Esperanto morphology the same way the original name does:

  • konservi = to preserve
  • -ejo = place

morphing into "preservation place" or "archive."

Why?

Currently my work outside of Github is scattered on various Forgejo instances. I do not wish to consolidate those into one, as I use those various instances with different goals and intents but I do want a safeguard that encapsulates all. Thus, I've come up with a decision to create a proper solution that scratches my itch. Here's how it is meant to look like:

[Forgejo A] ──┐
[Forgejo B] ──┼──> [Source Adapters] --> [Artifact Stream] --> [Dispatcher] --> [Sink A] --> [Verifier]
[Forgejo C] ──┘                                    │
                                                   ├──> [Sink B] --> [Verifier]
                                                   └──> [Sink C] --> [Verifier]