Skip to main content

Autonomous orchestrator for Claude Code โ€” runs your task queue 24/7

Project description

๐Ÿค– Noru

Ship while you sleep โ€” autonomous Claude Code orchestration

Python 3.11+ License: MIT Claude Code PRs Welcome

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.

Noru Demo
โ–ถ๏ธ Watch the demo (2 min)


๐Ÿ“‘ Table of Contents


โœจ 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 init scans 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:

  1. dispatch โ€” evaluate token budgets, pick highest-priority task, send to Claude Code
  2. sleep โ€” budget exhausted, wait for token window to refill
  3. idle โ€” queue empty + ready tasks below watermark, trigger scan to create review tasks
  4. 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.py as named methods
  • Follow the WorkerBackend protocol for execution backends
  • Keep core/ free of external dependencies

๐Ÿ“„ License

MIT โ€” use it, fork it, ship with it.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

noru-0.1.0.tar.gz (105.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

noru-0.1.0-py3-none-any.whl (116.6 kB view details)

Uploaded Python 3

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

Hashes for noru-0.1.0.tar.gz
Algorithm Hash digest
SHA256 ea3c343cfd6fb13ac197834be3052c127990cb9a97e3b6add8c84c68712e661d
MD5 9c1be95f1a7794cbb31bc4ef3cd35b86
BLAKE2b-256 e9091db1eed854dc20aaeb6355c34a93251c3e435105228b455b982c430b95eb

See more details on using hashes here.

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

Hashes for noru-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2bfccc13802752b2f9cabdb46d5bb2a0ef0cb5ebe7f7885703c448e2be68d4ee
MD5 cb7d3ef48731e74ca5066e9ba3c954ee
BLAKE2b-256 fc90f9720e28d4f36e2e41139279489257793dcdd546172f1caa99b9ff19285d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page