Bear Metal: The Coding Agent We Point at Our Own Backlog
Bear Metal is Bluebear's open-source background coding agent: it works tickets delegated through Linear and opens pull requests through your GitHub App installation.

Most of the AI coding agents we use day to day are interactive. You open a session, describe what you want, and stay in the loop while it works. That’s the right shape for exploration and design. It’s the wrong shape for a backlog.
A queue of scoped, well-understood engineering tickets - the dependency bump, the small refactor, the bug with a known repro - doesn’t need a design partner. It needs someone to sit down and do the work, then hand back a pull request.
We built Bear Metal to be that someone. It’s an autonomous coding agent that runs continuously in the background, picks up tickets delegated to it, and opens pull requests ready for review.
Today we’re open-sourcing Bear Metal under the MIT license.
Delegated, Not Just Assigned
An interactive assistant ends when you close the tab. A background agent needs a different contract: something that says this ticket is this agent’s job now, without losing track of who is accountable for it.
Bear Metal polls the ticketing system for tickets delegated to its bot user, not simply assigned to it. The original assignee stays on the ticket. Bear Metal works it on their behalf and hands it back when the job is done. That distinction sounds small, but it’s what makes the agent feel like a worker you dispatch rather than a queue you dump tickets into and lose visibility on.
The Control Model
The part of Bear Metal we spent the most time on isn’t the coding loop - it’s the boundary around it.
Bear Metal authenticates as a GitHub App installation scoped to contents, pull requests, and checks. There’s no merge permission. Whatever the agent produces lands as a pull request, which means every change it makes still passes through your normal review process before it touches a protected branch.
Before any of that, a workspace builder you write decides exactly what the agent can see:
WORKSPACE_BUILDER_COMMAND=git clone git@github.com:your-org/your-repo "$AGENT_WORKDIR"
That can be a one-line clone, a script that checks out an umbrella repo, or logic that routes to different repositories based on the ticket’s Linear labels. Either way, the workspace builder - not the model - decides what’s in scope.
Inside that workspace, a session is bounded on three axes: maximum iterations, maximum wall-clock time, and maximum tokens. Hit any of them and the ticket hands back to a human instead of running indefinitely. A heartbeat check recovers a task if a worker goes quiet, with a cap on how many times a single ticket can be reclaimed before it’s abandoned rather than retried forever.
None of this requires watching a live session. The dashboard and an optional Slack notification tell you when a PR goes up, so visibility comes from the output boundary, not from supervising the agent in real time.
It Doesn’t Stop at Open
Opening a pull request isn’t the finish line. Bear Metal keeps checking on a PR after it’s up and re-dispatches itself whenever the PR still needs work: a failing CI check, an unresolved review comment, or a merge conflict against the base branch.
That means it reads what you write in the PR. Leave a review comment asking for a change, and Bear Metal picks the ticket back up, pushes a new commit addressing it, and updates the PR - the same loop a human contributor would run, minus the wait. If a check fails, it investigates the failure and fixes it. If the base branch moves and the PR head conflicts, it rebases and resolves the conflict itself rather than leaving you a stale, unmergeable branch.
The goal is a PR that stays in a mergeable state on its own, so review time goes toward judging the change instead of chasing it back into shape.
What It Does Today
Bear Metal currently integrates with two systems: Linear for ticket delegation and GitHub for repository access and pull requests. That’s the surface we needed to run it against our own backlog, not a ceiling - the integration points are broken out cleanly, and other ticket trackers or git hosts are exactly the kind of thing we’d like to see added next.
It authenticates as a GitHub App to open or update pull requests, and keeps iterating afterward. It runs on Anthropic, OpenAI, or Google models depending on the API key you provide, and stores task state in SQLite by default or Postgres if you point it at one. Slack notifications are optional.
If there’s an integration you want - another ticket tracker, another git host, something else entirely - open an issue or submit a pull request. We’re running Bear Metal against our own backlog and shipping what we learn back into the repository.
Read the project page for the full workflow and quick start, or go straight to GitHub for setup instructions.