a.skh.am / tools
Tools
Command-line tools, two web apps, a Chrome extension and the libraries behind them: a synthesizer driven by a text score, speech-to-text and text-to-speech across machines, a handwriting canvas for the terminal, a keyboard deck with a light under every key, and tools for shipping Android apps and pull requests. Each has a page explaining how it works.
- 20 tools
- 2 live web apps
- 6 MCP servers for agents
- 1 Nix flake
Index
Sound
Speech
- ttsProvider-routing speech synthesis and a playback daemon
- CLI
- Daemon
- Nix module
- azttsAzure Speech and MAI voices through SSML
- CLI
- oaittsOpenAI-compatible speech, with styles as instructions
- CLI
- sttBatch and realtime transcription, with an authenticated relay
- CLI
- Daemon
- Nix module
- azsttAzure MAI transcription, batch and streaming
- CLI
- oaisttOpenAI-compatible transcription and realtime sessions
- CLI
- lifetailAlways-on transcription into a searchable journal
- Daemon
- CLI
- MCP
- Nix module
- ssmlDeterministic SSML from plain text and flags
- CLI
- Read AloudChrome extension: read pages with your own voice endpoint
- Chrome extension
Terminal & input
- CursiveHandwriting and shared canvases in the terminal
- CLI
- TUI
- MCP
- gfxshzsh drawn on a pixel canvas with Kitty graphics
- TUI
- KeygridPer-key input and light for a 100-key deck
- Library / C ABI
- CLI
- TUI
- TriageTerminal client for the Triage routing service
- TUI
- CLI
- meatServe an OpenAI-compatible API and answer it yourself, through the glass
- TUI
- CLI
Agents
- OutboxA review queue for messages agents want to send
- Daemon
- CLI
- MCP
- TUI
- Web app
- Android app
- Apple apps
- Nix module
Release
How they ship
Every Rust tool is a Nix package. The root flake composes each project's own flake, and nix build .#tools joins every binary into one bundle, each exactly once, so a machine installs all of them declaratively and upgrades them by moving one pin. The three speech daemons ship as Home Manager/NixOS modules that run them as user services. Two tools are web apps: Drums is plain ES modules, and Chirp compiles its whole engine to WebAssembly. The Chrome extension loads unpacked, and LLMbience runs from its launcher on a GPU host.
Surfaces
Most tools are reachable by people and by agents through the same code path. Where a tool speaks MCP, its MCP tools call the same handlers as its CLI, with the same validation and the same receipts, so an agent can do exactly what a person can, and nothing else.
The speech crates
The speech tools look like eight binaries, but they are two families over shared crates. tts, aztts and oaitts are three entrypoints into one TTS core that owns the CLI, the daemon, the playback queue and the remote protocol; the provider adapters only encode requests. The STT family mirrors it, and Lifetail, the always-on transcriber, reuses the STT core's realtime sessions. Both cores authenticate to Azure through one broker that takes a key or an Entra token.
This site
The Pages branch holds three independent things: the two web apps at drums/ and chirp/, and these pages at the root. One publisher converges all three to the main branch: it records the source revision each part was built from, rebuilds only the parts that are behind, and replaces only the paths each part owns. A Chirp build never touches Drums, and neither touches these pages. The sidebar frames each page, and each app, in a single iframe, but the apps are not wrapped: /tools/chirp/ is the app itself.