Diffy.

A crew of review bots that lives on your own server. They read every pull request, catch the bugs, fix red CI and untangle merge conflicts. You still press merge.

A pull request opens.

Sam pushes 49 changed files before coffee. Diffy sends the crew.

Open #169

Add a question panel to the agent chat

feature/question-panel into main

+312−4849 files

Pixel is reviewing

They read before they speak.

Diffy opens the whole repository, not just the diff. It follows every caller, definition and test before it says a word.

src/utils/agentQuestion.js

export function questionReply(answers) {
  const lines = answers.map((answer) => {
    const text = answerText(answer);
    return `**${answer.question}** ${text}`;
  });
  return lines.join('\n\n');
}
  • Read 3 callers
  • Read the tests
  • Checked the definition

Bugs crawl out of the diff.

Some are real. Some only look real. Sprig catches all of them first.

src/math.js

1export function divide(a, b) {
2 return a / b;
2 const result = a / b;
3 return parseAnswer(result);
4}

Every finding gets a second opinion.

Before anything is posted, a second pass tries to prove it wrong. Only what survives reaches your pull request.

Possible null in parseAnswer()

The only caller checks it first, on line 41.

Disproved

divide() accepts zero

A zero divisor returns Infinity instead of an error.

Confirmed
+ if (b === 0) throw new RangeError('Division by zero'); Commit suggestion

Ask in your own words.

No command syntax to learn. Mention the bot the way you would mention a teammate.

S

sam

@mango the CI is failing again, can you sort it out?

Mango

On it. Reading the failing checks first.

Started: fixing the failing checks

CI went red. Mango reads the log.

The failing job, the failing step, the line that broke. Mango patches the cause, runs your tests in a sealed container, and only then pushes.

lint build unit e2e
tests/test_live.py ....F
FAILED tests/test_live.py::test_cancel
E  AssertionError: a cancelled turn saved its answer
##[error] Process completed with exit code 1.

a41c09e Stop a cancelled turn from saving its answer

Two branches, one file.

Main moved on while you worked. Bea merges it in and keeps the intent of both sides, down to the last byte of your translation files.

src/locales/en.json

<<<<<<< feature/question-panel
"ask": "Ask a question",
=======
"ask_title": "Your question",
>>>>>>> main

Both sides kept

You press merge.

Diffy never merges and never force-pushes. The last word is always a person's.

All checks have passed

1 finding fixed, 2 commits from the crew, 0 conflicts

Merge pull requestMerged

Make a bot of your own.

Every Diffy bot has a name, a body and one thing it wears. It carries the same face to every code host it posts on, and it shows what it is doing by how it moves.

Hi, I'm Nova.

Waiting for a mention

Body
Color
Wears
Doing

It lives on your server.

A laptop on the company VPN, a box under a desk, a cloud machine you already pay for. Your code goes to the model you choose, and nowhere else.

Your repositories

GitHub and Gitea, private ones too. Behind a VPN, Diffy polls instead of waiting for webhooks.

Your server

Your model

Ollama, vLLM, LM Studio, llama.cpp, OpenAI, Anthropic, OpenRouter, or any compatible endpoint.

$ docker compose up -d
Open http://localhost:8080 and make your first bot.

Diffy is going open source.

We are getting the code ready for other teams. Watch the repository to hear the day it opens.

Repository opens soon