Autonomous development automation with Claude Code, Linear, and Notion.
Move a task to "Todo" in Linear or Notion and Claudear takes over — it creates an isolated git worktree, runs Claude Code to implement the work, posts progress updates, and opens a PR when done. Move to "Done" and the PR auto-merges.
- Multi-Provider: Works with Linear (webhooks) and Notion (polling)
- Multi-Team/Database: Support multiple Linear teams or Notion databases simultaneously
- Per-Project Repos: Each team/database can have its own repository
- Parallel Execution: Run multiple Claude Code sessions concurrently
- Auto PR Creation: Pushes code and creates PRs automatically
- Auto PR Merge: Move to "Done" to merge PRs
- Progress Updates: Posts comments as Claude works
# 1. Clone the repository
git clone https://github.com/ianborders/claudear.git
cd claudear
# 2. Install the claudear command
pip install claudear
# 3. Create your config
cp .env.example .envEdit .env with your API keys (see Configuration below).
pip install -U claudearStart Claudear from the cloned directory:
cd claudear
claudearImportant: Always run
claudearfrom the cloned repository directory. Configuration is loaded from.envin the current working directory.
- Move task to Todo — Claudear picks it up
- Automatic implementation — Creates isolated git worktree, runs Claude Code
- Progress updates — Comments on Linear/Notion as it works
- Blocked? — Posts a comment asking for help, waits for your reply
- Complete — Pushes code, creates PR, moves to "In Review"
- Move to "Done" — PR auto-merges, worktree cleaned up
- Python 3.9+
- Claude Code CLI installed and authenticated
- ngrok account (free tier works) — for Linear webhooks
- GitHub CLI (
gh) installed and authenticated - Linear workspace with API access, and/or Notion workspace with API access
# Linear
LINEAR_API_KEY=lin_api_xxx # Settings → API → Personal API keys
LINEAR_WEBHOOK_SECRET=whsec_xxx # Created when you register the webhook
LINEAR_TEAM_ID=ENG # Your team key from URL (linear.app/ENG/...)
# Linear workflow states (must match exactly)
LINEAR_STATE_TODO=Todo
LINEAR_STATE_IN_PROGRESS=In Progress
LINEAR_STATE_IN_REVIEW=In Review
LINEAR_STATE_DONE=Done
# GitHub
GITHUB_TOKEN=ghp_xxx # Settings → Developer settings → Tokens
# Repository
REPO_PATH=/path/to/your/repo # The repo Claudear will work on
# Server & ngrok
WEBHOOK_PORT=8000
NGROK_AUTHTOKEN=xxx # dashboard.ngrok.com → Your AuthtokenLINEAR_API_KEY=lin_api_xxx
LINEAR_WEBHOOK_SECRET=whsec_xxx
LINEAR_TEAM_IDS=ENG,INFRA,DESIGN # Comma-separated team keys
# Per-team repository paths
LINEAR_ENG_REPO=/path/to/engineering-repo
LINEAR_INFRA_REPO=/path/to/infrastructure-repo
LINEAR_DESIGN_REPO=/path/to/design-system-repoNOTION_API_KEY=secret_xxx
NOTION_DATABASE_ID=abc123def456
NOTION_POLL_INTERVAL=5 # Seconds between polls
REPO_PATH=/path/to/your/repo
GITHUB_TOKEN=ghp_xxxNOTION_API_KEY=secret_xxx
NOTION_DATABASE_IDS=abc123,def456,ghi789
# Per-database repository paths
NOTION_abc123_REPO=/path/to/project-alpha-repo
NOTION_def456_REPO=/path/to/project-beta-repo
NOTION_ghi789_REPO=/path/to/project-gamma-repoConfigure both providers — Claudear auto-detects and runs them simultaneously.
You need a persistent URL so the Linear webhook survives restarts.
- Go to ngrok Domains
- Create a free static domain (e.g.,
your-name.ngrok-free.app) - Create
~/Library/Application Support/ngrok/ngrok.yml:
authtoken: your_auth_token
tunnels:
claudear:
addr: 8000
proto: http
domain: your-name.ngrok-free.appLinear has built-in automations that conflict with Claudear. You must disable them:
- Linear → Settings → Team Settings → Workflow → GitHub
- Set all "Automate state changes" options to No action
- "When a branch is created" → No action
- "When a PR is opened" → No action
- "When a PR is merged" → No action
- etc.
If you skip this, Linear will fight Claudear for control of issue states.
- Linear → Settings → API → Webhooks → Create webhook
- Configure:
- URL:
https://your-name.ngrok-free.app/webhooks/linear - Events: Issues, Comments
- URL:
- Copy the signing secret to
.envasLINEAR_WEBHOOK_SECRET
- Go to Notion Integrations
- Create a new integration with read/write access
- Copy the Internal Integration Token to
.envasNOTION_API_KEY - Share your database with the integration (click "..." → Add connections)
claudearClaudear starts the webhook server, connects ngrok (for Linear), and begins polling (for Notion).
| Action | Result |
|---|---|
| Move task → Todo | Claudear starts working |
| Claude gets stuck | Posts comment, waits for your reply |
| Reply to comment | Claudear resumes |
| Task complete | PR created, task → "In Review" |
| Move task → Done | PR merges, worktree cleaned up |
Webhook not receiving events (Linear)
- Verify webhook URL matches your ngrok domain
- Check signing secret matches
LINEAR_WEBHOOK_SECRET - Test:
curl https://your-domain.ngrok-free.app/health
Notion tasks not picked up
- Verify database is shared with your integration
- Check
NOTION_DATABASE_IDmatches the ID in the URL - Increase
NOTION_POLL_INTERVALif rate limited
Claude not starting
- Run
claudemanually to verify CLI is installed and authenticated - Check
REPO_PATH(or per-team/database paths) exists and is a git repository
Tasks stuck in "Blocked"
- Check Linear/Notion for Claude's comment asking for help
- Reply to unblock (polls every 30 seconds)
Port 8000 in use
- Kill existing processes:
lsof -ti:8000 | xargs kill -9 - Kill ngrok:
pkill ngrok
Test the multi-provider setup
python -m claudear.scripts.test_multi_providerIf you're upgrading from an earlier version with existing task data:
python -m claudear.scripts.migrate_db --dry-run # Preview changes
python -m claudear.scripts.migrate_db # Apply migrationClaudear runs Claude Code CLI in headless mode using your Claude Code subscription (not API credits). It's the same Claude you use interactively, just automated.
MIT