# Marked Changelog

### Version Marked 3.1.8 (1185)

#### NEW

- Open or double-click `.markedprefs` files to import preferences into modern Settings (Advanced section)

#### IMPROVED

- Restore Purchases and checkout completion refresh subscription state from completed transaction subscription IDs when list_subscriptions misses a row
- fix_customer_subscription script distinguishes subscription vs permanent-license failures and prints subscription ownership diagnostics
- Bug report ZIP attaches a JSON `.markedprefs` export instead of hunting for a bundle-specific plist
- Prevent orphaned headlines skips redundant table page-break padding when the heading was already moved to the same page
- Link validation shows Uncertain (not an error) when a site blocks verification with 405 after GET fallback
- Settings localization audit script flags and applies drift between `Preferences.xib.strings` and modern `Settings.strings`

#### FIXED

- Custom CSS live reload no longer crashes when saving an externally edited active style sheet
- Subscription sync reassigns subscription rows to the correct customer after a database rebuild or email change leaves stale customer_id links
- Modern Settings accepts dragged CSS files again with “Add a Custom Style” overlay, opens Style Manager, and selects imported styles
- Modern Settings accepts dragged `.markedprefs` files with import overlay
- Paginated PDF no longer leaves a large blank gap between an orphan-moved heading and the following table when Prevent orphaned headlines is enabled
- Link validation retries with GET when HEAD returns 403, 404, or 405 so sites like Mozilla Support and Google Help no longer show false errors
- Link validation no longer mislabels HTTP 405 responses as Forbidden
- German Settings labels now match reviewed translator wording from `de-ui-review` (45 XIB Settings sync fixes, including Marked aktivieren instead of Sie-imperative labels)

### Version Marked 3.1.7 (1183)

#### NEW

- Open `.mmd` and `.mermaid` files directly in Marked, wrapping raw diagram syntax in fenced Mermaid code blocks for preview

#### IMPROVED

- Included Mermaid files in Markdown documents render correctly when referenced from merge/index files
- Mermaid file handling skips Markdown, MultiMarkdown metadata, and files that already contain fenced Mermaid blocks
- Better German localization

### Version Marked 3.1.6 (1182)

#### IMPROVED

- Batch document opens run sequentially so each window finishes loading before the next starts
- Single-file tab opens rely on AppKit auto-tabbing instead of manual `addTabbedWindow` merging for newly created documents
- German keyboard shortcuts panel fully localized; remaining English action, Dingus, preview navigation, TOC, HUD, and caption strings translated
- Run Command rule matching uses a dedicated file path check so only matching rules skip built-in Bike conversion
- French keyboard shortcuts panel with 107 reviewed KBShortcuts translations
- French Settings, Preview Context Menu, Statistics, and Tips strings from translator handoff

#### FIXED

- Multi-file open via mk URL handler, Finder, and drag-and-drop opens every selected file instead of only the first
- Tab labels stay matched to their documents when opening multiple files with Open documents in tabs enabled
- mk `open` URL handler passes multiple comma-separated paths through the same batched open pipeline as Finder and Dock drops
- Bike (.bike) files with a matching Preprocess Run Command rule now keep raw XML for external preprocessors (e.g. jaq `--from xml`) instead of converting to Markdown before the command runs
- Custom Rules preprocess now runs whenever Preprocess rules are enabled, even when the legacy custom preprocessor toggle is off
- Menu bar and document window localization for Direct, Setapp, and MAS builds by wiring MainMenu / MarkdownDocument strings into Xcode and adding MainMenuSetapp.strings / MainMenuMAS.strings for all locales
- Revenue dashboard widgets now refresh Paddle metrics on each run instead of serving stale cached totals

### Version Marked 3.1.5 (1181)

#### CHANGED

- Help HUD scroll shortcut label from “Scroll Down/Up” to Scroll Up/Down (matches j/k key order)

#### NEW

