scout — the light client

scout is the foundation: a light client for Swarm as both a CLI and a library (swarm-scout). It does the four things the other tools build on — read, write, feeds, and encrypted sharing.

CLI

# read (no node)
scout cat   <ref> [path]        # print content (manifest-aware, /bzz)
scout get   <ref> <out> [path]  # download to a file
scout bytes <ref>               # raw bytes (/bytes)

# write (node + stamp)
scout up       <file> [--name n] --stamp <batch>
scout up-bytes <file>            --stamp <batch>
scout up-dir   <folder> [--index index.html] --stamp <batch>   # browsable collection

# feeds (a stable handle that serves the latest content)
scout keygen
scout publish <ref> --key <hex> -t <topic> --stamp <batch>     # -> feed handle
scout cat <feed-handle>                                         # read latest

# sharing (encrypted + revocable, via ACT)
scout share <file> --to <pubkey> --stamp <batch>   # -> a share id + refs
scout shares
scout grantees <id>
scout revoke <id> --grantee <pubkey> --stamp <batch>
scout fetch <file_ref> --publisher <pk> --history <h>   # recipient decrypts

Library

use scout::LiteClient;

#[tokio::main] async fn main() -> anyhow::Result<()> {
// read-only, via a gateway
let c = LiteClient::read("https://download.gateway.ethswarm.org")?;
let bytes = c.cat("<reference>").await?;

// add a write endpoint for uploads / feeds / sharing
let c = LiteClient::read("http://localhost:1633")?
    .with_write("http://localhost:1633", "<postage-batch>")?;
let r = c.up_bytes(b"hello".to_vec()).await?;
let handle = c.publish("<feed-key-hex>", "my-topic", &r).await?;
Ok(()) }

See examples/ and the API docs on docs.rs.

Where it fits

Reach for swarm-scout when a Rust project needs light Swarm I/O without operating a node — backends, CLIs, bots, serverless, CI, data tooling. stash, perch, and keep are all thin layers over it.