
A React 19 web dashboard for claude-flow v3 multi-agent orchestration. RuFloUI wraps the claude-flow CLI behind an Express + WebSocket backend and presents a full visual interface for managing swarms, agents, tasks, and workflows.
.ruflo/ with debounced writes and crash recovery| Layer | Technology |
|---|---|
| Frontend | React 19, Vite 6, TypeScript, Zustand, Recharts, Lucide Icons |
| Backend | Express, WebSocket (ws), Node.js |
| CLI | claude-flow v3 (@claude-flow/cli local binary) |
| AI | Claude Code CLI for multi-agent execution |
# Clone the repository
git clone https://github.com/Mario-PB/rufloui.git
cd rufloui
# Install dependencies
npm install
# Start both frontend and backend
npm run dev
This starts:
- Frontend (Vite) on http://localhost:28588
- Backend (Express + WebSocket) on http://localhost:28580
The frontend proxies /api/* and /ws to the backend automatically.
npm install rufloui
# Configure npm to use GitHub Packages for the @mario-pb scope
echo "@mario-pb:registry=https://npm.pkg.github.com" >> .npmrc
# Install the package
npm install @mario-pb/rufloui
Note: GitHub Packages requires a personal access token with
read:packagesscope. Add it to your~/.npmrc://npm.pkg.github.com/:_authToken=YOUR_TOKEN
npm run dev:frontend # Vite dev server on port 28588
npm run dev:backend # Express API on port 28580 (auto-reloads)
npm run build # TypeScript check + Vite production build -> dist/
npm run preview # Preview the production build
src/
├── backend/
│ ├── server.ts # Express API + WebSocket + multi-agent pipeline
│ └── jsonl-monitor.ts # Real-time JSONL session file monitoring
└── frontend/
├── main.tsx # Entry point
├── App.tsx # Router, WebSocket handler, data fetching
├── api.ts # API client (typed fetch wrapper)
├── store.ts # Zustand global state with sessionStorage persistence
├── types.ts # TypeScript interfaces
├── styles/
│ └── global.css # CSS variables, dark theme, animations
├── components/
│ ├── Layout.tsx # App shell with sidebar navigation
│ ├── ErrorBoundary.tsx
│ └── ui/ # Button, Card, StatusBadge
└── pages/
├── Dashboard.tsx # System health, agent overview
├── SwarmPanel.tsx # Swarm init/shutdown/config
├── SwarmMonitorPanel.tsx # Real-time agent cards with output
├── AgentsPanel.tsx # Agent lifecycle management
├── AgentVizPanel.tsx # JSONL-based agent tree visualization
├── TasksPanel.tsx # Kanban task board with continuation
├── WorkflowsPanel.tsx # Workflow management
├── HiveMindPanel.tsx # Consensus and broadcast
├── MemoryPanel.tsx # Key-value memory store
├── NeuralPanel.tsx # Neural network status
├── PerformancePanel.tsx # Benchmarks and charts
├── SessionsPanel.tsx # Save/restore sessions
├── HooksPanel.tsx # Hook configuration
├── ConfigPanel.tsx # Configuration editor
└── LogsPanel.tsx # Live activity logs
Browser (React 19) Express Backend
┌────────────────────┐ ┌────────────────────────┐
│ Vite :28588 │───REST /api──>│ Express :28580 │
│ Zustand Store │<──WebSocket──>│ WebSocket Server │
│ sessionStorage │ │ │
└────────────────────┘ │ ┌──────────────────┐ │
│ │ claude-flow CLI │ │
│ │ (npx @claude-flow │ │
│ │ /cli@latest) │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ Claude Code CLI │ │
│ │ (claude -p) │ │
│ │ Multi-agent pipe │ │
│ └──────────────────┘ │
│ ┌──────────────────┐ │
│ │ .ruflo/ │ │
│ │ state.json │ │
│ │ outputs/*.jsonl │ │
│ └──────────────────┘ │
└────────────────────────┘
When a task is assigned to the swarm:
--max-turns 1 (no tool access), outputs a JSON plan breaking work into subtasksOnce the app is running, here's how to go from zero to a working multi-agent swarm in under a minute:
mesh), and click Initialize Swarm.coder), give it a name, and click Spawn. Repeat for other roles you need (researcher, tester, etc.).npm install (included as dependency)Monitor and control RuFloUI from Telegram.
Option A: Via the Dashboard (recommended)
/newbot, and follow the prompts to get a bot token./start to get your chat ID.Option B: Via environment variables
TELEGRAM_ENABLED=true
TELEGRAM_BOT_TOKEN=123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
TELEGRAM_CHAT_ID=123456789
Restart the backend. You should see [telegram] Bot connected as @YourBotName in logs.
| Command | Description |
|---|---|
/start |
Shows your chat ID (works for any user) |
/status |
System health + swarm status + agent/task counts |
/agents |
List active agents with type and status |
/tasks |
Tasks grouped by status (with inline refresh) |
/task <id> |
Detailed info for one task (with cancel button) |
/workflows |
List workflows with status and step count |
/swarm |
Swarm topology and status |
/run <description> |
Create and assign a task to the swarm |
/cancel <id> |
Cancel a running or pending task |
/help |
List available commands |
Configurable per-type via the dashboard (Config > Telegram Bot > Notifications):
| Notification | Default | Description |
|---|---|---|
| Task Completed | On | Task finishes successfully |
| Task Failed | On | Task fails with error |
| Swarm Initialized | On | Swarm starts up |
| Swarm Shutdown | On | Swarm stops |
| Agent Error | On | Agent encounters an error |
| Task Progress | Off | Progress updates (throttled to 1 per 30s per task) |
/start but cannot issue commands..ruflo/telegram.json with restricted file permissions (0600).Set TELEGRAM_ENABLED=false (or remove it) and restart. The bot is completely inert when disabled.
Automatically create swarm tasks when GitHub issues are opened.
repo scope).application/json, select Issues events.When a new issue is opened in a monitored repo:
| Variable | Default | Description |
|---|---|---|
GITHUB_WEBHOOK_ENABLED |
false |
Enable webhook receiver |
GITHUB_TOKEN |
— | GitHub PAT with repo scope |
GITHUB_WEBHOOK_SECRET |
— | HMAC secret for signature validation |
GITHUB_WEBHOOK_REPOS |
— | Comma-separated owner/repo list |
Contributions are welcome! Here's how you can help:
git checkout -b feat/my-featurenpm run build to make sure everything compilesIf RuFloUI is useful to you, consider buying us a coffee:
By default, RuFloUI runs Claude Code agents with --dangerously-skip-permissions, which allows agents to read, write, and execute commands without asking for confirmation. This is required for autonomous multi-agent orchestration — without it, every agent would block waiting for human approval on each action.
To disable autonomous mode, set the environment variable:
RUFLOUI_SKIP_PERMISSIONS=false
With this disabled, agents will require manual approval for each tool use, which effectively prevents autonomous swarm execution.
RuFloUI is designed for local development use. The API server binds to localhost and restricts CORS to the frontend origin. Do not expose the API to untrusted networks without adding authentication.
$ claude mcp add RuFloUI \
-- python -m otcore.mcp_server <graph>