- Navigate comments and footnotes in preview with C and Shift-C, including CriticMarkup, Scrivener, Fountain, and footnote reference markers
- Keyboard shortcuts reference documents C/Shift-C comment cycling and expanded E/Shift-E edit marker scope
- Keyboard Shortcuts panel (Help menu, Option-Command-K) displays in the user’s system language across 10 locales
- In-preview Help HUD (press ? or h) shows localized shortcut descriptions from the same string table
- Translator handoff files for remaining KBShortcuts strings include machine-translated DRAFT suggestions in docs/*-kbshortcuts-missing.marked-l10n

#### IMPROVED

- Post-layout pagination stabilization with a combined loop that alternates list straddle repair, orphan repair, and configured heading resnap until layout settles
- Edit marker navigation with E/Shift-E now cycles CriticMarkup insertions and deletions alongside diff markers
- Simplified Chinese localization updated across MainMenu, Settings, MarkdownDocument, Statistics, Tips, and related string tables from translator delivery
- Localized comment navigation tip strings across all supported languages
- Keyboard shortcuts reference seeds 46% of strings from existing menu and panel translations, with English fallback for remaining keys
- Simplified Chinese Settings UI now includes translations for Additional CSS, MathJax config, external app tooltips, open links in background, and related controls
- Simplified Chinese translations for the Keyboard Shortcuts panel and in-preview Help HUD (108 strings), including Dingus editor, preview navigation, TOC, and proofreading shortcuts
- Japanese translations for main menu, document window, Quick Panels, Document Intelligence, and Preferences (reviewed `.strings` files from translator)
- Japanese translations for Keyboard Shortcuts panel and Help HUD (108 strings)
- Japanese translations for Settings gaps, Preview context menu, Statistics, and Tips (merged from `ja-new-strings.marked-l10n` and `ja-kbshortcuts-missing.marked-l10n`)
- Settings controls refresh from defaults when switching export profiles (checkboxes, popups, text fields, sliders, editors)

#### FIXED

- Page break before H1/H2 on later configured headings by targeting the page after preceding content ends, applying absolute marker padding, and verifying placement from the heading first line
- Last configured H1 sitting mid-page with excessive marker padding by skipping orphan repair for headings in the run-up before configured breaks and clearing stale orphan spacing before resnap
- Typography preview spacers interfering with configured H1 breaks by removing duplicate `fakebreak` divs when inserting markers and excluding break markers from first-element padding clamp
- Prevent orphaned headlines false positives near configured page breaks using straddle-aware move plans and document-order run-up detection before configured H1/H2 markers
- Export profiles preserve `NO`/`0` preference values and skip auto-save while applying a profile

### Version Marked 3.1.4 (1180)

#### CHANGED

- From Page Setup moved into the Page Size popup menu, replacing the overlapping standalone button in the PDF export dialog

#### NEW

- Custom page size option in paginated PDF/Print dialog with width and height fields in inches
- Use Page Setup button applies paper size and orientation from File > Page Setup to paginated export
- AppleScript and automation accept custom pageSize dimensions (e.g. `8.5x11`, `215.9x279.4mm`, `612x792pt`) in addition to preset names

#### IMPROVED

- Export profiles persist custom page width and height alongside printPageSize
- Paginated PDF export reloads page size controls when export preferences or profiles change
- Custom page size width and height fields positioned directly below the Page Size popup to avoid overlapping other controls
- Post-layout pagination stabilization with a combined loop that alternates list straddle repair, orphan repair, and configured heading resnap until layout settles

#### FIXED

- Paginated PDF heading page breaks apply before single-page custom-style short-circuit and respect natural layout when deciding break-before moves
- Page break before H1/H2 so configured headings start at the top of a new page using marker-based breaks, resnap after list layout, and without double-padding
- List and paragraph line splitting after H1 page breaks by running full-document list straddle repair once heading breaks shift layout
- Paginated PDF list spacing by wiring stale list break cleanup and clearing orphaned inline-flow padding that accumulated in later pages
- Paginated PDF spacing drift by skipping the list post-pass clamp for intentional page-break markers and configured heading breaks
- Page break before H1/H2 on later configured headings by targeting the page after preceding content ends, applying absolute marker padding, and verifying placement from the heading first line
- Last configured H1 sitting mid-page with excessive marker padding by skipping orphan repair for headings in the run-up before configured breaks and clearing stale orphan spacing before resnap
- Typography preview spacers interfering with configured H1 breaks by removing duplicate `fakebreak` divs when inserting markers and excluding break markers from first-element padding clamp
- Prevent orphaned headlines false positives near configured page breaks using straddle-aware move plans and document-order run-up detection before configured H1/H2 markers

### Version Marked 3.1.3 (1178)

#### IMPROVED

- Statistics labels fall back to English when a localized string table entry is missing at runtime

#### FIXED

- Selection stats popup shows Word, Char, and Sent labels instead of raw localization keys like stats.selection.word
- Statistics localization loads translated strings from Statistics.strings in the app bundle for all supported languages

### Version Marked 3.1.2 (1177)

#### CHANGED

- Link navigation clears saved scroll position so the preview does not jump to a prior file’s position after following a link

#### NEW

- Open Recent lists watched folders, not just individual files inside them

#### IMPROVED

- Same-window navigation restores per-document preview style while keeping the current window size and position
- Trial indicator pill sizing and positioning when label text changes width
- Folder watch clears a stale preview pin when another file in the folder changes externally
- Folder watch folder open resets preview state on the main thread before scanning for the latest file
- Folder watch initial open clears pinned preview state and bypasses pin logic for the mandatory first scan
- Folder watch defers filesystem watching until after the initial most-recent scan completes

#### FIXED

- Text file link hover handler
- Folder-watch preview stays on the linked file instead of reverting to the most recently modified file in the folder
- New-window link clicks open the target in a separate window without changing the current document’s title or preview
- Same-window link navigation reloads the preview for the linked file without requiring a manual refresh
- Single-file documents no longer trigger folder-watch rescan logic that could leave the preview stuck on the wrong file
- Folder watch no longer snaps back to a link-pinned file after an external save switches preview to the most recently modified file
- Folder watch opens the most recently modified file when reopening a watched folder instead of the last link-navigated file
- Relative links in folder watch resolve from the current preview file’s directory, not the folder root
- Folder watch always loads the most recently modified file on initial folder open instead of a previously link-pinned file
- Folder watch no longer attempts to preview the folder path itself during window load
- Paginated PDF list spacing for inline-flow styles (Manuscript, Swiss) by detecting inline-flow lists, skipping aggressive Swiss split logic, and repairing straddles with inline continuation spans instead of block splits
- Paginated PDF wrapped headings bisected at page breaks when export font size is overridden, pushing headings with padding-top so margin collapse against preceding list items cannot leave lines clipped
- Command-P opens paginated Print preview instead of routing to continuous Save PDF export
- Paddle server permanent license recognition across multiple Paddle price IDs for subscription sync and access checks

### Version Marked 3.1.1 (1176)

#### CHANGED

- Review Marked menu opens the App Store write-review page directly instead of triggering an in-app rating flow

#### FIXED

- Opening a relative link in the same window while folder watching no longer replaces the watched folder path with the file path, which caused ENOTDIR errors and the “No Readable File Found” error screen

### Version Marked 3.1.0 (1175)

#### CHANGED

- Default Style tags preference to off so plain hashtags show unless capsule styling is explicitly requested
- Reading Ease tooltip renamed from Flesch-Kincaid to Flesch Reading Ease
- Fog Index readability tooltip text clarified
- Settings “Apps” category renamed to Applications (and localized equivalents) across all supported languages
- Custom Rules run from rule enabled state and predicates only, without per-document pre/processor toggles
- Remove Preprocessor and Processor status bar indicator buttons from the document window
- Remove Use Custom Preprocessor and Use Custom Processor items from the Extras menu

#### NEW

- Command-click opens preview web links in the default browser without switching away from Marked
- Always open links in the background preference in Preview settings, with a Command-click hint when disabled
- Clear button on external app pickers in Settings to reset the chosen text, image, or markup editor
- Discount option in the default processor popup in Settings
- Statistics status bar counts, drawer text, readability labels and tooltips, word-target progress, and selection popup labels now use localized Statistics.strings in all supported languages
- Preview tips (Comments hidden, Links dimmed, Focused, bookmarks, Mini Map, include boundaries, and related messages) now use localized Tips.strings via preview preferences
- Preview context menu items (Refresh, Copy HTML, Validate All Links, spelling actions, and related entries) now use localized PreviewContextMenu.strings

#### IMPROVED

- Completely redesigned Settings panel
- Localization for DE, FR, ES, IT, NL, and more
- Additional CSS and MathJax config open in dedicated popover editors instead of large inline fields
- Word list fields in Proofing settings use lined text views for easier multi-line editing
- Settings window restores the last viewed section and honors x-marked-3://pref/ deep links
- Preferences, Style Manager, and in-app pref links route through the Swift Settings window
- Accessibility identifiers on Settings sidebar, detail pane, and setting rows for automation and assistive tools
- Open in Dingus reads on-disk file content for normal markdown files instead of preprocessed in-memory text
- Unstyled mkhashtag tags render with subtle gray preview styling
- Additional CSS injected as a dedicated stylesheet block at the end of the document head
- Style tags setting indented under #Text is tag and automatically cleared when tag parsing is disabled
- Manage Styles item in the style popup menu is now localized via Settings.strings
- Processor-generated header IDs are preserved as-is instead of being stripped and re-normalized by preview JavaScript
- Duplicate header IDs still dedupe with numeric suffixes and update matching anchor links when a collision is resolved
- Expand frame widths for “Avg. Words/Sentence”, “Avg. Syllables/Word”, “Complex Words”, and “Reading Ease” label fields to accommodate longer localized strings without clipping.
- German localization for preview context menu actions (11 strings)
- Settings German strings from reviewed translator batch (74 updates, 12 new keys)
- Statistics drawer and readability labels in German (24 strings)
- Tips and status bar messages in German (13 strings)
- German Settings tooltips and labels still in English (YAML handling, header/footer logo, edit marker, and related gaps)
- Japanese Settings machine translations for remaining English labels, tooltips, and integration options
- Conductor preprocess and process phases run whenever enabled rules exist for that phase
- Shell script Run Command actions (`.sh`, `.bash`, `.zsh`, `.fish`) are also routed through an interpreter when needed
- Full Disk Access checks are cached per launch and debug FDA warnings log once instead of on every refresh
- Document state bookmarks are pruned on launch when their saved state file is missing, shrinking accumulated bookmarks.plist bloat over time
- French menu bar and document window strings use more standard macOS wording (Copier, Annuler, Parole, etc.)
- French Settings translations refreshed from reviewed Preferences.xib.strings and sidebar section titles
- French document UI strings updated for Quick Open, Quick Actions, and Ask About Document
- French settings labels for Custom Rules, code wrapping, proofing mode, and Mermaid diagrams
- File watch still coalesces atomic saves and bypasses unchanged-file short-circuits, but only forces a full HTML reload when Process rules, mind-map includes, or other hard-refresh conditions actually require it
- Harden Speed Read preference reads when the Cocoa bridge is unavailable
- Keep in-page anchor links (#headings) working inside the Dingus preview

#### FIXED

- Comments sidebar now shrinks the preview content area at all window widths instead of overlaying the document on wide screens
- Comments sidebar margin is cleared when the sidebar is hidden so the preview area returns to full width
- Build failure restoring missing MKDocumentIntelligenceL10n.swift and DocumentIntelligence.strings (English and German) referenced by the Xcode project but never committed to develop
- Guide lines in lined JSON and multiline Settings editors align correctly while scrolling
- Hashtags with #Text is tag enabled are always visible in preview; Show Comments is no longer required
- Styled tags display capsule styling in preview instead of being hidden with `display: none`
- Dingus editor no longer shows raw `<span class="mkstyledtag">` HTML when editing documents with #tags
- Hashtag conversion runs during preview processing only, keeping document source text as plain markdown
- Dingus editor no longer shows `MKHTMLCOMMENT` placeholders instead of original HTML comments
- Document source text restores held HTML comments, code blocks, math, and scrippets after preview processing instead of keeping internal placeholders
- Additional CSS selectors scoped to the preview wrapper so custom rules reliably override theme styles
- Manage Styles tooltip in Simplified and Traditional Chinese no longer displays English text
- Header IDs for CommonMark and other processors without native slug generation now use GitHub-style slugs (e.g. `12-another-header-level-2-but-with-special-characters`) so in-document anchor links match GitLab and MkDocs
- Subscription window Privacy and Legal footer links now open markedapp.com/privacy/ and markedapp.com/legal/ instead of 404ing .html URLs
- German localization re-import from translator files as UTF-8 text, fixing mojibake and Xcode build failures from binary plist `.strings` files
- Macstock build compile error by linking MKMacstockAccess into the Marked target instead of MarkedTests
- Show Custom Rules Log is always available under Help without requiring Debug mode
- Run Command no longer crashes or fails when a Custom Rule points at a bare `.py` script path without an explicit interpreter
- Python preprocessors with `#!/usr/bin/env python3` or no shebang now run through the system Python interpreter instead of being executed directly as a binary
- Python wrapper scripts now pass the script path as an argument to the interpreter
- Run Command failures now log exit status and STDERR output to the Custom Rules Log
- Run Command no longer logs Action succeeded when a command exits with a non-zero status
- Command Error alerts now include stderr output or the exit status when stderr is empty
- Run Command cleanup no longer crashes when removing temporary wrapper scripts for plain binary commands
- Python preprocessors with bare `.py` paths, no shebang, or `#!/usr/bin/env python3` now run through the system Python interpreter
- Cold document opens no longer hang while resolving every entry in the document state bookmark store
- Per-document UI state lookup resolves only matching bookmarks instead of serially sweeping hundreds of stored security-scoped bookmarks
- External editor saves update the preview via JavaScript again instead of reloading the entire WebView on every save
- Scroll to edit and edit markers are preserved when saving from an external editor, without the preview flash and cursor reset caused by full page reloads
- Guard Markdown Dingus `WKWebView.inspectable` behind macOS 13.3 availability so choosing Dingus when creating a new file no longer crashes on macOS 12
- Improve Speed Read overlay visibility on legacy WebKit previews with explicit fixed-position styles, a `body.mkspeedreading` display rule, and top/left/right/bottom CSS instead of `inset`
- Show a Speed Read status message when the preview JavaScript module is missing or throws during toggle
- Open Dingus preview http, https, and other external links in the default browser instead of navigating inside the preview web view

### Version Marked 3.0.39 (1172)

#### NEW

- Quick Actions Palette shortcut shown in in-app keyboard shortcut help

#### IMPROVED

- Ask About Document panel, preset prompts, status messages, and availability text now use localized DocumentIntelligence.strings (English and German)
- Apple Intelligence responses follow the user’s preferred system language, with custom questions answered in the question’s language
- Quick Actions palette ranks recently and frequently used actions at the top when the search field is empty
- Quick Actions, Export, and Tab Quick Open palettes accept trl+N and Ctrl+P to move selection down and up
- External binary execution on non-App Store builds now launches Homebrew and other external tools directly instead of always falling back to a shell when no bookmark is active
- Shell fallback for Run Command now uses a temporary wrapper script so complex inline filters with quotes, variables, and regex are not mangled by `zsh -c` argument parsing

#### FIXED

- Widow fix preference checkbox is no longer disabled when auto-hyphenation is enabled
- Conductor Run Command no longer fails on File > Open when a Homebrew preprocessor (e.g. jaq, jq) lacks a security-scoped bookmark but is otherwise accessible on direct builds

### Version Marked 3.0.38 (1171)

#### CHANGED

- Subscription UI uses Permanent Unlock for Marked 3 wording instead of Lifetime License

#### NEW

- Mac App Store subscription window shows live StoreKit localized prices with yearly savings callout
- `-MKHideSubscriptionPrices` launch flag and debug purchase preview hide subscription prices for App Store screenshots
- DOCX export embeds rendered Mermaid diagrams as PNG images instead of source code or label text
- Quick Actions palette (A) opens a searchable spotlight-style panel to run menu bar and preview gear menu commands from the keyboard
- File > Quick Actions… added in Direct, MAS, and Setapp builds with A shortcut
- Palette aggregates main menu and gear menu commands with breadcrumb paths, deduplicating overlaps by shortest path while preserving shortcuts
- Keyboard shortcuts shown right-aligned in light gray when defined in menus
- Palette includes dynamically built menus such as Style presets, History, and Window tab entries

#### IMPROVED

- DOCX export omits empty footnotes, header/footer, and comments package parts when the document does not use them
- DOCX bookmarks use Word-valid names with reliable deduplication suffixes
- DOCX export replaces diagram containers with temp-file PNG images passed from the preview WebView to the Word converter
- DOCX export skips SVG and foreignObject label text so diagram markup does not leak into Word paragraphs
- DOCX export decodes large inline data:image payloads via direct base64 parsing when embedding exported images
- DOCX export scales Mermaid diagram images to the page text width and uses correct Word EMU sizing
- DOCX export reduces vertical whitespace around Mermaid diagrams and centers them in the text column
- Mermaid DOCX export rasterizes from SVG dimensions instead of the full diagram container to avoid extra padding in exported PNGs
- DOCX export reads actual bitmap pixel dimensions when sizing exported diagram images
- Quick Actions search uses fuzzy matching so queries like `akdoc` match “Ask About Document” without requiring spaces
- Quick Actions shortcut display uses uppercase keys and shows **** when Shift is required, matching macOS menu conventions

#### FIXED

- DOCX export opens in Microsoft Word without unreadable content on documents with hundreds of lists
- Word Styles repair on export by removing duplicate Code style definitions from bundled Word templates and sanitizing styles at export time
- Word Lists handling with per-list numbering definitions, compact numbering.xml, and normalized ListParagraph style
- DOCX footnote character style uses Word-standard FootnoteReference naming instead of Footnote_20_anchor
- Mermaid DOCX export rasterizes each diagram from the live preview using canvas.drawImage on the in-document SVG
- Mermaid DOCX export no longer hangs during export by avoiding synchronous layout polling and oversized JavaScript return values
- Crash when activating submenu parent items that use internal AppKit handlers in the Quick Actions palette
- Run Embedded Script default interpreter path corrected from `/usr/bin/bash` to `/bin/bash`

### Version Marked 3.0.37 (1169)

- Maintenance release

### Version Marked 3.0.36 (1167)

#### IMPROVED

- PDF pagination uses a unified forward page loop with in-page list handling instead of a long chain of duplicate post-passes
- Boundary repair re-runs after auto heading page breaks so late layout shifts do not reintroduce straddles
- Alert messages display duration scales with message length (2-8 seconds) using the existing tip UI
- mkprintstyles uses compact break rules for custom preview styles (no blockquote or heading break-after overrides)
- PDF export HTML is refreshed from the document on every preview update, not only for Fountain documents
- Custom preview styles export with mkcustompreview body class for reliable pagination detection
- Signature and inline images wait for layout dimensions before pagination so straddle detection uses accurate heights
- resetPagination(true) fully clears pagination spacers and inline layout before each export repagination pass
- Pagination scroll padding on custom styles adds to author #wrapper padding-bottom rather than replacing it
- Paginated PDF only whole-page paragraph pushes when the first line straddles the break, not for mid-paragraph clip cases that should split instead

#### FIXED

- H1/H2 page breaks no longer drift or stack margins across long documents, including with footers enabled
- Auto page-break headings stay on the correct page instead of straddling or splitting across page boundaries
- Swiss-style list items (`li > p`) no longer leave large gaps or straddle page boundaries when the first item follows an intro paragraph
- List line clipping at page bottoms by using full clearance pushes instead of capped partial spacers
- Body paragraphs whose first line sits at a page boundary are moved to the next page instead of being clipped
- Preview JavaScript `window.alert()` now shows an HTML toast instead of failing silently in the WebView
- Paginated PDF keeps custom CSS body font sizes instead of applying the global export/print base size override (e.g. DIN 5008 at 10pt)
- Paginated PDF no longer inflates blockquote spacing from Marked pagination styles when a custom preview style is active
- Paginated PDF skips pagination for single-page custom style documents whose natural height fits one sheet
- Paginated PDF clears stale text zoom inline sizes before layout so stylesheet point sizes control pagination
- Paginated PDF preview resizes the hidden export WebView host window when page size or orientation changes so pagination uses the correct viewport width
- PDF preview cancels an in-flight generation and starts fresh when page size or orientation changes instead of ignoring the update
- PDF preview ignores stale generation completions so an older layout pass cannot overwrite a newer preview
- Paginated PDF tracks margin changes alongside page size and clears cached layout state when either changes
- Paginated PDF keeps floated letterhead columns side by side for custom CSS by preserving #wrapper max-width during pagination
- Paginated PDF uses screen media in the export WebView for custom CSS so print wrapper resets do not collapse float layouts
- Export font size override applies to custom CSS when Custom font size for export/print is enabled
- Images straddling page breaks in paginated PDF move to the next page instead of splitting across pages (unless taller than one page)
- Paginated PDF no longer undoes valid image page-break spacers during the final layout cleanup pass
- Custom CSS line-height in paginated PDF matches the stylesheet instead of being replaced by text zoom or forced 1.4 on code blocks
- Custom CSS #wrapper padding is preserved in paginated PDF export instead of being zeroed during WebView reset and pagination
- DOCX export no longer hangs on large documents when many heading bookmarks share the same 40-character slug
- Paginated PDF repairs lines clipped at page boundaries without pushing whole paragraphs down with excessive gaps
- Paginated PDF avoids mid-word paragraph splits and huge vertical spacing from over-aggressive straddle detection on lines that already fit on the page

### Version Marked 3.0.36 (1167)

#### IMPROVED

- PDF pagination uses a unified forward page loop with in-page list handling instead of a long chain of duplicate post-passes
- Boundary repair re-runs after auto heading page breaks so late layout shifts do not reintroduce straddles
- Alert messages display duration scales with message length (2-8 seconds) using the existing tip UI
- mkprintstyles uses compact break rules for custom preview styles (no blockquote or heading break-after overrides)
- PDF export HTML is refreshed from the document on every preview update, not only for Fountain documents
- Custom preview styles export with mkcustompreview body class for reliable pagination detection
- Signature and inline images wait for layout dimensions before pagination so straddle detection uses accurate heights
- resetPagination(true) fully clears pagination spacers and inline layout before each export repagination pass

#### FIXED

- H1/H2 page breaks no longer drift or stack margins across long documents, including with footers enabled
- Auto page-break headings stay on the correct page instead of straddling or splitting across page boundaries
- Swiss-style list items (`li > p`) no longer leave large gaps or straddle page boundaries when the first item follows an intro paragraph
- List line clipping at page bottoms by using full clearance pushes instead of capped partial spacers
- Body paragraphs whose first line sits at a page boundary are moved to the next page instead of being clipped
- Preview JavaScript `window.alert()` now shows an HTML toast instead of failing silently in the WebView
- Paginated PDF keeps custom CSS body font sizes instead of applying the global export/print base size override (e.g. DIN 5008 at 10pt)
- Paginated PDF no longer inflates blockquote spacing from Marked pagination styles when a custom preview style is active
- Paginated PDF skips pagination for single-page custom style documents whose natural height fits one sheet
- Paginated PDF clears stale text zoom inline sizes before layout so stylesheet point sizes control pagination
- Paginated PDF preview resizes the hidden export WebView host window when page size or orientation changes so pagination uses the correct viewport width
- PDF preview cancels an in-flight generation and starts fresh when page size or orientation changes instead of ignoring the update
- PDF preview ignores stale generation completions so an older layout pass cannot overwrite a newer preview
- Paginated PDF tracks margin changes alongside page size and clears cached layout state when either changes
- Paginated PDF keeps floated letterhead columns side by side for custom CSS by preserving #wrapper max-width during pagination
- Paginated PDF uses screen media in the export WebView for custom CSS so print wrapper resets do not collapse float layouts
- Export font size override applies to custom CSS when Custom font size for export/print is enabled
- Images straddling page breaks in paginated PDF move to the next page instead of splitting across pages (unless taller than one page)
- Paginated PDF no longer undoes valid image page-break spacers during the final layout cleanup pass

### Version Marked 3.0.35 (1166)

#### IMPROVED

- Detect straddling auto-break headings during pagination and apply margin-based page breaks instead of skipping them
- Add a final auto heading page-break repair pass after margin normalization to push split H1/H2 headings fully onto the next page
- PDF pagination uses a unified forward page loop with in-page list handling instead of a long chain of duplicate post-passes
- Boundary repair re-runs after auto heading page breaks so late layout shifts do not reintroduce straddles

#### FIXED

- Prevent H2 page breaks from splitting headings across page boundaries when auto page-break headings were marked settled too early
- Allow straddle repair to run on auto page-break H1/H2 headings that still cross a page slice
- H1/H2 page breaks no longer drift or stack margins across long documents, including with footers enabled
- Auto page-break headings stay on the correct page instead of straddling or splitting across page boundaries
- Swiss-style list items (`li > p`) no longer leave large gaps or straddle page boundaries when the first item follows an intro paragraph
- List line clipping at page bottoms by using full clearance pushes instead of capped partial spacers
- Body paragraphs whose first line sits at a page boundary are moved to the next page instead of being clipped

### Version Marked 3.0.34 (1165)

#### NEW

- Mk CLI accepts `--success [bundle id|app name|url scheme]` for returning focus after action
- AppleScript export commands for markdown, HTML, paginated PDF, continuous PDF, EPUB, DOCX, ODT, TextBundle, RTF, and OPML on application, windows, and documents
- AppleScript export `style` option applies a preview theme (e.g. `with {style:"Amblin"}`) before export and waits for the preview reload
- AppleScript application commands for streaming preview, clipboard preview, and close all
- available processors and preview style names application properties for listing processors and themes in scripts
- Document AppleScript properties for processor, preprocessor, source text, critic markup mode, autoscroll, speed read, and statistics
- Preview control commands: refresh preview, scroll to heading/position, autoscroll, speed read, highlights, full screen, copy HTML/RTF, get statistics, and print with profile
- headings property and command for preview table of contents (work in progress; not reliable yet)

#### IMPROVED

- `mk` CLI now has –background capabilties to avoid raising Marked to the foreground when not necessary
- AppleScript PDF options map `pageSize` and `margins` (e.g. `1in`) to print preferences before export
- AppleScript debug logging at Info level with launch diagnostics (`[AppleScript] Marked ready`) when debug mode is on
- Export routing resolves documents from receivers, key window, and `orderedDocuments`; parses `file://` export paths
- Window AppleScript `style` setter, export handlers, and save/close/print forwarding on NSWindow and NSApplication
- Profiles property returns a simple list of profile names instead of fragile AE record descriptors
- AppleScript window `style` setter triggers a full preview reload instead of only swapping CSS via JavaScript
- AppleScript export `with` record keys `pageSize`, `margins`, and `style` are normalized before applying export preferences
- AppleScript debug logging for paginated PDF pipeline steps when debug mode is enabled
- AppleScript processor overrides merge into per-document preprocessing and clean-up syntax path

#### FIXED

- AppleScript export no longer ignores the targeted window’s document (was exporting `currentDocument` instead)
- AppleScript export to the open document’s folder no longer fails the sandbox preflight check or write with a permission error
- AppleScript paginated PDF export uses HTMLToPDFGenerator instead of returning “not yet fully implemented”
- AppleScript crash when export commands use `with` record parameters (`scriptingRecordWithDescriptor:` on NSDictionary)
- AppleScript HTML export now uses rendered preview HTML instead of raw Markdown source text
- AppleScript hang during HTML export by deferring WebView JavaScript until the run loop can process WebKit
- AppleScript paginated PDF single-page output by spinning the run loop for all preview WebView JavaScript during export
- AppleScript handler crash when `evaluatedReceivers` returns NSApplication instead of an array
- AppleScript dictionary duplicate `profiles` property, invalid record codes, and suite-level export command dispatch that bypassed window handlers
- Paginated PDF AppleScript export no longer hangs after loading HTML in the hidden PDF WebView
- Paginated PDF export completes asynchronously so WebKit callbacks run while the Apple event is suspended and resumed on completion
- AppleScript PDF timeout during long paginated exports by resetting the Apple event timer while generation runs
- Paginated PDF generation checks for `paginateEntireDocument` instead of the obsolete `paginate` API in the PDF WebView
- AppleScript dictionary corruption (-2705) from invalid suite-level command codes in Marky.sdef
- Word highlight `startOnly` patterns highlight only the captured keyword when a non-capturing opener prefix is used
- Enablement error in preferences

### Version Marked 3.0.33 (1164)

#### NEW

- Paddle client support for revenue metrics, active subscriber metrics, and paginated estimated_total list counts

#### IMPROVED

- Clean launch re-enables window restoration when a prior Start Fresh or debugger stop left restoration prefs stuck off
- Open Files panel, openFiles:, and openURLs: route through a unified multi-file open path
- Launch file opens skip saved-state restoration when the user is explicitly opening documents at launch
- Pending launch queue accumulates multiple pre-launch openFile: calls instead of keeping only the last path
- Subscription access check proceeds with opening after a 3 second timeout instead of waiting indefinitely
- Reopened documents call showWindows when restoring a document with no visible window

#### FIXED

- Direct/Paddle subscribers retain paid access from cached subscription data when billing server verification fails or returns no data
- Open documents restore again on launch after a normal quit; crash recovery Start Fresh no longer leaves NSQuitAlwaysKeepsWindows disabled permanently
- Start Fresh crash recovery open dialog allows multiple file selection
- Reopened documents bring the existing window to the front when opened again
- Dock drops open all selected files when Marked is already running
- Dock drops reopen in-memory documents after their windows were closed
- Multi-file dock drops batch new files instead of opening only the first path alphabetically

### Version Marked 3.0.32 (1163)

#### IMPROVED

- HTML export auto-includes KaTeX and MathJax CDN stylesheets when exported HTML already contains pre-rendered math, without requiring the export checkboxes
- HTML export still adds full KaTeX/MathJax CDN scripts only when the Include KaTeX/MathJax CDN link options are enabled
- HTML export without preview template now receives math CDN head tags the same as templated exports

#### FIXED

- Restore consecutive blockquote spacing in PDF/Print Preview when adjacent quotes collapse after print margin normalization
- Omit KaTeX/MathJax bundle stylesheet links from exported HTML so served exports do not reference `/Applications/Marked.app/...` paths

### Version Marked 3.0.31 (1162)

#### NEW

- fix_customer_subscription.rb CLI to repair stuck trial-expired subscribers by syncing Paddle subscription data

#### IMPROVED

- Add dedicated heading straddle repair passes after clipped-text repair in the PDF pagination pipeline
- Re-run orphan heading repair after the final clipped-text pass so late layout shifts do not strand headings
- Use line-level text extents for heading fit, clearance, and straddle detection on multi-line headlines
- Walk parent containers in next-sibling lookup so headings inside wrappers still find following content

#### FIXED

- PDF/print line spacing now respects each style’s leading by removing global and export-time line-height overrides
- Blockquote spacing in PDF matches Manuscript preview by skipping pagination margin pushes and allowing natural page breaks inside quotes
- Print background colors and images preference now controls theme backgrounds, `bandw` mode, and hidden PDF WebView rendering
- Paddle subscription sync updates local billing rows when completed transactions convert trials to paid subscriptions
- Move orphaned headings to the next page when following content starts later, not only when within 60px of the page bottom
- Push split headlines entirely below the page break using current layout position instead of stale natural-top math that left clipped fragments
- Re-check moved headings on every pagination pass so partially pushed headlines are fully cleared
- Detect headlines that will not fit in remaining page space before they straddle the boundary
- Restore blockquote paragraph splitting at page boundaries without reintroducing whole-blockquote spacer gaps

### Version Marked 3.0.30 (1161)

#### IMPROVED

- Update Setapp framework
- Refresh heading page break preferences at print preparation and pagination start so PDF export matches current settings
- Post-pagination orphan repair with reconcile and final-pass passes that reunite separated headings with their content
- Heading page breaks use marginTop instead of paddingTop so headline text is not rendered at the bottom of an inflated padding box
- Clip repair at page boundaries detects line-level straddle for headings and paragraphs and applies safer marginTop fixes for headings
- H2/H1 auto page breaks use a dedicated post-pagination pass driven by export prefs instead of relying on @media print CSS during layout
- Heading page-break margins are settled to the actual page top after pagination so headlines sit just below the header without extra whitespace
- Following paragraphs after auto page-break headings are pulled up to sit directly below the headline when both share a page
- H2 page break detection remeasures each heading without inline margin and checks current on-page content before applying the break
- Auto H2 page breaks run again after final clip repair so headings stay at the top of a new page after late pagination adjustments
- Add a final line straddle verification pass after pagination to catch remaining bisected text lines
- Push split paragraph continuations to the next page only when they still start below the target top
- Reduce duplicate clip repair post-passes that amplified layout shifts and clipped lines across the document

#### FIXED

- Stop H2 page breaks in paginated PDF when the preference is disabled by clearing stale inline break styles and honoring Marked.config during pagination
- Prevent lines split across page boundaries in paginated PDF export with line-level boundary detection and a final clip-repair pass
- Orphaned headings in paginated PDF export now move to the next page with their following paragraph instead of sitting alone at the page bottom
- Large whitespace gaps when a paragraph was pushed to the next page but its heading stayed behind on the previous page
- Prevent orphaned headlines reliability when pagination flagged a heading as moved but failed to apply enough offset to reach the next page
- Page break before H2 now starts each section on a new page instead of only adding empty space above the headline
- Large top gaps before auto page-break headings caused by stacked marginTop from pagination, orphan repair, and auto-break passes
- Blank pages before section headings when multiple pagination passes overshot the next page boundary
- Orphan headline repair no longer re-moves headings already marked for automatic page breaks
- Page break before H2 for section headings that were still left mid-page when earlier margin offsets or late layout passes invalidated break calculations
- Skipped H2 breaks when previous block detection failed across zero-height or wrapper siblings between the heading and body text
- Correct H2 page break detection so headings after page 1 break onto a new page when prior content shares the same page
- Snap H2 page break margins to a single calculated offset instead of accumulating excess top spacing before headings
- Prevent clip repair from re-margining H1/H2 headings already positioned with page-break-before
- Stop mid-page paragraph gaps by merging spurious continuation blocks and clearing orphan spacers when text never crosses a page slice
- Split paginated paragraphs at whole visual lines and word boundaries so words like “heals” are not broken across lines
- Repair clipped PDF lines near page bottoms in Swiss and Ink when DOM extents end slightly above the page slice
- Prevent orphan short lines (e.g. lone “I”) from staying at the bottom of a page when a paragraph continuation is split across a PDF page boundary
- Preserve valid paragraph splits at page boundaries so cleanup no longer merges continuations that start on the next page
- Amblin H2 wrapped headline overlap in PDF export by setting an explicit line-height instead of inheriting the PDF wrapper’s 10pt leading
- Prevent clip repair from re-splitting paragraphs when lines sit near but do not cross a PDF page slice, which was stacking spacers and creating irregular mid-page gaps
- Only mark paragraph continuations as page-break fixes after spacer or margin offset is actually applied

### Version Marked 3.0.29 (1160)

#### IMPROVED

- Use Ruby-compatible substitution regex in CriticMarkupRenderer for more reliable `<del class="critic break">old</del><ins class="critic break">new</ins>` parsing
- Process substitutions before deletions in CriticMarkupRenderer and recognize inline comments immediately after `~~}`
- Extend PDF link cache polling window from 1.2s to 3s so early-page link overlays are ready before annotation drawing

#### FIXED

- Prevent CriticMarkup substitutions from breaking when multiple `<del class="critic break">old</del><ins class="critic break">new</ins>` blocks appear on one line (including when followed by a colon)
- Protect substitution syntax from additional-syntax strikethrough processing that incorrectly matched `~~` between adjacent substitutions
- Render GitHub emoji in paginated PDF export by inlining remote PNG src values with query strings (`?v8`) without corrupting the img tag
- Restore clickable links in paginated PDF export by caching link overlay positions synchronously before native PDF generation begins
- Align PDF link annotation boxes with visible link text by removing the hardcoded vertical offset in link coordinate conversion

### Version Marked 3.0.28 (1159)

#### IMPROVED

- PDF table pagination inserts transparent row spacers when splitting tables across pages instead of padding rows directly, avoiding bordered empty gaps above continued table content
- First-element top padding clamping runs per page during pagination to reduce excess blank space after page-break markers
- Safari extension build number syncs with Marked when running rake bump or rake unbump

#### FIXED

- Manual page breaks (`<!-- BREAK -->` and `{pagebreak}`) convert to mkpagebreak divs in preview, Dingus, and PDF export, including after HTML comment restoration in the processing pipeline
- PDF export paginates manual breaks by converting lingering comment markers in the DOM and applying break spacing so content after a manual break starts on a new page
- Manual page break padding and margins are protected from pagination cleanup passes that previously removed break spacing

### Version Marked 3.0.27 (1157)

#### NEW

- Prompt to copy or move custom CSS styles into Application Support when adding via file picker or drag-and-drop
- Remove original CSS file checkbox toggles the default button between Copy and Move to Application Support
- Use from Current Location option tracks imported styles at their original path without copying
- Markdownifier preference and panel checkbox to convert reference links to inline links after conversion
- Cancel button on clipboard URL conversion progress window aborts the fetch and dismisses without opening a preview
- Markdownify URL in the right-click context menu for http(s) links in the preview
- Markdownify URL in the click-and-hold link popover alongside Validate Link and Open In
- Markdownify URL prompts to open the converted page in a new window or current window, with optional Always use this choice via mdLinkBehavior
- Open In {browser} on the link context menu for http(s) URLs, placed after Markdownify URL
- MarkText added to detected external text editors (after Typora)

#### IMPROVED

- Accessibilith improvements
- Statistics sidebar read-only text fields hide the focus ring in the document window
- Headings use break-after: avoid in built-in print styles to reduce widow headings at page bottoms
- Code blocks and blockquotes use overflow: visible in print export to reduce glyph clipping at page boundaries
- Show page breaks in preview applies the same break-inside: avoid rules as PDF export when body.showpagebreaks is active
- SVG paths with spaces use percent-encoded markdown image syntax for reliable processor handling
- Blank preview detection skips SVG files and treats img, figure, and other visual HTML as meaningful content
- Preview init recognizes image-only wrapper content before loading the empty-file placeholder
- SwiftSoup and read-swift package pins updated for text-extraction performance fixes
- Footnotes section preserved as raw HTML at the end of gathered documents so footnote target ids survive conversion
- Extracted titles escape Markdown-special characters when inserted as an H1
- Markdownify URL from a preview link runs the same async gather pipeline as clipboard URL conversion, with progress and cancel support

#### FIXED

- Announcement panel Latest, Dismiss, and navigation buttons legible on macOS 15+
- Blockquotes, pre, tables, and figures no longer split across page breaks in PDF and print export
- Nested paragraphs inside blockquotes and pre blocks paginate with their container instead of splitting independently
- Blockquotes crossing a page break stay intact in PDF preview and export instead of splitting between pages with orphaned background color
- Trailing blank page at the end of PDF export no longer appears when page-break spacers inflate document height beyond the last visible content line
- Pre blocks and figures retain large page-break spacer padding after list pagination instead of being clamped back to 80px
- SVG files open as rendered image previews instead of raw XML source
- SVG preview no longer replaced by the “watching this file” empty state for image-only documents
- Large page imports skip Readability when HTML exceeds 500KB and use direct content container extraction instead
- Clipboard URL import no longer blocks the main thread; shows a progress window while fetching and converting
- Relative images in clipboard URL previews resolve using the source page URL as the document base instead of the Watchers folder
- Remote image URLs in gathered Markdown are absolutized with correct directory-style bases for extensionless page paths
- Footnote links stay as in-document `#fn` anchors and no longer open the source site or collide with HTML2Text reference numbers
- False math rendering from `$` and `$$` in gathered prose by escaping dollars and enabling HTML2Text escape_snob for literal Markdown characters
- Transient preview base URL uses the full https page URL instead of a path-only fragment
- Transient preview documents apply stored remote base URLs on the main thread when opened from a background read queue

### Version Marked 3.0.26 (1156)

#### NEW

- Add HTML Source View find with DHWebView match highlighting, previous/next navigation, and a find bar on the Source tab
- Route F and G to source find when the Source tab is active, leaving preview JavaScript find unchanged on the Preview tab
- Ask About Document panel for on-device summaries, outlines, key points, and Q&A using Apple Intelligence (macOS 26+, supported Macs)
- Preview > Ask About Document menu item and Shift-Cmd-Ctrl-I shortcut to open the panel beside the document window
- Formatted/Markdown toggle to view AI responses as rich text or source Markdown
- Copy response button on the response area copies RTF or Markdown to match the display toggle

#### IMPROVED

- Accept any *-prefixed jQuery selector, not only a fixed tag whitelist
- Selector queries bypass the large-document minimum query length so short patterns like *p still run
- Selector matches set data-marked-match-start and match IDs so Cmd+G navigation works on highlighted elements
- Add Debug Mode tracing (D.info/D.debug) along find and wordhighlight selector paths
- Keep syntax-highlighted source visible when find is closed; show the searchable web view only while find is open
- Close source find with the cancel button or Escape
- Source find queries persist to the system find pasteboard so F recalls the latest search
- Ask About Document panel styling with muted background, borderless responses, pill question field, and circular send button
- Formatted/Markdown control moved above the question field at the bottom of the panel

#### FIXED

- Default preview style from Preferences now applies when opening a document that has no saved per-document style (instead of defaulting to Swiss on first load)
- Preview style fallback for invalid style indices uses your default preview style preference rather than always reverting to Swiss
- Restore * element selector find (*h1, *p, class/combinator queries) by scoping searchResult cleanup in unhighlight so Mermaid post-search cleanup no longer strips element highlights
- Selector highlight on jQuery 1.7.1 using jQuery(this) inside .each instead of reversed callback arguments
- Source find field keeps keyboard focus while typing by live-highlighting matches instead of handing focus to WebKit on each keystroke
- Tooltip with wrong text
- Ask About Document menu appears on eligible Macs with refresh on launch and when the app becomes active
- Response area no longer shows raw CSS on first load; placeholder text displays until the first answer
- Long documents handled via chunked map-reduce in the on-device Foundation Models service
- Panel layout keeps preset actions visible and responses growing above the composer

### Version Marked 3.0.25 (1155)

#### FIXED

- Default preview style from Preferences now applies when opening a document that has no saved per-document style (instead of defaulting to Swiss on first load)
- Preview style fallback for invalid style indices uses your default preview style preference rather than always reverting to Swiss

### Version Marked 3.0.24 (1154)

#### IMPROVED

- Diff marker processing skips full wrapper comparison when source text and volatile HTML are unchanged, including on style-pinned full reloads
- Diff HTML stripping uses a single-pass O(n) scan instead of repeated forward searches that scaled quadratically with preview size

#### FIXED

- Document open no longer hangs on large link-heavy files when preview diff markers are computed during initial load

### Version Marked 3.0.23 (1153)

#### IMPROVED

- MAS subscription status falls back to cached StoreKit transaction data when live entitlements are not yet available after purchase
- PDF list pagination uses a dedicated post-pass with line-rect straddle detection, spacer-based pushes, split-at-boundary for multi-line blocks, clip sweeps, and cleanup of spurious page-break padding

#### FIXED

- MAS subscription window no longer shows “Subscription will begin” with a past trial end date when the billing server still reports an active trial
- MAS title bar trial pill no longer stays on Trial Expired after the trial end date has passed
- MAS sandbox purchase now updates the subscription window and trial pill immediately instead of waiting for StoreKit’s background transaction listener
- Report an Issue email body format string that broke the preferences plist filename argument
- PDF export pagination for deeply nested lists in Swiss and Compact Swiss themes, preventing clipped lines and spurious full-page gaps at page boundaries
- Nested list items (e.g. Pass/Offer/Put under an intro line) now push or split individually at page bottoms instead of being skipped or bisected
- Subordinate nested items (single child under intro text, e.g. “It finishes”) no longer receive phantom mid-page padding or double spacers
- Bare list intro text without a wrapping `<p>` (Apex output) handled correctly so nested content is not padded independently of its parent item
- Headings at page boundaries moved when straddling or orphaned at the bottom of a page
- Paddle permanent unlock retained when server responses omit `permanent_license` but local data indicates a completed lifetime purchase
- Trial indicator hidden for permanent Paddle unlocks in DIRECT builds
- Trial countdown derived from `trial_ends_at` instead of billing-period expiration so paid subscriptions no longer show incorrect trial days remaining
- Preview style restore when reopening documents so built-in themes (e.g. Swiss after Compact Swiss) are not overridden by stale persisted custom CSS paths
- Style menu built synchronously before per-document style restore so the toolbar selection matches the saved preview theme

### Version Marked 3.0.22 (1152)

#### CHANGED

- Bring updated document to front selects the correct tab or orders the window within Marked only when Marked is already active; it no longer pops Marked above other applications while you work in another app

#### NEW

- Return focus to previous app preference restores keyboard focus to your editor after raise/bring-on-update activates Marked (optional, off by default)

#### IMPROVED

- MAS subscription status falls back to cached StoreKit transaction data when live entitlements are not yet available after purchase
- Custom Word Styles folder is created at launch alongside Custom CSS
- Tab selection on file update still switches to the updated document’s tab when Marked is in the background, so the right preview is ready when you return
- Raise window on update remains the option to float the preview above other applications without requiring Marked to be frontmost first
- Window visibility on update is handled through one code path for content reloads, CSS tracking, and dynamic image updates
- Report an Issue configuration archive includes the correct preferences plist for the running build (Direct, MAS, Setapp, etc.) and lists the bundle identifier in the summary
- Style picker sync after reload uses identifier lookup instead of resetting the popup to index 0 (Swiss)
- Custom CSS inlining trusts pinned preview paths during processor runs so reopen does not fail before security bookmarks resolve

#### FIXED

- Custom Word export styles load from `~/Library/Application Support/Marked/Custom Word Styles/` instead of the incorrect nested `Marked/Marked/` path documented in help
- DOCX export applies user Custom Word Styles from Application Support, not only bundled `wordstyles` templates
- Preferences refresh temporarily disables raise and bring options so saving General settings no longer flashes or reorders preview windows
- Custom preview styles no longer revert to Swiss on manual reload (R) when a custom stylesheet is active
- Preview style reload pins the active style by identifier and CSS path instead of re-validating through `setPreviewStyle:` and falling back to the first bundled style
- Fountain stylesheet detection no longer treats Markdown custom CSS paths as Fountain, which was incorrectly restoring Swiss on refresh
- Custom preview style restore when reopening a document, including R, by restoring style synchronously before the first processor pass and persisting the custom CSS path
- Per-document preview style saves on window close and quit so the last custom style is written back reliably
- Quit hang by skipping WebKit `close`/`stopLoading` during app termination, stopping file watchers first, and ignoring late reload/processor callbacks during shutdown
- MAS subscription window no longer shows “Subscription will begin” with a past trial end date when the billing server still reportsan active trial
- MAS title bar trial pill no longer stays on Trial Expired after the trial end date has passed
- MAS sandbox purchase now updates the subscription window and trial pill immediately instead of waiting for StoreKit’s background transaction listener
- Report an Issue email body format string that broke the preferences plist filename argument

### Version Marked 3.0.21 (1151)

#### CHANGED

- External editor defaults are no longer written at registration so a cleared editor shows the Choose Application placeholder until the user picks one

#### NEW

- External app picker (`MKExternalAppPickerController`) for choosing text, image, and markup editors from installed apps with a standard Choose Application panel
- Markdown Dingus can be set as the external text editor preference and opens new files in the Dingus when that preference is active
- Clear buttons in Settings > Apps reset external editor, image editor, and markup editor preferences without restoring stale defaults
- Set print/PDF margins per document with Margins: metadata (two or four values, points)

#### IMPROVED

- Custom preview styles in the Markdown processor use inlined CSS content (matching Dingus) with sandbox bookmark and container-path access checks before falling back to Swiss
- Default preview style preference resolves legacy string names to style manager indices and saves an integer index from URL handlers and settings
- Style menu rebuild restores the selected style by identifier and re-applies the current style when preferences are saved
- Installed app discovery (`NSWorkspace+MKInstalledApps`) finds editor apps by bundle ID, standard install locations, and Setapp variants
- Beta builds skip MAS Pro license validation and grant full subscription access for local testing
- Diff markers are not reused when the preview stylesheet changes, so style switches always refresh the document head
- Margins metadata overrides Export preferences and PDF export panel margin fields
- Extract body snippet from full HTML processor output (including UTF-8 BOM) before wrapping in the preview template
- Auto-pass `--snippet` to mmd/multimarkdown custom processor and preprocessor, mapping `--full` to snippet mode for preview
- Resolve custom processor path from per-document metadata and preferences instead of ignoring the configured binary
- Honor Custom Processor preference when default processor is MultiMarkdown but custom processing is enabled
- Enable custom processing for per-document `Processor: /path/to/mmd` metadata (Custom processor type)
- Pass useCustom and useCustomPre through preview generation so Conductor and custom processors run correctly
- CriticMarkup CSS matches bare ins/del/mark elements and MultiMarkdown 6 comment spans in addition to `.crit` class selectors
- Normalize MultiMarkdown 6 span.critic.comment output to Marked’s criticcomment format during preview processing

#### FIXED

- Preview style picker resolves styles by identifier instead of unreliable menu item tags, preventing out-of-range indices that fell back to Swiss
- Preview style changes force a full HTML reload via `pendingStyleFullHTMLLoad` so the `<head>` primaryCSS link updates instead of leaving a stale built-in stylesheet during incremental preview updates
- Custom preview styles keep the correct selection in the style popup and menu bar instead of reverting to Swiss during reload
- Style Manager deletion removes the style reference after a failed Move to Trash, including when the CSS file no longer exists
- Stop DOCTYPE and document shell from appearing as escaped text in preview when a custom processor (e.g. homebrew mmd) returns a full HTML page
- Prevent MultiMarkdown from running twice on HTML already in the pipeline, which produced `<p>&lt;!DOCTYPE html&gt;...` in source view
- Restore CriticMarkup Original and Edited views when Markup/Original/Edited tabs are clicked but preview stayed in Markup mode
- Add class=“crit” to bare ins/del/mark tags from processors (e.g. MultiMarkdown 6) that omit the class CriticMarkup CSS requires
- CriticMarkup tab handler no longer loses mode state when clicked (broken `this` binding in setMode)

### Version Marked 3.0.20 (1149)

#### CHANGED

- External editor defaults are no longer written at registration so a cleared editor shows the Choose Application placeholder until the user picks one

#### NEW

- External app picker (`MKExternalAppPickerController`) for choosing text, image, and markup editors from installed apps with a standard Choose Application panel
- Markdown Dingus can be set as the external text editor preference and opens new files in the Dingus when that preference is active
- Clear buttons in Settings > Apps reset external editor, image editor, and markup editor preferences without restoring stale defaults

#### IMPROVED

- Custom preview styles in the Markdown processor use inlined CSS content (matching Dingus) with sandbox bookmark and container-path access checks before falling back to Swiss
- Default preview style preference resolves legacy string names to style manager indices and saves an integer index from URL handlers and settings
- Style menu rebuild restores the selected style by identifier and re-applies the current style when preferences are saved
- Installed app discovery (`NSWorkspace+MKInstalledApps`) finds editor apps by bundle ID, standard install locations, and Setapp variants
- Beta builds skip MAS Pro license validation and grant full subscription access for local testing
- Diff markers are not reused when the preview stylesheet changes, so style switches always refresh the document head

#### FIXED

- Preview style picker resolves styles by identifier instead of unreliable menu item tags, preventing out-of-range indices that fell back to Swiss
- Preview style changes force a full HTML reload via `pendingStyleFullHTMLLoad` so the `<head>` primaryCSS link updates instead of leaving a stale built-in stylesheet during incremental preview updates
- Custom preview styles keep the correct selection in the style popup and menu bar instead of reverting to Swiss during reload
- Style Manager deletion removes the style reference after a failed Move to Trash, including when the CSS file no longer exists

### Version Marked 3.0.19 (1148)

#### CHANGED

- Premium Features menu label reflects MAS Pro licensed vs unlicensed state instead of trial messaging
- Removed legacy syntax themes superseded by highlight.js 11.11.1 and Base16 builds (darcula, dracula, solarized-, tomorrow, zenburn, and others)
- Fountain PDF export hides custom export font size override; screenplay margins are fixed at 72pt
- Fountain print/PDF layout driven by Fountain.css mkprinting rules instead of generic export styles

#### NEW

- In DEBUG builds, Option-click License Information opens the full purchase panel preview even when already licensed
- Bike outlines preference checkbox is visible under Apps > Embed as Mermaid mind maps
- Scrivener projects can prepend compile metadata (Title, Author, Language) from `Settings/compile.xml` when no Draft `metadata` document or existing MMD header block is present
- Scrivener preference Add compile metadata (title, author) when missing (default on) under Apps preferences
- Marked MAS Pro uses App Store receipt validation instead of the subscription trial and StoreKit 2 subscription flow
- MAS Pro shows a license required alert when the app is not licensed through the Mac App Store
- Open PDF files directly in Marked; converts to Markdown for preview and export (workflow similar to RTF import)
- PDF import runs pdf22md conversion in the background with a Converting notice while the preview waits
- PDF imports cache converted Markdown and assets under Watchers/PDF; live reload when the source PDF changes on disk
- Open in external editor for PDF imports opens the document in Preview (Cmd-E)
- Export copies PDF import image assets from the conversion cache like DOCX and RTF
- Embed %logo and %image in DOCX headers and footers from Header/Footer preferences
- Map %h1-%h6 DOCX header placeholders to Word STYLEREF fields for exported heading styles
- Substitute %md_ metadata* placeholders in DOCX headers and footers at export time
- Insert Text actions resolve `[%key]` placeholders from document metadata, environment variables, and Marked context (e.g. `[%title]`, `[%MARKED_PATH]`) without requiring MultiMarkdown
- Image variants preference resolves local dark and @2x siblings into responsive `<picture>` markup in preview
- Reopen restores each document’s window size and preview style using bookmark-keyed storage when files move or rename
- Syntax highlighting themes expanded to 239 styles, including GitHub Dark, Tokyo Night, Night Owl, Nord, Rose Pine, and the full Base16 collection as flat `base16-*` themes
- Paginated Fountain PDF export using FNPaginator page breaks, dedicated print CSS, and fountain-pdf-paginate.js
- Highland screenplay bundles (`.highland`) open and preview as Fountain documents
- TextPack and Highland document types registered for Open With and folder preview
- Fountain notes (`[[note]]`) and synopses render as sidebar comment markers in preview

#### IMPROVED

- Style Start Trial as a narrower centered confirm button below the plan cards instead of a fourth full-width plan row
- Add radio-style selection circles on subscription plan buttons to clarify which plan is selected
- Shrink the subscription window for License Information views and move Manage Subscriptions below the status card to remove empty space
- Grow the license status card to fit wrapped license detail text
- Bike task nodes in mind maps use / instead of GitHub bracket syntax that breaks Mermaid
- Mermaid mind map nodes from Bike, OPML, OmniOutliner, and FreeMind use rounded-square shape syntax
- iThoughts mind maps without style data default to rounded nodes instead of square
- Scrivener placeholder resolution for <$author>** and **<$projectabbreviatedtitle> during RTF import using compile settings and `.scrivx` project properties
- MAS Pro hides subscription purchase UI, trial timers, and trial reset paths used by the MAS subscription build
- PDF file watching only triggers re-conversion when the source PDF actually changes
- PDF import shows an explicit error when conversion finishes with no Markdown content (common with very large manuals)
- Print/PDF pagination splits paragraphs at the end of the last visible line instead of preferring sentence boundaries
- Paragraph continuations keep links and emphasis intact by moving whole inline elements to the next page rather than bisecting them
- Paragraph continuations suppress extra top margin and indent so split text reads as one flowing paragraph across pages
- Export palette child window presentation and dismissal when showing the floating panel
- Recognize PDF as a supported document type so import documents get full Marked functionality
- Search and Replace replacement strings now use the same expanded `[%key]` lookup (metadata, env, and context) with case-insensitive key matching
- Values set by earlier Set Metadata actions or preceding rules in the sequence are available to later Insert Text and Find/Replace steps
- Syntax highlighting updated to highlight.js 11.11.1 with 256 languages (all core grammars plus third-party packages)
- External image editing reloads changed images in the preview when returning to Marked, with path matching for figure and picture markup
- Reverse diff order now controls which source edit is anchored (first vs last visible change outside comments)
- Preview style saves synchronously when changed from the toolbar, menu bar, or Style Stealer, including on window close
- Switching to another file in the same window saves the outgoing document’s UI state before loading saved settings
- External editor prompts to re-select the app when a saved preference path is missing or invalid, and stores full app paths for image and markup editors
- DocC preview base path resolution consolidated for consistent catalog resource lookup
- Syntax highlighting preference automatically migrates removed theme names to equivalent replacements on launch (e.g. dracula to base16-dracula)
- HTML export and preview use normalized syntax theme names so exports stay in sync with bundled stylesheets
- Edit marker anchoring ignores hidden `<!-- -->` text in preview HTML and uses visible source length when mapping edits to the wrapper
- Reverse diff order still controls which source edit is anchored (first vs last visible change outside comments). Thanks to Eli Lev for helping debug these comment fixes.
- { and } (Shift+[ / Shift+]) always step through all highlight types and remember the last type for filtered [ / ] navigation
- [ and ] after { / } navigate only the last highlighted proofing category instead of all types again
- Bike to Mermaid label escaping uses shared iThoughts quoting for consistent node text
- Include processing runs once before fenced-code hold to prevent double Mermaid restoration

#### FIXED

- Restore License Information title, status card, and footer links when the subscription window shrinks for licensed users
- Stop footer links from overlapping the license status card by sizing the window for the full footer stack
- Restore confetti animation after license layout by firing it once the window has finished resizing
- Bike (.bike) includes honor embedBikeAsMermaid instead of always rendering nested lists
- Bike Mermaid mind maps parse correctly using plain indented labels with Unicode task markers
- Preview load hang when a document includes a .bike file by deferring included-file watch events until the first preview is ready
- Bike completed tasks in list mode when Bike uses data-done timestamps (not only data-checked)
- Manuscript GitHub task list alignment with regular bullets and correct nested task indent
- Manuscript checked tasks render as solid black squares instead of blue system checkboxes
- Grump task list indentation so root checkboxes line up with bullets and nested tasks match nested bullets
- Preview task checkboxes are non-interactive without grayed-out disabled styling (pointer-events, aria-disabled, click blocking)
- PDF import no longer flashes or repeatedly reloads when conversion writes to the cache folder
- PDF import shows a stable preview after long conversions instead of stopping on a blank document while conversion is still running
- PDF import image and resource paths resolve against the cache assets folder instead of the PDF file’s parent directory
- Open Export palette on PDF import documents instead of blocking them as Quick Look previews
- Context menu targets images inside figure and picture elements reliably for Edit/Copy/Validate actions
- Scroll to edit and edit markers anchor to visible body edits instead of metadata in closed HTML comment blocks
- Edit markers ignore processor HTML churn when volatile wrapper markup matches, reducing false markers and bad scroll targets
- Preview style restores correctly on reopen instead of reverting to the global default
- HTML comments in Markdown are held before SmartyPants and other smart typography runs, so `-->` closers are not turned into an en-dash plus `>` (which left comments open and hid everything after them in preview)
- Preview shows content after large `<!-- -->` blocks (e.g. archived ChatGPT transcripts) when comment closers use `-->`
- Edit markers and scroll to edit place the marker near your actual edit instead of far down the page when large HTML comments inflate preview HTML
- [ and ] highlight shortcuts work on first use with all proofing types before you have used { and }
- Keyword panel leaves focus in the preview when it opens so [ / ] work immediately; click or Tab to edit temporary keywords
- Keyword panel returns focus to the preview webview after updating highlights or using locate-target buttons
- Locate-target buttons in the keyword drawer no longer steal keyboard focus from the preview
- Duplicate Mermaid mind map blocks when Bike/OPML includes are combined with other included files
- Bike mind map diagrams staying stale on save until a manual refresh
- Mermaid node labels containing curly braces breaking Bike mind map rendering
- Fountain PDF export page count and layout drift from preview print font override
- Preview updates dropped while document processing was in progress
- Stylesheet changes during processing not applying until restart
- Fountain PDF export page numbers appearing at the bottom of the preceding page instead of on the page they label

### Version Marked 3.0.18 (1147)

#### CHANGED

- Premium Features menu label reflects MAS Pro licensed vs unlicensed state instead of trial messaging
- Removed legacy syntax themes superseded by highlight.js 11.11.1 and Base16 builds (darcula, dracula, solarized-, tomorrow, zenburn, and others)

#### NEW

- In DEBUG builds, Option-click License Information opens the full purchase panel preview even when already licensed
- Bike outlines preference checkbox is visible under Apps > Embed as Mermaid mind maps
- Scrivener projects can prepend compile metadata (Title, Author, Language) from `Settings/compile.xml` when no Draft `metadata` document or existing MMD header block is present
- Scrivener preference Add compile metadata (title, author) when missing (default on) under Apps preferences
- Marked MAS Pro uses App Store receipt validation instead of the subscription trial and StoreKit 2 subscription flow
- MAS Pro shows a license required alert when the app is not licensed through the Mac App Store
- Open PDF files directly in Marked; converts to Markdown for preview and export (workflow similar to RTF import)
- PDF import runs pdf22md conversion in the background with a Converting notice while the preview waits
- PDF imports cache converted Markdown and assets under Watchers/PDF; live reload when the source PDF changes on disk
- Open in external editor for PDF imports opens the document in Preview (Cmd-E)
- Export copies PDF import image assets from the conversion cache like DOCX and RTF
- Embed %logo and %image in DOCX headers and footers from Header/Footer preferences
- Map %h1-%h6 DOCX header placeholders to Word STYLEREF fields for exported heading styles
- Substitute %md_ metadata* placeholders in DOCX headers and footers at export time
- Insert Text actions resolve `[%key]` placeholders from document metadata, environment variables, and Marked context (e.g. `[%title]`, `[%MARKED_PATH]`) without requiring MultiMarkdown
- Image variants preference resolves local dark and @2x siblings into responsive `<picture>` markup in preview
- Reopen restores each document’s window size and preview style using bookmark-keyed storage when files move or rename
- Syntax highlighting themes expanded to 239 styles, including GitHub Dark, Tokyo Night, Night Owl, Nord, Rose Pine, and the full Base16 collection as flat `base16-*` themes

#### IMPROVED

- Style Start Trial as a narrower centered confirm button below the plan cards instead of a fourth full-width plan row
- Add radio-style selection circles on subscription plan buttons to clarify which plan is selected
- Shrink the subscription window for License Information views and move Manage Subscriptions below the status card to remove empty space
- Grow the license status card to fit wrapped license detail text
- Bike task nodes in mind maps use / instead of GitHub bracket syntax that breaks Mermaid
- Mermaid mind map nodes from Bike, OPML, OmniOutliner, and FreeMind use rounded-square shape syntax
- iThoughts mind maps without style data default to rounded nodes instead of square
- Scrivener placeholder resolution for <$author>** and **<$projectabbreviatedtitle> during RTF import using compile settings and `.scrivx` project properties
- MAS Pro hides subscription purchase UI, trial timers, and trial reset paths used by the MAS subscription build
- PDF file watching only triggers re-conversion when the source PDF actually changes
- PDF import shows an explicit error when conversion finishes with no Markdown content (common with very large manuals)
- Print/PDF pagination splits paragraphs at the end of the last visible line instead of preferring sentence boundaries
- Paragraph continuations keep links and emphasis intact by moving whole inline elements to the next page rather than bisecting them
- Paragraph continuations suppress extra top margin and indent so split text reads as one flowing paragraph across pages
- Export palette child window presentation and dismissal when showing the floating panel
- Recognize PDF as a supported document type so import documents get full Marked functionality
- Search and Replace replacement strings now use the same expanded `[%key]` lookup (metadata, env, and context) with case-insensitive key matching
- Values set by earlier Set Metadata actions or preceding rules in the sequence are available to later Insert Text and Find/Replace steps
- Syntax highlighting updated to highlight.js 11.11.1 with 256 languages (all core grammars plus third-party packages)
- External image editing reloads changed images in the preview when returning to Marked, with path matching for figure and picture markup
- Reverse diff order now controls which source edit is anchored (first vs last visible change outside comments)
- Preview style saves synchronously when changed from the toolbar, menu bar, or Style Stealer, including on window close
- Switching to another file in the same window saves the outgoing document’s UI state before loading saved settings
- External editor prompts to re-select the app when a saved preference path is missing or invalid, and stores full app paths for image and markup editors
- DocC preview base path resolution consolidated for consistent catalog resource lookup
- Syntax highlighting preference automatically migrates removed theme names to equivalent replacements on launch (e.g. dracula to base16-dracula)
- HTML export and preview use normalized syntax theme names so exports stay in sync with bundled stylesheets

#### FIXED

- Restore License Information title, status card, and footer links when the subscription window shrinks for licensed users
- Stop footer links from overlapping the license status card by sizing the window for the full footer stack
- Restore confetti animation after license layout by firing it once the window has finished resizing
- Bike (.bike) includes honor embedBikeAsMermaid instead of always rendering nested lists
- Bike Mermaid mind maps parse correctly using plain indented labels with Unicode task markers
- Preview load hang when a document includes a .bike file by deferring included-file watch events until the first preview is ready
- Bike completed tasks in list mode when Bike uses data-done timestamps (not only data-checked)
- Manuscript GitHub task list alignment with regular bullets and correct nested task indent
- Manuscript checked tasks render as solid black squares instead of blue system checkboxes
- Grump task list indentation so root checkboxes line up with bullets and nested tasks match nested bullets
- Preview task checkboxes are non-interactive without grayed-out disabled styling (pointer-events, aria-disabled, click blocking)
- PDF import no longer flashes or repeatedly reloads when conversion writes to the cache folder
- PDF import shows a stable preview after long conversions instead of stopping on a blank document while conversion is still running
- PDF import image and resource paths resolve against the cache assets folder instead of the PDF file’s parent directory
- Open Export palette on PDF import documents instead of blocking them as Quick Look previews
- Context menu targets images inside figure and picture elements reliably for Edit/Copy/Validate actions
- Scroll to edit and edit markers anchor to visible body edits instead of metadata in closed HTML comment blocks
- Edit markers ignore processor HTML churn when volatile wrapper markup matches, reducing false markers and bad scroll targets
- Preview style restores correctly on reopen instead of reverting to the global default

### Version Marked 3.0.17 (1146)

#### NEW

- Add Speed Read to the Preview menu (Control-Option-S) with the same shortcut as the Gear menu

#### IMPROVED

- Enable Speed Read in the main menu only when a Markdown preview document is active, and disable it for HTML previews and when no document is open
- Forward Preview > Speed Read through AppController to the active document and sync the menu checkmark with overlay state

#### FIXED

- Enable Speed Read in the preview Gear menu without requiring Enable Mini Map or Sync Speed Reading with scroll position

### Version Marked 3.0.16 (1145)

#### NEW

- MAS in-app review prompt for paid users (3-day gate) using SKStoreReviewController with write-review follow-up on the App Store
- Review Marked menu runs the system rating sheet and offers to open the App Store write-review page
- DocC image resolution for .docc catalogs (extensionless references, dark and @2x variants) with Resolve DocC image references preference (default on)

#### IMPROVED

- Open panel allows folders and file packages with clearer messaging when browsing for documents

#### FIXED

- Scrivener preview resolves relative image paths from the .scriv bundle directory instead of inside the package
- Scrivener HTML asset base path uses the document folder for non-.scriv sources

### Version Marked 3.0.15 (1143)

#### CHANGED

- Error overlays and CLI instructions send Marked Support button clicks to the new-question form

#### IMPROVED

- File watch coalesces primary-file events during atomic saves (250ms debounce) and forces a full preview reload when a Process-phase processor is enabled
- File change detection uses content hash as well as modification date so in-place saves are not missed when mtime is unchanged
- Processor queue cancels in-flight work on reload and ignores stale finishes so slow Pandoc passes cannot overwrite a newer save or skip marker insertion
- Per-document processor choice during a preview pass no longer temporarily writes defaultProcessor to shared preferences (avoids spurious preference notifications and races)
- Preview error overlay support link uses HTTPS for the main support site

#### FIXED

- External save updates the preview again when a Conductor Process rule (e.g. Pandoc) runs, including atomic editor saves that emit rapid kqueue delete/write bursts
- Edit markers appear after saves when Pandoc or other processors change the HTML wrapper layout, by splitting preview HTML on wrapper markers instead of requiring a fragile five-part regex split
- Edit markers anchor to markdown source changes (pre-processor) rather than post-Pandoc HTML, so diffs are detected reliably
- Edit markers at the start of `#wrapper` are no longer removed on init and are repositioned into the first content block so they stay visible
- Opening a new file in the same window resets diff baselines, included files, and preview state so markers and reload behavior start clean
- Preview processing no longer hangs or triggers Main Thread Checker errors when Pandoc or file-watch reloads run on the background processor queue
- Preferences export profile controls are only updated on the main thread when defaults change
- Report an Issue and Open Support Site open `https://support.markedapp.com/questions/add` instead of the old `discussion/new` URL that returned 404
- Marked Support in the Help menu opens the support site over HTTPS

### Version Marked 3.0.14 (1141)

#### NEW

- Confetti celebration when a subscription, trial, or lifetime license becomes active in the subscription window

#### IMPROVED

- Subscription window shows Activating your subscription… while the billing server confirms a new purchase
- Post-checkout restore retries automatically until Paddle and the billing server sync complete
- Subscribe URL handler uses the same post-checkout activation path as the in-app checkout sheet/
- Checkout sheet dismissal refreshes subscription status without manual restore
- Confetti is denser and longer with multiple emitters and timed bursts during checkout and restore success
- Lifetime Manage Subscriptions easter egg uses the full celebration animation
- Diff markers sit on the edited line within a block instead of only at the block top
- Scroll to edit is debounced and MathJax/KaTeX only scroll when diff markers are present
- Scrivener compile still emits image references when image files are missing on disk (broken preview image instead of swallowed markup)

#### FIXED

- Paddle purchases should no longer require Restore Purchases to register after a successful checkout
- Failed post-checkout restore no longer marks the subscription canceled before the server has caught up
- Scrivener compile no longer duplicates text sections for selected documents
- Confetti plays once per license type so status refreshes do not retrigger the animation
- Scrivener and RTF saves use a coalesced compile reload instead of stacked full refreshes, eliminating preview churn and duplicate scroll-to-edit passes
- Scrivener watch handling skips included asset updates during an in-flight compile so icon.png and similar paths no longer trigger extra reloads
- Scrivener synchronous imports suppress the importer delegate refresh when the compiled text is already applied, avoiding a second preview pass
- Edit markers for Scrivener/RTF compare raw compile snapshots (not processed Markdown) so markers appear after real binder edits
- Edit markers anchor at the substantive change (largest text insert) and search inserted text in the preview so markers land on the edited paragraph, not an earlier block
- Dynamic image updates no longer strip existing diff markers or force scroll when Scroll to edit is off
- Window title keeps the filename when Use first H1 as fallback title sets print title from an H1 that matched the old window title
- Quick Open opens centered on screen when no Markdown document window is available
- Scrivener documents with external images pasted as Markdown (`![](./resources/...)`) compile to proper image references instead of broken `![][]` text or missing markup
- Scrivener compile preserves Pandoc attribute blocks on image lines by keeping Markdown syntax through HTML conversion rather than an `<img>` round-trip that dropped images and `{...}` attrs
- Scrivener image paths with parentheses in filenames (and `<em>`/`<span>` wrappers from AppKit) normalize and resolve correctly
- Scrivener `./resources/` links resolve inside the .scriv bundle (not each binder RTF folder or the parent Desktop folder)

### Version Marked 3.0.13 (1140)

#### NEW

- Confetti celebration when a subscription, trial, or lifetime license becomes active in the subscription window

#### IMPROVED

- Subscription window shows Activating your subscription… while the billing server confirms a new purchase
- Post-checkout restore retries automatically until Paddle and the billing server sync complete
- Subscribe URL handler uses the same post-checkout activation path as the in-app checkout sheet
- Checkout sheet dismissal refreshes subscription status without manual restore
- Confetti is denser and longer with multiple emitters and timed bursts during checkout and restore success
- Lifetime Manage Subscriptions easter egg uses the full celebration animation
- Diff markers sit on the edited line within a block instead of only at the block top
- Scroll to edit is debounced and MathJax/KaTeX only scroll when diff markers are present

#### FIXED

- Paddle purchases should no longer require Restore Purchases to register after a successful checkout
- Failed post-checkout restore no longer marks the subscription canceled before the server has caught up
- Scrivener compile no longer duplicates text sections for selected documents
- Confetti plays once per license type so status refreshes do not retrigger the animation
- Scrivener and RTF saves use a coalesced compile reload instead of stacked full refreshes, eliminating preview churn and duplicate scroll-to-edit passes
- Scrivener watch handling skips included asset updates during an in-flight compile so icon.png and similar paths no longer trigger extra reloads
- Scrivener synchronous imports suppress the importer delegate refresh when the compiled text is already applied, avoiding a second preview pass
- Edit markers for Scrivener/RTF compare raw compile snapshots (not processed Markdown) so markers appear after real binder edits
- Edit markers anchor at the substantive change (largest text insert) and search inserted text in the preview so markers land on the edited paragraph, not an earlier block
- Dynamic image updates no longer strip existing diff markers or force scroll when Scroll to edit is off
- Window title keeps the filename when Use first H1 as fallback title sets print title from an H1 that matched the old window title
- Quick Open opens centered on screen when no Markdown document window is available

### Version Marked 3.0.12 (1139)

#### CHANGED

- Keep on Top shortcut is now F instead of F, avoiding conflict with Focus view in the preview

#### NEW

- Filter Scrivener Documents panel (Proofing menu) to choose which binder sections appear in the Scrivener preview
- Scrivener filter persists checkbox selections per project UUID; first open selects Draft items with Include in Compile only (Research and other binders start unchecked)
- Empty Scrivener preview with link to open the filter panel via `x-marked://scrivenerfilter`
- F opens Filter Scrivener Documents from the Proofing menu (also in the gear Proofing submenu)
- Open RTF and RTFD files directly in Marked with conversion to Markdown, live preview on save, and export support
- RTF/RTFD images from the document bundle are copied into a Watchers asset cache for preview and export

#### IMPROVED

- Run Command sets pandoc’s working directory to the document folder and requests access to that folder for auxiliary files
- Bibliography errors show a warning when pandoc stderr reports citeproc, bibliography, or permission problems
- Filter panel closes with the window close button; Proofing menu checkmark reflects whether the panel is open
- Scrivener 3 previews can include Research and other binders (not Trash); Scrivener 2 shows Draft only in the panel
- Scrivener re-import cancels in-progress compiles when filter checkboxes change (400 ms debounce)
- Pages RTFD files convert fully by fixing invalid nested lists and stripping span wrappers in HTML to Markdown conversion
- Included RTF and RTFD files in other documents are converted instead of showing an error
- Scrivener RTF compile uses the shared conversion pipeline (behavior unchanged, less duplicated code)

#### FIXED

- Pandoc citeproc and `--bibliography=` paths now receive sandbox access (flags like `--bibliography=/path/to/file.bib` were previously ignored)
- Duplicate Custom Processor Log lines for the same Run Command in one preview pass
- Scrivener import treats missing IncludeInCompile as Yes so Draft items from older or migrated projects are not skipped
- Scrivener filter section All and None buttons work again after outline cell reuse (section index stored separately from view tags)
- Scrivener folder headers (e.g. “Going Further”) appear when child documents are selected, including folders directly under Draft
- Scrivener top-level Text documents outside Draft/Research (e.g. Tutorial intro sheets) show checkboxes and can be included in the preview
- RTF/RTFD preview no longer stuck on the loading screen after conversion (removed nested refresh during import; same stabilization as Scrivener)
- Pages RTFD body text at 16px no longer converts to h5 headings (heading levels are relative to the document body font size)
- Pages double-wrapped lists no longer render as code blocks in preview
- RTF headings no longer wrap title text in bold or leave empty `*`/`_` emphasis markers in Markdown output
- RTF images without captions no longer use the filename as alt/title, including after cache renames to image-1.png (avoids spurious MMD figure captions)
- RTFD images referenced as `file:///filename` (e.g. Pages `pastedGraphic.png`) now resolve against the bundle and copy into the asset cache

### Version Marked 3.0.11 (1138)

#### NEW

- Preview menu shortcut Option-Command-C to open Edit Custom Rules (Conductor)

#### IMPROVED

- Conductor command paths without a leading slash (e.g. `opt/homebrew/bin/pandoc`) are normalized to absolute paths automatically
- External binary execution falls back to running through the shell when direct NSTask launch fails in the sandbox

#### FIXED

- Stop preview hang when a Conductor Run Command processes large documents (pandoc and similar tools no longer deadlock on full stdout pipes)
- Stop crash on launch when an external command was authorized via a folder bookmark (NSTask no longer uses the bookmark directory path as the executable)
- Stop Run Command from prompting for pandoc access on every preview reload after permission was already granted
- Remove duplicate Custom Processor Log entries for each Run Command in the process phase
- Conductor command file picker (folder button beside the command field) no longer grays out Homebrew binaries and extensionless executables
- Sandbox permission dialog for external executables so Homebrew bin symlinks and Cellar binaries are selectable

### Version Marked 3.0.10 (1137)

#### IMPROVED

- Images, figures, and other graphic blocks use page-break spacers so painted content does not bleed onto the previous PDF page
- Open Recent is preserved on crash recovery; missing files are only removed from Recent when the user explicitly opens an unavailable entry, not during automatic session restoration
- Export profile creation selects the new profile in preferences without re-applying all settings to UserDefaults
- Document state lookup resolves bookmarks one at a time instead of flooding ScopedBookmarkAgent with parallel requests
- Window state restoration on quit encodes regular bookmark paths without resolving every bookmark synchronously

#### FIXED

- PDF export no longer repeats or overlaps page content when scrolling through long paginated documents
- PDF export adds scroll padding after pagination so the last pages capture unique content instead of duplicating earlier slices
- PDF export resolves relative image URLs to absolute paths before print preparation removes the document base tag
- PDF export loads HTML with the source document base URL instead of only the app bundle so relative assets resolve during pagination
- Base64 image embedding for export uses the document base path, DOCX asset folder when present, and file:// image src values
- Refresh no longer crashes when preview style is None and cssPath is unset (getAllPrefs passed nil to NSMutableDictionary setObject🐒)
- Conductor preprocess and Insert CSS rules run when enabled Preprocess rules exist, even if the legacy custom preprocessor executable is not installed
- Preview style None uses a blank primary stylesheet instead of silently falling back to Swiss
- Changing preview style rebuilds the preview so Conductor CSS injected into the document head is not dropped when switching themes
- Start Fresh after a crash removes only Marked saved state and Marked autosave data, not the entire Library/Autosave Information folder
- Disabling a Custom Rule now updates the preview instead of leaving the previous styled HTML in place when the source file did not change
- Toggling Custom Rules uses a full preview reload so Processor rules and preview style None apply immediately
- Preview style selected before a Conductor Set Style action is restored when that rule is turned off
- Preprocessor and Processor status bar lights now disable Conductor rules for that phase instead of leaving enabled rules active when the light is off
- Turning a pre/processor light off or on triggers a full preview rebuild so preview style and rule effects update immediately
- Stop crash when adding a new export profile on recent macOS versions
- Manage Profiles window no longer reloads the profile table while the new profile name is being edited
- Prevent Quit from hanging for nearly a minute when many sandbox bookmarks are stored

### Version Marked 3.0.10 (1137)

#### IMPROVED

- Images, figures, and other graphic blocks use page-break spacers so painted content does not bleed onto the previous PDF page
- Open Recent is preserved on crash recovery; missing files are only removed from Recent when the user explicitly opens an unavailable entry, not during automatic session restoration

#### FIXED

- PDF export no longer repeats or overlaps page content when scrolling through long paginated documents
- PDF export adds scroll padding after pagination so the last pages capture unique content instead of duplicating earlier slices
- PDF export resolves relative image URLs to absolute paths before print preparation removes the document base tag
- PDF export loads HTML with the source document base URL instead of only the app bundle so relative assets resolve during pagination
- Base64 image embedding for export uses the document base path, DOCX asset folder when present, and file:// image src values
- Refresh no longer crashes when preview style is None and cssPath is unset (getAllPrefs passed nil to NSMutableDictionary setObject🐒)
- Conductor preprocess and Insert CSS rules run when enabled Preprocess rules exist, even if the legacy custom preprocessor executable is not installed
- Preview style None uses a blank primary stylesheet instead of silently falling back to Swiss
- Changing preview style rebuilds the preview so Conductor CSS injected into the document head is not dropped when switching themes
- Start Fresh after a crash removes only Marked saved state and Marked autosave data, not the entire Library/Autosave Information folder
- Disabling a Custom Rule now updates the preview instead of leaving the previous styled HTML in place when the source file did not change
- Toggling Custom Rules uses a full preview reload so Processor rules and preview style None apply immediately
- Preview style selected before a Conductor Set Style action is restored when that rule is turned off

### Version Marked 3.0.10 (1136)

#### CHANGED

- Exported HTML highlight.js bundle updated to 11.11.1 (jsDelivr cdn-release)

#### NEW

- Center header and footer fields in Export preferences and per-document Print Header Center / Print Footer Center metadata
- Preview style menu option “None” for Conductor-only or unstyled preview without built-in theme CSS

#### IMPROVED

- PDF print and on-screen paginated headers and footers support left, center, and right zones including centered logos
- DOCX export writes center header and footer content with correct Word tab stops
- Markdown Dingus preview style menu includes None and clears theme CSS when None is selected
- Images, figures, and other graphic blocks use page-break spacers so painted content does not bleed onto the previous PDF page

#### FIXED

- HTML export includes Conductor Insert CSS and Insert CSS File styles from the preview document head
- HTML export with None preview style no longer reads a missing CSS path
- PDF export no longer repeats or overlaps page content when scrolling through long paginated documents
- PDF export adds scroll padding after pagination so the last pages capture unique content instead of duplicating earlier slices
- PDF export resolves relative image URLs to absolute paths before print preparation removes the document base tag
- PDF export loads HTML with the source document base URL instead of only the app bundle so relative assets resolve during pagination
- Base64 image embedding for export uses the document base path, DOCX asset folder when present, and file:// image src values

### Version Marked 3.0.9 (1135)

#### IMPROVED

- Conductor-injected stylesheet and style tags are hoisted from the document body into the HTML head during preview generation

#### FIXED

- Insert CSS File inserts after MultiMarkdown and Pandoc metadata blocks, so a following Run Processor action still recognizes document metadata instead of rendering CSS:, HTML Header:, and similar keys as body paragraphs
- Hashtag highlighting no longer wraps #tags inside quoted strings,
  blocks are removed so CSS does not appear in the Markdown output.
- Empty HTML tags (e.g. ) are stripped before conversion so they no longer produce extra ** or other formatting characters in the Markdown output.
- Direct (Paddle) builds no longer get locked out of Restore/plan selection by stale cached MAS entitlement results during subscription checks
- Trial remaining days no longer show absurd values when trial dates are corrupted or overridden

### Version Marked 3.0.0b29 (1111)

#### CHANGED

- Migrate MathJax integration to v3 ES5 components with v3-compatible typesetting and configuration

#### NEW

- Allow choosing MathJax source between Local bundle and CDN in Style preferences
- Add MathJax packages popover to enable physics, mhchem, braket, and bold symbols
- Bundle MathJax v3 ES5 distribution files with the app so math rendering works offline without requiring a CDN

#### IMPROVED

- Preserve existing equation numbering options while mapping them to MathJax v3 tags and tagSide
- Detect existing MathJax v3 output to avoid double rendering in the preview
- Add VoiceOver accessibility labels to subscription purchase window buttons so screen reader users can understand each plan and action
- Make word repetition ignore callout scaffolding and SVG icons so only visible callout titles and content are analyzed

#### FIXED

- Opening the Markdown Dingus via the x-marked://dingus URL handler no longer crashes; the style popup is configured by using the last-added menu item instead of the enumeration index so it works when the popup has a title item or different structure.
- Switching to Process as Fountain and back returns to selected Style
- Exclude Mermaid diagrams from Cmd-F search highlighting to avoid corrupting diagram rendering in previews
- Strip MathJax configuration scripts and related HTML tags from the text used for word repetition in all scopes to avoid bogus repeated “words”
- Ensure document-scope word repetition ignores MultiMarkdown metadata headers instead of treating them as part of the main document text

### Version Marked 3.0.0b28 (1110)

#### CHANGED

- Only one diff marker is shown per paragraph/blockquote/list item; duplicates in the same block are hidden so markers no longer stack.

#### NEW

- Word repetition now offers a Sentence scope in addition to Document and Paragraph, highlighting repeats that occur within individual sentences
- Add agentic coding integration notes to Help Docs
- Detailed Statistics window now shows the detected or fallback language code used for readability calculations

#### IMPROVED

- Word repetition scope selector uses a three-way toggle and keeps the panel’s repeated-word counts aligned with the currently active scope
- Readability scores now use an apostrophe-aware word counter for more accurate results, especially in languages with frequent contractions
- Word repetition highlighting treats contractions and leading apostrophes as the same word, reducing false negatives when scanning for overused terms
- Preferences labels no longer show stray focus rings when clicked, matching the visual style of surrounding controls
- Reading Ease now uses language-specific Flesch-style formulas for English, German, Spanish, French, Italian, and Dutch to better reflect each language’s typical word and syllable patterns
- Subscription purchase view no longer shows the trial countdown line when an active or trialing subscription is already displayed.
- E and Shift+E navigate only visible diff markers and numbering reflects visible count (e.g. 1 of 3) so the list does not jump.
- End key and B/Shift+G continue to scroll to bottom; Home and g/Shift+G scroll to top.
- Purchase flow changed to select subscription/unlock type->click Buy Now. Buy button disables until overlay has shown. Avoids confusion when there’s a delay on the Apple side loading the purchase overlay.

#### FIXED

- Character counts now ignore leading and trailing spaces and newlines in all stats views, preventing extra characters from being reported for padded selections and documents
- Word export now preserves paragraph line breaks when “Retain line breaks in paragraphs” is enabled so DOCX matches the preview (handles both HTML br elements and literal newlines in paragraph text).
- Table of contents and other hash links now scroll the preview correctly when clicked or activated with Return; target is resolved with getElementById and decodeURIComponent so IDs with special characters work.
- Arrow Up and Arrow Down now scroll the preview by one step (40px) instead of jumping to top or doing nothing; WebView default behavior is overridden with explicit window.scrollTo.
- Bookmark n (next by position) wraps from the last bookmark to the first; when at the first bookmark n advances to the next.
- Bookmark n and p (next/previous by position) no longer skip bookmarks that share the same row; the noRepeatY filter was removed so all bookmarks are included in position order.
- Incorrect product ID on MAS permanent unlock

### Version Marked 3.0.0b27 (1109)

#### FIXED

- Save button in Style Generator now shows a toast when clicked without an active edit session (“No style is being edited. Use Edit from the Style Manager”) instead of doing nothing silently

### Version Marked 3.0.0b26 (1108)

#### CHANGED

- Document displayName now respects showFullPathInWindowTitle so any UI that syncs from the document (e.g. window controller) shows the chosen path style

#### NEW

- EPUB export can download remote images and embed them when “Download remote assets” is checked in the Save as EPUB dialog
- EPUB save panel now includes the “Download remote assets” checkbox so remote images can be included in the exported book
- **Preference “**Show full path in window title” in Settings > Preview; when on, preview window shows the full file path instead of the filename

#### IMPROVED

- Window title updates immediately when toggling the preference (all open documents refresh)
- Zoom level in title bar no longer overwrites full path; title is taken from document display logic when base title is not provided
- Quick open (Cmd+Shift+O) shows transient documents by base name only (e.g. “Clipboard Preview” instead of the .mktransient filename)
- Quick open uses the same display title as the window for every document (transients, Bear, watch folder, full/short path per preference) via displayTitleForWindowOrList

#### FIXED

- EPUB table of contents links now use the sanitized heading id (nav.xhtml no longer matches data-orig-id and produces broken fragment links)
- Preview no longer blocks images whose filename contains tracking-like substrings (e.g. “_ga”); only URL query parameters are checked for tracking params
- Disabled image cache-buster in preview so remote image URLs are not modified and can load correctly
- Crash when closing document windows after long-running preview sessions due to double-closing the WebView when the window is closed
- “Add as New Style” in Style Generator now creates a new CSS file in Custom CSS and adds it to the Style Manager
- Save in Style Generator immediately refreshes preview in documents using that style (no manual refresh needed)
- Edit from Style Manager now loads the selected style instead of Blank Theme (retry when MarkedStyleBridge is not yet ready)

### Version Marked 3.0.0b25 (1107)

#### IMPROVED

- Showing an Opening X files window when opening multiple files at once so users get immediate feedback while documents load
- Style Generator file chooser now uses modern content-type filtering on macOS 12+ while remaining compatible with older macOS versions
- Dingus: Pasting URLs in the editor now avoids wrapping links in angle brackets on reference definition lines and when inserting inside parentheses, so Markdown stays valid
- Gremlin highlighting now focuses on control and invisible characters (including C0/C1 controls and zero-width characters) instead of flagging all non-ASCII text
- Preview window contextual menu now includes a Copy item when text is selected so users can copy selected preview content to the clipboard
- Use outline css rule to highlight keywords during selection
- Update color palette for keyword highlights
- Word repetition drawer now updates its list and document highlights live when you change minimum repeats or toggle ignore checkboxes
- Proofing highlights use simplified background styles so repeated-word and avoidance cues are clearer in both light and dark themes

#### FIXED

- Code blocks and other fixed-height preview layout now refresh correctly after Preview->Zoom In/Out/Reset so content fits at the new text zoom level
- Partial fix: Multi-file Dock drops now open all selected files. To my chagrin, this does not work when a preview window is already open
- Word repetition ignore settings now stay in sync between the drawer and in-document highlights, including temporary vs global ignores
- Word repetition detection now respects the current minimum repeat threshold and global ignore list even when they change without editing the document text
- Opening x-marked URLs now decodes file and page parameters safely, avoiding crashes and handling missing or malformed paths more gracefully
- PDF export now restores saved header and footer colors using a secure color unarchive transformer instead of deprecated transformers
- Subscription access prompts correctly present a modal subscription window in more cases where access is required
- Code blocks splitting betweeen pages have extra background padduing on origin page
- Prevent first-page bullet lists from visually splitting between pages in paginated PDF/Print output
- Ensure list items moved across page boundaries keep their padding and are not cleaned up as stale page breaks
- Improve generic list pagination so short UL/OL blocks that cross a page boundary can be moved as a whole or by item regardless of whether a TOC is present

### Version Marked 3.0.0b24 (1106)

#### CHANGED

- Dingus now uses a two-pane layout with the editor on the left and a combined Source/Preview pane on the right, switched via a segmented control and U so you can quickly toggle the Dingus output view.
- Dingus move-paragraph shortcuts are now mapped to and instead of and , freeing Option for selection expansion commands.
- Changed indent/outdent shortcuts to avoid conflicts with History menu
- Changed Dingus editor caret color from light blue to pink
- Open in Dingus shortcut from Cmd+O to Opt+Cmd+O to avoid conflicting with standard Open
- Open in Dingus menu item and button label from “Load” to “Open”
- Open in Dingus now available when Dingus is not key (AppController dingusLoad handles it)
- **Pan and zoom diagrams tooltip to “**Add panning (drag) and zooming (Cmd-scroll)”
- Pan and zoom checkbox enabled only when Mermaid is checked
- Diagram-container layout and .diagram-zoom-btn styles for zoom control overlay
- Mermaid is now always included in every document; removed includeMermaid conditional
- Default preferences: includeMermaid and panZoomMermaid set to YES
- Normalize whitespace in all HTML `<pre><code>` blocks as a final post-processing step so code blocks render consistently across standalone and multi-file documents
- Make direct-open OPML documents use the same converter and embedOPMLAsMermaid setting as includes so they can render as either Mermaid mind maps or nested outlines

#### NEW

- Dingus editor supports smart URL paste so that when the clipboard contains a protocol:// URL, pasting with a selection wraps the selected text as a markdown link `[text](url)` and pasting without a selection inserts a self-linked form instead of raw text.
- Dingus editor supports K to quickly insert markdown links, wrapping selected text as `[text]()` with the cursor positioned in the URL field, or inserting `[]()` with the cursor between the brackets when no text is selected.
- Dingus preview WKWebView now has WebKit developer extras enabled so you can inspect it using Safari’s Develop menu and Web Inspector for easier debugging of markup and CSS.
- Dingus editor supports selection expansion and contraction with and , stepping through word, inner/outer delimiters (including fenced code), sentence, paragraph, contiguous nonblank block (e.g. a whole table), enclosing list/blockquote/code block, and finally the entire document.
- When a selection scope is active (from opt-cmd-up/down), opt-cmd-left and opt-cmd-right expand the selection left/right (or up/down for paragraph scope) instead of moving the cursor
- When a whole paragraph is selected, opt-cmd-left/right automatically expand by paragraph even if the selection wasn’t created with opt-cmd-up
- Find bar in Dingus editor (Cmd-F) with search field, match count readout, and prev/next buttons; find next (Cmd-G) and find previous (Shift-Cmd-G) with consistent wrap at document boundaries
- Replace bar below find bar with Replace and Replace All (case-insensitive); Replace advances to next match after replacing
- **Cmd-Option-F opens find/**replace bar and focuses the search field
- Tab moves focus between the find and replace fields when the find bar is visible
- Delimiter highlighting: matching parentheses, brackets, and braces (including closing) in darker blue in the Dingus editor
- Quoted string highlighting: single- and double-quoted strings in light green (quotes and content) in the Dingus editor
- Dingus left pane Options menu (upper right) with Show line numbers, Show invisibles, and Highlight gremlins; choices are persisted in UserDefaults and restored when opening the Dingus.
- Show line numbers: gutter on the left with one number per logical line (wrapped lines count as one), medium gray; off by default.
- Show invisibles: spaces as mid-dots, tabs as rightward arrow, newlines as carriage-return symbol in light gray (custom MKInvisiblesLayoutManager).
- Highlight gremlins: light red background for non-ASCII (curly quotes, emoji), dark red for zero-width spaces and other problematic control characters; tab and newline are not highlighted.
- Dingus save and Save As now write with Unix line endings and UTF-8 (content is normalized before writing).
- Add optional Mermaid diagram pan/zoom when panZoomMermaid preference is enabled: Cmd+wheel to zoom, drag to pan, using Panzoom library
- Add panZoomMermaid preference in Style settings (default off)
- Add diagram-container overflow hidden for mermaid panzoom containers
- Zoom in (+), zoom out (-), and reset () buttons on Mermaid diagrams when pan/zoom is enabled
- Add automatic Mermaid mind map embedding for iThoughts, MindManager, FreeMind, and OPML file includes when mind map and outline embedding options are enabled.
- Add preferences to control whether included iThoughts and OPML files are rendered as Mermaid diagrams or embedded as images, lists, or file links.
- Add AppleScript support for exporting the current document as OPML alongside existing export formats.
- Include iThoughts .itmz mind maps via file inclusion syntax (`/path` or `<<[path]`); convert to Mermaid diagram or embed preview image based on preference
- MKiThoughtsConverter: parses mapdata.xml and style.xml to produce Mermaid mindmap, or extracts preview.png for base64 image embed
- Apps > iThoughts X: “Embed iThoughts X maps as Mermaid diagrams” checkbox (embediThoughtsAsMermaid); when off, embeds Quick Look preview instead
- Add Bike outline include support that converts .bike documents into Markdown or Mermaid mind maps when included
- Allow opening MindManager (.mmap), FreeMind (.mm), OmniOutliner (.ooutline), and Bike (.bike) files directly as mind maps or nested Markdown outlines, respecting existing embedAsMermaid preferences

#### IMPROVED

- Dingus editor syntax highlighting now colors markdown links with distinct colors for brackets, link text, and URLs, and also highlights autolinked `<url>` forms, making links easier to scan in the editor.
- Dingus editor indented code block detection in the syntax highlighter so that indented code is recognized both at the top level and when nested under list items, matching Markdown rules for code blocks inside lists.
- Dingus preview HTML is always wrapped in a div with id=wrapper and updated by replacing wrapper.innerHTML, preserving wrapper-specific styles and applying consistent padding in the preview.
- Dingus preview styles stay in sync with Marked styles by reapplying the current CSS whenever styles are updated, so edits in the Style Manager immediately affect the Dingus preview.
- Indent/outdent now properly restores multi-line selections after indenting/outdenting, expanding the selection to account for indentation changes
- Fix full disk access handling
- Change Dingus shortcut to ctrl-cmd-d to avoid conflict with default Dock show/hide shortcut
- Word and sentence selection expansion now works reliably in both directions and can cross paragraph boundaries
- Paragraph selection expansion now skips over blank lines and continues into adjacent paragraphs
- Selection expansion uses the actual selection boundaries instead of the original anchor point, allowing continuous expansion in both directions
- Find next/previous now wrap reliably at start/end of document in both directions
- Dingus editor options: Options pull-down always displays “Options” as title; 4px margin below dropdown; line number gutter and menu state stay in sync on launch (inset applied before options so gutter never overlaps content).
- Set DOCUMENT_DEBUG to false and guard layoutSidebarComments D.info/D.debug calls to reduce console noise
- Move SVG to direct child of diagram-container for correct cursor-centered focal zoom
- Persist and restore mermaid diagram zoom and pan state across Marked update/refresh
- Defer pan restore with double requestAnimationFrame so pan applies after zoom paints
- Zoom in/out use zoomToPoint with container center for correct focal origin (fixes pan-right behavior)
- TestFlight override now hides trial pill instead of showing fake trial state
- SubscriptionStatusChanged posted after dismissing subscription window to avoid modal races
- Make Mermaid fenced code block rendering more robust across MultiMarkdown, CommonMark, Kramdown, and Discount processors to reduce syntax issues in embedded diagrams.
- Improve OmniOutliner .ooutline mind map export so Mermaid diagrams use cleaner labels, no stray Markdown links, and no trailing spaces on lines
- Wire new mind map and outline embedding options into preferences and preview so users can control whether external outlines are embedded as Mermaid or nested lists
- Normalize whitespace inside HTML `<pre><code>` blocks as a final post-processing step so code formatting is consistent between standalone files and multi-file documents

#### FIXED

- Pressing Return on a backtick fence line only auto-inserts a matching closing fence when that line starts a new fenced code block; closing fences are no longer duplicated when a processor allows code fences without a preceding blank line.
- Markdown preview loading from watched folders now forces loadFromBaseURL to run on the main thread even when triggered from background operations, preventing WebKit/WebView crashes due to off-main-thread JavaScript evaluation.
- Fixed bug where indenting/outdenting list items at the beginning of a line added extra newlines
- Disabled History menu navigation ([/]) when Dingus is active to prevent conflicts with editor shortcuts
- Opt-cmd-left/right now correctly move cursor to paragraph boundaries when there’s no selection scope, instead of doing nothing
- MoveToEndOfParagraph (Ctrl-E) now positions cursor at end of line instead of jumping to the next line
- TOC max-N CSS selectors: correct ul depth so max-1 through max-5 hide the right nested levels
- PanZoomMermaid and includeMermaid preference changes now trigger document refresh (added to defaultsToObserve, handle in observeValueForKeyPath)
- SubscriptionStatusChanged notification now observed by documents to refresh trial indicator when “Disable Subscription Testing” toggled
- ShowError/showSuccess skip modals when “Disable Subscription Testing” is on to prevent dialog spam
- Prevent trailing double-space hard line breaks from appearing at the end of lines in code blocks and Mermaid diagrams, including those inserted via file includes
- Eliminate trailing double-space hard line breaks from all code blocks and Mermaid diagrams, including those generated by file includes and direct-open mind map formats
- Trial indicator hides correctly when “Disable Subscription Testing” is toggled on or off in the subscription window
- Server-driven TestFlight override now immediately refreshes subscription and trial UI in open documents and subscription windows

### Version Marked 3.0.0b23 (1105)

#### CHANGED

- Removed automatic “Open document” dialog scheduling on app activation, welcome close, crash restoration, and file open events
- Removed “Show Open dialog when activated with no files open” preference from Preferences
- Dingus: Cycle list marker order: unordered -> ordered -> empty -> unordered (ordered cycles to no marker)
- Dingus: Wrap selection with pair (e.g. [) now keeps selection on wrapped content instead of collapsing to end
- Dingus: List markers require space after to be treated as list: “* “ is list, “italics” is not

#### NEW

- Dingus: Pair * and _ as characters that auto-insert closing delimiter and support type-over and space-in-empty-pair
- Dingus: Shift+Cmd+L on paragraph inserts “* “ at beginning of line, keeping cursor position
- Dingus: Return on list or blockquote line with only marker clears the line and places cursor at start
- Dingus now supports loading, saving, and opening Markdown files via a status bar and File menu shortcuts (S, S, O, P).
- Preview menu includes an Open in Dingus command (E) to send the current document into the Dingus editor.
- New Markdown File (N) now prompts to open the new document in the default editor/Marked or directly in the Dingus.
- Dingus editor supports move paragraph up/down with and ; the current paragraph (including its newline) is cut and pasted above or below the adjacent paragraph so paragraphs do not merge. Documented in Markdown Dingus help.

#### IMPROVED

- Made WebView-driven UI features (TOC, highlighting, search, full screen, print, link checking, etc.) more robust under heavy background processing by consistently funneling their JavaScript calls through the main-thread-safe helper
- Dingus prompts to save unsaved changes when loading or closing and shows a dirty indicator in the window title.
- Dingus editor Tab behavior inserts a literal tab on blank lines while preserving smart list and blockquote indentation elsewhere.
- Dingus preview now resolves relative image and asset paths correctly when editing a file loaded from disk, matching normal Marked previews.

#### FIXED

- Eliminated a WebKit thread-violation crash by routing MarkdownDocument WebView JavaScript evaluation through a main-thread-safe runJavascript helper instead of calling stringByEvaluatingJavaScriptFromString directly from background processing
- Conductor: changing action type (e.g. Set Metadata to Run Command) now immediately refreshes the fields instead of showing stale Key/Value labels until the row is dragged
- Conductor: “Command not found” and other Run Command errors no longer show multiple alert dialogs when the same command fails across several processing passes
- Conductor: copy-to-bundle terminal commands in the sandbox error dialog now include “sudo” for mkdir, cp, and chmod (required for /Applications/… app bundle)
- DOCX export to Markdown no longer hangs when the document contains large tables with long cell content (replaced catastrophic-backtracking regex with line-by-line table parsing)
- TOC max-level depth selectors in export and tocstyle CSS now correctly hide nested list levels (e.g. max-2 hides depth 3, not depth 2)
- TOC placeholder comment now accepts optional hyphen in min/max levels (e.g. “max2” and “max-2” both work in
  )
- Find in document defers search for large documents to avoid blocking the UI and reduces WebKit pressure
- Preferences table drag-and-drop when row rect is zero-sized
- Duplicate runJavascript call removed in MarkdownDocument
- Preview statistics keyboard shortcuts no longer steal I from the Dingus editor, so italics shortcuts work reliably there.
- Dingus diff-based preview anchor insertion no longer crashes when HTML diffs extend past the end of the document.
- Dingus Shift+Tab outdent behavior no longer crashes when outdenting lines due to a safer cursor repositioning strategy after multi-line indentation changes.
- Moving a paragraph down to the end of the document no longer merges it with the last line; a newline is inserted before the moved paragraph when the insertion point does not follow a newline.
- Tab and Shift+Tab no longer move the cursor to the next line: after indenting or outdenting a list item, blockquote, or plain paragraph, the cursor stays on the same line at the correct logical position.

### Version Marked 3.0.0b22 (1104)

#### IMPROVED

- Progress indicator animation is slightly faster (0.8s to 0.6s)
- File path watching for backlinks and embeds now skips obvious non-file patterns (URLs, shell vars, markdown fragments) and only watches paths that exist on disk
- PDF export progress shows “Laying out… page X of ~Y” during layout phase and progress callback runs synchronously so the overlay updates

#### FIXED

- Custom preprocessor no longer crashes when path is empty or executable does not exist; skips gracefully with warning instead of attempting to launch invalid task
- Mk CLI handles relative file paths (was defaulting to looking inthe sandbox folder)
- Automatic open dialog no longer opens if a file open dialog is already open; added explicit currentOpenPanel check and scan for any visible NSOpenPanel since [NSApp modalWindow] can miss panels shown with beginWithCompletionHandler
- PDF export header/footer handling is defensive against nil or non-string values for logo/image tokens to avoid crashes
- Included files (e.g. on iCloud) no longer reported as “unrecognized format”; encoding is only treated as invalid when content failed to load, and UTF-8 is tried for known text extensions when the first read fails

### Version Marked 3.0.0b21 (1103)

#### CHANGED

- Toolbar icons for TOC, export, keyword drawer, and extras now use modern system symbol glyphs with slightly larger hit areas for better usability
- Preview Clipboard, MarsEdit Preview, Streaming Preview movd to File->New menu
- Improve Conductor action cell reuse so changing action type correctly rebuilds the dynamic fields instead of leaving stale controls in place
- Install Command Line Tool now embeds and installs the mk binary from the cli subfolder inside the app bundle so it no longer relies on a debug-only dylib
- Make the Dingus preview honor the same custom and built in styles as the main preview by mirroring the style list

#### NEW

- Custom Rules window includes a Reload All button that saves the current rule and refreshes all open document previews to apply changes immediately
- Added comprehensive dark mode support for link popup with proper inverted colors and styling when body has .inverted class
- Add style popup and pencil edit button to Dingus preview so users can choose and edit preview styles directly
- Open selected Dingus style in the Style Generator with a flow for duplicating built in styles as editable copies
- Added stringByRemovingControlCharactersAndGremlins method to automatically remove problematic control characters (including form feed, DEL, and C1 control characters) from markdown files when they are opened, preventing EPUB export issues caused by invisible gremlins in source files.

#### IMPROVED

- Insert TOC action now supports both minimum and maximum header levels and generates TOC markers that honor min/max depth settings
- Run Shortcut and Run System Service actions now fall back to manual text entry when sandboxing prevents automatic discovery of shortcuts or services
- Run Shortcut action uses the shortcuts CLI when available to populate the shortcut list more reliably
- Export button now cleanly toggles the export palette on and off, keeping its on/off state in sync with whether the palette is actually visible
- Export palette closing from keyboard shortcuts or export completion now reliably returns the export button to its off state
- Pagebreak markers in the TOC theme are clearer and more consistent, including support for inverted themes and fake page breaks
- Reduced long-press delay from 750ms to 250ms so users can quickly access link menu with a brief pause
- Link popup now uses modern macOS design language with backdrop blur, system fonts, and refined shadows
- Link popup buttons now have cleaner styling without borders, with improved hover and active states using system blue color
- Link popup typography updated to use SF Pro system font stack for native macOS appearance
- Link popup spacing and padding refined for better visual hierarchy and touch targets
- Add link to JS API docs in help sidebar
- “Replace horizontal rules with page breaks” and “page break before footnotes” can now operate independently. MultiMarkdown inserts a horizontal rule automatically in footnotes, which meant if hrs were page breaks, then footnotes always had a page break. This is now avoided.
- Added mk-no-page-break class to HR tags in footnotes divs when hrIsPageBreak is true and breakBeforeFootnotes is false, preventing unwanted page breaks in footnotes section
- Added support for webp and avif image formats in preview
- Image permission checks now only request access for inaccessible images, avoiding unnecessary permission prompts
- Enhanced image path detection to handle both HTML img src attributes and markdown image syntax
  alt
- Sandbox file access now handles cases where files can’t be probed due to permission restrictions, still allowing permission requests for parent folders
- Simplified drag-and-drop implementation in Conductor window to use standard pasteboard types instead of custom types
- Author entered in the EPUB save dialog is now saved as the default for the next export (epubAuthor in preferences).
- PNG safety checks no longer run for remote image URLs; only local file PNGs are validated to avoid main-thread network stalls that were freezing the preview.

#### FIXED

- Custom Rules search/replace now treats \n, \t, \, $ and other escapes correctly in replacement strings, preventing stray literal characters in output
- Custom Rules predicates with multiple filters are preserved when switching between rules instead of collapsing back to a single row
- Clicking the export button while the export palette is open now hides the palette instead of briefly flashing and reopening it
- Link popup menu now appears on mouseup after long press instead of disappearing immediately when mouse is released
- Images in preview now automatically request folder access when needed, addressing sandbox permission issues that prevented images from loading after reboots or file moves
- Fix Conductor actions table drag and drop by switching to string-based pasteboard types and simplifying row index handling to prevent invalid data crashes
- Prevent crashes in file watching by validating queued path entries against the current watched entries and safely handling deallocated objects
- Improve PDF export error alert to fall back to a generic message when the error description is unavailable
- Fallback to system default app when no specific application is found for opening a file, with logging when that also fails
- Fixed crash in PDF export when error description is nil by providing fallback message
- Fixed crash in VDKQueue watcherThread when accessing deallocated path entry objects by validating objects exist in dictionary before use
- Fixed crash in openCurrentElementInApp when no application is found to open file by adding nil check and fallback to default application
- Prevent PDF export and print from crashing when footer templates contain %logo or %image placeholders in left or right footer text
- Prevent crashes when showing the blocking subscription window after access has expired or is missing
- Reduce rare EXC_BAD_ACCESS crashes while monitoring large sets of files for changes
- EPUB export failures caused by control characters and gremlins in markdown source files by cleaning text immediately after file read and before any processing occurs.
- Custom title and author entered in the EPUB save dialog are now applied to the exported EPUB; previously they were ignored.
- Conductor “Insert TOC” action now inserts a blank line after the TOC marker so the following line (e.g. the first heading) is parsed as Markdown instead of plain text.
- EPUB export now escapes unescaped ampersands in HTML (e.g. “AT&T”) so generated XHTML is valid.

### Version Marked 3.0.0b20 (1102)

#### CHANGED

- Export palette is now disabled for Quick Look preview documents
- Status messages display in red for Quick Look preview warnings
- Status messages are clickable when truncated or have verbose messages
- Footnotes are now conditionally included in the sidebar based on user preference (defaults to enabled)
- When includeFootnotesInSidebar is disabled, only comments (CriticMarkup, Fountain, Word) appear in the sidebar, not footnotes
- MASSubscriptionRegistrar.registerFromTransaction now accepts a transaction that is already verified by the caller (SubscriptionManager), removing the redundant verification check that could prevent MAS purchases from being registered for Paddle access
- Diff markers now use cyan color instead of red (light cyan when inactive, darker cyan when active) to avoid appearing as errors

#### NEW

- Quick Look preview detection for unrecognized file types with warning messages
- Status message popover that displays full or verbose messages when clicked
- Verbose message support for status messages (shown in popover, not status bar)
- Special warning messages for .doc and .rtf files with instructions to convert to DOCX
- Export menu keyboard shortcut (Shift+E)
- Register MAS subscription purchases with Paddle version access system when transactions are verified
- Mk Command Line Tool
- Diff markers are now clickable and show help cursor on hover
- Clicking diff markers displays a tooltip explaining what they are and keyboard shortcuts (E/E)
- Diff markers now have title attribute for hover tooltips with navigation instructions

#### IMPROVED

- Error messaging for unsupported file types with detailed explanations in popovers
- File type recognition to properly detect Quick Look preview mode
- Style Manager shortcut legend now shows specific keyboard shortcuts (1-9, 1-0, 1-0, 1-0) instead of vague description
- Long tables now split at row boundaries when printing to PDF instead of moving the entire table to the next page. The table ends at the last fully-visible row on each page and continues on the next page.
- Paragraph splitting in PDF print now prevents widowed lines by detecting when a split would leave fewer than 20 characters on the next page. When detected, the split is adjusted to move the previous line to the next page instead, avoiding orphaned single words or short phrases.
- Added early cached subscription check to provide faster verification when cached data is available
- Enhanced subscription verification logging to help diagnose timeout and cache issues during StoreKit entitlement checks
- MarkdownDocument, MKStatsStore, and MKTextAnalyzer description methods no longer dump full document text, HTML, or other large fields; they now show string lengths, key counts, and compact state (e.g. html: (N chars), string: (N chars), wordCount, outlineMode, isUpdating) so debug and NSLog output stays usable
- Help CSS now uses modern Sass color APIs compatible with upcoming Dart Sass releases to avoid deprecation issues.
- Mk command line tool now detects stdin vs TTY more reliably and supports explicit streaming and STDIN-based preview workflows.
- Diff markers have higher z-index and proper pointer events to ensure they’re always interactive

#### FIXED

- Crash when clicking status message during document deallocation
- Weak reference issues during object deallocation that caused crashes
- PDF export now automatically overrides scroll-behavior: smooth to prevent pagination issues where content repeats or is lost across pages
- Subscription check now properly falls back to cached data when StoreKit entitlement checks timeout after system restart, preventing users from being blocked from accessing the app
- Table of Contents no longer emptied after print or PDF export; fetchHTML now clones the TOC instead of moving it out of the DOM so the sidebar TOC stays available
- Subscription check falls back to cached data when the MAS verification server returns an error or the response cannot be parsed, preventing users from being blocked when the server is unavailable
- Subscription verification completion handling and dispatch group usage so the finish callback and group.leave() are invoked correctly in all paths, avoiding races and potential deadlocks when StoreKit entitlement checks time out or complete out of order
- Removed ASCII escape sequences before rendering
- Help menu search now indexes help topics as soon as the app launches and no longer requires opening the help window first.
- Help menu search results now always appear in the Help menu dropdown and respect the result limit, even when there are no matching topics.
- Help index sidebar now includes the Command Line Utility topic and stays in sync with the configured sections.

### Version Marked 3.0.0b19 (1101)

#### CHANGED

- Reset Alerts button in General preferences now also resets the automatic open dialog preference

#### NEW

- Add checkbox to automatic File Open dialog allowing users to disable showing the dialog when Marked is activated with no files open

#### FIXED

- Sidebar comments now properly detect and display footnotes in CommonMark format (fn-XX) in addition to MultiMarkdown format (fn:XX)
- Hashtag highlighting regex now avoids matching tags within HTML attributes like href=”#tag”
- Document scroll position no longer resets when scrolling to bottom of documents with many footnotes
- Sidebar updates no longer cause document scroll to jump to incorrect position
- Horizontal rules with page break setting now properly create page breaks in paginated PDF export by including hr elements in pagination selectors
- EPUB export now properly handles colgroup tags with opening and closing tags instead of self-closing format
- EPUB export now properly escapes XML special characters in footnote data-comment attributes to prevent XHTML validation errors
- When a file is deleted, Marked now shows the “I swear it was just here” message in the preview instead of requesting file access permissions
- Permission dialogs are now centered on screen to prevent them from appearing under the menu bar
- CriticMarkupRenderer now correctly uses the source string when processing markup patterns instead of the modified output string
- Bypass link now shows reliably for TestFlight users outside the US
- Removed region check requirement that was preventing the bypass link from appearing
- Comment sidebar close button hidden when sidebar is closed
- Typo in Welcome splash screen

### Version Marked 3.0.0b18 (1100)

#### CHANGED

- Sidebar scroll handler now captures and preserves scroll position from when scrolling stopped to prevent layout shifts from resetting scroll
- Bypass link only hides for confirmed production App Store builds, not based on region or unreliable TestFlight detection

#### IMPROVED

- Footnote detection now searches the entire document if no footnotes container is found, making it more robust for different markdown processors
- Footnote text extraction now properly removes CommonMark backlink elements and patterns for cleaner sidebar display
- Reference link detection now supports both href-based and id-based matching for CommonMark footnote references
- Sidebar comment visibility updates now respond 3x faster after scrolling stops (50ms vs 150ms debounce)
- Added scroll restoration protection to prevent recursive scroll events during sidebar layout updates
- Pagination selectors now include elements with mkpagebreak class for more reliable page break handling
- Bypass link now shows in DEBUG builds for local development

#### FIXED

- Removed region check requirement that was preventing the bypass link from appearing

### Version Marked 3.0.0b17 (1099)

#### NEW

- Add autocompletion to folder preview extensions token field with support for common file extensions including markdown variants, document formats, and screenplay formats
- **Extract and protect math blocks from typographic processing using hold/**replace system similar to code blocks

#### IMPROVED

- Slight redesign of Settings
- Redesign settings group backgrounds with rounded corners and accent color edge using Spiro Disco Ball theme color
- Add screenshot image to Full Disk Access grant dialog showing System Settings interface
- Add helpful note to Full Disk Access dialog explaining how to add Marked.app if it doesn’t appear in the list using the + button
- Update Help with new Settings screenshots
- Whitelist github.githubassets.com PNGs to skip safety checks for faster loading of documents with many GitHub emoji
- Auto-detect blank previews and trigger refresh attempts, with special handling for Scrivener documents that fail to import

#### FIXED

- Issues accessing security bookmarks
- Prevent crash when file watcher receives invalid memory pointer in kevent
- Prevent crash when style generator tries to access undefined acceptTypes property
- Preserve emoji and UTF-8 symbols when saving EPUB

### Version Marked 3.0.0b16 (1098)

#### CHANGED

- Sidebar comment and footnote text colors now consistently use black in light mode and white in dark mode
- Lopash theme: updated background color to rgb(247, 248, 248)

#### NEW

- Added portrait/landscape orientation selector with icon representations in PDF export window

#### IMPROVED

- “Reopen Last File” menu item is now automatically disabled when there are no recent documents to reopen
- Sidebar and comment/footnote bubbles now have darker backgrounds in dark mode
- Font-size override now uses style element with !important at end of head to ensure it overrides all stylesheet rules
- Swiss theme: increased base font size from 14px to 16px for better readability
- Swiss theme: improved line-height and spacing rhythm throughout for better reading comfort
- Swiss theme: refined table styling with lighter borders, rounded corners, and subtle alternating row colors
- Swiss theme: added max-width constraint for better readability on large screens
- UpstandingCitizen theme: standardized spacing and applied 1.5 line-height rhythm throughout

#### FIXED

- Sidebar border now completely disappears when collapsed in light mode
- Sidebar no longer overlaps content in Amblin and Manuscript styles
- Tables in Goldilocks style inverted mode now use dark backgrounds with alternating row shades for better readability
- Font-size override now correctly applies to html, body, and #wrapper elements (was only applying to body)
- Add to Marked buttons in embedded style gallery now work by handling x-marked-3 URL scheme in addition to x-marked scheme
- Fixed crash when closing style editor window by setting releasedWhenClosed to NO and adding proper window delegate cleanup to prevent deallocation during close animation
- UpstandingCitizen theme: corrected heading size hierarchy (h4 larger than h5/h6, with h5 larger than h6)

### Version Marked 3.0.0b15 (1096)

#### NEW

- Added saveODT: IBAction method that properly calls saveODTWithProfile: for ODT file exports
- Added TestFlight override checkbox in subscription window that allows non-US TestFlight users to bypass subscription checks when purchases aren’t available
- Added region detection to automatically show TestFlight override option only for non-US users, with compiler flag option to always enable for testing
- Added testflight_override field to TrialStatus API response structure for potential server-side override support
- Full tabbed window support (Settings->General->Open documents in tabs)
- Added Quick Open panel (Shift-Cmd-O) for fast switching between open documents and accessing recent files with real-time search filtering

#### IMPROVED

- Rewrote Quick Overview splash screen to avoid scrollbars and fix Quick Config
- Added debug logging to hasPermanentUnlockWithCompletion to help diagnose subscription access issues

#### FIXED

- Prevent crash when saving files that triggers auto-update by adding nil checks for baseURL in file watching handlers
- Fix crash when saving Open Document Format files by routing ODT saves through proper export controller instead of unsupported textutil conversion
- Fixed issue where users with active trials couldn’t open documents due to hasPermanentUnlock completion callback not being called on main thread
- Fixed issue where clicking “Marked Help” menu item opened to invalid page “_NS:215” instead of index page by validating menu item identifiers and ignoring internal AppKit identifiers
- Fixed crash when importing CSS styles in Style Generator by safely handling WKOpenPanelParameters acceptTypes property that is not KVC-compliant
- Tab order in preferences to allow each pane to be navigated with Tab and Shift-Tab

### Version Marked 3.0.0b14 (1094)

#### CHANGED

- Sidebar margin only applies when viewport width is 1200px or less

#### IMPROVED

- Wrapper height no longer constrained to viewport when comments sidebar is visible
- Drop shadows on wrapper now extend properly when scrolling long content

#### FIXED

- Ensure Markdown window bottom toolbar background matches system appearance in Dark Mode
- Handle NSURL objects in file path monitoring to prevent crashes when included files are tracked as URLs instead of strings
- Sidebar no longer causes wrapper to shift when viewport is wide enough

### Version Marked 3.0.0b13 (1093)

#### NEW

- EPUB export now validates XHTML before saving and provides detailed error messages with line numbers, column numbers, and code context (similar to Ruby error messages) to help identify markup issues.
- EPUB export automatically generates a default cover image when no custom cover is provided, featuring a gradient background with title-centered and author byline at the bottom.
- Default cover preview is shown in the EPUB export dialog image well and automatically updates when title or author changes, ensuring the well is never empty.

#### IMPROVED

- XHTML validation errors now include contextual code snippets showing the problematic line with a pointer indicator, making it easier to identify and fix markup issues even when working with Markdown source.
- EPUB export provides configurable XHTML validation with optional auto-fix mode, allowing users to choose whether to stop on errors or continue with warnings.

#### FIXED

- EPUB export now properly handles checkbox input tags by ensuring they are self-closing and XHTML-compliant, preventing XML parsing errors that caused content truncation in exported EPUB files.
- EPUB export now ensures all HTML void elements (input, br, hr, img, meta, link, etc.) are properly self-closing for XHTML/XML compliance, preventing XML parsing errors that caused content truncation.

### Version Marked 3.0.0b12 (1092)

#### CHANGED

- Updated export CSS to use #firstdiff selector instead of .diff-marker class for better specificity in diff marker styling.

#### FIXED

- Users with active trials can now open documents. The subscription access check was failing because MKSubscriptionManager was missing the required SubscriptionProvider protocol methods, causing the access check to stop before checking trial status.

### Version Marked 3.0.0b11 (1091)

#### NEW

- Added security-scoped resource access management with proper cleanup using @try/@finally blocks to ensure resources are always released
- Export palette now supports mouse interaction - single-click on any export option triggers that export format
- Export palette rows now show hover state highlighting when mouse moves over them
- Export palette shows active/activated state with emphasized highlight when an export option is clicked or selected via keyboard
- Export palette displays loading spinner in the shortcut column while waiting for save dialog to appear after selecting an export format

#### IMPROVED

- Added comprehensive debug logging throughout DOCX export process including temp directory creation, zip archive initialization, file operations, and security-scoped resource access
- Enhanced error messages with detailed diagnostics about directory existence, writability, and security-scoped access status to help troubleshoot export failures
- Improved temp directory handling with fallback to container directory for better reliability in sandboxed environments
- Keyboard shortcuts in export palette are now vertically centered to match title and icon alignment
- Added comprehensive debug logging throughout DOCX export process including temp directory creation, zip archive initialization, file operations, and security-scoped resource access
- Enhanced error messages with detailed diagnostics about directory existence, writability, and security-scoped access status to help troubleshoot export failures
- Improved temp directory handling with fallback to container directory for better reliability in sandboxed environments
- Added security-scoped resource access management with proper cleanup using @try/@finally blocks to ensure resources are always released

#### FIXED

- DOCX export now properly handles security-scoped resources from NSSavePanel, fixing “Failed to initialize zip archive” errors when exporting to user-selected locations
- Changed zip file creation to occur in temp directory first, then move to final location, avoiding sandbox permission issues where directory write access is restricted even with file-level security scopes
- DOCX export now properly handles security-scoped resources from NSSavePanel, fixing “Failed to initialize zip archive” errors when exporting to user-selected locations in sandboxed apps
- Changed zip file creation to occur in temp directory parent first, then move to final location, avoiding sandbox permission issues where directory write access is restricted even with file-level security scopes
- Removed footnote return symbol () from exported DOCX footnotes
- Fixed footnote reference detection to support multiple HTML formats (#fn:N, #fnref:N, and #fnN)
- Fixed footnote relationship ID format (changed from rIdFootnotes to rId9) to match Word’s numeric pattern
- Fixed DOCX files containing invalid compressed data by ensuring zip file is created outside the source directory
- Fixed Word “unreadable content” errors by properly escaping XML characters in footnote text and filtering invalid control characters
- Applied same security-scoped resource access and temp directory zip creation fixes to EPUB, TextBundle, and TextPack exports

### Version Marked 3.0.0b10 (1090)

#### CHANGED

- Marked 3 now allows the use of x-marked-3:// url scheme to differentiate in cases where both Marked 2 and Marked 3 are installed

#### NEW

- Added Full Disk Access status indicator in Processor preferences with green/red dot showing current permission status, automatically refreshes when window becomes active or app receives focus
- Added code signing verification for debug builds with warnings when code signing is missing, as Full Disk Access requires proper code signing
- Added security-scoped resource access management with proper cleanup using @try/@finally blocks to ensure resources are always released

#### IMPROVED

- Custom style loading falls back to parent directory access only when no bookmark exists
- Full Disk Access detection now tests multiple protected locations (Mail, Keychains, Calendars) for more reliable status detection across different system configurations
- Grant Permissions dialog now provides clear step-by-step instructions and deep-links directly to System Settings Full Disk Access panel, with better messaging for already-granted permissions
- Added system-level file test (TimeMachine plist) as primary Full Disk Access check for more reliable detection across different system configurations
- Enhanced error detection to check both NSCocoaErrorDomain and NSPOSIXErrorDomain error codes for more accurate permission status reporting
- Full Disk Access indicator now only refreshes when Marked becomes active, reducing unnecessary permission checks when other apps activate
- Added comprehensive diagnostic logging including executable path, bundle path, error domains, and code signing status to help troubleshoot permission issues
- Added fallback tests using access() system call and Mail preferences file reading for additional permission verification methods
- Added comprehensive debug logging throughout DOCX export process including temp directory creation, zip archive initialization, file operations, and security-scoped resource access
- Enhanced error messages with detailed diagnostics about directory existence, writability, and security-scoped access status to help troubleshoot export failures
- Improved temp directory handling with fallback to container directory for better reliability in sandboxed environments

#### FIXED

- Custom CSS from Documents now loads after restart by using the saved security bookmark before checking file existence
- Report Issue zip creation now works in sandboxed builds by using bundled TWZipCreator library instead of system zip command, and creates zip in temp directory with optional save panel for user copy
- Full Disk Access check now uses actual user home directory instead of sandbox container directory, fixing false negative permission detection
- DOCX export now properly handles security-scoped resources from NSSavePanel, fixing “Failed to initialize zip archive” errors when exporting to user-selected locations
- Changed zip file creation to occur in temp directory first, then move to final location, avoiding sandbox permission issues where directory write access is restricted even with file-level security scopes

### Version Marked 3.0.0b9 (1088)

#### NEW

- Patch files and scripts to implement CommonMark list-interrupt-paragraph support in cmark-gfm

#### IMPROVED

- Metadata replacement retains HTML edge-case handling and cleans up intermediate buffers.
- Oroved Some preferences layout
- Metadata replacement retains HTML edge-case handling and cleans up intermediate buffers.
- Code span detection uses reliable odd/even backtick counting
- Added debug logging with [HighlightDebug] prefix for troubleshooting
- **File-open auto dialog re-**checks for any open document and skips when welcome closes with docs open.
- Welcome window centers and suppresses file-open while visible.
- Thread-safe navigation history access using serial dispatch queue

#### FIXED

- Missing disclosure triangle on `<details>` blocks in some themes @fixed Duplicate Scroll to Edit options in Settings > Preview @fixed == in Setext headers being broken by highlighter
- Superscript/subscript processor now skips double-tilde sequences (~~) so strikethrough syntax works correctly. Previously deletion was incorrectly processed as subscript.
- Highlights no longer break Setext headers (lines with only ==+ after text)
- Highlights skip sequences with more than 2 = in a row (=== or more)
- Deletions no longer processed inside code spans or code blocks
- Announcements skipped on first launch and latest marked read for new users.
- Help viewer no longer auto-instantiates at app init and closes on quit.

### Version Marked 3.0.0b8 (1087)

#### CHANGED

- **Changed “**Show Comments” in gear menu to “Show Comments and Footnotes” for clarity
- Moved tips container bottom position from 40px to 20px
- Minor UI adjustment to external editor popup button styling in preferences

#### NEW

- Integrated Style Generator and Gallery
- Custom styles from Documents folder breaking after restart
- Scrivener emphasis/italic at end of line causing extra asterisks
- **Added “**Show Comments and Footnotes” menu item in Proofing menu with Cmd+Ctrl+C keyboard shortcut
- Added getExternalEditorPath helper method to safely extract editor path from NSUserDefaults
- Added close button to comments sidebar in lower left corner

#### IMPROVED

- Add licenses for Kramdown and CommonMark to help
- Help Docs redesigned
- Keyboard shortcuts in help now use Apple-recommended + separator between keys, key display redesigned
- All external editor path lookups now use safe extraction method instead of direct objectForKey access
- Comments sidebar positioning now accounts for close button height to prevent overlap

#### FIXED

- Custom styles from Documents folder breaking after restart
- Scrivener emphasis/italic at end of line causing extra asterisks
- Help Doc navigation and bookmarking
- External editor path handling now supports multiple storage formats (NSString, NSKeyedArchived NSData, bookmark data)
- Close button click handler now properly synchronizes both Cocoa and JavaScript state before hiding sidebar
- Tooltip restore function now properly synchronizes state when restoring comments from “Comments hidden” tooltip
- Fixed clipboardSaved reference bug (changed to self->clipboardSaved)

### Version Marked 3.0.0b7 (1083)

> Be sure to check out the revamped Style Gallery and the new Style Generator!

> Style Gallery:

> - Preview, download, and add to Marked
> - Sort by name or date

> Style Editor:

> - Adjust all common settings visually
> - Full featured built-in CSS editor
> - Live preview of changes
> - Save, share, or add to Marked

#### CHANGED

- Style Stealer now uses MKStyleManager instead of legacy user defaults

#### NEW

- Added top-level Style menu mirroring preview picker

#### IMPROVED

- Switching styles reloads CSS/fonts without refresh
- Scrivener document processing now re-renders when preferences change, so “display titles as headers” setting takes effect on refresh without requiring document reopen

#### FIXED

- Custom CSS now grants file access before applying
- Scrivener documents with empty content but titles now show headers when “display titles as headers” is enabled
- Scrivener documents are now included in processing even when RTF files don’t exist, if they have titles and headers are enabled
- Links within italic, bold, or highlighted text in DOCX files now maintain their formatting correctly. Previously, formatting would break when a hyperlink appeared within formatted text, producing invalid markup like `_text_ [link](url) _more text_` instead of `_text [link](url) more text_`.
- New styles added via URL handler addstyle now appear at end of menu
- New styles from Style Generator now appear at end of menu
- New styles from Style Stealer now appear at end of menu

### Version Marked 3.0.0b6 (1082)

> Big changes revolving around how the MAS version handles Run Command actions in Custom Rules.

#### CHANGED

- Default shell detection now falls back to /bin/zsh on modern macOS
- Log messages formatted as single lines for easier filtering
- Crossgrade menu item now opens help document instead of showing window
- Menu item now reads “Save Transient Preview” to reflect that clipboard, streaming, and extractor windows all use the same save path.

#### NEW

- MAS version can execute external binaries when copied to app bundle
- Automatic detection and execution of scripts with external shebangs via system interpreters
- Proactive file access requests when entering commands in Conductor window
- File access checking for executables referenced in script content
- Error dialogs with step-by-step instructions for copying binaries to bundle
- “Copy Terminal Commands” button in error dialogs for easy setup
- Wrapper script generation for Python scripts to prevent xcrun errors
- Added Help->Copy UUID menu item to copy user identifier for license crossgrade requests
- Added Sandbox Restrictions help document with crossgrade instructions and mailto link with pre-filled body text
- “Kind” predicate option for Custom Rules (choose from known document types)
- Mark all changes between document saves and allow navigation

#### IMPROVED

- File picker dialog now allows selecting executable files directly
- Better handling of symlinks in file access requests
- Error messages now include actual paths and actionable instructions
- Error messages for sandbox execution failures now include instructions for copying UUID when requesting crossgrade
- Updated Custom Processor documentation to clarify Python/Ruby script limitations in MAS version
- When making changes to preferences that Export Profiles track, automatically save the change to the current profile
- “Restore default styles” in Style Manager offers to restore default order of built-in styles
- Option to only show most recent edit marker
- Fix width/height of diff markers
- Add multi-select to Style Manager
- Top alignment of all Settings panes
- Content Extractor previews generate slugged filenames from the capture URL (queries removed) so default save names match the source site/article.

#### FIXED

- Crash when canceling file access permission dialog
- Missing file access checks for external scripts selected via file picker
- Scripts with external Python interpreters now execute through system Python
- Preview content now displays correctly after crash recovery by detecting loading page and forcing full reload
- Default to .md extension for New File
- Automatic preview updates not happening on save
- Drag improvements for style manager
- Settings->Advanced option alignment and spacing
- Saving transient previews now defaults to Markdown extensions and writes the underlying text instead of the old HTML placeholder.
- Opening transient previews in an editor now prompts for a Markdown save location and launches the external editor with that file.

### Version Marked 3.0.0b5 (1081)

#### IMPROVED

- Update documentation
- Additional debug logging

#### FIXED

- Display headlines for empty Scrivener documents
- Remove “Headlines for Scrivener Document Titles” from Export Profiles, so that the preferenc sticks when reloading profiles
- **Remove “**Change Tracking <-> CriticMarkup” from Export Profile saving
- Button backgrounds in Style Stealer and Markdownify URL
- Scrivener documents not updating preview when file changes

### Version Marked 3.0.0b4 (1079)

#### IMPROVED

- Only shows subscription window when no active subscription or trial is found
- Clean up INFO level logging

#### FIXED

- Indentation in Discount guide code blocks
- When titles are missing from Scrivener documents, avoid inserting
- Repeated security bookmark requests
- Skip backlink scanning if the document is in the Watchers directory
- Automatic Open dialog repeating after cancelation

### Version Marked 3.0.0b3 (1078)

#### IMPROVED

- Only shows subscription window when no active subscription or trial is found
- Clean up INFO level logging

### Version Marked 3.0.0b2 (1073)

#### NEW

- Announcement system so that the developer can show updates and announcements to users without requiring a new build
- Style Manager allows you to enable/disable built-in styles, reorder, preview and reveal/edit styles.
- Option-click back button in mini stats panel opens file in default editor
- Export Markdown now copies local image assets to assets folder
- Side panel for word repetition counts. Shows how many times each stem appears in the document, with options for ignoring per-document or globally.
- Export Drawer converted into Spotlight-style panel for keyboard-driven export functionality

#### IMPROVED

- Reorganize menu items, add Proofing menu
- Mini stats panel back button icon changes when option key is held
- Mini stats expand button now uses system ellipsis icon instead of text
- Mini stats panel height increased for better content display
- Help panel layout updated to use flexbox for better responsiveness
- Export menu item now pops up a searchable, Spotlight-style dialog with all available export options (instead of the previous drawer)

#### FIXED

- Sandboxed access to wiki files and backlinks
- Add History menu items to MAS and Setapp builds
- Save dialog now ensures suggested filename includes .md extension
- Empty inline links no longer incorrectly match image syntax
- JavaScript regex fix for HTML id attribute detection

### Version Marked 3.0.0b1 (1072)

> An all-new, best-in-class DOCX exporter. Marked can now even open DOCX files and export them as Markdown or any other format.

> New Markdown processors built in: CommonMark (with GFM extensions) and Kramdown! Kramdown adds the ability to apply ids, clases, and other attributes to inline and block elements, among other features.

> Let’s see, what else?

#### NEW

- Syntax highlighting for CSS and JSON fields
- Custom Styles can be dragged and dropped on the Settings window to add them
- Menu of static Word export styles
- Ability to open DOCX files directly and convert to Markdown
- Display a message when an empty file is opened
- DOCX change tracking is now converted to CriticMarkup in the Markdown document
- CommonMark processor option, includes all GFM extensions
- Kramdown processor (requires Ruby), supports all Kramdown syntax
- UI for setting up conditional processors based on various criteria, with built-in filters, transforms, and command execution
- EPUB export
- Allow custom word styles
- Import/Export all preferences as a JSON file
- Display comments (CriticMarkup, Scrivener, Word) in a sidebar instead of inline
- Drag and drop files onto the Custom Rules window to intellegently detect file type and add an appropriate action to the current rule
- Convert [[wiki links]]
- Fully functional back/forward navigation when following links to other Markdown files
- Allow user to specify minimum level to include in table of contents (`<!--TOC min4-->` or `{{TOC:2-6}}`)
- Make missing file links clickable to create a new file
- Show wiki backlinks to current document
- Save as TextBundle/TextPack
- Logo/image in PDF/Print header/footer
- Current heading in PDF/Print header/footer
- Footnotes at bottom of page they occur on
- Save export settings to profiles for easy re-use
- Built-in Style Stealer for extracting styles fro web sites
- Markdown Dingus (Help->Markdown Dingus) for live testing of syntax for Marked’s built-in processors
- Style Manager allows for complete control over built-in and custom Styles

#### IMPROVED

- Completely rewritten DOCX export, faster, valid style markup
- Reorderable custom Styles
- Button visibility in Settings
- Double click to rename Custom Styles in menu
- Performance improvements for lined text views
- Hide advanced config options when MathJax is disabled
- Ignore non-numeric values in reading speed text field
- Suppress open dialog when opening a file
- Scrivener import will convert single-cell tables (used for asides) into block quotes
- When exporting, convert non-built-in fonts to equivalent system fonts
- Better regex for detecting highlights and deletions in text
- Completely rewritten Scrivener import, faster and with no reliance on Ruby or Python
- Rewritten RTF/RTFD export
- Rewritten CriticMarkup handling, all native, no reliance on external scripts or tools
- Handle DOCX highlights, using a `<mark>` tag with appropriate background color
- In DOCX import, allow highlights to be suppressed when comments are disabled
- Clicking on the WPM number in the detailed stats window makes it editable
- Detailed stats view UI adjustments
- Native mmd_merge handler
- Hold option to set debug logging level from the Help menu
- Additional documentation about debugging and support requests
- Store current autoscroll speed as a global preference instead of preview-specific value, ensuring consistent behavior across previews and maintaining preferences across launches.
- Autoscroll now works with a WPM (words per minute) setting, and calculates how many words would fit on the screen with the current style, setting the scroll speed accordingly
- Syntax highlighting in code blocks is preserved when exporting to Word
- Markdown export can optionally wrap text at a specified width
- Markdown export can optionally convert inline links to reference links
- Change default file extension for markdown export to “.md”
- Clean up Markdown export, especially for Word files
- Better handling when **custom processor**s are disabled or not available
- Save assets to subfolder when exporting HTML, OPML, or Markdown
- Add option to convert Word change tracking <-> CriticMarkup
- Substitute Goldilocks for Multi-Column
- Handle proper conversion of Pandoc % metadata
- Make document metadata available as MD_keyname environment variables to custom Run Command and Run Embedded Script actions
- Improved conversion of existing custom processor settings to the new Custom Rules format
- Bi-directional MathML to OMML (Word)
- Intra-document links work in PDFs

#### FIXED

- Help document list item link styling
- Tab order in Proofreading Settings
- Paragraphs generated by DOCX converter that start with `<mark>` not being properly handled by MultiMarkdown
- Don’t strip query parameters when copying URL with right click or popup menu
- Thread safe accessors for document stats
- Status bar and drawer not changing to dark mode
- Recognize more ways Word inconsistently marks paragraphs as headings
- Handle `metadata` document in Scrivener binder as document metadata
- Race condition on filesize
- Don’t show open dialog if Welcome screen is opening
- Handle MarsEdit 5 previews
- Handle emphasis with internal spaces when converting HTML to Markdown
- Raw file includes not working

#### CHANGED

- Keyboard shortcuts for export options
- Remove RTFD export option. RTFD will be automatically selected when the export includes images
- Remove Additional Scripts window as it’s been replaced by Custom Rules
- Custom Processor Log changed to Custom Rules Log

Support Site | Legal | Privacy