A VSCode extension for reviewing document-change annotations from a clean, theme-aware sidebar. It lists every annotation in your workspace grouped by file (click to jump to the source) and acts on them with one click — accept/reject suggestions, add, highlight, comment, reply, and delete — applied straight to your document, so you never hand-write the markup. Two syntaxes are supported, picked automatically per file type:
Designed for AI-assisted editing workflows where a model leaves suggestions and comments as review markup directly in your documents. (More document types can be added behind the same interface — see CONTRIBUTING.md.)
Features
Workspace-wide overview of all annotations, grouped by file (shown with workspace-relative paths). A header summarises the total — e.g. 12 annotations · 3 files — with a collapse-all toggle; each file group collapses on click too.
Five annotation types, in either syntax:
| Type |
CriticMarkup (.md) |
LaTeX changes (.tex) |
| addition |
{++addition++} |
\added{addition} |
| deletion |
{--deletion--} |
\deleted{deletion} |
| substitution |
{~~old~>new~~} |
\replaced{new}{old} |
| highlight |
{==highlight==} |
\highlight{highlight} |
| comment |
{>>comment<<} |
\comment{comment} |
Authors are optional: CriticMarkup uses a Name: prefix on comments; LaTeX uses [id=Name] on any command.
Threaded comments — consecutive comments (no blank line between) attach to the preceding suggestion or to each other, shown as a chat-style thread.
Click an entry to put the cursor at the end of its text (ready to add to it); double-click to select the text (ready to replace it). Same for attached comments. The selection excludes the delimiters and any author encoding.
Edit in place:
- Accept / reject additions, deletions, and substitutions.
- Remove highlights.
- Reply to a comment, addition, deletion, or substitution — inserts an empty attached comment and drops you into the editor to type it.
- Modify in editor (the ✎ button, same as double-clicking) selects the comment's text for replacing.
- Delete a comment or a whole thread.
- Prev/next arrows (▲ ▼) in the toolbar step the editor caret through every annotation across all files, in list order (disabled at the first/last).
- The sidebar is buttons-only — all text is typed in the document editor.
- Edits apply as undoable changes (Ctrl+Z) and leave the file unsaved so you can review before saving.
Context-aware create toolbar — with a Markdown or LaTeX file open, the buttons act on your cursor/selection and you type directly in the document:
- Comment inserts an empty comment after the current word (or after the enclosing markup) and focuses the editor; with a selection it highlights the text and starts a comment on it.
- Highlight / Delete / Replace wrap the selection; Replace drops the caret ready for the replacement. With the cursor inside a highlight, Highlight becomes Unhighlight.
- Add wraps a selection, or inserts an empty addition at the cursor.
- Buttons that need a clean selection disable when nothing (or overlapping markup) is selected. New markup is never nested inside existing markup — it's placed after it.
Follows your cursor — moving the caret into an annotation in the editor (by clicking, or with the prev/next arrows) scrolls the sidebar to it and highlights that entry, plus the specific comment when the caret is inside one.
Author attribution — set reviewMarkupSidebar.username and new annotations carry your name (CriticMarkup prefixes comments with Name: …; LaTeX adds [id=Name]); each author name gets a distinct color in the sidebar.
Live updates as you type, plus instant reflection of external/AI writes on disk.
Native look & feel — uses VSCode theme colors throughout (light/dark aware).
Settings
| Setting |
Default |
Description |
reviewMarkupSidebar.username |
"" |
Name attributed to annotations you create from the sidebar, e.g. Simon: looks good. Leave empty for unattributed annotations. |
Design
Lightweight by construction: a single ripgrep pass per folder discovers only the files that contain annotations (across every supported type), a shared engine parses them per dialect, updates are per-file, and nothing runs while the sidebar is closed. Adding a document type is one dialect module plus one line in the registry — the scan, watcher, and editor filters all derive from it, so performance stays flat as types are added. See CONTRIBUTING.md for the architecture and the rules that keep it slim.
Development
npm install
npm run build # bundles to dist/
npm run typecheck
npm test # run the unit suites
Press F5 to launch an Extension Development Host, open a folder with review markup in .md or .tex files, and click the Review Markup icon in the activity bar.
License
MIT