{"slug": "i-made-claude-code-plans-reviewable-and-the-hard-part-was-waking-claude-up", "title": "I made Claude Code plans reviewable, and the hard part was waking Claude up", "summary": "A developer built plan-live, a Claude Code plugin that renders markdown plans as a live local page where users comment on tasks or selected text and Claude edits the file, returning each change as an accept-or-reject diff. The plugin wakes Claude by launching `plan-live watch` as a background process that exits when Apply is pressed, avoiding polling or an extra server, and keeps review state in a sidecar `.review.json` while re-reading the plan before every write to avoid stale edits. Rejecting a change reverts only the matched hunk rather than restoring a snapshot, and since v0.3.2 each comment batch includes section line ranges and a plan outline, though the developer says these are hints rather than a guarantee that Claude skips the full file.", "body_md": "Claude Code writes good plans. It also writes long ones. At some point I was scrolling through a 300-line markdown file trying to remember which task I had already agreed with and which one I wanted to change, and I decided the file was the problem, not the plan.\n\nSo I built plan-live. It is a Claude Code plugin that opens a markdown plan as a live local page. You comment on a task or on any selected text, press Apply, and Claude edits the file. Every change comes back as a diff you can accept or reject.\n\nThe page itself is the easy part: a dependency graph, task progress from the checkboxes, option cards, Mermaid diagrams, four themes. The interesting part was the loop. Here are the three decisions I would defend.\n\nI did not want a \"now go read my comments\" prompt after every Apply. Claude Code has no inbox I can push into, but it does notice when a background command finishes.\n\nSo the skill starts `plan-live watch` as a background process. It sits there, quiet, until you press Apply. Then it prints the batch of comments and exits. The exit is the wake-up. Claude sees the process finished, reads the output, edits the markdown, and starts a new watcher for the next round.\n\nIt is a little hacky, and I like it anyway. There is no polling and no extra server for Claude to talk to. It only works because the harness already treats a finished background task as news.\n\nReview state (your comments, what is resolved) lives in a sidecar `.review.json`. The plan is still a plain `.md` file that you can open in any editor, commit, or diff.\n\nThe cost of that choice is that you and Claude can both write to the same file. So the server re-reads the file before every write instead of trusting what it loaded earlier. If Claude edited a task a second ago, your next action starts from that version, not from a stale copy.\n\nAn accept/reject UI is only comfortable if reject is safe. When you reject a change, plan-live does not restore a snapshot of the whole file, because that would also throw away other edits made in between. It reverts just that hunk, found by matching its surrounding context.\n\nI think this is the feature that makes people willing to press Apply at all. Trying a change costs nothing.\n\nSomeone asked me whether Claude re-reads the whole plan on Apply. Fair question, and my first answer was too confident.\n\nEach batch carries only the comments you made, with the section they are on and any quoted line. Since v0.3.2 it also includes the line range of each commented section and a short outline of the plan, and the skill tells Claude to read just those ranges.\n\nI tested this on a 60-task plan in a headless run. For a simple comment, Claude searched for the line and edited it, and did not read the whole file. But it did that before the line ranges existed too, so for easy comments I could not measure a difference. A comment that depends on other sections can still make it read more. I have not tested very long plans broadly, so treat the line ranges as a hint to Claude, not a guarantee.\n\nThe first three themes mostly differed in colour and fonts. Switching between them, I could not feel the difference. This week I ran Emil Kowalski's `apple-design` skill over the whole UI and rebuilt each theme so it also moves differently.\n\nAurora is a floating glass bar with frosted cards, a soft spotlight that follows your pointer, and a spring that overshoots a little. Editorial is a letterhead with a double rule, stacked paper sheets, a slow ease, and an Apply button that presses down like a stamp. Blueprint is a drafting table: a title block, ruler ticks along each card, hatch lines on hover, and motion that moves in steps instead of gliding. Fluid is new. It uses the system font and frosted materials with one blue accent, and it dims the page behind the jump panel while the panel is open.\n\nThe skill also found plain problems in the shared UI. Hover effects bounced where they should settle. Buttons reacted when you let go, not when you pressed. Reduced motion removed all feedback instead of keeping short fades. The graph pan stopped dead and had no sense of weight, so it now has a drag threshold, resists at the edges, and glides when you let go.\n\nAll four themes still pass the same contrast test, and the screenshots in the README come from one script, so they stay honest.\n\nCommenting only changes the plan. The next thing I wanted was to start the work from the same page, so v0.5.0 adds a Run button to every task section that still has unchecked steps.\n\nClick it and a small confirm tells you two things before anything happens: whether the task depends on tasks that are not finished yet (the dependency graph already knows this), and whether Claude is actually watching the plan. Confirm, and the request lands in the review rail like a comment. It goes out with your next Apply, and Claude works through the unchecked steps in order and ticks each box in the plan as it finishes, so the progress ring and the graph move while it works.\n\nThe part I like is that I did not build a new queue. A run is just a new kind of comment, so it rides the same loop as everything else: the watcher wakes Claude, the batch says \"execute this section, tick the boxes, stop at the first step you cannot finish\", and the ticked boxes come back as diffs you can reject. Reject puts the boxes back.\n\nThere are limits. The watcher has to be running, the same as for comments. Claude Code still asks for permission before it runs anything that needs it. And only edits to the plan come back as diffs, so code Claude writes elsewhere is not shown on the page.\n\nI tested the whole path in a browser against a copy of the demo plan: queue two runs, Apply, watch the boxes tick, reject one diff and see the file revert. The demo plan's steps are sample text, so that test ticked steps without running real code. How well Run behaves on a real plan with real commands is the part I would like feedback on.\n\nIt binds to 127.0.0.1 with a per-session key. It has no runtime dependencies (Node 20 or newer), the fonts and Mermaid are bundled, and nothing leaves your machine. It is tested on macOS and Linux. Windows is untested, and I would like to hear from anyone who tries.\n\n```\n/plugin marketplace add yahav10/plan-live\n/plugin install plan-live@plan-live\n/plan-live docs/examples/demo-plan.md --theme fluid\n```\n\nThat is v0.5.0. Press `T` to cycle the four themes and `D` for light and dark.\n\nThe repo is at [github.com/yahav10/plan-live](https://github.com/yahav10/plan-live), MIT licensed. If you use Claude Code for planning, I would like to know where the Apply loop feels wrong. That is the part I am least sure about.", "url": "https://wpnews.pro/news/i-made-claude-code-plans-reviewable-and-the-hard-part-was-waking-claude-up", "canonical_source": "https://dev.to/yahav10/i-made-claude-code-plans-reviewable-and-the-hard-part-was-waking-claude-up-1pbb", "published_at": "2026-10-17 11:50:32+00:00", "updated_at": "2026-10-17 12:04:24.656388+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-products"], "entities": ["Claude Code", "plan-live", "Emil Kowalski", "Anthropic"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/i-made-claude-code-plans-reviewable-and-the-hard-part-was-waking-claude-up", "markdown": "https://wpnews.pro/news/i-made-claude-code-plans-reviewable-and-the-hard-part-was-waking-claude-up.md", "text": "https://wpnews.pro/news/i-made-claude-code-plans-reviewable-and-the-hard-part-was-waking-claude-up.txt", "jsonld": "https://wpnews.pro/news/i-made-claude-code-plans-reviewable-and-the-hard-part-was-waking-claude-up.jsonld"}}