from sendmail to your DMs
A local-first, AI-native CLI and terminal UI for the messages humans send each other. Read, search, reply, and pipe to agents — all from your shell.
▸ LinkedIn today. iMessage, Slack, Discord, email, SMS next.
$ allman sync
syncing inbox · 47 conversations · 312 messages fetched
done in 8.2s
$ allman inbox --json | claude
→ 3 unread · agent drafting replies...
$ allman send jamie-rivera "Thursday works. 2pm?"
sent to Jamie Rivera
$ _
Local-first
Your data, on your disk.
Messages are plain JSONL in a local git repo. No cloud sync. No telemetry.
cat, grep, and git log work exactly as you'd expect.
AI-native
Built to be piped.
Every command speaks --json.
NDJSON event streams feed agents in real time. No SDK to learn — just shell out.
Keyboard-driven
Never leave the shell.
Full terminal UI with vim bindings, inline search, and emoji reactions.
Designed for people who already live in tmux.
Channels
Today LinkedIn.
Tomorrow, everywhere humans message.
allman's ambition is the same as sendmail's was for email — one open, programmable, local-first layer for every messaging channel. One adapter at a time.
LinkedIn SHIPPING
Full sync · real-time listen · send · react · search
iMessage NEXT
Local macOS DB adapter
Slack PLANNED
Workspace DMs + threads
Discord PLANNED
DMs across servers
Email PLANNED
IMAP + Gmail API
SMS PLANNED
Twilio + macOS Messages
X / Bluesky LATER
Direct messages
Your channel SDK
Adapter API · write your own
Interface
Two front-ends.
One local store.
allman — the CLI
Sync, search, send, and listen from the command line. Pipe to scripts, feed to agents, or wire into your shell the way you'd wire any Unix tool.
- ▸
allman sync— pull conversations with incremental or full re-sync - ▸
allman listen— stream live events as NDJSON - ▸
allman send— reply by slug, URL, or URN with pre-send safety - ▸
allman grep— full-text search over every message you've had - ▸
allman inbox— watermarked unread feed built for agent polling
$ allman listen --json
connected · streaming events...
{"type":"message","from":"jamie-rivera",
"body":"Thursday at 2 works!","ts":...}
{"type":"reaction","from":"taylor-osei",
"emoji":"👍","msgUrn":...}
{"type":"typing","from":"morgan-patel"}
CONVERSATIONS
▸ Jamie Rivera 2m
Taylor Osei 1h
Morgan Patel 3h
Casey Tanaka 1d
Riley Johansson 2d
Jamie Rivera @jamie-rivera
Product Lead at Acme Corp
─── Today ───
you 2:15 PM
Thursday works. 2pm?
Jamie 2:18 PM
Thursday at 2 works!
↳ 👍
[browse] your-account · 47 convs · 3 unread · ● live · ? help
allman-tui — the inbox
A full inbox experience in your terminal. Browse, read, compose, react, search — everything a mail client does, with keys instead of clicks.
- ▸ Vim-style nav:
j/k,g/G,/search - ▸ Live updates via the platform's real-time event stream
- ▸ Inline emoji picker with search-as-you-type
- ▸ Quick-reply templates with variable substitution
- ▸ Open profiles and threads in browser with one key
For Agents
Your agent shells out
to allman, exactly like you do.
No protocol. No SDK. No long-running server to negotiate with. Agents call the CLI, parse JSON, pipe to the next step — the same tools every developer already knows. Sendmail was an executable, not a service. allman follows the same rule.
-
SHELL
A CLI is a tool. Agents use tools.
Works inside Claude Code, Cursor, Windsurf, or any framework with shell access. Inspectable, replayable, composable with
jq,grep, and every other Unix tool. -
JSON
Structured output, everywhere.
Every command takes
--json.stdoutis data,stderris logs — agents parse without prompting tricks. -
STREAM
NDJSON for long-running agents.
allman listen --jsonemits messages, reactions, and typing indicators as newline-delimited JSON. Pipe it into anything. -
SAFE
Pre-send guards + rate limits.
Aborts if a new inbound arrived since your agent's last read. Per-channel throttles enforced in the client. Your agent can't be too eager.
# Poll for new messages as JSON
$ allman inbox --json --since 5m
[{"from":"jamie-rivera",
"body":"Can we reschedule?",
"channel":"linkedin"}]
# Filter with jq, hand to the model
$ allman inbox --json \
| jq '.[] | select(.unread)' \
| claude -p "draft replies"
# Stream for long-running agents
$ allman listen --json | agent
connected · waiting...
How It Works
Four commands.
That's the whole setup.
01
Install
One binary, no package manager. Works on macOS and Linux.
curl -fsSL https://raw.githubusercontent.com/tarkaai/allman-tui/main/install.sh | bash
02
Login
Real browser session. Cookies stay on your disk.
allman login
03
Sync
History → JSONL. Incremental by default.
allman sync
04
Use
Browse, script, or hand off to an agent.
allman-tui
Store
Plain files.
In a git repo.
Every message you receive is a line in a JSONL file on your disk.
cat, grep, jq — they all work. Back it up with
git push. There is no other database.
Credentials never leave your machine. Authentication happens through a real browser session — the same way you'd log in yourself.
.allman/
ACoAAA.../ # your account
conversations/
2-abc123/
meta.json # name, headline
messages.jsonl # full history
@jamie-rivera → 2-abc123
@taylor-osei → 2-def456
config.json
COOKIES.json (gitignored)
Lineage
Named after a mail carrier.
Eric Allman wrote sendmail in 1981 — the open, programmable mail transfer agent that moved a generation of human messages.
Forty-five years later, those messages live in a dozen closed silos. allman is the same idea, for the channels that actually matter now.
Open Source
MIT-licensed.
Read the code, send a PR.
Both the CLI and TUI are public on GitHub. Build from source, fork it, wire it into your own tools — that's the whole point.
Stay in the loop.
Occasional updates from the team — new channels, major releases, and the things we're learning along the way. No funnels, no drip campaigns, no upsells. Unsubscribe in one click.
Roughly monthly. We'll never share your address.