Skip to main content

Compare

bernstein vs aider

aider is a single-agent interactive pair programmer with years of investment in diff hygiene and auto-commit messages. Bernstein is one layer up: a deterministic Python scheduler that runs aider (and 40+ other CLI agents) in parallel git worktrees and merges only after quality gates pass. This page is for picking which layer the problem actually lives at.

Last checked against the upstream README and usage docs on 2026-05-17. Sources: https://github.com/Aider-AI/aider, https://aider.chat/docs/usage.html.

tl;dr

DimensionaiderBernstein
ShapeOne interactive chat session, one repo, one model at a timeYAML task graph, many agents in parallel git worktrees
Primary surfaceTerminal chat (aider) or one-shot --messageCLI scheduler that spawns aider, claude, codex, ... as subprocesses
Diff / edit hygieneHand-tuned per model (whole-file, diff, udiff, search-replace)Delegated to whichever adapter is running the task
Git commitsAuto-commit per turn with generated messageAdapter commits to a worktree branch, scheduler merges on green gates
Audit trailGit history + chat transcriptHMAC-SHA256 hash-chained log on disk under .sdd/
Installpython -m pip install aider-install && aider-installpipx install bernstein

what each tool actually does

aider

The upstream README describes aider as "AI pair programming in your terminal". You launch aider with the files you want edited, chat with the model, and aider applies the changes directly to the working tree. Its real edge is the boring stuff that turns out to matter most: per-model edit formats, a repo-map that packs related files into context within a token budget, and automatic git commits with sensible messages. It supports Claude, GPT, DeepSeek, and "almost any LLM, including local models." Apache-2.0, ~45k stars on GitHub as of 2026-05-17.

Source: github.com/Aider-AI/aider.

Bernstein

Bernstein is a Python CLI orchestrator. It reads a flat YAML of tasks, routes each task to the best CLI adapter for its role, and spawns that adapter in a dedicated git worktree. aider is one of those adapters (bernstein/adapters/aider.py) and is called non-interactively via aider --message ... --yes. The control loop is plain Python with no LLM in the scheduler; every routing decision and every quality-gate outcome lands in an HMAC-SHA256 hash-chained log under .sdd/. Forty-plus other adapters (Claude Code, Codex, Cursor, Gemini, Goose, OpenHands, ...) plug in behind the same interface.

Source: github.com/sipyourdrink-ltd/bernstein.

when to pick aider

  • You want one interactive session, one repo, one model. Drop into a terminal, edit files, ship commits. aider is built for that loop and the loop is short.
  • Diff hygiene matters more than orchestration. aider's edit formats and auto-commit messages are years of careful work; you do not get those by wrapping it.
  • You like the auto-commit-per-turn workflow and want git history to be the audit trail.
  • Local-model coding sessions. aider has good support for "almost any LLM" including local backends - no scheduler is needed if the agent count is one.

when to pick bernstein

  • You want several tasks running at once without stomping on each other. Each adapter spawns in its own git worktree, so two agents editing the same file cannot corrupt each other; the merge step is the only place state combines.
  • You want to route roles to different agents. Claude Opus on architect, aider on backend, Codex on tests - one scheduler, one YAML, one trace.
  • You need a tamper-evident audit log on disk. HMAC-SHA256 chains every routing decision, agent spawn, tool call, and gate outcome. Deleting or rewriting a row breaks the chain.
  • You want aider in the fleet, not on its own. Bernstein wraps it as one adapter and lets the scheduler decide when it gets the task.

same task in both tools

"Refactor src/auth into stateless tokens, then write regression tests."

aider (interactive)

# interactive session, one model
aider --model sonnet src/auth/*.py
# then in the chat prompt:
# > Refactor this module into stateless tokens. Add regression tests.

Invocation pattern from the upstream usage docs (2026-05-17). aider auto-commits each edit it makes.

Bernstein (YAML, two adapters)

# bernstein.yaml
tasks:
  - id: refactor-auth
    role: backend
    agent: aider           # adapter spawns 'aider --message ... --yes'
    model: sonnet
    prompt: "Refactor src/auth into stateless tokens."
  - id: qa-auth
    role: qa
    agent: claude          # different adapter, different model
    model: opus
    depends_on: [refactor-auth]
    prompt: "Write regression tests covering the refactor."

Each task runs in its own git worktree. aider does its normal auto-commit inside the worktree; Bernstein merges back to the working branch only after the gate set (lint / types / tests / security) is green.

honest gaps

aider is more mature than Bernstein on the things aider does. Its diff formats, repo-map context packing, and commit-message generation are years of hand-tuning that Bernstein does not try to reproduce; it spawns aider when those primitives are what the task needs. aider also has a much larger user base and a longer track record on solo pair-programming sessions. Bernstein is younger, narrower by design, and built for a different shape of work: coordinating a fleet of CLI tools, not being one. If the task is one model editing one repo in one chat, use aider directly. If the task wants several agents in parallel or a tamper-evident log of who did what, that is when Bernstein earns its weight.

faq

Does Bernstein replace aider?

No. Bernstein wraps aider as one of 40+ CLI adapters (bernstein/adapters/aider.py). aider keeps its diff/edit format and auto-commit logic; Bernstein decides when aider gets the task, runs it in a dedicated git worktree, and gates the merge on lint / types / tests.

When is aider on its own the right answer?

When the work is a focused interactive session with one model, one repo, one developer driving the chat. aider has years of investment in its diff format, repo-map context-packing, and auto-commit messages. If the task fits that shape, adding a scheduler on top is overhead.

When does Bernstein help on top of aider?

When you want several tasks running in parallel without stomping on each other, when you want to route different roles to different agents (aider on backend, claude on architect, codex on tests), or when you need an HMAC-chained audit log on disk for compliance.

How does Bernstein spawn aider?

Non-interactively via aider --message <prompt> --yes inside a per-task git worktree. aider still does its normal auto-commit, but the commits land on the worktree branch and only reach the working branch after the gate set passes.

What does aider do better than Bernstein?

Diff/edit hygiene. aider has hand-tuned edit formats (whole-file, diff, udiff, search-replace) per model, a repo-map heuristic for context-packing inside a token budget, and commit-message generation tuned over many iterations. Bernstein does not reimplement those; it spawns aider when those primitives are what the task needs.