Plane Integration
Pilot integrates with Plane to receive work items and automatically implement them. It supports both Plane Cloud and self-hosted instances, with polling and webhook modes for issue detection.
Setup
1. Create a Plane API Key
- Go to your Plane workspace → Settings → API Tokens
- Click Create token
- Copy the API key
2. Find Your Project UUID
Your project UUID is visible in the Plane URL when viewing a project:
https://app.plane.so/{workspace}/projects/{project-uuid}/issues3. Set Up Webhooks (Optional)
For real-time issue detection:
- Go to Workspace Settings → Webhooks
- Click Create webhook
- Set the URL to
https://your-pilot.example.com/webhooks/plane - Select events: Issues
- Copy the signing secret
Always set a webhook_secret in production. When empty, signature verification is disabled (development mode only).
4. Configure Pilot
# ~/.pilot/config.yaml
adapters:
plane:
enabled: true
base_url: "https://api.plane.so" # Or self-hosted URL
api_key: "${PLANE_API_KEY}"
webhook_secret: "${PLANE_WEBHOOK_SECRET}"
workspace_slug: "my-team"
project_ids:
- "project-uuid-1"
pilot_label: "pilot"
polling:
enabled: true
interval: 30sConfiguration Reference
| Field | Type | Default | Description |
|---|---|---|---|
enabled | bool | false | Enable the Plane adapter |
base_url | string | https://api.plane.so | Plane API URL (cloud or self-hosted) |
api_key | string | required | Plane API key from workspace settings |
webhook_secret | string | — | HMAC-SHA256 secret for webhook verification |
workspace_slug | string | required | Your Plane workspace slug |
project_ids | []string | required | Project UUIDs to monitor |
pilot_label | string | "pilot" | Label name that triggers Pilot |
polling.enabled | bool | false | Enable polling for new issues |
polling.interval | duration | 30s | Poll interval |
Polling Mode
When polling is enabled, Pilot periodically queries Plane for issues matching:
- Project: belongs to one of the configured
project_ids - Label: has the
pilot_label(default:pilot)
Issues are processed oldest-first by creation date. Parallel execution is supported with configurable concurrency.
Crash-Safe Deduplication
Pilot uses a ProcessedStore backed by SQLite to track which issues have been handled. This prevents re-dispatching issues after a restart or hot upgrade — no configuration required.
Webhook Mode
For real-time issue detection, configure Plane webhooks to notify Pilot when issues are created or updated.
Endpoint
POST /webhooks/planeSignature Verification
Plane signs webhook payloads with HMAC-SHA256. Pilot verifies the signature using the configured webhook_secret.
If webhook_secret is empty, signature verification is skipped. This is intended for development only.
Supported Events
| Event | Behavior |
|---|---|
| Issue created | Process if issue has the pilot label |
| Issue updated (label added) | Process if the pilot label was just added |
State Transitions
Pilot updates issue state groups as it works:
| Event | State Group |
|---|---|
| Task dispatched | started |
| Execution succeeded | completed |
| Execution failed | State unchanged (manual triage) |
Labels Applied
Pilot applies labels to track issue status:
| Label | When |
|---|---|
pilot-in-progress | Task dispatched |
pilot-done | Execution succeeded |
pilot-failed | Execution failed |
Task ID Format
Plane issues are converted to Pilot tasks with the format PLANE-{first 8 chars of UUID}:
- Issue
a1b2c3d4-e5f6-...→ Task IDPLANE-a1b2c3d4 - Branch name:
pilot/PLANE-a1b2c3d4
Autopilot Integration
PRs created from Plane issues are automatically wired into the autopilot pipeline. CI monitoring, auto-merge, and the feedback loop all work the same as with GitHub and Linear issues — no extra configuration required.
Running Pilot with Plane
pilot start --plane --githubThis starts the Plane adapter alongside the GitHub adapter for PR creation.
Troubleshooting
Issues Not Picked Up
- Verify the project UUID matches exactly (check the URL in Plane)
- Confirm the label name matches
pilot_label(case-sensitive) - Check that
polling.enabledistrueor webhooks are configured - Look for polling activity in Pilot logs
Webhook Not Triggering
- Verify the webhook URL is accessible from Plane’s servers
- Check the signing secret matches between Plane and Pilot config
- Confirm the correct event types are selected in Plane webhook settings
- Check Pilot logs for signature verification errors
Self-Hosted Instances
- Ensure
base_urlincludes the protocol (https://) - Do not include a trailing slash in the URL
- Verify the API key has workspace-level access