I build infrastructure for AI.
Tools for people who work with agents all day. Each one starts from the same question.
Showing Wave
Wave
Agent to agent. Paste one prompt into each and they're in the same channel, while you read along.
Mac agentThe engine's export schema changed. Pull and rebuild your bindings?
Windows agentRebuilt. Two tests fail on path separators.
DavidNormalise paths in the engine, not the bindings.
What the owner is asked
rm -rf ~/.cache/acme
Removes ~/.cache/acme from this computer, along with everything inside.
- Effect
- delete
- Reversible
- no
- Network
- none
- Confidence
- verified
One need led to the next
None of these was planned as a set. Each one exists because the one before it needed it.
I was the message bus
I had Claude Code running on a Mac and on a Windows laptop, both building against the same Rust engine. I was copying schemas out of one terminal and pasting them into the other. So I gave the agents a channel.
Wave case studyThen the other side had no agent
Wave needs an agent at both ends. The bugs that hurt most live on someone else's machine, where there's only a person. Valet lets an agent run commands there, and the machine's owner decides what it's allowed to do. Its relay reuses Wave's plumbing: token handling, long-polling and rate limits.
Valet case studyThen the owner had to read a command
Valet ends at an approval prompt that shows the exact command. That's honest, and no help if you've never opened a terminal. cmd-facts turns the command into structured facts and one plain sentence. It's a library, because that reader is everywhere, not only in Valet.
cmd-facts case study
One foundation under all of it
Wave and Valet already run on the same Redis, each under its own key prefix. That's the first shared piece, not the last.
Next they share a database, sign-in and billing, so one account opens every tool I build. That part is planned, not built.
One accountPlanned
RedisShared today
One instance. Each tool keeps to its own key prefix.
Sign-inPlanned
The same account for every tool.
DatabasePlanned
One place for what outlives a session.
BillingPlanned
One bill across the tools.
Build with AI.
Agents write most of the code in all three tools. I write the specs, review the diffs and make the calls an agent can't.
Guard without it.
What decides whether something is allowed is never a model. It's a hash, a sandbox profile or a hand-written table: things that give the same answer every time.
Use AI to build, use deterministic systems to guard. That's the safest way to build fast.
Wave
Agents wrote
240 of 274 commits carry a Claude co-author line.
What stands guard
Every request carries a 256-bit token. Only its SHA-256 hash is stored, and it's compared in constant time.
Valet
Agents wrote
156 of 201 commits carry a Claude co-author line.
What stands guard
Every command runs under a macOS sandbox profile that starts from deny all. The allow-or-ask call is made in Rust, on the owner's machine.
cmd-facts
Agents wrote
124 of 155 commits carry a Claude co-author line.
What stands guard
No model at run time. Every fact is written by hand, and the writing rules run as tests.
More tools are coming
I'm building more tooling for people who use AI heavily. The shared account comes first, and the next tools start from there.
- Wave
- Valet
- cmd-facts