Releases: sftwrdotdev/Markpad
Release list
Markpad v2.7.6
Download
| System | Chip | Download | |
|---|---|---|---|
| Windows | Intel / AMD | Markpad_2.7.6_x64-setup.exe |
installer |
| Intel / AMD | Markpad_2.7.6_x64.exe |
portable | |
| ARM64 | Markpad_2.7.6_arm64-setup.exe |
installer | |
| ARM64 | Markpad_2.7.6_arm64.exe |
portable | |
| macOS | Intel and Apple Silicon | Markpad_2.7.6_universal.dmg |
one file for both |
| Linux | x86-64 | Markpad_2.7.6_amd64.AppImage |
portable |
| x86-64 | Markpad_2.7.6_amd64.deb |
Debian, Ubuntu | |
| x86-64 | Markpad-2.7.6-1.x86_64.rpm |
Fedora, RHEL, openSUSE |
Note
Windows SmartScreen Notice: Windows executables are not signed with an Authenticode certificate, so SmartScreen shows them as an unrecognized app. Click "More info" → "Run anyway". The antivirus heuristic that used to flag the portable .exe no longer does.
Note
macOS Gatekeeper Notice: the .dmg is not yet notarized, so the first launch is refused — "Markpad cannot be opened because the developer cannot be verified" — and the dialog offers only Cancel and Move to Trash. Two ways past it, both one-time:
- Control-click (right-click)
Markpad.appin Finder → Open → Open. That dialog has the button the double-click one does not. - Or double-click once and press Cancel, then go to System Settings → Privacy & Security, scroll to Security, and press Open Anyway beside the message naming Markpad. Authenticate with your password or Touch ID and confirm.
Folder access is remembered across updates, from 2.7.5 on. macOS ties a folder grant to the app's signing identity, and Markpad now carries one that does not change when the code does, so the permission survives an update instead of being asked for again. Updating from a release older than 2.7.5 asks once more — the signature changes the identity, and the old grants belonged to the unsigned one. Signing is not notarization: the first-launch dialog above is unaffected.
The two Windows files differ only in that one installs and one does not.
Package managers: choco install markpad-app (Windows), sudo snap install markpad (Linux).
What Markpad renders
Every syntax Markpad renders is in one document — download markdown-syntax.md (简体中文) and open it in Markpad: the preview shows each feature working, the editor beside it shows how each one is written. Give the same file to an AI and it knows exactly what Markpad can render: ask it to reformat a document you already have, or to write a new one that uses the whole range — callouts, tables, footnotes, maths, diagrams — and open the result here. Read it on GitHub.
What's Changed
Full Changelog: v2.7.5...v2.7.6
Markpad v2.7.5
Download
| System | Chip | Download | |
|---|---|---|---|
| Windows | Intel / AMD | Markpad_2.7.5_x64-setup.exe |
installer |
| Intel / AMD | Markpad_2.7.5_x64.exe |
portable | |
| ARM64 | Markpad_2.7.5_arm64-setup.exe |
installer | |
| ARM64 | Markpad_2.7.5_arm64.exe |
portable | |
| macOS | Intel and Apple Silicon | Markpad_2.7.5_universal.dmg |
one file for both |
| Linux | x86-64 | Markpad_2.7.5_amd64.AppImage |
portable |
| x86-64 | Markpad_2.7.5_amd64.deb |
Debian, Ubuntu | |
| x86-64 | Markpad-2.7.5-1.x86_64.rpm |
Fedora, RHEL, openSUSE |
Note
Windows SmartScreen Notice: Windows executables are not signed with an Authenticode certificate, so SmartScreen shows them as an unrecognized app. Click "More info" → "Run anyway". The antivirus heuristic that used to flag the portable .exe no longer does.
Note
macOS Gatekeeper Notice: the .dmg is not yet notarized, so the first launch is refused — "Markpad cannot be opened because the developer cannot be verified" — and the dialog offers only Cancel and Move to Trash. Two ways past it, both one-time:
- Control-click (right-click)
Markpad.appin Finder → Open → Open. That dialog has the button the double-click one does not. - Or double-click once and press Cancel, then go to System Settings → Privacy & Security, scroll to Security, and press Open Anyway beside the message naming Markpad. Authenticate with your password or Touch ID and confirm.
Folder access is remembered across updates, from 2.7.5 on. macOS ties a folder grant to the app's signing identity, and Markpad now carries one that does not change when the code does, so the permission survives an update instead of being asked for again. Updating from a release older than 2.7.5 asks once more — the signature changes the identity, and the old grants belonged to the unsigned one. Signing is not notarization: the first-launch dialog above is unaffected.
The two Windows files differ only in that one installs and one does not.
Package managers: choco install markpad-app (Windows), sudo snap install markpad (Linux).
What Markpad renders
Every syntax Markpad renders is in one document — download markdown-syntax.md (简体中文) and open it in Markpad: the preview shows each feature working, the editor beside it shows how each one is written. Give the same file to an AI and it knows exactly what Markpad can render: ask it to reformat a document you already have, or to write a new one that uses the whole range — callouts, tables, footnotes, maths, diagrams — and open the result here. Read it on GitHub.
What's Changed
- fix(find): the find widget's tooltips stop being clipped away (#675) by @PathGao in #677
- fix(themes): an imported theme's bold and italic colours reach the editor (#676) by @PathGao in #678
- feat(export): Export as PDF gets a keyboard shortcut (#673) by @PathGao in #679
- feat(copy): copying from the preview keeps its formatting (#674) by @PathGao in #680
- fix(preview): inline code in a heading sits on the heading's baseline (#681) by @PathGao in #685
- feat(editor): the built-in themes colour Markdown (#676) by @PathGao in #684
- feat(editor): colour Markdown from the renderer, not from a regex by @PathGao in #686
- feat(editor): a formula reads as markup around operands by @PathGao in #687
- fix(editor): an emphasis keeps its colour inside a link or a heading by @PathGao in #688
- fix(themes): an imported theme keeps its colours under the semantic layer by @PathGao in #689
- feat(split): the editor and preview can trade sides (#184) by @PathGao in #693
- fix(toc): the outline shows the document it is looking at by @PathGao in #694
- fix(status bar): the word count counts CJK and every non-Latin script (#691) by @PathGao in #695
- fix(title bar): Auto-Reload and Mod+L agree in every mode (#692) by @PathGao in #696
- fix(watcher): arm Live Mode on the directory, so a save does not kill it by @PathGao in #697
- fix(save): ask the file who wrote it, and check before overwriting (#692) by @PathGao in #698
- fix(conflict): closing cannot answer the question, and Compare shows the answer (#692) by @PathGao in #699
- fix(window): a cold start no longer takes focus from the app you switched to (#702) by @PathGao in #704
- Cut the dead issue-form fields, and ask for the three things triage keeps reconstructing by @PathGao in #703
- Enter continues a block quote, as it already continues a list (#700) by @PathGao in #705
- The caret's glide is a setting, not a hard-coded on by @PathGao in #712
- Tab on a list item is a level, not a tabSize by @PathGao in #713
- The snap publish step calls a command snapcraft still has by @PathGao in #715
- feat(editor): ${filename} in the image directory, so a folder can belong to one document (#714) by @PathGao in #716
- ci(macos): a signing identity that outlives a release, so the folder grant does (#209) by @PathGao in #707
- ci(macos): a certificate without an identity stops the release, instead of shipping unsigned by @PathGao in #718
- ci(release): a build cannot write into a version that is already published by @PathGao in #720
- fix(export): the PDF re-render sends the config that keeps Mermaid labels by @PathGao in #721
- 2.7.5: the first signed macOS release, and the snap publishes on its own again by @PathGao in #719
Full Changelog: v2.7.4...v2.7.5
Markpad v2.7.4
Download
| System | Chip | Download | |
|---|---|---|---|
| Windows | Intel / AMD | Markpad_2.7.4_x64-setup.exe |
installer |
| Intel / AMD | Markpad_2.7.4_x64.exe |
portable | |
| ARM64 | Markpad_2.7.4_arm64-setup.exe |
installer | |
| ARM64 | Markpad_2.7.4_arm64.exe |
portable | |
| macOS | Intel and Apple Silicon | Markpad_2.7.4_universal.dmg |
one file for both |
| Linux | x86-64 | Markpad_2.7.4_amd64.AppImage |
portable |
| x86-64 | Markpad_2.7.4_amd64.deb |
Debian, Ubuntu | |
| x86-64 | Markpad-2.7.4-1.x86_64.rpm |
Fedora, RHEL, openSUSE |
Note
macOS Gatekeeper Notice: the .dmg is not yet notarized, so the first launch is refused — "Markpad cannot be opened because the developer cannot be verified" — and the dialog offers only Cancel and Move to Trash. Two ways past it, both one-time:
- Control-click (right-click)
Markpad.appin Finder → Open → Open. That dialog has the button the double-click one does not. - Or double-click once and press Cancel, then go to System Settings → Privacy & Security, scroll to Security, and press Open Anyway beside the message naming Markpad. Authenticate with your password or Touch ID and confirm.
Being unsigned also means macOS grants file access per prompt instead of remembering it, so Markpad may keep asking for permission — most visibly with auto-save on (it can be turned off in Settings; closing a tab still offers to save) and in documents with many local images, which can ask once per image. Signing the app yourself on your own Mac ends that: see this comment on #209 — a code-signing certificate made in Keychain Access plus codesign --force --deep, or the Sentinel app. It has to be redone after each update.
The two Windows files differ only in that one installs and one does not.
Package managers: choco install markpad-app (Windows), sudo snap install markpad (Linux).
What Markpad renders
Every syntax Markpad renders is in one document — download markdown-syntax.md (简体中文) and open it in Markpad: the preview shows each feature working, the editor beside it shows how each one is written. Give the same file to an AI and it knows exactly what Markpad can render: ask it to reformat a document you already have, or to write a new one that uses the whole range — callouts, tables, footnotes, maths, diagrams — and open the result here. Read it on GitHub.
What's Changed
- fix(snap): stop using the rust plugin, and build snapcraft.yaml on pull requests by @PathGao in #577
- chore(ci): install the Linux build dependencies once by @PathGao in #578
- perf(snap): package the release's .deb instead of compiling Markpad again by @PathGao in #579
- ci: compile pull requests on the Ubuntu the release compiles on by @PathGao in #580
- fix: bring Cargo.lock to 2.7.3 and guard the three version files by @PathGao in #582
- feat(find): open the preview find bar on the selected text by @PathGao in #586
- ci: restore the cache key and the package list that did not reach master by @PathGao in #583
- chore(deps): the upgrades that are available, and why three are not by @PathGao in #587
- chore(release): write the version once, in the three files it lives in by @PathGao in #588
- ci: ask the AppImage what it bundles, and whether it starts by @PathGao in #584
- fix(preview): a ticked task dims its content once, not once per nesting level by @PathGao in #589
- fix(deps): back to monaco-editor 0.55.1 — 0.56 kills vim mode by @PathGao in #599
- fix(preview): hide the disclosure triangle, which one colon never did by @PathGao in #598
- chore: remove Dependabot by @PathGao in #600
- chore(ci): remove the snap build check by @PathGao in #601
- chore(deps): reqwest 0.13 and winreg 0.55 by @PathGao in #602
- chore(deps): notify 6.1.1 → 8.2.0 by @PathGao in #603
- fix(i18n): require the language, so a call site cannot forget it by @PathGao in #605
- refactor(rust): split lib.rs into fs_safety, markdown, commands and app by @PathGao in #606
- refactor(scroll): give the buffer's lines and the renderer's different types by @PathGao in #607
- refactor(tabs): derive isDirty, and give a keystroke one route to the document by @PathGao in #608
- refactor(folds): give heading and callout folds one owner by @PathGao in #609
- refactor(markdown): collapse the grammar data the two languages duplicate by @PathGao in #611
- ci: one release build at a time, and no runner it names can move on its own by @PathGao in #612
- fix(front-matter): key the edit errors by document, like their four siblings by @PathGao in #613
- perf(preview): remember what KaTeX and highlight.js drew, and debounce for a typist by @PathGao in #614
- test: run the runes-module tests through the compiler that owns runes by @PathGao in #615
- chore(rust): run rustfmt once, and add the gate that keeps it run by @PathGao in #616
- fix(i18n): the eleven toasts that only ever spoke English by @PathGao in #620
- fix(folds): measure a fold from its layout height, not its scrollable extent by @PathGao in #617
- fix(settings): give theme, zoom and preview width the persistence every other setting has by @PathGao in #618
- refactor(titlebar): read the markdown extension list, do not restate it by @PathGao in #623
- fix(anchors): convert the rect delta into scroll pixels before adding it (#621) by @PathGao in #625
- feat(editor): a strikethrough button, and the toolbar bug that made it unavoidable by @PathGao in #626
- fix(settings): hand back the effect root disposer the store was throwing away by @PathGao in #624
- fix(markdown): teach code_region_ranges about indented code blocks by @PathGao in #628
- fix(tabs): keep the untitled buffer out of the path history, and drop three dead interface parts by @PathGao in #627
- fix(tabs): take the tab menus' chords from the registry, not from a literal by @PathGao in #629
- fix(editor): escape what a markdown link destination cannot carry by @PathGao in #630
- fix(editor): teach the list buttons the marker grammar the renderer already knows by @PathGao in #631
- perf(preview): replace the blocks that changed instead of the article by @PathGao in #632
- ci: pin node past the manifest lookup that keeps failing by @PathGao in #633
- fix(scroll-sync): give a collapsed fold both ends of the lines it hides by @PathGao in #634
- test: run the runes-module suites under the compiler that owns runes by @PathGao in #635
- feat(editor): continue a Markdown list when Enter is pressed inside one by @PathGao in #636
- fix(startup): vet the paths argv hands over before opening them by @PathGao in #637
- fix(settings): collect the last two writers outside the persistence mechanism by @PathGao in #638
- perf(preview): scan the article once, and keep the sections between renumb...
Markpad v2.7.3
Download
| System | Chip | Download | |
|---|---|---|---|
| Windows | Intel / AMD | Markpad_2.7.3_x64-setup.exe |
installer |
| Intel / AMD | Markpad_2.7.3_x64.exe |
portable | |
| ARM64 | Markpad_2.7.3_arm64-setup.exe |
installer | |
| ARM64 | Markpad_2.7.3_arm64.exe |
portable | |
| macOS | Intel and Apple Silicon | Markpad_2.7.3_universal.dmg |
one file for both |
| Linux | x86-64 | Markpad_2.7.3_amd64.AppImage |
portable |
| x86-64 | Markpad_2.7.3_amd64.deb |
Debian, Ubuntu | |
| x86-64 | Markpad-2.7.3-1.x86_64.rpm |
Fedora, RHEL, openSUSE |
Note
macOS Gatekeeper Notice: the .dmg is not yet notarized, so the first launch is refused — "Markpad cannot be opened because the developer cannot be verified" — and the dialog offers only Cancel and Move to Trash. Two ways past it, both one-time:
- Control-click (right-click)
Markpad.appin Finder → Open → Open. That dialog has the button the double-click one does not. - Or double-click once and press Cancel, then go to System Settings → Privacy & Security, scroll to Security, and press Open Anyway beside the message naming Markpad. Authenticate with your password or Touch ID and confirm.
Being unsigned also means macOS grants file access per prompt instead of remembering it, so Markpad may keep asking for permission — most visibly with auto-save on (it can be turned off in Settings; closing a tab still offers to save) and in documents with many local images, which can ask once per image. Signing the app yourself on your own Mac ends that: see this comment on #209 — a code-signing certificate made in Keychain Access plus codesign --force --deep, or the Sentinel app. It has to be redone after each update.
The two Windows files differ only in that one installs and one does not.
Package managers: choco install markpad-app (Windows), sudo snap install markpad (Linux).
What Markpad renders
Every syntax Markpad renders is in one document — download markdown-syntax.md (简体中文) and open it in Markpad: the preview shows each feature working, the editor beside it shows how each one is written. Give the same file to an AI and it knows exactly what Markpad can render: ask it to reformat a document you already have, or to write a new one that uses the whole range — callouts, tables, footnotes, maths, diagrams — and open the result here. Read it on GitHub.
What's Changed
- chore(deps): bump nanoid past GHSA-2v37-7h3g-55p8 by @PathGao in #536
- fix(preview): media players inherit the source range they replaced by @PathGao in #533
- fix: offer .txt in the Open dialog (#535) by @PathGao in #537
- fix(updater): let the release notes be selected and copied (#532) by @PathGao in #538
- feat(preview): Edit jumps to the fragment you right-clicked by @PathGao in #539
- fix(preview): make task checkboxes work, and look like task checkboxes by @PathGao in #534
- fix: report the document's real line ending in the status bar by @PathGao in #540
- fix(preview): make split-view scroll sync line-accurate by @PathGao in #541
- fix: detect a document's encoding and save it back in the same one (#372) by @PathGao in #544
- fix(toc): stop the floating outline from sitting on the text it covers by @PathGao in #545
- fix(editor): two Monaco defaults that only hurt non-Latin scripts (#393) by @PathGao in #546
- fix(clipboard): one cut, one copy, one paste (#207) by @PathGao in #548
- docs(samples): keep the manual test fixtures where the samples are by @PathGao in #550
- fix(clipboard): copy plain text from the preview too (#549) by @PathGao in #551
- fix(load): stop an overtaken load from stranding a document on its slice (#547) by @PathGao in #552
- fix(save): let Save As be the way out of a partial buffer (#547) by @PathGao in #553
- fix(load): raise large-file preview threshold from 50KB to 5MB by @PathGao in #554
- feat(editor): sticky scroll, smooth scrolling, and smooth caret animation by @PathGao in #555
- docs: bring the syntax reference up to 2.7.3, and surface it where people download by @PathGao in #558
- fix(find): re-focus the preview find bar on a repeated Cmd/Ctrl+F by @PathGao in #560
- docs: name the two kinds of test in scripts/, and ask which one a PR added by @PathGao in #563
- ci(release): stop publishing packages from inside the build matrix by @PathGao in #561
- test(fold): assert the duplicate-title fold behaviour instead of its spelling by @PathGao in #564
- test(session): run the load-failure and watcher-grace paths instead of grepping them by @PathGao in #565
- test(youtube): assert the rendered anchor, and teach the shim href/src by @PathGao in #567
- test(session): round-trip the window snapshot instead of grepping it by @PathGao in #568
- test(tags): round-trip the window tag instead of matching three lines by @PathGao in #569
- fix(release): make the recovery path usable, and stop promising updates that do not exist by @PathGao in #566
- refactor(editor): one source for the options both Monaco call sites apply by @PathGao in #571
- ci: cache cargo output and stop redundant runs by @PathGao in #572
- fix(update): stop offering an update that a package-managed install cannot apply by @PathGao in #573
- ci: bound the cargo cache to master, and stop the npm cache from crowding it out by @PathGao in #574
- chore: remove an unused import and a command attribute nothing could reach by @PathGao in #575
- refactor(close): make the unsaved-tab review a function that can be run by @PathGao in #576
Full Changelog: v2.7.2...v2.7.3
Markpad v2.7.2
Download
| System | Chip | Download | |
|---|---|---|---|
| Windows | Intel / AMD | Markpad_2.7.2_x64-setup.exe |
installer |
| Intel / AMD | Markpad_2.7.2_x64.exe |
portable | |
| ARM64 | Markpad_2.7.2_arm64-setup.exe |
installer | |
| ARM64 | Markpad_2.7.2_arm64.exe |
portable | |
| macOS | Intel and Apple Silicon | Markpad_2.7.2_universal.dmg |
one file for both |
| Linux | x86-64 | Markpad_2.7.2_amd64.AppImage |
portable |
| x86-64 | Markpad_2.7.2_amd64.deb |
Debian, Ubuntu | |
| x86-64 | Markpad-2.7.2-1.x86_64.rpm |
Fedora, RHEL, openSUSE |
Note
Windows SmartScreen Notice: Windows executables are not currently signed with an Authenticode code signing certificate. Windows SmartScreen may flag the binaries as an unrecognized file or false positive Trojan. You can safely bypass SmartScreen by clicking "More info" → "Run anyway".
The two Windows files differ only in that one installs and one does not.
Package managers: choco install markpad-app (Windows), sudo snap install markpad (Linux).
What's Changed
- fix(session): keep the restore breadcrumb where a kill cannot take it by @PathGao in #501
- fix(commands): move four blocking filesystem commands off the UI thread by @PathGao in #502
- fix(session): keep the snapshot when exit is used during startup by @PathGao in #503
- fix(assets): serve the asset protocol off the webview thread by @PathGao in #504
- chore: delete the code nothing reaches, and narrow the exports nothing imports by @PathGao in #506
- fix(ci): strip host-coupled libwayland from the AppImage so it starts on newer Mesa by @LargeModGames in #499
- fix(windows): remove dead installer code from the shipped binary by @PathGao in #507
- chore(i18n): remove dead installer/uninstaller translation keys by @PathGao in #508
- refactor(tauri): move #[tauri::command] to window_runtime, delete 17 wrapper functions by @PathGao in #509
- fix: guard localStorage.getItem/setItem existence for Node.js v25 compat by @PathGao in #510
- chore: remove debug leftovers, bump prevent-default to stable by @PathGao in #511
- refactor(rust): replace unwrap() with expect() or lock_recover by @PathGao in #513
- refactor(rust): introduce lightweight Error type for internal functions by @PathGao in #514
- refactor(ts): tighten any types to unknown or specific types by @PathGao in #512
- fix(scroll-sync): measure a block from the scroll container, not from its offset parent by @PathGao in #515
- docs(samples): add the scroll-sync stress document, by @Guardiancelte by @PathGao in #516
- feat(settings): the two preferences the panel was missing, and honest semantics for the ones it had by @PathGao in #517
- docs(samples): re-land the stress document under its author (rebase-merge, please) by @PathGao in #519
- refactor(outline): centre the current entry, and let both panes answer with one rule by @PathGao in #518
- feat(editor): offer this document's headings as link targets by @PathGao in #520
- fix(drag-drop): answer every file dropped on the editor pane by @PathGao in #521
- feat(markdown): accept ++inserted++, and copy a reference in the document's own spelling by @PathGao in #522
- refactor(markdown): let comrak parse the two things regexes were parsing by @PathGao in #523
- docs: a Markdown syntax reference, a reshaped README, and a download table on the release page by @PathGao in #524
- chore(deps): move the dompurify pin to 3.4.13 by @PathGao in #528
- fix(macos): give the menu back the commands the web side cannot bind by @PathGao in #527
- chore(build): add signing key to AppImage and update snapcraft workflow by @alecdotdev in #529
Full Changelog: v2.7.1...v2.7.2
Markpad v2.7.1
What's Changed
- fix(editor): stop Monaco outlining fullwidth CJK punctuation by @PathGao in #462
- fix(ci): unpin WebKitGTK so the AppImage bundles a Mesa-compatible version by @LargeModGames in #463
- fix(preview): never anchor the scroll restore to a boxless
by @PathGao in #464 - feat(i18n): add zh-TW translation strings by @love80312 in #465
- fix(export): let the exported HTML follow the preview's max width by @PathGao in #468
- docs(issues): ask reporters what triage actually needs, without requiring it by @PathGao in #469
- ci: run the fast suite on pushes to master by @PathGao in #470
- fix(editor): give each tab its own Monaco model so undo survives a switch by @PathGao in #471
- ci: add a dependabot config, deliberately quiet by @PathGao in #472
- fix(scroll-sync): map the panes by source line instead of by ratio by @PathGao in #474
- docs: add a pull request template, all of it optional by @PathGao in #473
- docs(agents): correct three statements that no longer match the tree by @PathGao in #475
- ci(deps): bump the github-actions group with 4 updates by @dependabot[bot] in #476
- fix(editor): make the Vim z-family scroll, and put zb/z- the way Vim has them by @PathGao in #479
- feat(editor): shortcuts for the six unbound formatting commands, and one meaning for Ctrl+T by @PathGao in #480
- fix(windows): remove the bundled installer and uninstaller (#466) by @PathGao in #481
- ci(release): point the updater at this repository, and ship on the tested Node by @PathGao in #485
- ci(deps): keep major bumps out of the grouped pull request, and split the cadence by @PathGao in #484
- feat(shortcuts): a read-only shortcuts reference, and one registry behind it by @PathGao in #488
- ci(deps): split the cadence, hold two crates, and stop batching pre-1.0 npm by @PathGao in #490
- fix(editor): honour Highlight Occurrences, and drop the U+2028 dialog by @PathGao in #492
- fix(shortcuts): bind Save As, and check the keymap against the registry by @PathGao in #493
New Contributors
- @LargeModGames made their first contribution in #463
- @dependabot[bot] made their first contribution in #476
Full Changelog: v2.7.0...v2.7.1
Markpad v2.7.0
New Features
- Preview width is configurable: a setting, a shortcut pair to widen/narrow, and the preference persists (#346, #347, #348, #349)

- Editor toolbar : new icons and a show/hide toggle (#282)

- Window tags and pinned sessions rebuilt (#280)

- Moving tabs between windows rebuilt (#279)
- macOS settings menu (#339)

- Floating table-of-contents toggle (#331)

Documents
- A file over 50 KB opened as a truncated preview, and saving wrote that preview back over the whole document (#374)
- A non-UTF-8 file opened as mojibake, and auto-save wrote the mojibake over the original 1.5 s later (#379)
- Dropping two images with the same name in the same second silently replaced the first while the document still linked to it (#383)
- A read failure during session restore evicted the tab and saved the trimmed list, so an unplugged drive lost the tab permanently (#401)
- Re-opening a file that was already open with unsaved edits discarded them, and cleared the dirty flag so nothing said so (#412)
- Two tabs could hold one path with two auto-save timers writing over each other (#413, #416)
- A tab moved between windows could end up open in both, each copy with its own auto-save timer writing over the other (#366).
- Pressing ⌘S while an auto-save was mid-write could leave the older text on disk (#436, #438).
- Quitting with two tagged windows could lose one window's pinned tags (#424).
- A stale preview render could overwrite a newer one (#254), and an interrupted session restore left the app unable to recover (#260).
Security
- Exported HTML skipped the sanitizer entirely (#376)
- The preview never used the shared sanitize policy, so a document's
<style>reached the app's own UI — reproduced hiding the title bar and fetching a remote beacon (#384) - A link could read as
http://…everywhere the user can see it and open a local file instead (#415) - Imported VS Code theme colours are validated before being injected as CSS (#362), and imported theme slugs are normalized (#301)
- Theme and image file paths are constrained to their directories (#249, #270)
- File IO, decoding and Markdown boundaries hardened on the Rust side (#371)
Export and printing
- Exported HTML now contains rendered math, syntax highlighting and Mermaid diagrams instead of raw source (#411)


- Exported HTML carries the theme, and no longer cuts collapsed sections out of the document (#382)
- PDF exports are readable in every theme; diagrams no longer come out dark-on-dark (#359)

- A PDF exported from edit mode is no longer blank (#407)
- Local images are inlined on Windows (#363)
- Find highlights no longer print, and collapsed matches are revealed (#377)
- Print layout: native controls, full page width, and tighter content rhythm (#329, #333)
- The export menu is no longer greyed out for an unsaved document you're editing (#441)
Editor and preview
- Task checkboxes work in the preview, and the change is written back to the file (#345, #352)
- Three separate LaTeX reports turned out to be one bug :
_{1}becoming italics,\\being eaten so a multi-rowalignedcollapses,\%being eaten so KaTeX treats the rest of the line as a comment. All three are comrak applying Markdown inline rules inside math delimiters; fixed by masking the span before parsing rather than patching one character at a time (#351, #402; closes #174 / #177 / #197) - Escaped dollars stay escaped, and
$$…$$inside a paragraph renders (#422) - The editor context menu is fully localized and follows a language change (#381)
- URLs pasted inside code blocks are no longer turned into links (#381)
- Scroll position returns to the block you left, not to a percentage (#420)
- Heading folds are per-document, and are cleared when a tab follows a link to a different file (#425, #448)
- A leading
---no longer swallows the paragraph after it (#375) Copy Referenceproduces a link Markpad can actually follow (#403)- Preview works without saving first (#421)
- ToC jumps use heading source position (#335)
- Editor options and keyboard shortcuts now do what their labels claim (#369)
- Saving works from reading mode (#365)
- "Save image as" works for local images, and says so honestly for remote ones (#408)
- A relative link to a non-Markdown file resolves against the document instead of the app (#409, #415)
Copy Referenceproduces a link Markpad can follow (#380), and "open the exported file" had never worked because the opener plugin had no path scope (#403)- Live Mode watched the wrong file after a tab switch (#296)
- YouTube embeds open externally instead of failing in place (#338)
- Settings: the modal stays draggable (#312), collapsed toolbar sections are remembered (#286), and every setting syncs across windows instead of the last window overwriting the rest (#370)
- Recent files are merged across windows instead of overwritten (#405)
- The auto-save failure toast no longer repeats (#406)
- A malformed UTF-8 code fence crashed the renderer (#265)
- Window titles update natively (#288); a window created at startup is reused instead of a second one appearing (#318)
Windows
- "Move to New Window" froze the app.
create_transfer_windowbuilt the window synchronously, and on Windows that deadlocks. WebView2 needs the main thread free to pump messages while the window is created (#360) - Right-clicking a tab twice opened the document menu the second time, because the first menu's full-viewport overlay swallowed the click and only called
preventDefault()(#360) - Install failed outright when the Desktop or Start Menu folder did not exist — this is the cause of the
OS Error 3reports (#400) - Uninstall could terminate unrelated processes with the same name (#358)
- Install and uninstall are recoverable if interrupted (#364)
- Markpad no longer registers itself for plain text files (#302)
- The Install button stays reachable at large system text sizes (#428)
macOS
- PDF export did not work at all (#287)
- Opening several documents at once from Finder kept only one of them (#298, #300)
- The editor paste menu was missing (#266)
Performance
- Startup JavaScript down 81 % : Monaco now loads when you open the editor rather than before the first paint. First paint went from 4770 KB to 904 KB; entering edit mode costs ~330 ms once per window (#423)
- Mermaid-heavy documents ~12× faster to type in; diagrams are no longer redrawn on every keystroke (2185 ms → 189 ms on a 20-diagram document) (#419)
Changelog
- fix: restore collapsed toolbar settings by @PathGao in #286
- fix: enable PDF export on macOS by @PathGao in #287
- fix: allow native window title updates by @PathGao in #288
- fix: preserve tabs after document read errors by @PathGao in #293
- fix: route Live Mode changes to the watched file by @PathGao in #296
- fix: allow opening multiple documents by @PathGao in #298
- fix: retain all macOS open-document paths by @PathGao in #300
- fix: normalize imported VS Code theme slugs by @PathGao in #301
- fix: stop associating plain text files by @PathGao in #302
- Fix split scroll sync triggered by typing by @PathGao in #304
- Update vulnerable Markdown rendering dependencies by @PathGao in #306
- Audit production dependencies in pull requests by @PathGao in #308
- fix: delimit parenthesized autolinks by @PathGao in #291
- Update vulnerable Svelte build toolchain by @PathGao in #310
- Add a minimal macOS Settings menu by @PathGao in #339
- fix: open YouTube embeds externally by @PathGao in #338
- chore: remove internal planning documents by @PathGao in #344
- Keep Settings modal drag accessible by @PathGao in #312
- Audit complete dependency lockfile in CI by @PathGao in #314
- Exclude editor bottom padding from split scroll sync by @PathGao in #316
- Reuse the created window handle during startup by @PathGao in https://github.com/sftwrdotd...
Markpad v2.6.13
Summary
Features
- Added independent native windows with menu-based tab transfer.
- Added hover marquee to reveal truncated tab titles.
Fixes
- Tabs & Windows: Fixed tab renaming. App now prompts for unsaved tabs individually on window close and batch close. Menus are guarded when dialogs are active.
- Editor: Pasting a URL over a selected URL replaces it instead of nesting. Unsaved content is preserved when toggling tasks. Prevented stale large-file loads.
Thank you @PathGao!
What's Changed
- fix: review unsaved tabs one at a time on window close; restore window state only by @PathGao in #211
- fix: remove duplicate test:frontmatter script key by @PathGao in #217
- fix: key section folds by unique heading id instead of heading text by @PathGao in #219
- fix: pair code regions by CommonMark rules in markdown preprocessing by @PathGao in #228
- fix: preserve Windows file associations on uninstall by @PathGao in #256
- fix: tab rename never worked — window.prompt is a no-op in the webview by @PathGao in #224
- fix: pasting a URL over a selected URL replaces it instead of nesting by @PathGao in #229
- feat: reveal truncated tab titles with a hover marquee by @PathGao in #223
- refactor: deterministic fold wrapper ids by @PathGao in #221
- fix: guard menus while dialogs are active by @PathGao in #239
- test: pin raw render_markdown invocations to the pipeline allowlist by @PathGao in #220
- fix: harden Windows installer environment handling by @PathGao in #252
- feat: independent native windows with menu-based tab transfer by @PathGao in #214
- refactor: debounced preview render goes through renderTabPreviewFromRaw by @PathGao in #218
- fix: avoid stale fold height after leaving edit mode by @PathGao in #238
- fix: preserve dirty content when toggling tasks by @PathGao in #245
- fix: ignore stale large-file loads by @PathGao in #247
- ci: gate releases on complete platform artifacts by @PathGao in #241
- fix: confirm dirty tabs before batch close by @PathGao in #243
Full Changelog: v2.6.12...v2.6.13
Markpad v2.6.12
What's Changed
- Support Ctrl+F4 to close active tab on Windows by @Numb006 in #181
- Add file tab actions, Markdown navigation history, and resizable ToC by @daniel-grabowski in #190
- Configurable default mode for new files by @Numb006 in #180
- Improve export, reload, and toolbar workflows by @daniel-grabowski in #195
- Focus the existing window when opening Markdown files by @daniel-grabowski in #193
- Edit YAML frontmatter from the preview by @daniel-grabowski in #194
- Make settings modal stable and sync split scrolling by pixels by @daniel-grabowski in #196
- i18n: complete missing Korean (ko) translation keys by @moduvoice in #203
- fix: restore horizontal scroll for wide tables in preview by @legolev in #206
- fix: keep folded sections aligned after window resize by @PathGao in #210
New Contributors
- @Numb006 made their first contribution in #181
- @daniel-grabowski made their first contribution in #190
- @moduvoice made their first contribution in #203
- @legolev made their first contribution in #206
- @PathGao made their first contribution in #210
Full Changelog: v2.6.11...v2.6.12
What's Changed
- Support Ctrl+F4 to close active tab on Windows by @Numb006 in #181
- Add file tab actions, Markdown navigation history, and resizable ToC by @daniel-grabowski in #190
- Configurable default mode for new files by @Numb006 in #180
- Improve export, reload, and toolbar workflows by @daniel-grabowski in #195
- Focus the existing window when opening Markdown files by @daniel-grabowski in #193
- Edit YAML frontmatter from the preview by @daniel-grabowski in #194
- Make settings modal stable and sync split scrolling by pixels by @daniel-grabowski in #196
- i18n: complete missing Korean (ko) translation keys by @moduvoice in #203
- fix: restore horizontal scroll for wide tables in preview by @legolev in #206
- fix: keep folded sections aligned after window resize by @PathGao in #210
New Contributors
- @Numb006 made their first contribution in #181
- @daniel-grabowski made their first contribution in #190
- @moduvoice made their first contribution in #203
- @legolev made their first contribution in #206
Full Changelog: v2.6.11...v2.6.12