Architecture
Components
Section titled “Components”- Launcher/CLI (
vesper) reads a source, creates a temporary broker and provisions entries. - Broker owns an in-memory linked store and a private Unix socket.
- Capability is 32 random bytes represented as 64 lowercase hexadecimal characters.
- Client SDK maps a logical name to
VESPER_CAP_<NAME>, connects toVESPER_SOCKET, and performs oneGET.
vesper run lifecycle
Section titled “vesper run lifecycle”- Parse all secret specifications and the target command.
- Read sources into protected mappings.
- Erase copied
env:values from the launcher’s environment and copiedliteral:bytes from parser storage. - Create a mode-0700 temporary directory and broker socket.
- Fork a broker process.
- Fork the target into a dedicated process group.
- Provision each entry with TTL, use count, owner UID and the target process-group scope on Linux.
- Send only socket path, names and capability tokens to the waiting target through a pipe.
execthe target; pre-exec memory is replaced.- Wait for target completion, terminate the broker, erase all remaining entries and remove the temporary directory.
Secret memory
Section titled “Secret memory”Secret buffers are anonymous private mmap allocations rounded to page size. Vesper attempts:
mlockto keep pages out of ordinary swap;MADV_DONTDUMPto omit them from compatible core dumps;MADV_DONTFORKon Linux to prevent launcher buffers from being inherited.
Every release path overwrites the complete mapping before munmap.
Store semantics
Section titled “Store semantics”The broker is single-threaded, so validation, use-count decrement and removal are atomic with respect to other requests. Expired entries are removed during the poll loop and immediately when accessed. Tokens are compared exactly; collisions are regenerated.
A successful authorization creates a protected response copy, consumes one use, then sends the copy. This means network interruption cannot make a one-time capability replayable.
SDK contract
Section titled “SDK contract”SDKs return binary data (unsigned char*, Ruby binary String, PHP binary string, Kotlin ByteArray, Swift Data). Text conversion is explicit. Native SDKs never spawn vesper; shell is the only client that delegates to the CLI.