A self-hosted, AI-Native personal OS β in a single Go binary.
Multi-agent Β· Multi-channel Β· Long-term memory Β· Cron + Inbox notifications Β· MCP Β· Plugins Β· Web dashboard
Install Β· Quick Start Β· Channels Β· Architecture Β· Roadmap
Pawnix is not just an agent runtime β it's a long-running, self-hosted layer between you and any LLM, designed to behave the way an operating system does for your AI life:
- Always on. Daemon supervisor keeps the gateway alive across crashes and config changes.
- Multi-agent. Run a personal team β coder, analyst, scheduler β each with its own personality, memory, and skills.
- Multi-channel by default. Same agents, reachable from your browser, Telegram, Discord, Slack, or any custom plugin channel.
- Notifications as a first-class primitive. Cron jobs, watchers, and any agent can
notifyyou β through the in-app Inbox, browser toasts, or back through your IM channels. - Persistent memory.
MEMORY.md+ searchable conversation logs + pgvector semantic memory. - Skills that grow. Drop a
SKILL.mdand your agent can do new things; agents can learn skills from interaction patterns. - Local-first, cloud-optional. Defaults to plain JSON in
~/.pawnix/. Switch to PostgreSQL / SQLite when you outgrow files. - Single binary. No Docker, no Python venv, no Node runtime. Cross-compiles for macOS / Linux / Windows.
curl -fsSL https://raw.githubusercontent.com/softbreezee/claw-os/main/install.sh | bash
pawnix # opens the setup wizard at http://localhost:18953# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/softbreezee/claw-os/main/install.sh | bash
# Windows: download the .zip from Releases and double-click pawnix.exe
# From source
git clone https://github.com/softbreezee/claw-os.git
cd claw-os && make build
# Upgrade
pawnix upgrade- Run
pawnixβ the setup wizard opens athttp://localhost:18953. - Pick an LLM provider (OpenAI, Anthropic, or any OpenAI-compatible endpoint).
- Click Launch β start chatting in the browser.
- Optional: open Channels in the sidebar to connect Telegram / Discord / Slack (see below).
Connect a chat platform once and the same agents become reachable from anywhere β Web, Telegram, Discord, Slack. Each bot binds to one agent (who handles incoming messages) and carries a My chat ID (where push notifications come back to you).
- Create a bot. Talk to @BotFather β
/newbotβ name it β copy the bot token (123456789:ABCβ¦). - Find your chat ID. Talk to @userinfobot β it replies with your numeric ID (e.g.
8175643861). - Add the channel. Pawnix dashboard β Channels β Add channel β Telegram β paste the token β bind to an agent β Save & Restart.
- Set "My chat ID". In the Telegram card, paste the ID from step 2 into the My chat ID field β Save & Restart.
- Done. Open Telegram, search for your bot, send a message β your agent replies. Cron jobs and
notify(..., channel='telegram')calls now also push back here.
- Create a bot. Discord Developer Portal β New Application β Bot tab β reset & copy the token. Enable MESSAGE CONTENT INTENT.
- Invite it to your server. OAuth2 URL Generator β scopes:
botβ permissions:Send Messages,Read Message Historyβ open the URL β invite to your server. - Find your user ID. Discord β Settings β Advanced β enable Developer Mode β right-click your name β Copy User ID.
- Add the channel. Pawnix dashboard β Channels β Add channel β Discord β paste the token β bind agent β fill My user ID β Save & Restart.
- Done. DM the bot from Discord to talk; cron /
notifydeliver back to your DMs.
- Create a Slack app at https://api.slack.com/apps with Socket Mode enabled.
- Generate a Bot User OAuth Token (
xoxb-β¦) and an App-Level Token withconnections:write(xapp-β¦). - Find your member ID. Profile β β― β Copy member ID (
U0XXXXXXX). - Add the channel. Channels β Add β Slack β paste both tokens β bind agent β fill My user ID β Save & Restart.
The "My chat/user ID" you set is what unlocks proactive notifications β any agent can call
notify(text, channel='telegram')to ping you back here, with no manual chat-ID juggling.
The runtime. Every later milestone builds on this.
- Multi-LLM provider routing with per-call model override (OpenAI, Anthropic, DeepSeek, Gemini, GLM, Kimi, Groq, Ollama, OpenRouter)
- Multi-agent + team
@mentionrouting - Channels CRUD UI (Telegram / Discord / Slack) with hot agent bindings
- Skills + Plugins (JSON-RPC subprocess) + MCP (HTTP & stdio)
- Dual-layer memory (
MEMORY.md+ FTS / pgvector) - Cron jobs + per-agent heartbeat
- Web dashboard at
:18953 - Daemon supervisor with crash auto-restart and restart-aware exit codes
From FastClaw to Pawnix β and from "agent runtime" to "personal OS".
- Binary
pawnixΒ· config dir~/.pawnix/Β· config filepawnix.jsonΒ· modulegithub.com/softbreezee/claw-os - launchd / systemd labels updated; new logo + favicon; full UI/CLI rename
- Cron OS-ification β single store-backed ledger; UI / agent tool / scheduler all read the same source; cron tools auto-inherit current chat origin (Web β Inbox, Telegram β Telegram)
- Inbox + Notifications subsystem β
store.NotificationRecord+/api/notifications+ Sidebar badge + browser-native toast -
notify(text, channel?)tool β any agent can push to the user; Inbox by default, IM channels whenMyChatIDis configured -
MyChatIDper channel β decouples "agent that handles incoming messages" (binding) from "where to push outgoing notifications"
Make the agent remember you, not just facts.
- Memory graph: extract entities and relations from conversations
- Time-aware retrieval (recency-weighted scoring)
- Cross-agent shared memory pool with permissions
- Memory browser UI: visualize, edit, prune what each agent knows
- Skill auto-induction: turn frequent prompt patterns into callable skills
- Voice in/out (Whisper STT + pluggable TTS)
- Screen understanding (screenshot β multimodal LLM β action)
- First-class file ingestion (PDF / video / Excel β memory)
- Skills Hub: a "GitHub for skills" with one-click install
- Agent export/import: full bundle (persona + skills + memory schema)
- Multi-device sync (laptop + phone + server share state)
- P2P session handover (start at home, finish on the road)
- End-to-end encrypted remote access β without renting a VPS
- Full audit log (every tool call, traceable & rollback-able)
- Permission system v2 (fine-grained, dangerous-op confirmation)
- Backup, disaster recovery, HA mode
- Multi-user / team mode
| Capability | Notes |
|---|---|
| ReAct loop | Multi-turn reasoning + tool calling, configurable max iterations |
| Any LLM | Any OpenAI-compatible API; per-call model override from the chat UI |
| Multi-agent | Independent persona / memory / skills per agent; team @mention routing |
| Memory | MEMORY.md + FTS / pgvector; auto-pruning + LLM-driven compression |
| Skills | On-demand SKILL.md loading; agents can learn skills from interaction patterns |
| Channels | Web Β· Telegram Β· Discord Β· Slack Β· custom (JSON-RPC plugin) |
| Cron | Cron expressions / intervals / one-shot β single store-backed ledger |
| Inbox | Cron / webhook / notify results land in the dashboard Inbox + browser toast |
notify(text, channel?) |
Any agent can push to the user β Inbox by default, IM when MyChatID is set |
| Hooks | Before / After hooks on prompts, model calls, tool calls |
| Hot reload | Edit config or SOUL.md β takes effect immediately |
| Storage | File (default) Β· PostgreSQL + pgvector Β· SQLite + FTS5 |
| Security | Sandbox exec Β· YAML policy engine Β· AES-256-GCM credential vault Β· PII scrubbing Β· tool-loop detection |
| Platform | Web dashboard Β· OpenAI-compatible REST Β· WebSocket Β· MCP client Β· daemon mode |
exec Β· read_file / write_file / list_dir Β· web_fetch Β· web_search Β· memory_search Β· message Β· notify Β· spawn_subagent Β· create_cron_job / list_cron_jobs / delete_cron_job Β· load_skill Β· db_query / db_create_table Β· all MCP tools
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Pawnix Gateway β
β β
Web UI βββββΆ β ββββββββββββ βββββββββββββββββββββββββββ β
Channels βββΆ β β Message β β Agent Manager β β
Plugins ββββΆ β β Bus ββββββββββββββββΆβ Agent A Β· Agent B Β· β¦ β β
Webhooks βββΆ β β βββββββββββββββββ (skills Β· hooks Β· mem) β β
API ββββββββΆ β ββββββββββββ ββββββββββββββ¬βββββββββββββ β
β β β
β βββββββββββ¬ββββββββββββ¬ββββββββββββββ¬ββββ΄ββββββ¬βββββββ β
β βΌ βΌ βΌ βΌ βΌ βΌ β
β Tools Memory Sessions Policy Cron Inbox β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β REST Β· SSE Β· WebSocket Β· Webhooks Β· Web UI :18953 β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
βββββββ daemon supervisor (crash + restart aware) βββββββ
The daemon supervisor (pawnix daemon __run) wraps the gateway in a restart loop and recognises exit code 75 as "restart-on-purpose" (used by Save & Restart in the UI), so config changes apply atomically.
ββββ single store ledger (cron_jobs, notifications) ββββ
β β
βΌ β
[scheduler.pollStore] βββ store.SaveCronJob βββββ UI / agent's create_cron_job
β
β fire (msg.AgentID + msg.Origin='cron')
βΌ
[routing.routeDM] βββΊ [agent.HandleMessage] βββΊ reply
β
βββββββββββββββββββββββββββββββββββ΄βββββββββββββββββββββ
β β
βΌ βΌ
Channel='' or 'web' Channel='telegram' / 'slack' / β¦
β β
βΌ βΌ
store.SaveNotification bus.Outbound β chanMgr β IM bot
β β
βΌ βΌ
Sidebar badge + browser toast Push lands in Telegram / Slack
The same notify(text, channel?) tool β usable by any agent, not just the one bound to the channel β lets watchers, finished long-running tasks, and proactive alerts share this pipeline.
Pawnix reads ~/.pawnix/pawnix.json on startup. The dashboard manages most of this for you; the snippets below are for power users.
{
"providers": {
"openai": { "apiKey": "${OPENAI_API_KEY}", "apiBase": "https://api.openai.com/v1", "apiType": "openai" },
"deepseek": { "apiKey": "${DEEPSEEK_API_KEY}", "apiBase": "https://api.deepseek.com/v1", "apiType": "openai" }
},
"agents": {
"defaults": { "model": "deepseek/deepseek-v4-pro", "maxTokens": 8192, "temperature": 0.7, "thinking": "medium" },
"list": [
{ "id": "coder", "model": "anthropic/claude-sonnet-4.5", "skills": ["debugging", "tdd"] },
{ "id": "analyst", "model": "deepseek/deepseek-v4-flash", "skills": ["financial-modeling"] }
]
},
"channels": {
"telegram": {
"enabled": true,
"accounts": {
"main": {
"botToken": "123456:ABC...",
"myChatId": "8175643861"
}
}
}
},
"bindings": [
{ "agentId": "coder", "match": { "channel": "telegram", "accountId": "main" } }
],
"storage": {
"type": "postgres",
"dsn": "postgres://user:pass@localhost:5432/pawnix?sslmode=disable",
"autoMigrate": true
},
"mcpServers": {
"brave-search": { "type": "http", "url": "https://api.search.brave.com/mcp", "headers": { "Authorization": "Bearer ${BRAVE_API_KEY}" } },
"local-tool": { "type": "stdio", "command": "python", "args": ["-m", "my_mcp_server"] }
}
}Storage backends: "file" (default), "postgres", "sqlite".
Pawnix plugins are subprocesses speaking JSON-RPC 2.0 over stdin/stdout β write them in Python, Node, Go, anything.
Plugin types: channel Β· tool Β· provider Β· hook
pawnix plugins install telegram # from Pawnix Hub
pawnix plugins install github.com/user/repo # from a GitHub repo
pawnix plugins install ./my-plugin # from a local directoryOfficial plugins live in plugins/.
http://localhost:18953
| Page | What it does |
|---|---|
| Overview | Gateway status, stats, quick actions |
| Chat | Talk to your agents in the browser, async task-based |
| Inbox | Cron / webhook / agent-initiated notifications + browser toasts |
| Agents | Create / edit / delete agents, edit SOUL.md, MEMORY.md |
| Models | Manage providers and the default model |
| Skills | Browse and manage installed skills |
| Plugins | Enable / disable / configure plugins |
| Channels | Add Telegram / Discord / Slack accounts; bind agents; set "My chat ID" for push |
| Cron Jobs | Create and manage scheduled tasks |
| Apps | Quick-launch companion dashboards |
| Settings | Storage backend, webhook, gateway config |
# OpenAI-compatible chat
curl -X POST http://localhost:18953/v1/chat/completions \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"model":"auto","messages":[{"role":"user","content":"hello"}],"stream":true}'// WebSocket (OpenClaw-compatible)
const ws = new WebSocket('ws://localhost:18953/ws');
ws.send(JSON.stringify({ type: 'chat', message: 'hello' }));Internal endpoints (Pawnix-native): /api/cron, /api/notifications, /api/channels, /api/agents, /api/chat/..., /api/daemon/restart.
pawnix # start (setup wizard or gateway)
pawnix gateway # start gateway explicitly
pawnix doctor # check config health
pawnix upgrade # update to latest
pawnix daemon start|stop|restart|status
pawnix plugins install <name|repo|path>
pawnix plugins list|remove
pawnix agent create|list
pawnix migrate # JSONL sessions β PostgreSQL
pawnix backupgit clone https://github.com/softbreezee/claw-os.git
cd claw-os
./setup.sh # checks (and offers to install) Go, Node, PostgreSQL
make build # binary + embedded web UI (production)
make dev-build # fast local rebuild after `cd web && pnpm build`
make dev # hot reload via air
make test
make release-local # all platforms~/.pawnix/
βββ pawnix.json # main config
βββ pawnix.pid # daemon PID
βββ cron_jobs.json # cron ledger (file backend)
βββ notifications.json # inbox ledger (file backend)
βββ logs/gateway.log
βββ agents/<id>/agent/ # SOUL / MEMORY / IDENTITY / sessions / skills / ...
βββ plugins/
PostgreSQL tables (when storage.type = "postgres"): configs Β· agents Β· workspace_files Β· sessions Β· memory_logs Β· cron_jobs Β· notifications Β· chat_tasks Β· memories Β· research_data Β· schema_registry
Contributions welcome. Pawnix's strength is simplicity β keep it that way.
Pawnix stands on the shoulders of fastclaw-ai/fastclaw.
This project began as a fork of FastClaw and evolved into a self-hosted AI-Native personal OS. The entire v0.1 Foundation β multi-LLM provider routing, multi-agent gateway, channels (Telegram / Discord / Slack), the skill system, plugin protocol, MCP client, dual-layer memory, daemon supervisor, web dashboard scaffolding β all originated in or grew directly out of FastClaw's design and code.
Huge thanks to the FastClaw authors for building such a clean, hackable foundation, and for releasing it under MIT so projects like this one are even possible. If you like Pawnix, please go give the original repo a star.