Skip to content

softbreezee/claw-os

Repository files navigation

Pawnix logo

Pawnix

A self-hosted, AI-Native personal OS β€” in a single Go binary.

Go License Status

Multi-agent Β· Multi-channel Β· Long-term memory Β· Cron + Inbox notifications Β· MCP Β· Plugins Β· Web dashboard

Install Β· Quick Start Β· Channels Β· Architecture Β· Roadmap


What is Pawnix?

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 notify you β€” 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.md and 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

πŸ“¦ Install

# 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

πŸš€ Quick Start

  1. Run pawnix β€” the setup wizard opens at http://localhost:18953.
  2. Pick an LLM provider (OpenAI, Anthropic, or any OpenAI-compatible endpoint).
  3. Click Launch β€” start chatting in the browser.
  4. Optional: open Channels in the sidebar to connect Telegram / Discord / Slack (see below).

πŸ’¬ Channels Setup

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).

Telegram

  1. Create a bot. Talk to @BotFather β†’ /newbot β†’ name it β†’ copy the bot token (123456789:ABC…).
  2. Find your chat ID. Talk to @userinfobot β†’ it replies with your numeric ID (e.g. 8175643861).
  3. Add the channel. Pawnix dashboard β†’ Channels β†’ Add channel β†’ Telegram β†’ paste the token β†’ bind to an agent β†’ Save & Restart.
  4. Set "My chat ID". In the Telegram card, paste the ID from step 2 into the My chat ID field β†’ Save & Restart.
  5. 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.

Discord

  1. Create a bot. Discord Developer Portal β†’ New Application β†’ Bot tab β†’ reset & copy the token. Enable MESSAGE CONTENT INTENT.
  2. Invite it to your server. OAuth2 URL Generator β†’ scopes: bot β†’ permissions: Send Messages, Read Message History β†’ open the URL β†’ invite to your server.
  3. Find your user ID. Discord β†’ Settings β†’ Advanced β†’ enable Developer Mode β†’ right-click your name β†’ Copy User ID.
  4. Add the channel. Pawnix dashboard β†’ Channels β†’ Add channel β†’ Discord β†’ paste the token β†’ bind agent β†’ fill My user ID β†’ Save & Restart.
  5. Done. DM the bot from Discord to talk; cron / notify deliver back to your DMs.

Slack

  1. Create a Slack app at https://api.slack.com/apps with Socket Mode enabled.
  2. Generate a Bot User OAuth Token (xoxb-…) and an App-Level Token with connections:write (xapp-…).
  3. Find your member ID. Profile β†’ β‹― β†’ Copy member ID (U0XXXXXXX).
  4. 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.


πŸ—Ί Roadmap

v0.1 β€” Foundation

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 @mention routing
  • 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

v0.2 β€” Rebrand & The OS Layer  ← you are here

From FastClaw to Pawnix β€” and from "agent runtime" to "personal OS".

  • Binary pawnix Β· config dir ~/.pawnix/ Β· config file pawnix.json Β· module github.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 when MyChatID is configured
  • MyChatID per channel β€” decouples "agent that handles incoming messages" (binding) from "where to push outgoing notifications"

v0.3 β€” Memory OS Β next

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

v0.4 β€” Multi-modal & Voice

  • Voice in/out (Whisper STT + pluggable TTS)
  • Screen understanding (screenshot β†’ multimodal LLM β†’ action)
  • First-class file ingestion (PDF / video / Excel β†’ memory)

v0.5 β€” Agent Marketplace

  • Skills Hub: a "GitHub for skills" with one-click install
  • Agent export/import: full bundle (persona + skills + memory schema)

v0.6 β€” Distributed Mesh

  • 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

v1.0 β€” Production Persona

  • 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

✨ Features

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

Built-in tools

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


πŸ— Architecture

                β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                β”‚                       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.

Notifications & cron data flow

   β”Œβ”€β”€β”€ 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.


πŸ”§ Configuration

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".


πŸ”Œ Plugins

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 directory

Official plugins live in plugins/.


πŸ–₯ Web Dashboard

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

πŸ”— API

# 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.


πŸ›  CLI

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 backup

πŸ›  Development

git 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

Workspace layout

~/.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


Contributing

Contributions welcome. Pawnix's strength is simplicity β€” keep it that way.

License

MIT

πŸ™ Acknowledgements

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.


Built with 🐾 by the Pawnix community · Forked with gratitude from FastClaw

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors