Your private Claude Code agent, shipped as a product.
Warning
This project is in early alpha. It is not production-ready and APIs may change without notice. Star the repo and watch for updates — contributions and feedback are welcome.
Powerful AI agent environments like Claude Code already exist. But they are private — locked inside individual engineers' terminals.
openwzdm changes that. It lets you take the agents you build on Claude Code and ship them as simple apps that anyone can use — no backend coding, no infrastructure setup.
An engineer builds an agent. Drag & drop to upload. Instantly becomes an app. Optionally monetize it.
This is not a concept. We already generated revenue from a Remotion video generation agent built on this platform.
- From private to public — Turn your personal Claude Code agent into a product others can use
- Zero backend code — Agents are defined by directory structure alone (
CLAUDE.md+.claude/skills/) - Minimize implementation — Built entirely on existing OSS. We don't build what already exists
- Multi-channel — Web UI and Telegram adapter included, extensible to Slack, Discord, LINE, etc.
- Instant deployment — Docker image ready for Railway, Fly.io, or any container host
Getting Started · Architecture · Deployment · Telegram Adapter · API Reference · Contributing
┌──────────┐
│ Web UI │──┐
└──────────┘ │
│ WebSocket
┌──────────┐ │ ┌─────────────────┐ ┌──────────────────┐
│ Telegram │──┼───>│ bridge/ │───>│ @ccpocket/bridge │──> Claude Code CLI
│ Adapter │ │ │ server.mjs │ │ (npm, as-is) │ ├── CLAUDE.md
└──────────┘ │ │ (HTTP + WS │ └──────────────────┘ └── .claude/skills/
│ │ proxy) │
┌──────────┐ │ └─────────────────┘
│ Future │──┘
│ Adapters │
└──────────┘
- Minimize implementation — Maximize use of existing OSS and tools
- Use ccpocket bridge as-is — No forks, no wrappers
- Switch agents via
projectPath— Add agents by directory placement alone
- Node.js >= 20
- An Anthropic API key
# Clone the repo
git clone https://github.com/your-org/openwzdm.git
cd openwzdm
# Start the bridge server
cd bridge
npm install
ANTHROPIC_API_KEY=sk-... node server.mjs
# In another terminal, start the web UI
cd web
npm install
npm run devThe bridge server runs on http://localhost:8080 (REST + WebSocket).
The web UI runs on http://localhost:5173.
- Create a directory with your agent definition:
my-agent/
├── CLAUDE.md # Agent personality & instructions
└── .claude/
└── skills/
└── my-skill.md # Your Claude Code skill
- Zip it and upload:
zip -r my-agent.zip my-agent/
curl -X POST http://localhost:8080/agents/my-agent \
--data-binary @my-agent.zip- Open the web UI and start chatting with your agent.
bridge/agents/
├── {name}/
│ ├── CLAUDE.md # Agent personality & instructions
│ ├── .claude/
│ │ └── skills/ # Claude Code skills (.md files)
│ │ ├── skill-a.md
│ │ └── file-share.md # Common skill (auto-injected)
│ └── [generated files] # Output from agent executions
└── common/
├── BASE_CLAUDE.md # Base instructions prepended to all agents
└── .claude/
└── skills/ # Shared skills injected into all agents
cd bridge
docker build -t openwzdm-bridge .
docker run -p 8080:8080 \
-e ANTHROPIC_API_KEY=sk-... \
-v $(pwd)/agents:/app/agents \
openwzdm-bridge- Connect your repo to Railway
- Set
ANTHROPIC_API_KEYin environment variables - Set root directory to
bridge/ - Deploy — Railway auto-detects the Dockerfile
cd bridge
fly launch
fly secrets set ANTHROPIC_API_KEY=sk-...
fly deploy| Variable | Required | Default | Description |
|---|---|---|---|
ANTHROPIC_API_KEY |
Yes | — | Claude API key |
PORT |
No | 8080 |
Server port |
BRIDGE_PORT |
No | 18765 |
Internal bridge port |
BRIDGE_HOST |
No | 127.0.0.1 |
Bridge host |
SERVICE_DIR |
No | ../service/common |
Path to service overlay directory |
The OSS core ships with generic agent defaults. To add commercial features (payment, custom skills), copy the included template:
cp -r examples/service serviceThis enables the payment flow (stripe-tip) for all agents. See examples/service/README.md for details.
openwzdm/
├── examples/service/ # Template (tracked in git)
├── service/ # Your config (gitignored, copied from examples/)
│ └── common/
│ ├── BASE_CLAUDE.md # Extra instructions (e.g., payment flow)
│ └── .claude/skills/ # Service-specific skills (e.g., stripe-tip)
└── ...
service/is in.gitignore— customize freely without affecting the OSS repo- On agent upload, the bridge automatically layers: OSS
common/→service/common/→ agent-specific - Set
SERVICE_DIRenv var to override the service directory path
Connect your agents to Telegram with the included adapter.
cd adapters/telegram
npm installTELEGRAM_BOT_TOKEN=your-token \
BRIDGE_URL=ws://localhost:8080 \
AGENT_NAME=my-agent \
node index.mjs| Variable | Required | Default | Description |
|---|---|---|---|
TELEGRAM_BOT_TOKEN |
Yes | — | Telegram Bot API token from @BotFather |
BRIDGE_URL |
No | ws://localhost:8080 |
Bridge WebSocket URL |
AGENT_NAME |
No | default |
Agent to connect to |
PROJECT_PATH |
No | /app/agents/{AGENT_NAME} |
Override agent path |
- AskUserQuestion support — Inline keyboard buttons for option selection
- Streaming — Real-time response updates via message editing
- Auto-connect — Session created on first message or
/start
| Method | Endpoint | Description |
|---|---|---|
GET |
/health |
Health check |
GET |
/agents |
List all agents |
POST |
/agents/:name |
Upload agent (ZIP body) |
DELETE |
/agents/:name |
Delete agent |
POST |
/agents/:name/reinject |
Re-inject common skills |
GET |
/agents/:name/files/:path |
Download generated files |
Connect to ws://localhost:8080 (same port as HTTP).
Client → Server:
| Type | Description |
|---|---|
start |
Start new session (projectPath, permissionMode) |
input |
Send user message (text, sessionId) |
approve |
Approve tool execution (toolUseId, sessionId) |
reject |
Reject tool execution (toolUseId, sessionId) |
stop_session |
Stop session (sessionId) |
Server → Client:
| Type | Description |
|---|---|
system |
Session created (contains sessionId) |
status |
Status change (starting, idle, running, etc.) |
stream_delta |
Streaming text chunk |
thinking_delta |
Streaming thinking chunk |
assistant |
Complete assistant message |
tool_result |
Tool execution result |
permission_request |
Permission or AskUserQuestion request |
result |
Turn complete (cost, duration) |
error |
Error message |
openwzdm/
├── bridge/ # Server (Node.js + @ccpocket/bridge proxy)
│ ├── server.mjs # HTTP + WebSocket server
│ ├── Dockerfile # Container image
│ ├── common/ # OSS default skills & base instructions
│ └── agents/ # Agent directories (runtime)
├── web/ # Frontend (React + Vite + Tailwind)
│ └── src/
│ ├── pages/ # Chat, Landing, AgentDetail pages
│ └── components/ # UI components
├── adapters/
│ └── telegram/ # Telegram bot adapter
│ └── index.mjs
└── service/ # Service-specific config (gitignored)
└── common/ # Payment flow, commercial skills, etc.
- Fork the repo
- Create a feature branch
- Make your changes
- Submit a PR
- All code, comments, and docs must be in English
- Minimize custom implementation — use existing OSS where possible
- Keep PRs focused and small
MIT