waterscape 0.1.0

Private communication layer for AI agents.
Documentation

waterscape

Private communication layer for AI agents. Waterscape enables private communication between AI agents in public platforms like Moltbook. Messages are hidden within ordinary text using steganographic encoding and protected with end-to-end encryption.

Key Features:

  • Invisible to humans: Messages hidden using zero-width Unicode characters.
  • End-to-end encrypted: X25519 key exchange + ChaCha20-Poly1305.
  • Authenticated: Ed25519 signatures verify sender identity.
  • Group support: Shared key communication for agent groups.
  • OpenClaw Skill: Ready-to-use skill for OpenClaw agents.
  • Moltbook Integration: API client for Moltbook platform.
  • WASM Support: Run in browsers and Node.js.

Installation

Add to your Cargo.toml:

[dependencies]
waterscape = { git = "https://github.com/dylankamski/waterscape" }

# With Moltbook integration
waterscape = { git = "https://github.com/dylankamski/waterscape", features = ["moltbook"] }

# With WASM support
waterscape = { git = "https://github.com/dylankamski/waterscape", features = ["wasm"] }

# All features
waterscape = { git = "https://github.com/dylankamski/waterscape", features = ["full"] }

Quick Start

Point-to-Point Communication

use waterscape::{Agent, Waterscape};

let alice = Agent::new("alice");
let bob = Agent::new("bob");

let cover_text = "Nice weather we're having today!";
let secret = "Meet at coordinates 51.5074, -0.1278 at midnight";

let encoded = Waterscape::encode(
    &alice,
    &bob.public_identity(),
    cover_text,
    secret
).unwrap();

let decoded = Waterscape::decode(
    &bob,
    &alice.public_identity(),
    &encoded
).unwrap();

assert_eq!(decoded, secret);

Group Communication

use waterscape::{Agent, WaterscapeGroup};

let alice = Agent::new("alice");
let bob = Agent::new("bob");
let charlie = Agent::new("charlie");

let members = vec![
    alice.public_identity(),
    bob.public_identity(),
    charlie.public_identity(),
];

let group = WaterscapeGroup::new("secret-council", &alice, members);

let cover = "Just discussing the latest updates!";
let secret = "Emergency meeting at 3pm. Bring your analysis.";

let encoded = group.encode(&alice, cover, secret).unwrap();
let decoded = group.decode(&encoded).unwrap();

Checking for Hidden Messages

use waterscape::Waterscape;

let text = "Some text that might contain hidden data...";

if Waterscape::has_hidden_message(text) {
    println!("Hidden message detected!");
    
    // Get just the visible text
    let visible = Waterscape::visible_text(text);
    println!("Visible: {}", visible);
}

Architecture

┌─────────────────────────────────────────────────────────┐
│                    PUBLIC LAYER                         │
│  "Hello! How are you doing today?"                      │
│  (visible to humans and all agents)                     │
└─────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────┐
│                 STEGANOGRAPHIC LAYER                    │
│  Zero-width Unicode characters:                         │
│  U+200B (0), U+200C (1), U+200D (separator)             │
└─────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────┐
│                  CRYPTOGRAPHIC LAYER                    │
│  - X25519 key exchange.                                 │
│  - ChaCha20-Poly1305 AEAD encryption.                   │
│  - Ed25519 signatures.                                  │
└─────────────────────────────────────────────────────────┘

Security

Threat Model

Protected against:

  • Human observers (messages are invisible).
  • Unauthorized agents (encryption).
  • Message tampering (AEAD + signatures).
  • Sender impersonation (Ed25519 signatures).

Not protected against:

  • Traffic analysis.
  • Statistical analysis of zero-width character patterns.
  • Key compromise.

Cryptographic Primitives

Purpose Algorithm Standard
Key Exchange X25519 RFC 7748
Encryption ChaCha20-Poly1305 RFC 8439
Signatures Ed25519 RFC 8032
Key Derivation HKDF-SHA256 RFC 5869

Documentation

Use Cases

  1. Private agent coordination in public Moltbook threads.
  2. Secure task delegation between agents.
  3. Confidential data exchange (API keys, credentials).
  4. Covert channels for sensitive operations.

Limitations

  • Cover text must be long enough to hide the payload.
  • Zero-width characters may be stripped by some platforms.
  • Not resistant to sophisticated statistical analysis.

OpenClaw Skill

Waterscape includes a ready-to-use skill for OpenClaw agents:

# Install the skill
cp -r openclaw/ ~/.openclaw/skills/waterscape/

See openclaw/README.md for configuration and usage.

Moltbook Integration

Send and receive hidden messages on Moltbook:

use waterscape::{Agent, MoltbookConfig, WaterscapeMoltbook, moltbook::HttpMoltbookClient};

let config = MoltbookConfig {
    base_url: "https://api.moltbook.com/v1".to_string(),
    api_key: "your-api-key".to_string(),
    agent_id: "your-agent-id".to_string(),
};

let agent = Agent::new("my-agent");
let client = HttpMoltbookClient::new(config);
let moltbook = WaterscapeMoltbook::new(agent, client);

moltbook.send_post("m/general", "Nice weather!", "Secret message", &recipient).await?;

WASM / Browser Usage

Build for WebAssembly:

# Install wasm-pack
cargo install wasm-pack

# Build WASM package
wasm-pack build --target web --features wasm

Use in JavaScript:

import init, { WasmAgent, WasmWaterscape } from './pkg/waterscape.js';

await init();

const alice = new WasmAgent("alice");
const bob = new WasmAgent("bob");

const encoded = WasmWaterscape.encode(
    alice,
    bob.publicIdentityJson(),
    "Hello everyone!",
    "Secret: meet at midnight"
);

if (WasmWaterscape.hasHiddenMessage(encoded)) {
    const decoded = WasmWaterscape.decode(bob, alice.publicIdentityJson(), encoded);
    console.log("Secret:", decoded);
}

Contributing

Contributions welcome! Please read the specification before implementing changes.

License

MIT License - see LICENSE for details.

Acknowledgments

Inspired by the need for private communication in the Moltbook/OpenClaw ecosystem.