Plasmite
Persistent JSON message pools backed by plain files. Multiple processes write and read concurrently â no daemon, no config.
# In another terminal:
# {"seq":1,"time":"...","meta":{"tags":[]},"data":{"from":"alice","msg":"hello bob"}}
# {"seq":2,"time":"...","meta":{"tags":[]},"data":{"from":"alice","msg":"you there?"}}
~600k messages/sec on a laptop. Pools are ring buffers, so writes almost always succeed.
Install
Installs both plasmite and the pls alias.
Prefer manual binaries? Download your platform tarball from the v0.1.0 release.
Why Plasmite?
| Alternative | Limitation | Plasmite |
|---|---|---|
| Temp files + locks | No watching, collision-prone | Multiple writers, real-time reads |
| Named pipes | Blocks writers, one reader | Non-blocking, multiple readers |
| Polling a directory | Busy loops, no ordering | Streaming with sequence numbers |
| Redis | Requires daemon | Just files |
| WebSockets | Requires server | No networking needed |
Pools are regular files you can ls and rm. Messages are JSON, so you can filter with jq. Writes are crash-safe.
Examples
Watch your CI from the couch
Terminal 1 â build script:
Terminal 2 â you, watching:
Gate one script on another
# deploy.sh â wait for tests to pass
# test-runner.sh â signal when done
Funnel streams into one place
# Ingest an API event stream
|
# Tee system logs into a pool
| |
Filter, tag, replay
# Tag messages when you write them
# Filter when you read
# Replay the last hour at 10x speed
Go remote
Same CLI, just pass a URL:
# From another machine
A built-in web UI is always available at /ui:

See the remote protocol spec for the full HTTP/JSON API.
Bindings
Native bindings â no subprocess overhead:
client, _ := plasmite.NewClient("./data")
pool, _ := client.CreatePool(plasmite.PoolRefName("events"), 1024*1024)
pool.Append(map[string]any, nil, plasmite.DurabilityFast)
=
=
const = require
const client =
const pool = client.
pool.
Python and Node bindings are source-only for v0.1.0 (Rust toolchain required â brew install rust on macOS, rustup on Linux). Pre-built binaries coming soon.
See Go quickstart, Python docs, and Node docs.
Commands
| Command | Description |
|---|---|
poke POOL DATA |
Send a message (--create to auto-create pool) |
peek POOL |
Watch messages (streams until Ctrl-C) |
get POOL SEQ |
Fetch one message by sequence number |
pool create NAME |
Create a pool (--size 8M for larger) |
pool list |
List pools |
pool info NAME |
Show pool metadata and metrics |
pool delete NAME... |
Delete one or more pools |
doctor POOL | --all |
Validate pool integrity |
serve |
HTTP server (loopback default; non-loopback opt-in) |
pls and plasmite are interchangeable. Shell completion: plasmite completion bash|zsh|fish.
How It Works
A pool is a persistent ring buffer â one .plasmite file:
- Multiple writers append concurrently (serialized via OS file locks)
- Multiple readers watch concurrently (lock-free, zero-copy)
- Bounded retention â old messages overwritten when full (default 1MB, configurable)
- Crash-safe â torn writes never propagate
Every message has a seq (auto-incrementing), a time (nanosecond-precision), optional tags, and your JSON data. Tags and --where (jq predicates) compose for filtering. See pattern matching guide.
Default pool directory: ~/.plasmite/pools/.
More Info
Specs: CLI · API · Remote protocol
Guides: Rust API quickstart · Go quickstart · libplasmite C ABI · Exit codes · Diagnostics
Changelog · Inspired by Oblong Industries' Plasma.
License
MIT. See THIRD_PARTY_NOTICES.md for vendored code.