A local-first editorial reader for comparing a real HTML manuscript with a detailed Markdown outline. It is deliberately a disposable workshop, not a content-management system.
- derives the left-hand table of contents from the manuscript's real
h1–h6headings; - shows the complete manuscript in the centre;
- switches to a compact detailed-outline view without imitating the book layout;
- displays intentions, introductions, transitions, conclusions, sources and work notes as tickets on the right;
- links passages and tickets in both directions;
- creates selection annotations with Recogito Text Annotator;
- saves the current session in the browser and exports it as portable JSON;
- loads the included fictional fixtures or any local
manuscript.htmlandoutline.mdpair.
No server-side storage, account, remote database or publication workflow is included.
npm install
npm run devOpen the URL printed by Vite. The fictional example loads automatically.
The document must contain ordinary semantic headings and prose. Stable heading IDs are recommended. A block may declare an editorial role and intention:
<p data-editorial-role="introduction" data-intention="Frame the question.">...</p>Recognised roles are introduction, argument, transition, conclusion, source, illustration, and note.
Use Markdown headings whose {#id} matches a manuscript heading. Under each heading, add list fields:
## A useful chapter {#useful-chapter}
- Intention: Explain why the distinction matters.
- Introduction: Open with the reader's practical problem.
- Transition: Connect the distinction to the next method.
- Conclusion: State what has now been established.
- Sources: Author, *Title* (2024).
- Note: Check the final example.Repeated fields are allowed. Unknown list labels are kept as metadata.
The app stores the latest session in localStorage under editorial-workbench/session/v1. “Export JSON” downloads the current inputs, outline model and user annotations. “Reset” clears only this local session.
Imported manuscript scripts, inline event handlers and javascript: URLs are removed before rendering. The iframe allows only the bundled annotation runtime to execute. This is a safety boundary for author-controlled files, not a substitute for a hardened public-upload sanitiser.
Project defaults live in public/config.json, including fixture paths, the manuscript root selector, language, storage key, role labels and ticket colours.
npm test
npm run build
npm run previewThis MVP is static and same-origin. Imported files remain in the browser. It does not write back to source files; export is explicit.