Autonomous orchestrator for Claude Code โ runs your task queue 24/7
Project description
๐ค Noru
Ship while you sleep โ autonomous Claude Code orchestration
Your AI developer that never sleeps. Noru is a Python CLI + web dashboard that runs Claude Code tasks autonomously 24/7 โ managing priorities, token budgets, and idle code reviews so your codebase improves around the clock.
๐ Table of Contents
- ๐ Table of Contents
- โจ Features
- ๐ Quick Start
- ๐ Dashboard
- โ๏ธ Configuration
- ๐ง CLI Reference
- ๐ Integrations
- ๐ Tunnel (Remote Access)
- ๐ก API Reference
- ๐๏ธ Architecture
- ๐ค Contributing
- ๐ License
โจ Features
| Feature | Description |
|---|---|
| ๐ฏ Autonomous Task Queue | Priority-based scheduling with weight classes (light/medium/heavy) |
| ๐ Real-Time Dashboard | Kanban board, stats, charts โ desktop + mobile responsive |
| ๐ Token Budget Management | 5-hour session windows + weekly limits with auto-pause |
| ๐ Idle Code Reviews | 16 built-in review types run via watermark refill when ready tasks drop below threshold |
| โธ๏ธ Pause / Resume | Pause the agent from the CLI or API โ server stays up, dispatch stops |
| ๐ Language Config | Claude responds in your language โ 13 supported languages |
| ๐ Activity Log | Persistent event timeline for every dispatch, pause, and state change |
| ๐ก๏ธ Guardrails | User-defined rules injected into all prompts to prevent noru from overstepping |
| ๐ Plugin Notifications | Telegram, Slack, Discord โ know when tasks complete |
| ๐ Remote Access | Built-in tunnel support (cloudflared/ngrok) with QR code |
| ๐ง Full REST API | Everything the dashboard can do, your scripts can too |
| ๐ Event Hooks | Custom notifications on task start, complete, fail |
| โก Zero Build Step | No npm, no webpack, no framework overhead โ just Python |
| ๐ก๏ธ SQLite + WAL | Fast, reliable, zero-config database |
๐ Quick Start
Get Noru running in under 2 minutes:
1. Install
pip install noru
2. Initialize a project
cd ~/your-project
noru init
๐ก Tip:
noru initscans your project and suggests initial tasks based on TODOs, open issues, and code quality signals.
3. Start the orchestrator
noru start
That's it. Noru is now running tasks and serving the dashboard at http://localhost:7777.
# Open the dashboard in your browser
noru dashboard
# Check what's happening
noru status
Adding tasks manually
# Add a task
noru task add --project my-app --title "Fix authentication bug" --priority 1
# Promote it to the queue
noru task ready 1
# Watch it get picked up automatically
noru status
๐ Dashboard
Noru ships with a single-file HTML dashboard โ no build step, no node_modules. Just open http://localhost:7777.
Tabs
| Tab | What it shows |
|---|---|
| ๐ Overview | Metric cards, token window bar, weekly budget bar, agent controls, recent activity |
| ๐ Kanban | 4-column board (Todo โ Doing โ Review โ Done) with project filters |
| ๐ Projects | Project cards with status and task counts |
| ๐ Tasks | Searchable, filterable table with all tasks |
| ๐ Stats | Token usage charts, completion rates, cost tracking |
๐ฑ Mobile friendly. The dashboard is fully responsive โ check on your tasks from your phone while you're out.
โ๏ธ Configuration
Full reference: docs/configuration.md
Config lives at ~/.noru/config.yaml. Created automatically on first run, or customize it:
# Core settings
loop_interval_seconds: 60
port: 7777
claude_cli: claude
# Token budget โ 5-hour rolling window
max20_window_tokens: 220000
window_duration_hours: 5
# Weekly budget
weekly:
seed_limit: 1500000
developer_reserve_pct: 0.35 # 35% reserved for your interactive sessions
reset_day: monday
# Guardrails โ injected into all prompts
guardrails:
- "NEVER change database schema or migrations"
- "NEVER re-architect the project layout"
# Watermark refill โ trigger idle scans when ready tasks drop below threshold
watermark:
low_watermark: 2
scan_cooldown_seconds: 60
# Idle review jobs (run when ready tasks < watermark)
idle_jobs:
max_tasks_per_run: 3
jobs:
- id: security-scan
enabled: true
- id: bug-detection
enabled: true
- id: test-coverage
enabled: true
# ... see full list below
๐ก Tip: You can also edit configuration from the dashboard's admin panel.
๐ก๏ธ Guardrails
User-defined rules injected into every prompt noru sends to Claude Code. Use them to set hard boundaries on what noru is allowed to do:
guardrails:
- "NEVER change database schema or migrations"
- "NEVER re-architect the project layout"
- "NEVER modify CI/CD pipelines"
๐ Idle Review Jobs (16 built-in)
When ready tasks drop below the watermark threshold, noru triggers a scan that creates review tasks automatically. This is stateless โ no phases, no state machine. Just: ready_tasks < low_watermark triggers a scan, then cooldown.
| Job | Default | Focus |
|---|---|---|
security-scan |
โ ON | XSS, injection, secrets, OWASP Top 10 |
bug-detection |
โ ON | Test failures, type errors, edge cases |
logic-review |
โ ON | Business logic, missing validations |
test-coverage |
โ ON | Untested functions, generate tests |
code-quality |
โ ON | Dead code, unused imports, TODOs |
refactor |
โฌ OFF | Extract functions, reduce duplication |
ui-bug-scan |
โฌ OFF | Visual regressions, broken layouts |
ux-review |
โฌ OFF | Accessibility, navigation, UX patterns |
ui-polish |
โฌ OFF | Spacing, alignment, consistency |
perf-audit |
โฌ OFF | N+1 queries, memory leaks |
docs-update |
โฌ OFF | Missing docstrings, README gaps |
dependency-check |
โฌ OFF | Outdated packages, CVEs |
api-review |
โฌ OFF | Endpoint consistency, validation |
type-safety |
โฌ OFF | Missing type hints |
error-handling |
โฌ OFF | Missing try/catch, error propagation |
pr-review |
โฌ OFF | Review open PRs on GitHub |
# Enable/disable review jobs
noru idle enable perf-audit
noru idle disable docs-update
noru idle list
๐ง CLI Reference
Lifecycle
| Command | Description |
|---|---|
noru start |
Start orchestrator + dashboard server |
noru stop |
Graceful stop (finishes current task) |
noru stop --force |
Immediate stop |
noru restart |
Stop then start |
noru pause |
Pause dispatch โ server stays up, no tasks run |
noru status |
Current state, queue depth, active task |
noru status --json |
Machine-readable status output |
noru dashboard |
Open dashboard in browser |
noru logs |
Tail orchestrator logs |
Task Management
| Command | Description |
|---|---|
noru task add --project ID --title "..." --priority N |
Add a task |
noru task ready ID |
Promote task to the active queue |
noru task list |
List all tasks |
noru task list --status todo --project my-app |
Filter tasks |
noru task done ID |
Mark task done manually |
noru task skip ID |
Skip task (lower priority) |
Project Management
| Command | Description |
|---|---|
noru project add --id my-app --name "My App" --repo-path ~/dev/my-app |
Register a project |
noru project list |
List all projects |
noru project pause ID |
Pause a project (skip its tasks) |
noru project resume ID |
Resume a paused project |
noru init |
Scan current directory and propose tasks |
Configuration
| Command | Description |
|---|---|
noru config show |
View current configuration |
noru config set KEY VALUE |
Set a config value (dot notation) |
noru config reset |
Reset config to defaults |
Idle Reviews
| Command | Description |
|---|---|
noru idle list |
Show all review jobs with on/off status |
noru idle enable JOB |
Enable a review job |
noru idle disable JOB |
Disable a review job |
Direct Execution
| Command | Description |
|---|---|
noru run |
Run one task now (bypasses scheduler) |
noru run --task ID |
Run a specific task |
noru run --dry-run |
Show the prompt without executing |
๐ Integrations
Full reference: docs/integrations.md
Noru supports event hooks for notifications when tasks complete, fail, or when the queue empties.
Telegram
# ~/.noru/config.yaml
hooks:
telegram:
enabled: true
bot_token: "your-bot-token"
chat_id: "your-chat-id"
events: [task_completed, task_failed, queue_empty]
Slack
hooks:
slack:
enabled: true
webhook_url: "https://hooks.slack.com/services/..."
events: [task_completed, task_failed]
Discord
hooks:
discord:
enabled: true
webhook_url: "https://discord.com/api/webhooks/..."
events: [task_completed, task_failed]
๐ก Tip: You can combine multiple integrations. All hooks fire independently.
๐ Tunnel (Remote Access)
Full reference: docs/tunnel.md
Access your dashboard from anywhere โ no port forwarding required.
# Start a tunnel (auto-detects cloudflared or ngrok)
noru tunnel start
# Displays a public URL + QR code for mobile access
# Example: https://abc123.trycloudflare.com
| Provider | Setup |
|---|---|
| cloudflared (recommended) | brew install cloudflared โ no account needed |
| ngrok | brew install ngrok โ free account required |
โ ๏ธ Warning: The tunnel exposes your dashboard to the internet. Use it on trusted networks or add authentication.
๐ก API Reference
Full reference: docs/api.md
Noru exposes a full REST API at http://localhost:7777/api. Everything the dashboard does, your scripts can do too.
Key endpoints:
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/status |
Orchestrator state and queue info |
GET |
/api/tasks |
List all tasks (supports filters) |
POST |
/api/tasks |
Create a new task |
PATCH |
/api/tasks/:id |
Update task status or priority |
GET |
/api/projects |
List all projects |
GET |
/api/budget |
Token budget status |
GET |
/api/stats |
Usage statistics and charts data |
POST |
/api/agent/start |
Start the orchestrator |
POST |
/api/agent/stop |
Stop the orchestrator |
# Example: list tasks via curl
curl http://localhost:7777/api/tasks | python3 -m json.tool
# Example: add a task via API
curl -X POST http://localhost:7777/api/tasks \
-H "Content-Type: application/json" \
-d '{"project_id": "my-app", "title": "Fix login bug", "priority": 1}'
๐๏ธ Architecture
noru start
โโโ Python process (single PID)
โโโ Main thread: uvicorn (FastAPI on :7777)
โโโ Daemon thread: OrchestratorLoop
โโโ Fetches usage via tmux /usage command (HTTP API fallback)
โโโ Picks highest-priority eligible task
โโโ Dispatches to Claude Code via tmux sessions (session-id continuity)
โโโ Detects 429 rate-limit errors and backs off reactively
โโโ Records results to SQLite (WAL mode)
Every loop cycle (default 60s) โ scheduler picks one of 4 actions:
- dispatch โ evaluate token budgets, pick highest-priority task, send to Claude Code
- sleep โ budget exhausted, wait for token window to refill
- idle โ queue empty + ready tasks below watermark, trigger scan to create review tasks
- create_only โ budget too low for execution, only create/plan tasks
Project Structure
src/noru/
โโโ core/ # Models, database, config, constants (zero external deps)
โโโ engine/ # Token monitor, weekly tracker, queue, scheduler
โโโ executor/ # WorkerBackend protocol, Claude CLI, dispatcher, idle reviewer
โโโ interface/ # Orchestrator loop, Click CLI, FastAPI server, dashboard
โโโ integrations/ # Hooks (Telegram, Slack, Discord), superpowers, agency-agent
Tech Stack
- Python 3.11+ โ threaded orchestrator, zero JS build step
- SQLite (WAL mode) โ fast concurrent reads, zero config
- FastAPI โ REST API + dashboard serving
- Click โ CLI framework
- Alpine.js + Chart.js โ dashboard UI (single HTML file)
The WorkerBackend protocol abstracts CLI execution. The default TmuxWorker manages persistent Claude Code tmux sessions with session-id continuity per project. You can implement your own backend for other LLM CLIs.
๐ค Contributing
Contributions are welcome! Noru is built with a test-first approach.
# Clone and install
git clone https://github.com/pxson2903/noru.git
cd noru
pip install -e ".[dev]"
# Run tests
pytest
# Run a specific test file
pytest tests/core/test_database.py -v
Guidelines:
- Write tests first, then implement (TDD)
- Use frozen dataclasses for models
- All DB queries go in
core/database.pyas named methods - Follow the
WorkerBackendprotocol for execution backends - Keep
core/free of external dependencies
๐ License
MIT โ use it, fork it, ship with it.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file noru-0.1.0.tar.gz.
File metadata
- Download URL: noru-0.1.0.tar.gz
- Upload date:
- Size: 105.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea3c343cfd6fb13ac197834be3052c127990cb9a97e3b6add8c84c68712e661d
|
|
| MD5 |
9c1be95f1a7794cbb31bc4ef3cd35b86
|
|
| BLAKE2b-256 |
e9091db1eed854dc20aaeb6355c34a93251c3e435105228b455b982c430b95eb
|
File details
Details for the file noru-0.1.0-py3-none-any.whl.
File metadata
- Download URL: noru-0.1.0-py3-none-any.whl
- Upload date:
- Size: 116.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2bfccc13802752b2f9cabdb46d5bb2a0ef0cb5ebe7f7885703c448e2be68d4ee
|
|
| MD5 |
cb7d3ef48731e74ca5066e9ba3c954ee
|
|
| BLAKE2b-256 |
fc90f9720e28d4f36e2e41139279489257793dcdd546172f1caa99b9ff19285d
|