
Edytor
Tools
What worked
Phase 1 shipped in 16 minutes across 4 plans. The detectors directly implement a 6-pass revision heuristic distilled from editorial analysis of ~50 of my posts — Claude Code got the regex ordering right (longest-first), handled abbreviations in the citation detector, and preserved character offsets in the parser for future gutter marks. 105 tests across 9 files emerged naturally. The philosophy of 'sit quietly in the room like an editor' translated well into 'console log for Phase 1, visual surfaces for Phase 2'.
What broke
The citation detector has false positives on place names, acronyms, and sentence-starts — capitalization is a weak heuristic. There's no LLM analysis yet, which means 4 of the 6 failure modes (metaphor coherence, inventory depth, promise alignment, transition quality) remain unaddressed until Phase 3 wires in Roughneck. Error handling is minimal — parseDocument() silently skips malformed content, which is fine for drafts but fragile.
Roles
I wrote the writing-heuristic and writing-feedback research documents — the editorial analysis that defines what a failure mode is. Claude Code wrote every detector from those specs. The debounced-on-typing (2.5s) analysis cadence, the folder scoping to blog/ and _draft/ only, and the amber/red threshold configurability were all co-designed.
Edytor (Writing Coach Obsidian Plugin)
Overview
Edytor is an Obsidian plugin providing real-time, non-disruptive writing coaching for personal blog drafting. It detects six specific failure modes derived from editorial feedback on Andrew's writing, helping catch recurring bad habits during drafting rather than after publication.
Philosophy: Non-disruptive observation and reporting, never interference with writing flow. The plugin "sits quietly in the room" like an editor, visible when you look for it, invisible when you don't.
Target users: Writers using Obsidian who maintain a personal blog (specifically Andrew's ~/book vault with blog/ and _draft/ folders).
Key Features (Phase 1 Complete)
Six local detection systems running in real-time as you type:
- Hedge phrase detection — 14-phrase kill list ("I think", "perhaps", "sort of")
- Apology pattern detection — 8 patterns ("thinking out loud", "ramble-filled")
- Citation/proper noun density — Three-pass: as-argues, bibliography, proper-noun
- Sentence length detection — Max/avg word counts per sentence (35 amber, 50 red)
- Parenthetical detection — Open parentheses count per sentence
- List/inventory detection — Markdown lists 3+ items and bibliography-style constructions
Additional: Configurable thresholds (amber/red per metric), folder scoping (blog/ and _draft/ only), debounced analysis (2.5s after typing stops), full settings UI.
Architecture
Tech Stack
| Layer | Technology |
|---|---|
| Language | TypeScript 5.9 (strict mode) |
| Runtime | Obsidian plugin API (desktop-only, v1.5.0+) |
| Editor | CodeMirror 6 (via Obsidian) |
| Build | esbuild 0.27 (single main.js output) |
| Testing | Vitest 3.1 (105 passing tests across 9 files) |
Structure
src/
detectors/ # Six detection modules
hedges.ts, apologies.ts, citations.ts,
sentence-length.ts, parentheticals.ts, lists.ts
main.ts # Plugin entry point
types.ts # 54 TypeScript interfaces
parser.ts # Markdown document parser (preserves character offsets)
analyzer.ts # Orchestrator calling all detectors
settings.ts # Obsidian PluginSettingTab
tests/
detectors/ # Unit tests per detector
parser.test.ts # 22 passing parser tests
analyzer.test.ts
research/
writing-heuristic.md # 6-pass revision system (canonical reference)
writing-feedback.md # Editorial analysis of ~50 posts
Analysis Pipeline
Editor text (markdown)
-> Parser.parseDocument() [strips frontmatter, code blocks; preserves offsets]
-> Paragraph[] with Sentence[] details
-> Six detectors (parallel, all regex/heuristic-based)
-> analyzer.analyze() [aggregates, computes document-level severities]
-> Console log for Phase 1 validation
Development History
Built on 2026-03-21 — Phase 1 executed in 16 minutes across 4 plans:
- 01-01 (4 min): Project scaffold, parser, types, test infrastructure
- 01-02 (5 min): First detector batch (hedges, apologies, citations)
- 01-03 (5 min): Second detector batch (sentence length, parentheticals, lists) + analyzer
- 01-04 (2 min): Plugin integration, settings tab, debounced analysis
Phases 2-5 planned but not yet started:
- Phase 2: Status bar + CodeMirror gutter marks
- Phase 3: LLM analysis via Roughneck (metaphor coherence, transition quality)
- Phase 4: Side panel + offline resilience
- Phase 5: Publishing pipeline + CNC metrics
Strengths
- Research-driven — Detectors directly implement 6-pass revision heuristic from editorial analysis of 50+ posts
- Offset preservation — Parser maintains character positions for future Phase 2 gutter marks
- Thorough testing — 105 tests covering parser edge cases, detector behaviors, analyzer
- Clean separation — Parser, detectors, analyzer, plugin layer all independent
- Regex expertise — Longest-first ordering, multi-pass citation detection, abbreviation handling
Weaknesses & Risks
- Citation detection false positives — Capitalization heuristic catches place names, acronyms, sentence-starts
- No LLM analysis yet — 4 of 6 failure modes (metaphor, inventory depth, promise alignment, transitions) need Phase 3
- No error handling — parseDocument() silently skips malformed content
- Performance not optimized — Full re-analysis on every debounce, no incremental caching
- Zero UI — Phase 1 outputs to console only; Phase 2 will add visual surfaces
Connection to Other Projects
- Roughneck — Phase 3 will use Roughneck's Ollama queue for LLM-powered analysis
- 2024.garden — Publishing pipeline in Phase 5 targets the garden blog platform
- CNC — Phase 5 will report writing quality metrics to CNC dashboards