A bridge from webhooks to Automerge documents
53%
Rust 25%
Nix 22%

README.md

Waystation #

Caution

Early scaffold. Nothing here works yet; interfaces will change without notice.

Waystation ingests events from the open web — webhook pushes and RSS/Atom feeds — and records each one into an Automerge document. Documents sync between peers with Subduction, so the ingest station is just another peer: replicas converge offline, and there is no canonical server to take down.

                        ┌──────────────────────────────┐
  webhook POST ────────▶│  ingest adapters             │
                        │  (receiver, feed poller)     │
  RSS/Atom poll ───────▶└──────────────┬───────────────┘
                                       │ normalized Items
                                       ▼
                        ┌──────────────────────────────┐
                        │  Automerge document writer   │
                        └──────────────┬───────────────┘
                                       │ changes
                                       ▼
                        ┌──────────────────────────────┐
                        │  Subduction sync             │◀──▶ peers
                        └──────────────────────────────┘

The shape follows the same discipline as Onomancy: a pure, sans-IO core that owns the vocabulary and rules, thin adapters that speak each protocol, and one agent that wires them together.

Crate Purpose
waystation_core Substrate-neutral kernel: Source, normalized Item, ingest rules (TODO)
ingest adapters Webhook receiver, RSS/Atom poller (TODO)
document writer Automerge substrate adapter (TODO)
waystationer The agent (binary): serve · poll · sync (TODO)

Libraries implement the protocol; agents that practice it are waystationers.

Development #

With Nix (flakes enabled):

nix develop   # rust 1.91, cargo-* utilities, command menu
menu          # list dev-shell commands (rust:*)

Or bring your own toolchain pinned by rust-toolchain.toml:

cargo test --workspace --all-features
cargo clippy --workspace --all-features --all-targets

CI mirrors the dev shell as runnable apps:

nix run .#ci   # fmt, clippy, test, cargo-deny

Design notes #

  • Sans-IO core. waystation_core has no clocks, sockets, or storage. Adapters translate the outside world into Items; the core decides what they mean. Everything outside the network boundary is pure and property testable.
  • Parse, don't validate. Origins carry structured addressing (endpoint names, feed URLs) rather than loose strings to be re-validated downstream.
  • Records, not interpretations. Ingest stores the origin payload verbatim alongside normalized metadata; interpretation happens in documents, where it can be revised.

See design/ for the design documents (starting with document topology).

License #

Licensed under either of

at your option.