middleware/ratelimit.go:42
A fixed window lets a client burst 2× the limit at the boundary. Can we use a sliding window here?
- if b.count >= b.limit { + if b.slidingCount(now) >= b.limit {
Five coding agents on five tickets. Your terminal tells you which one is busy. cairn tells you where the work is, and what is waiting for your decision.
git clone https://github.com/Gradrien/cairn && cairn/install.sh --herdr For Claude Code in herdr. Works with Linear, or no tracker at all. Install steps
Your terminal tells you an agent is idle. Not whether it finished, is waiting on your approval, or is stuck on a question. cairn reads every ticket's state and puts the answer on one screen, with the ones that need you first and the exact thing to decide.
Each ticket gets its own work site: the ticket, its branch, its terminal workspace, its agents, its plan and its pull request, moving from Plan to Build, Review and Shipped.
Agents never push or open a pull request on their own. A Claude Code hook blocks git push and gh pr create on a ticket's branch until you press a on the commit you reviewed. Enforced, not requested.
gh pr merge stays blocked for agents. cairn never merges anything.c opens the whole pull request in the terminal: description, reviews, inline comments with their file:line, screenshots included. Send any comment to the agent in one click. It becomes a task, gets fixed locally, and comes back to you as the next push to allow.
f does the same for a red CI: cairn fetches the failing steps' logs and hands them over.
middleware/ratelimit.go:42
A fixed window lets a client burst 2× the limit at the boundary. Can we use a sliding window here?
- if b.count >= b.limit { + if b.slidingCount(now) >= b.limit {
Type cairn once, or press prefix a in herdr. Every key is also a button, and everything works with the mouse.
The three moments that are yours.
Get to the right place fast.
Everything else a ticket needs.
cairn follows as many repositories as you like, on one screen, each with its own tracker. The key says where a ticket comes from: ENG-412 next to WEB-7.
Paste a personal API key in the settings. cairn checks it, finds your team, assigns the tickets you take and moves them to In Progress when the plan starts.
cairn add --tracker linear --key ENG Type a title, get WEB-8. The plan file is the ticket; the pull request is found by its branch. Made for side projects.
cairn add Jira, GitLab, something built in-house: plug it in by writing one small Go interface. List your tickets, take one, start it.
type Tracker interface { Mine() ([]Issue, error) Take(key string) error Start(is Issue) (bool, error) // …and three more }
You need Go, gh logged in, and herdr. Run the installer again after every update: it restarts the cairn already open.
The binary, the agents' skill, the push hook, and cairn's button in herdr's sidebar.
git clone https://github.com/Gradrien/cairn && cairn/install.sh --herdr From inside it. No option means no tracker; change anything later with s.
cd ~/code/your-repo && cairn add Open cairn from herdr with prefix a. Press n and type a title or a ticket number. The plan comes back to you for approval.
Hikers stack a few stones so the next person knows where the path goes. cairn does that for every ticket your agents walk: where it is, what it waits for, who decides.
git clone https://github.com/Gradrien/cairn && cairn/install.sh --herdr Photo: Plateau d'Emparis, Hautes-Alpes, by Dominicus Johannes Bergsma, CC BY-SA 3.0, colour-graded for this page (source).