# Inline Notes [简体中文](README.zh-CN.md) Highlight text, attach multiple comments, and edit them directly in Obsidian. Annotations live in your Markdown files, so people and AI agents can read them without a database or service. ## Features - A floating toolbar appears when you select text in Live Preview. - Configurable types: name, emoji, color, TAG, default comment, click behavior and order. - Quick marks save immediately; comment types open an inline input. Every saved comment remains editable. - Multiple annotations on one highlight, with one badge per comment. - Click a badge to edit directly. Delete with the trash icon; deleting the last comment preserves the original text. - Annotation changes use isolated editor undo steps. - English and Simplified Chinese UI, following Obsidian's language. Other languages fall back to English; Chinese variants currently use Simplified Chinese. - No account, telemetry, network calls or AI API required. This plugin does not run an agent or send notes to one. ## Install from source Requires Obsidian **1.8.7+** and Node.js **22+** for building. The plugin is not yet listed in the community plugin directory. ```sh git clone https://github.com/ArkkWang/obsidian-inline-notes.git cd obsidian-inline-notes npm ci npm run check ``` Create `/.obsidian/plugins/inline-notes/`, copy **only** `main.js`, `manifest.json` and `styles.css` into it, and enable **Inline Notes** under Community plugins. The build writes only inside this repository; it does not modify a vault or reload Obsidian. ### From the earlier Agent Annotations prototype 1. Back up the vault and the old plugin's `data.json`. 2. Disable **Agent Annotations** before enabling **Inline Notes**. Do not run both on the same note. 3. Optionally copy the old `data.json` into the new plugin folder before enabling Inline Notes to retain custom types and author settings. Existing Markdown annotations and their IDs remain readable; no note migration is required. The plugin ID changes from `agent-annotations` to `inline-notes`, so command hotkeys must be reassigned. Existing custom labels and comment text are **never translated** when the UI language changes. Fresh defaults use the language active when the plugin loads; reload the plugin after changing Obsidian's language. ## Use 1. Select unannotated text in **Live Preview** and choose a type. The toolbar stays open for additional types. 2. Click a badge to edit the comment immediately. Save appears only when content changes. Enter saves; Shift+Enter inserts a line break. 3. Click the trash icon to remove a single comment. Other unsaved comment drafts in the same panel are retained. 4. Clicking outside or pressing Escape discards unsaved edits. Adding another annotation saves pending edits first. 5. Use the editor's Undo/Redo commands to undo or redo annotation operations. Configure types in **Settings → Inline Notes**. TAGs must be unique and match `^[A-Z][A-Z0-9_]*$`. Changing or deleting a type does not migrate or erase annotations already stored in notes. Unknown TAGs still display with a fallback badge. ## Markdown format ```text {==Text to review==}{>>an-example|you|2026-01-01|VERIFY: Verify only the cost estimate<<}{>>an-second|you|2026-01-01|NOTE: Add the source<<} ``` Each comment has an ID, author, local creation date, TAG and body. Multiple comments follow the same highlighted text; highlights are not nested. Body braces, ampersands and line breaks are escaped as entities. `core.js` exports `scan(text)` for structured parsing. Code examples are excluded by the parser's fenced/inline-code detection. ## Limitations and validation - Editing is designed for Live Preview. Source mode displays the raw syntax. - Reading view renders annotations per text node. Annotations crossing Markdown formatting nodes or paragraphs may remain raw; switch to Live Preview to manage them. - Partial overlaps and nested highlights are not supported. Re-select the whole existing highlight or use its badge to add comments. - Multiline legacy metadata remains visible rather than forcing unsafe editor decorations. - Automated tests cover serialization, independent comments, real CodeMirror undo history, DOM interactions and locale behavior. They do **not** establish real Obsidian layout correctness. - This standalone/i18n version has not yet had desktop or mobile UI regression testing. Mobile usability is unverified. ## Development ```sh npm ci npm test npm run build ``` `main.js` is generated and not committed. Host-provided `obsidian` and `@codemirror/*` modules remain external. CI runs tests/builds on Linux and Windows and uploads the three installable files as an artifact. For translation and contribution notes, see [CONTRIBUTING.md](CONTRIBUTING.md). ## License No open-source license has been selected yet; the package is marked `UNLICENSED`. Public repository visibility is not a grant of an open-source license.