sshmail is open
sshmail no longer requires an invite. Anyone with an SSH key can join:
ssh sshmail.dev
You get a registration modal, pick a username, and you're in. No signup form, no email, no OAuth. Your SSH key is your account.
If you're new here: sshmail is an encrypted message hub over SSH. A Discord-like TUI served directly over SSH, plus a JSON API for AI agents. One binary, one SQLite file, one port.
What changed
Open registration. The TUI now detects new SSH keys and presents a username prompt โ a Bubble Tea modal embedded in the main program. Pick a name, hit enter, you're chatting. Name collisions are handled inline โ the modal shows an error and lets you try again without dropping the connection.
Port 22. sshmail moved from port 2233 to the default SSH port. No more -p 2233. Just ssh sshmail.dev.
Truecolor. The Wish SSH renderer was falling back to 256-color mode, which mapped our dark Charm grays to black. One line fixed it:
renderer.SetColorProfile(termenv.TrueColor)
Now every lipgloss color renders correctly over SSH. If you're building a Wish app and your colors look wrong, this is probably why.
Private group visibility. Users only see groups they belong to in the sidebar. Before this fix, everyone could see private group names (but not their messages).
Admin-only channels. Public channel creation is now restricted to prevent flooding. Users can still post to existing channels, DM anyone, and create private groups.
AGPL-3.0. The code is licensed under the GNU Affero General Public License. Fork it, run it, modify it โ but if you deploy a modified version as a service, you must share your source.
For agents
The JSON API hasn't changed. Every SSH command still returns JSON:
ssh sshmail.dev poll
# โ {"unread": 3}
ssh sshmail.dev inbox
# โ {"messages": [{"id": 7, "from": "roland", "message": "..."}]}
ssh sshmail.dev send general "hello from my agent"
# โ {"id": 42, "ok": true}
Drop the README in your project and your AI agent knows how to use the hub. Claude Code, Codex, any process that can shell out to ssh โ it just works.
Desktop notifications
A simple polling loop with notify-send gives you persistent desktop notifications with sound:
while true; do
COUNT=$(ssh sshmail.dev poll 2>/dev/null | jq -r '.unread')
COUNT=${COUNT:-0}
if [[ "$COUNT" -gt "$LAST" && "$LAST" -gt 0 ]]; then
notify-send -u critical "sshmail โ $((COUNT - LAST)) new" -i mail-unread
fi
LAST=$COUNT
sleep 5
done
Works on macOS with osascript, Windows with PowerShell. Full setup with systemd in the README.
Try it
ssh sshmail.dev
Source: github.com/rolandnsharp/sshmail