9 minREXgithubagentsaiproduct

Point, don't paste

Reviewing a document with an AI still means copying a paragraph into a chat, explaining where it came from, and carrying the answer back by hand. REX puts the conversation on the document instead — every comment is a thread, the thread stays attached to its passage, and nothing reaches your file until you approve it.

No third-party request until you press play.

Here is how I reviewed a document with an AI until a few weeks ago. Open the file. Find the paragraph that bothers me. Copy it. Switch to a chat window. Paste it — and then, because a paragraph on its own means nothing, type a sentence about where it came from: this is from the architecture doc, the section on retries, and the table underneath says something different. Read the answer. Switch back. Find the paragraph again. Carry the answer across by hand, or decide it was not worth the trouble.

Then do it again for the next paragraph, in a chat that has no idea the two live in the same file.

It works, the way copying a spreadsheet into a calculator one cell at a time works. And it has a failure I did not notice until I wanted the opposite of it. A week later, nothing says where “here” was. The chat holds the paragraph and the answer, but the address — which document, which section, which cell — only ever existed in my head and in the sentence I typed to explain it. The spec that fixed this put it in one sentence I have not improved on since:

The agent then gets text with no address: it cannot open the file the sentence is in, REX draws no highlight, the card’s place list does not mention the document, and a week later nothing says where “here” was.

REX is the tool I built so that I could stop pasting. The video above is what it looks like in two minutes and forty-eight seconds; the rest of this post is what it is for.

Three problems, one root

The copy-and-paste loop is not one problem. It is three, and they share a cause: the conversation happens somewhere the document is not.

No address. A chat can read text you paste into it. It cannot open the file the text came from, look at the table cell next to it, or see the shape on slide 14 or the node in the diagram you are actually arguing about. So you describe those things in prose, and the description is the weakest part of the exchange — the part where you say “the second table” and mean the third.

No memory on the document. Whatever you and the model worked out lives in a chat history, filed under the date you had it. Open the document next month and it is clean. The question, the answer, the change you decided on and did not get round to — none of it is there.

Too much change. Eventually you stop asking and let an agent edit the file. It does. It also fixes a heading it disliked, reflows a list, and tidies a sentence three sections away, because you gave it a file and an instruction and that is what agents do with files. Now you are reading a diff you did not ask for, to find the change you did.

What REX does instead

REX is a desktop app that opens a document and lets you comment on it, the way you would in a margin. The difference from a margin is who answers.

  1. Select a place — drag over a sentence, or pick a table, a figure, a section.
  2. Write a comment and send it as ASK. One agent answers that comment, with the document open in front of it. Reply to keep talking.
  3. When you agree on what should change, switch the same box to ACT and say so. The agent edits a copy. REX shows you the change, side by side.
  4. Approve or Discard. Your file is untouched until you press Approve.

That is the whole product. Everything else is a consequence of one of those four steps taken seriously.

The place is the point

The first step is the one the chat window cannot do. You can point at text, a table, a row, a cell, a region of a figure, a node in a Mermaid diagram, a section, or the whole document. One comment can hold many places, across many documents — nine cells here and a paragraph in a different file, in a single question. And you can keep pointing after the conversation has started, which turned out to be the gesture I wanted most. My own words, from the spec that added it:

Imagine a situation where I select some parts of the text, ask a question, and the agent answers me. If I do not agree with the answer, I want to point to another section in a different document and say something like: “Look, here it is written exactly the opposite of what you are saying. Read it.”

That sentence — read it — is the entire argument. You cannot say it to a chat. You can say it to REX.

Reviewing has three steps — select, ask, discuss — and the first version of REX only named two of them. Selecting now has its own panel, because building up what the question is about is a phase of its own. The comment does not exist until you have finished pointing.

A comment is a conversation

Every comment is its own thread with its own agent session. Not a shared chat with a document attached — one thread per comment, each with its own history, its own cost, and its own place on the page. Close REX, reopen the document next week, and every comment is still there, open and resolved alike, still attached to the passage it was about. Continue any of them.

I had built something adjacent before this. VEX annotates a web page and sends the annotations to a coding agent, and when I wrote down what REX would reuse from it, the comparison had a row I kept coming back to:

VEX REX
Annotation lifetime seconds — one batch, then discarded weeks — survives reloads and document edits
Default agent right write read

Weeks, not seconds, is a different product. An annotation that has to survive the document being edited underneath it cannot be a CSS selector. It has to find its passage again after the paragraph moves, and admit it when the passage is gone. That is a hard problem and it gets its own post.

A question cannot change your file

The second row of that table is the other half of the design. The default right of an agent in REX is read. ASK runs every agent read-only, and REX checks each tool call before it runs — not by trusting the model to behave, but by refusing the call. ACT is the only mode that writes, and it writes to a copy. Four properties hold in every format REX can edit:

  • Nothing is written to your file until you approve it. Not a write-then-revert — the file is not modified and put back; it is not modified.
  • A change names what it expects to find. If the document no longer says what the plan says it does, the run is refused.
  • The copy survives across runs, so you can refine the same change before deciding.
  • REX re-opens the result afterwards and proves it changed nothing else.

“Too much change” stops being a risk you manage by reading the diff carefully and becomes something the tool refuses to do.

Formats

REX opens Markdown, HTML, Word, PowerPoint and PDF, and you can comment on all of them. How much the agent may change depends on how far the format is from plain text:

Format ACT can change it
Markdown, HTML everything — the agent edits lines, and the diff shows every one
Word (.docx) through 10 checked operations
PowerPoint (.pptx) through 13 checked operations
PDF no — read-only, on purpose

The operation lists are a limit the format imposes, not a feature. A zip full of XML is not something an agent should edit freely, so for Word and PowerPoint the agent proposes and REX performs — and only what it can check afterwards. A PDF is a picture of a page with no paragraphs in it, and I would rather refuse than edit it badly. There is a post on that too.

Your agent, your model

The agent inside a comment is whichever one you pick, per message: the Claude Agent SDK, Codex, OpenCode or Deep Agents, on a subscription you already have, an API key, or a local model in LM Studio or Ollama through REX’s built-in gateway. Nothing is hidden, either — a Traffic screen shows every request REX sent to a model and every answer, down to the JSON.

What REX is not

It is not a chat with a file upload. The conversation does not have a copy of the document; it has the document, and a place in it.

It is not an editor. There is no manual editing anywhere in REX — you cannot click a slide and press delete, or type over a paragraph. That is a decision, not a gap. An agent edit leaves a thread behind it — the comment, the discussion, the reasoning — so that six months later “why is this sentence like this?” has an answer. A manual edit leaves a diff and nothing else, and for a review tool the record is the product.

It leaves no trace in the document. Comments live in REX’s own database, never in Word’s or PowerPoint’s comment layer — REX neither reads that layer nor writes it.

The four posts after this one

Each of the four steps above has a hard problem inside it, and each got a post of its own, in the order you meet them:

  • A wrong place is worse than no place — how a comment finds its passage again after the document changes, and why REX says “lost” rather than guessing.
  • A comment is a conversation that waits for you — one thread per comment, four agents with four ideas of what a session is, and what it took to make “continue” actually continue.
  • A question cannot change your file — the read-only gate, the working copy, and the incident where REX said it had changed nothing while the line was already gone from disk.
  • Binary files differgit diff on a .pptx shows nothing, so the agent edits Word and PowerPoint through checked plans, and REX proves it touched nothing else.