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_corehas no clocks, sockets, or storage. Adapters translate the outside world intoItems; 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
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT license (LICENSE-MIT)
at your option.