v4.12.0
The editor where agents live.
v4.0 is the agent-native author release. The agent goes from "external tool you run a CLI for" to a first-class editor surface — works continuously, across multiple vaults, with full visibility, replay, and rollback. Everything below is in core. No plugin tax. ~15 MB still.
v4.12.0
4.12.0 — fold it, print it, undo it.
- Fold a heading and everything under it. Click the arrow in the gutter, or use the Fold commands to collapse a section, every section, or everything below a level. The model is a plain text scan rather than a CodeMirror feature, so it works the same in the plain-textarea editor Windows uses.
- Printing no longer follows your app theme. A dark theme used to print dark — ink on paper, or a PDF nobody could read. Print and PDF now use their own light palette, with an explicit dark option if that is what you actually wanted.
- Deleting a file gives you eight seconds to undo. The delete is held rather than the file moved somewhere clever: it stays exactly where it is until the timer runs out. Anything that needs the filesystem settled first — creating, renaming, switching workspace, closing the window — flushes the pending delete before it acts.
- Quick capture, from anywhere. A system-wide chord (⌘⌥M by default) opens a small box over whatever you are doing. Type a line, press Enter, and it lands in your Inbox without SoloMD ever coming forward.
- A Tasks panel. Every
- [ ]in the workspace, in one list. Priorities and due dates are read from either the Obsidian Tasks emoji (⏫,📅 2026-09-10) or a plain-ASCII form (!!!,due:2026-09-10), so an existing vault keeps working and nobody has to reach for an emoji picker mid-sentence. Click a task to jump to its line; tick it to write the file. - Import Word, PDF, HTML and spreadsheets. The converters were already in the app with no way to reach them. There is now a menu entry — and importing a name that already exists picks the next free one instead of overwriting, compared case-insensitively, because Windows and macOS disagree about what counts as a collision.
- Edit a table as a grid. Add and remove rows and columns without counting pipes. CJK text is padded by display width, so the Markdown source stays aligned in a monospace font instead of drifting one column per Chinese character.
- DOCX templates. Cover page, table of contents, running header, page numbers — three presets, or set per document with a
docx:block in the front matter. - Numbered equations and cross-references.
\labelon a display equation gets a number and an anchor;\eqrefbecomes a link that jumps to it. - A deleted workspace folder no longer looks like an empty vault. If the folder went away underneath us, the tree showed nothing under its own name — indistinguishable from having lost every file in it. It now says the folder is missing, and clears the warning by itself when the folder comes back.
- The file-tree context menu printed key names. Four strings were never defined in any language, so the menu showed
explorer.copyGitUrlinstead of a label — in all fourteen. Defined everywhere now. - For agents:
list_tasksin the MCP server. Every checkbox in the workspace with its file, line and done state, matching what the Tasks panel shows — so an agent and the panel cannot disagree about which line to tick.
v4.11.22
4.11.22 — things that quietly did nothing.
- File → New Window opened no window. The menu item fired an event nothing listened for, so it had been inert since the day the native menu shipped — while the same action from the command palette worked, which is why it read as "nothing happens" rather than an error. Both now take the same path, and a window that fails to open says so instead of failing silently.
- A text file opened blank after live-edit. On Windows, switching from a markdown file in live-edit mode to a .txt file showed an empty editor with the line numbers still counting the missing text. The content was never lost — the gutter and the editor were being filled at different moments, and only the gutter won. Switching away and back used to be the workaround; now it just opens.
- [[folder/note]] links made a second, empty note. A wikilink with a folder in it never resolved, so clicking it created a duplicate beside the note you were linking to. Folder paths, frontmatter aliases, and files created since the last scan all resolve now. Thanks to @jukejeew.
- Linux: File → Exit, with Ctrl+Q. Tiling window managers hide the title bar, leaving no ✕ and no obvious way out. Also from @jukejeew.
- No more full-screen flicker while dragging the splitter, and a custom theme that would reintroduce it now says so when it loads. Thanks to @raopan2021.
v4.11.21
4.11.21 — the shortcuts page you couldn't see.
- Settings → Shortcuts opened onto an empty page. 4.11.20 shipped the rebinding feature with its settings page invisible: the panel shows one category at a time through a CSS whitelist, and the new Shortcuts category was never added to it, so the hide rule caught the markup and nothing brought it back. Everything was there and working — you just couldn't see it. The whitelist now covers all seven categories.
- Downloads you can verify yourself. Every release now carries a
SHA256SUMS.txtcovering all its files, so you can check what you downloaded is what we built. - About Chrome's "scanning" notice on Windows. The Windows builds aren't code-signed yet, so Chrome's Enhanced Protection scans each new version and then reports no virus found — that is a pass, not a warning. Separately, 4.11.20's x64 installer tripped a machine-learning false positive in Microsoft Defender, which is why that download was briefly held back at 4.11.19. Every release is now scanned with Defender before it goes out, and 4.11.21's x64 installer scans clean — so Windows x64 is current again.
v4.11.20
4.11.20 — the shortcuts are yours now.
- Every app shortcut can be changed. Settings → Shortcuts lists 37 actions grouped by File / Edit / View / Navigate / Tools. Click Change, press the chord you want, and it applies immediately — no restart. You can unbind an action entirely (if you want ⌘E or ⌘D back for something else, take it), reset one to its default, or restore all of them. Trying to take a chord another action already holds is refused with the name of the action holding it, rather than quietly creating two owners for one key.
- Changing a shortcut changes it everywhere. The chord you set is what the toolbar tooltips say, what the Markdown cheatsheet's shortcut table shows, what the command palette lists, and — the part that actually matters on macOS — what the native menu bar holds. Previously the menu owned ⌘S at the operating-system level, so rebinding Save would have left ⌘S also saving; the menu is now rebuilt with your chords, and an unbound action loses its menu accelerator entirely.
- Including the editor's own ⌘J. AI Rewrite lives in the editor's keymap rather than the app's, and it is rebindable too — the change reaches an already-open editor, not just the next one you open. The keys that only mean something inside a popup (arrows, Tab, Enter, Esc) stay fixed, as do the ones the operating system owns: undo, cut, copy, paste.
v4.11.19
4.11.19 — the phone stops being a shrunken desktop.
- A layout built for a phone. Measured on a 390px screen before this release: the file tree took 250px and the right sidebar another 260 — of 390 — so the editor was a sliver or gone entirely; split view left each pane about 195px; the status bar wrapped onto a second line; and the toolbar was a ribbon of 29 icons you swiped through. The side panes are now drawers that float over the editor and close with a tap outside, so the editor always has the full width. Split stacks the panes vertically instead of side by side. The toolbar keeps six controls — file tree, save, the three view modes, search — and a "more" that expands the bar into a sheet where every remaining control has an icon and a label; nothing became unreachable. The status bar keeps the counters that move while you type and drops the desktop reference values. Settings stops being a 160px nav rail beside a 145px column. Tablets are deliberately untouched — the layout follows the viewport, not the operating system, so an iPad keeps the desktop arrangement and a desktop window dragged narrow gets the phone one.
- Bold that ends in a full-width punctuation mark now renders.
**限制:**硬链接came out as literal asterisks. The closing**sits after a full-width colon and before a Han character, and CommonMark says a run in that position can't close — a shape that is everywhere in Chinese writing. SoloMD now follows the CommonMark CJK amendment, which reads those rules as non-CJK punctuation. Both engines were fixed: the preview/export renderer and the separate parser behind live edit, so the two panes can't disagree about the same document. ASCII is unchanged. - A multi-line
$$formula stays in one piece on Windows. A block using\begin{aligned}was split into three, with the indented middle line rendered as a grey code block. The Windows editor's block splitter knew about ``` fences but not about$$, so it walked into the formula line by line — and any line indented four spaces, which is routine insidealigned, became an indented code block of its own. - Exporting starts in the document's own folder. The save dialog was given only a filename, so the system reused wherever you last saved — export a note from your notes folder and the dialog could still open in last week's Downloads.
- The first-run AI setup offers every provider, and a base URL. It listed four brands while Settings had sixteen, and had no address field at all — so anyone using a relay endpoint or a self-hosted server had to skip the wizard entirely. It now shows the full list with an editable base URL, and providers that need no account no longer demand a key. Separately, verification no longer fails on endpoints that don't serve a model list: a gateway that returns 404 for
/v1/modelswhile chat works perfectly is now verified with a one-token chat instead. A wrong key still fails, as it should. - Reading mode uses the font you chose. It declared its own serif stack and swallowed the setting whole — the code comment even claimed you could override it. On a phone its exit button also sat on top of the first heading; it moves to the bottom right, where a thumb can reach it.
- The macOS install script works again.
curl -fsSL https://solomd.app/install.sh | bashfailed for every macOS user with "Failed to mount DMG" — the script silenced the very output it then tried to read the mount point out of. Thanks to the reporter, whose diagnosis was exact. - Code blocks have a copy button while you edit. In live-edit mode a fenced block looks rendered — the ``` lines are hidden — but selecting it by hand still gave you the source: the fences, and, for a block nested in a list, the two spaces of list indentation in front of every line. Paste that into a terminal and you get to strip it by hand. Every code block now carries the same one-click copy button the preview pane has, and it copies what a renderer would: no fences, the block's own indentation removed, the code's own indentation kept. Present in all three places code is shown — the live editor, the preview pane, and the Windows block editor.
- Ollama on another machine is detected. If you ran Ollama on a NAS or a desktop across the room and put its address in Base URL, Settings → AI insisted "not detected" — the probe ignored that field and always asked localhost, even though chat itself was talking to your server perfectly well. It now follows the address you set, re-checks as you type it, tells you exactly what it probed, and when a remote box doesn't answer it says what to check (a remote server needs
OLLAMA_HOST=0.0.0.0and an open port) instead of offering to install Ollama on your laptop. - New provider: any OpenAI-compatible server you host yourself — llama.cpp's
llama-server, LM Studio, vLLM, LocalAI, an internal gateway. Previously the only way in was to borrow another provider's slot, and it didn't work: a key was mandatory (so people invented one) and a barehost:port— exactly what those servers print at startup — 404'd because the/v1prefix was assumed to be typed already. Now the key field is optional, the address is completed for you, the model list is read from the server, and if it can't connect you see the server's own answer (HTTP 404, connection refused) plus what to check. Usable from recipes too:provider: openai-compat(orllama-cpp/lmstudio/vllm).
v4.11.17
4.11.17 — the Option-key shortcuts, and one stall Linux can no longer take.
- Every ⌘⌥ shortcut works on macOS. macOS folds Option+letter into a different glyph before the keystroke ever reaches us — Option+N arrives as "Dead", Option+P as "π", Option+C as "ç" — and we were matching on the letter, so ⌘⌥N (new text file), ⌘⌥P (slideshow), ⌘⌥⇧P (print to PDF), ⌘⌥B and ⌘⌥L had simply never fired on a Mac. They now match on physical key position. While we were there, ⌘⌥C copies the selection as Markdown — the one copy format people actually paste elsewhere, and the only one without a shortcut.
- Linux: SoloMD no longer waits on an accessibility service that isn't answering. When the desktop's AT-SPI bus accepts a call and never replies, GTK and WebKit each block the interface for their full D-Bus timeout — 25 s and 30 s — before the window can paint or take a click. SoloMD now asks that bus itself, with a two-second budget, before GTK starts: if it answers, nothing changes and screen readers work exactly as before; if it doesn't, we start without accessibility instead of waiting on it. Measured on a rig with a deliberately wedged bus, launch-to-usable went from 51 s to 3 s.
This is not a fix for the freezes reported on Arch and Ubuntu (#253, #200). Those never recover on their own; this stall always did, so it is something else, and that investigation is still open. If you are hitting one of those, the issues are the place to follow along.
v4.11.16
4.11.16 — the cursor stays where you put it.
- The caret no longer jumps away while you type on Windows. If anything touched the open file from outside — a cloud client syncing it, a sync pull, a save round-trip — SoloMD reloaded the buffer and the cursor was thrown to the other end of the document. Sometimes letters stopped going in at all, because the same event interrupted an in-flight IME composition or knocked focus out of the editor, at which point single keystrokes were being read as shortcuts. A fix for this existed since 4.11.1 but only covered the CodeMirror editor; Windows runs a native text box and never received it.
- Gitee sync works. It could not authenticate at all: we sent the Basic-auth username GitHub requires, and Gitee rejects it outright — so every attempt failed no matter how valid the token was. Verified end-to-end against a real Gitee repository now. (#249)
- The agent can actually write when you let it. "Allow the agent to write in the vault" had no effect — the write tools were never sent to the model, so it answered that it had none. And recipe runs finished on their branch but never appeared in "Pending review", so they could not be accepted or rejected. Both traced by @jclg83. (#247, #248)
- Spell-check in your language. The checker was pinned to English, which flagged every word for everyone else. Pick a dictionary in Settings → Writing, and drop any Hunspell
.aff+.dicpair into the folder the button opens. (#246) - Case conversion. Shift+F3 cycles the selection — or the word under the cursor — through lower / UPPER / Title, with explicit commands in the palette. Requested on Gitee.
- Curly quotes are off for good. Making them opt-in in 4.11.11 only changed the default, so everyone who already had them kept seeing a wide gap after apostrophes on CJK fonts. Now cleared once, and it stays off unless you turn it back on. (#251)
v4.11.15
4.11.15 — three things Gitee had been telling us for weeks.
- Slash commands did nothing on Windows unless you were in Live Edit. Windows runs a plain text box rather than CodeMirror, because WebView2 drops characters during Chinese input — and the replacement autocomplete had only ever been wired to the Live Edit block editor. In 仅编辑 and 分栏 the popup never appeared, could not be navigated, and could not insert. It was not only the slash menu:
[[wikilinks,#tags and@citations share the same trigger and were equally dead. All four now work in every mode, with the popup following your cursor line. (Gitee IK6JCC) - The two PDF exports now say what they actually produce. "Export to PDF" rasterises the page, so the text is a picture — not selectable, not searchable, and several times larger. The export people actually wanted was sitting right below it under a name that gave no hint. They are now labelled — PDF (text), real selectable text via the system print, listed first and recommended; PDF (image), rasterised but saved without a dialog — in the toolbar and the command palette. (Gitee IK8QJQ)
- Word / EPUB / ODT / LaTeX exports match the preview again. Those formats go through Pandoc, which was being handed the raw file while the preview got a pass of leniency fixes first. A sublist indented two spaces therefore nested on screen and came out flat in a .docx. Pandoc now sees the same text you do. (Gitee IJXS8V)
v4.11.14
4.11.14 — the blank screen that swallowed your notes.
- A saved view that no longer existed could blank the whole editor, with no way back. Reported on Android as "notes won't open" — but the notes were opening: the toast fired, the status bar counted the lines, and then nothing appeared. The content area shows exactly one thing at a time and the editor is last in line, so a saved view marked open kept its place even after the view itself was gone. And because the pane's ‹ back button lived inside the same block that refused to render without a view, there was nothing left to click. Opening more files couldn't help — every one of them opened into a pane that couldn't draw. Android hit it most often, since a folder picked through the system file picker frequently can't read the views directory, but nothing about it was Android-only. The editor now takes over the moment a view stops resolving, and the back button always renders. (#245)
- The Aurora theme got a pass. Aurora-tinted hairline borders, translucent panel interiors that stay readable over the gradient, and no more full-screen strobe while dragging a panel edge. Thanks @raopan2021. (#244)
- The Arch package is current again.
solomd-binis live on the AUR and the in-repo packaging (stuck at 4.1.0) now tracks the real releases. Thanks @gonwe. (#241)
v4.11.13
4.11.13 — a proper Gitea integration, 11 new themes, and two things that quietly did nothing.
- Gitea / Forgejo is a first-class sync target now. 4.11.12 made self-hosted sync reachable; this makes it real. Your Gitea token lives in its own keychain entry, so you can hold a GitHub and a Gitea token at the same time. Your server URL is remembered and checked before you commit to it. And SoloMD can now list your repositories and create the vault repo for you, instead of making you paste a clone URL. Contributed by @JumpingY, verified end-to-end against a real Gitea server. (#150)
- 11 new community themes. Aurora, Deep Blue, Deep Green, Deep Purple, Frost Blue, Graphite Gray, Ink Blue, Rose Pink, Soft UI, VSCode Modern and Warm Sand — by @raopan2021, in Settings → Browse community themes. There is also a reload button next to your custom CSS file, so you can edit a theme in your editor and see it applied without restarting. (#239)
- Search in folder was dead if you had ever hidden the right sidebar. Ctrl/Cmd+Shift+F, the toolbar button and View → Search in Folder all did exactly nothing — and pressing again silently toggled it back off. The search panel lives in the right sidebar, and the sidebar's master hide switch outranked it, so the panel was being opened where nothing could draw it. All four entry points now un-hide the sidebar. (#209)
- Holding Cmd on a Mac no longer rescales the whole app by accident. Zoom-by-scroll stepped on any scroll event at all, so a trackpad under a resting finger — with Cmd held for ⌘S or ⌘Tab, as it usually is — would drift the entire UI down to minimum size. Incidental movement is now about five times less likely to zoom, while deliberate zooming is unchanged, and there is a switch in Settings → Basics to turn the gesture off completely. (#215)
v4.11.12
4.11.12 — sync works on your own server, and Android stops promising what it can't do.
- Self-hosted Gitea / Forgejo sync actually works now. The sync engine was never GitHub-specific — but the setup screen was. The provider picker only appeared after you saved a token, and saving validated every token against github.com and deleted it when that failed, so a self-hosted token could never survive. Pick your provider first, and we no longer ask github.com about tokens that aren't theirs. Verified end-to-end against a real Gitea server. (#229)
- Android no longer shows sync settings it can't run. The Android build has no Git engine inside it, but the app still drew the whole Sync panel and version-history UI — every button answered with a cryptic
Command not found, and with auto-commit on you got an error on every save. Those controls are gone on Android now, replaced by a plain explanation. (#230) - No more
.solomdfolder in every folder you open. Opening a folder just to read a note left a.solomddirectory behind. That folder is for handing your open tabs between devices, so it's now only written inside genuinely cloud-synced folders — nothing is created in an ordinary local folder. (#236) - OpenCode Go joins the AI provider list. 24 models behind one subscription, contributed by @fengzhoujingshui. (#232, #235)
- The Linux installer works on ARM.
install.shonly ever fetched x86_64 packages, so the arm64 builds we already ship were unreachable on a Raspberry Pi or an ARM VM. Fixed by @jysz. (#220)
v4.11.11
4.11.11 — the Windows window controls work again, and Vim can save.
- Minimize and close work on Windows again. The unified title bar's window buttons were being blocked by a missing permission — clicks did nothing and you had to close from the taskbar. Fixed and verified on a real Windows build. The File menu got its Exit item back, dropdowns no longer close when you scroll under them, and reading mode now has its own minimize/close buttons. (#221, #223)
- Vim can save and quit.
:w,:wq,:x, and:qnow do what you'd expect — routed through SoloMD's real save and unsaved-changes flow. Along the way we closed a gap where a save fired right after typing could miss the last few keystrokes. (#222) - No more phantom space after an apostrophe. The preview kept its typographic quotes on by default, and some fonts drew the curly apostrophe full-width — reading like an extra space. Quotes now render exactly as you type them; curly quotes are a new opt-in setting. (#216)
- Android: dictionary and translate apps show up again. Selecting text now offers your installed
PROCESS_TEXTapps (offline dictionaries, translators). (#224)
v4.11.10
4.11.10 — one title bar on Windows, and three fixes you asked for.
- Windows gets a unified title bar. Three rows of chrome collapse into one — window controls, tabs, and toolbar share a single row, like the Mac app. Snap Layouts still work on the maximize button, and the MSI installer got proper branding.
- Select-all can't freeze the Windows editor anymore. Ctrl+A in the block editor is now handled by SoloMD itself instead of fighting the native textarea. (#189, #210)
- Code blocks wrap in Live Edit, and PDFs stop clipping them. The "wrap long lines in code blocks" setting now applies while editing, and PDF export no longer cuts off long code lines. (#211)
- Nested lists inside numbered lists keep their shape. A bulleted sub-list under an ordered list no longer flattens to one level. (#213)
v4.11.9
4.11.9 — zoom that keeps its aim, and four asked-for comforts.
- ⌘+/⌘- zoom no longer breaks click targeting on macOS. Zoom now goes through the system webview (like Safari's), so the caret lands exactly under the pointer at any zoom level. (#192)
- The sidebar can't get stuck hidden anymore. Opening the outline — or any pane — from the shortcut, Settings, or the tab bar now also brings the auto-hidden sidebar back. (#207)
- Command palette speaks your language. All 85 commands follow Settings → Language across 14 locales; searching matches both the translated and the English name. (#177)
- New options: a solid (non-blinking) cursor toggle (#193) and a dedicated code font (#190). Copying tables from preview keeps their borders when pasted into mail clients. (#189)
v4.11.8
4.11.8 — split view lines up, positions stick.
- Split view stays level. The editor and preview now track each other pixel-accurately at any scroll position — soft-wrapped paragraphs, images, and raw HTML blocks no longer pull the two panes apart, and line numbers stay glued to their lines. (#203)
- Your scroll position survives tab switches. On Windows, switching away and back no longer resets the view to the top — in Edit, Split, and Live Edit modes alike. (#169)
==Highlight==renders in live edit. Same treatment as bold/italic: styled off the caret line, raw source when you edit it; code blocks stay verbatim. Typewriter mode now also centers the caret line in the Windows editor. (#199)- Outline jump labels past
azare fixed. Long documents no longer showaundefinedmarkers. (#206)
v4.11.7
4.11.7 — one reliable Windows install path.
- MSI is now the only installed Windows channel. SoloMD installs to
C:\Program Files\SoloMD; the portable ZIP remains available without installation. - Old per-user installs migrate safely. On first launch from the MSI path, SoloMD verifies and removes the retired
%LOCALAPPDATA%\SoloMDNSIS installation, including its stale shortcuts and taskbar pin. - Your work and settings stay untouched. The migration never removes
%APPDATA%\app.solomdor user documents.
v4.11.6
4.11.6 — Windows keeps the new icon after upgrading.
- Taskbar pins, shortcuts, and the running app now share one stable identity. Windows no longer falls back to an old or blank cached icon after an upgrade.
- This is a focused Windows hotfix. macOS and Android packages are refreshed for consistent downloads; their platform behavior is unchanged.
v4.11.5
4.11.5 — embedded HTML now works in live edit.
- Block HTML renders where you write. Containers such as
<div>,<table>, and<details>now collapse into their rendered result when the caret leaves the block. - Inline HTML behaves like Markdown formatting. Tags including
<strong>,<sup>,<mark>, and<kbd>apply their visual meaning instead of remaining as noisy source. - The source is always one click away. Moving the caret back into an HTML fragment reveals the exact markup for editing.
v4.11.4
4.11.4 — the new mark reaches the window chrome.
- The title bar now carries the new Portal mark. The legacy
#MDtext lockup is gone from the in-app toolbar. - The About dialog matches. Both surfaces now render one shared brand component, so future identity updates cannot drift apart.
- macOS file icons are included and registered. The signed, notarized universal DMG maps Markdown files to the new warm-paper Portal document icon.
v4.11.3
4.11.3 — a new face, plus two fresh fixes.
- SoloMD has a new visual identity. The new orange
#Portal app icon now ships consistently across macOS, Windows, Linux, iOS, Android, the App Store, and the website. - Markdown files are recognizable at a glance. The default document icon is a warm paper sheet with an orange fold and the matching
#Portal mark. - Vim mode works on Windows again. Enabling Vim now switches the editor onto CodeMirror immediately, while the normal Windows editor keeps its IME-safe textarea path.
- Code blocks have a Copy button. Every rendered fenced block gets a pinned, accessible one-click copy action in its top-right corner.
v4.11.2
4.11.2 — four small fixes that were bugging you.
- Code blocks can wrap. New setting soft-wraps long code lines instead of a horizontal scrollbar — and PDF/print now always wraps, so wide code is never cut off on paper.
- Tabs remember where you were. Switching back to a tab no longer resets the view to the top when you had scrolled without clicking; line numbers stay put too.
- Vim
j/krespect tables. Single-step motions land on a collapsed table/math/Mermaid block edge and expand it — same as the arrow keys — instead of hopping clear over. - Full file names in the Explorer. New setting wraps long names instead of middle-ellipsis truncation.
v4.11.1
4.11.1 — the cursor stays where you put it.
- Chinese IME cursor jump fixed. Editing mid-paragraph and starting a pinyin composition right after could throw the caret to the top of the document and strand half-composed letters there — a debounced-sync race replacing the whole document mid-composition. Composition is never interrupted now, and external updates keep the caret in place.
- The update prompt stopped stealing your browser. Detecting a new version now shows a 12-second clickable toast; nothing opens unless you click it — and every update-related link (toast, settings check, About dialog) goes to solomd.app instead of GitHub.
- AI model catalog refreshed across all 14 providers (GPT-5.6 family, Grok 4.5, Claude Fable 5 / Opus 4.8, Gemini 3.6, GLM-5.2, Kimi K3 and more; retired DeepSeek v2 endpoints removed).
v4.11
4.11 — broken tables fix themselves.
- Malformed tables render anyway. AI exports and PDF-to-Markdown tools often emit a delimiter row that doesn't match the header (an extra
|---|cell, a missing one, an empty cell) — and the whole table silently collapsed into literal| … |text. SoloMD now repairs the delimiter row on the fly, like Typora and Obsidian, keeping each column's alignment. Code-block samples are left untouched. - Numbered sections can become headings (opt-in). Reports often number sections as plain text —
6.2 Export licensing— with no#. A new setting (off by default) promotes such lines to real headings by depth:6.2→ h2,6.2.1→ h3. Ordered lists, decimal sentences and single numbers are never touched. - Headless export matches the app. The CLI (
solomd-export, new--number-headingsflag) and the MCPexport_notetool (newnumber_headingsarg) now run the exact same Markdown preprocessing as the in-app preview and DOCX export — one engine, identical output everywhere.
v4.10
4.10 — PlantUML + a preview width slider.
- PlantUML diagrams (opt-in).
```plantumlfences render as diagrams in the preview and in live edit, through a configurable PlantUML server. Off by default — your notes never leave the machine unless you turn it on; point it at a self-hosted server to keep rendering on your own network. - Preview width is yours. The preview / reading column width is now a slider (480–1600px, was a fixed 760px). "Fit width" still stretches to the window.
- Tables no longer trap the caret. In live edit, ↑/↓ used to teleport clear over rendered tables — and could skip whole paragraphs below them. The caret now walks every line, steps into a table (or math / Mermaid block) to edit its source, and the block re-renders when you leave.
- Code-block line numbers, fixed. Numbered code blocks no longer double their line spacing, C-style
/** */comments no longer swallow the rest of the block into row 1, and the WYSIWYG editor now honors the same line-number setting as the preview. - Clicks stay clicks (4.10.1). Clicking right after a tab switch — while diagrams/images were still rendering — could select multiple lines instead of placing the caret. The caret now stays where you pressed, even when the layout shifts mid-click.
- Open linked files with the default app (4.10.2). A Markdown link to a local PDF / Office file (
[report](./report.pdf)) now opens in your system's default app instead of being converted to Markdown. New setting, on by default; links to.md/ text / images still open inside SoloMD.
v4.9
4.9 — Android real folders + editor polish.
The 4.9 line makes SoloMD open and edit your real folders on
Android — not a sandboxed copy. On Android 11+ (including
Honor / Huawei Magic OS, where the all-files
permission grants nothing) SoloMD now uses the Storage Access
Framework: pick a folder once, then read and write the actual
.md files in place, saved back through the system content
provider.
- Android folder vault (SAF). Open a real folder, edit files in place, full-width mobile layout.
- Save As fixed. It was writing empty files on Android — now the content lands in the file you choose.
- Find (Ctrl/⌘+F) scrolls as you type. The editor jumps to the first match while you type, like your browser — no more "found nothing" on long notes.
- Live-edit arrow keys cross blocks. ↑/↓/←/→ now move the caret between paragraphs in the Windows block editor — and as of 4.9.6 they respect soft-wrapped lines, so ↑ in a long paragraph no longer teleports over it.
- Line numbers on Windows (4.9.6). The "show line numbers" setting now works in the Windows editor, with a gutter that stays aligned under word wrap.
- Export Mermaid diagrams as PNG (4.9.6). Click a diagram → Export PNG or Copy image, at 2× resolution with a theme-matched background.
- Save dialog picks up your title (4.9.6). A never-saved note starting with
# Headingpre-fills "Heading.md" — stop retyping filenames. - Linux launch fix. AppImage no longer aborts with
EGL_BAD_PARAMETERon some Intel / Mesa setups.
v4.7
4.7 — Windows gets a brand-new editor.
Windows only. SoloMD on Windows now uses a completely
rebuilt block editor in place of CodeMirror.
WebView2's contentEditable dropped the
first character of CJK / IME input and
doubled punctuation (worst with Sogou) — a bug that
could not be fixed inside CodeMirror because it lives in WebView2
itself. The new editor types each block through a native
<textarea> on the OS-native IME path, so the
dropped-character and doubled-punctuation problems are gone.
The new Windows editor keeps full feature parity:
live Markdown preview, autocomplete & slash commands
(/), focus & typewriter mode, smart list continuation,
AI rewrite (Ctrl+J), in-document find & replace
(Ctrl+F), clipboard image paste, task-checkbox toggle,
undo / redo, Tab indent, spellcheck and word-wrap.
macOS, Linux, iOS and Android are unaffected — they keep the existing CodeMirror editor. Also in 4.7: the command palette no longer jumps when you hover or wheel-scroll the list (#93).
v4.9
4.9 — Android opens your real vault.
On Android, SoloMD's only freely-readable folder used to be a
sandbox under /Android/data that no file manager can
reach on an unrooted phone — so you could never point the app at
your actual notes folder. 4.9 adds All-files access:
grant it once and Open Folder lets you browse to a
real vault anywhere on the device (Documents, a
Syncthing / Dropbox folder, an SD card) and edit files in
place — no copying into the sandbox. The file tree, search,
version history and save all work against your real paths (#148,
#151).
Also in 4.9, a sweep of reported bugs. The macOS window can be dragged by its title bar again (#153) — the drag call had been silently rejected by a missing permission ever since the unified title bar shipped; double-click to zoom is back too. The "File Changed on Disk" dialog no longer interrupts typing on Android (#148) — the app's own saves were mistaken for external edits because Android delivers file events seconds late; changes are now judged by the file's modification time instead. The update-available notice now opens the solomd.app download page (reachable in mainland China, with the Gitee mirror) instead of GitHub (#154), and the no-op "Reveal in Finder" menu item is hidden on phones.
4.8.11 — three reported bugs, fixed.
Android can open files again (#148): files handed
over by a file manager, "Open with", or the in-app picker arrive as
content:// URIs that no filesystem call can read — they
now import into the SoloMD folder (keeping the original filename, or
naming from the doc's first heading) and open normally, mirroring the
iOS Files-app flow. GitHub sync no longer pushes to
main while pulling from master
(#147) — a second device could get permanently stuck never seeing the
first device's pushes; pull now normalizes the branch the same way
push does, with a fallback for legacy master-only remotes.
And closing a tab returns to the adjacent tab
instead of jumping to the first one in the list (#149 — root cause
contributed by the reporter, thanks!).
4.8.10 — quality-of-life sweep. Ctrl+A finally selects the whole document in the Windows live editor (it used to stop at the current paragraph), so select-all → copy / delete / type-over behaves like any other editor. Deleting a file or folder now moves it to the system Trash / Recycle Bin instead of erasing it permanently (#112), and single entries can be removed from the Recent-files list. A new “single newline = line break” setting keeps the preview, the Windows live editor and every export (PDF, DOCX, Pandoc) agreeing on what Enter means (#141). Font size & family now apply everywhere — live-edit blocks, the preview pane and reading mode (#143). Switching tabs keeps your cursor and scroll position (#144), “open at startup in reading mode” works again with restore-tabs off, the settings pages no longer share one scroll position, and the toolbar AI-rewrite button works on Windows (#126).
4.8.9 — iOS file opening, fixed for real. Opening a
Markdown file from the Files app, AirDrop or another
app no longer fails with "No such file or directory" (#139) — the
share sheet handed over a percent-encoded file:// URL
that was never decoded. Recent files survive app
updates (iOS moves the app container on every update; stored
paths are re-anchored automatically), Open Folder now
pins the workspace to SoloMD's Documents folder, and the tab
bar scrolls with a swipe. Also on desktop: local
SVG previews stay visible across windows (#142,
thanks @beihai23).
4.8.1 — fixes. Find & Replace is
discoverable again (a command-palette entry; it always lived behind
Ctrl+F, #137). Clicking a relative .md link inside a
WSL vault no longer fails with “os error 3” (#138).
A pinned reading-mode startup with restore-tabs off no
longer opens a blank window (#128). The macOS app icon
is now a proper rounded squircle with margin (#111). And an
expired/revoked GitHub sync token now prompts you to
reconnect instead of throwing a raw 401.
4.8.0 — image hosting (图床). Paste, drop or pick an image and SoloMD can now upload it to an external image host and insert the returned URL — instead of only copying it into a local folder, like Typora / MarkText. Five backends: PicGo (local server), a custom command (PicGo-Core / uPic / any script), SM.MS, S3-compatible (Aliyun OSS / Tencent COS / Cloudflare R2 / MinIO), and a GitHub repo + CDN. Plus “insert image from URL” and a “upload all local images in this note” command. Auto-upload on paste falls back to a local copy if the host is unreachable. Configure in Settings → Writing.
4.7.4 — Backspace / Delete are reliable again in the Windows editor. Each paragraph there is its own text box, so pressing Backspace at the very start of a block (or Delete at its very end) used to hit the box edge and do nothing — delete felt hit-or-miss. Those boundary presses now act on the whole document, joining paragraphs or removing the blank line just like a normal editor, with the caret and focus following along.
4.7.3 — PDF export no longer
crashes on themes or content using modern CSS color functions
(color(), oklch(), color-mix()),
and a failed export no longer leaves the window frozen or zoomable
(#115). Plus: split-view scroll sync works again on
Windows — the editor and preview had stopped following each other
after the 4.7 Windows editor rebuild.
4.7.2 — the file tree gets a resizable sidebar (drag the edge, 180–600 px), per-filetype icons, and middle-ellipsis truncation for long filenames; the macOS title bar no longer overlaps the in-app toolbar (#121). Plus a PDF export fix: body paragraphs and list items are no longer sliced in half across page breaks.
4.7.1 — live preview now renders bullet lists, task checkboxes and horizontal rules (not just headings) across macOS / Linux / iOS / Android; source mode is genuinely plain again (headings no longer enlarged when live-preview is off). Plus: file-tree copy path / relative path (#120) and a close-folder button (#118), a limit-editor-width readable column (#109), and the fit-width toggle now works in reading mode (#117).
v4.6
4.6 — the knowledge-graph half, built.
A full design-system + Vue component-library rebuild
(warm-neutral surfaces, orange #ff9f40 accent) and a
unified macOS title bar (traffic lights inlined into
the toolbar) — plus the seven structural features that used to be the
one thing a knowledge-graph editor like Tolaria did and SoloMD didn't.
All on disk as plain .md / YAML. No new file format.
Properties inspector (⌘⇧I)
A dedicated frontmatter editor — date, relation, status and tag pickers — instead of hand-editing YAML. Writes straight back to the note's front-matter.
Type-driven sidebar
type:<Name> notes become first-class
collapsible sidebar sections (types-as-lenses), each with a custom
icon, color, order, and pinned properties.
Typed relationships
belongs_to / related_to /
has frontmatter fields with automatic
inverses — declare one side, the other resolves itself.
Relationship graph ("Neighborhood")
A per-note explorer of outgoing and inverse relationships — walk the graph one hop at a time from whatever note you're in.
Saved filtered views
Persistent sidebar views stored as
.solomd/views/*.yml — filter by type, status, date,
or regex, and they stay put across launches.
Inbox workflow
⌘E marks the current note organized and
auto-advances to the next — a real inbox-zero loop for triaging
captured notes.
tldraw whiteboards
Markdown-backed boards via a ```tldraw fence —
durable in the note's .md, and cross-compatible with
Tolaria's on-disk board format.
Design-system UI + unified title bar
A warm-neutral surface palette with an orange
#ff9f40 accent, rebuilt on a proper Vue component
library, and a unified macOS title bar that inlines the traffic
lights into the toolbar.
The five pillars (v4.0)
Each is in core. Toggleable via a setting. Built to play nicely with your existing notes — no schema migration, no new file format, no required cloud account.
1 · Inline Agent Panel
Right-side first-class panel (peer to Outline / Backlinks /
Tags / History). Streamed chat-with-vault routed through
the in-process MCP surface and your existing 14-provider
AI stack. [[wikilink]] citations resolve to
real notes; tool-call cards expand inline showing every
read/write the agent makes. Reply too long? Insert
and Copy buttons drop it into the active
editor — replaces selection if any, else inserts at the
cursor. Run history persists as plain markdown under
.solomd/agent-runs/ — grep-able,
git-trackable.
2 · Agent Recipes / Scheduled Runs
Declarative agent jobs as YAML in your vault:
<workspace>/.solomd/agents/*.yml.
Triggers: schedule (cron), on-save,
on-commit, on-tag-add, manual.
Safety rails are non-negotiable: every
run gets its own AutoGit branch agent/<recipe>/<run-id>,
writes are reviewable via accept / reject UI before
merging, and a per-run write-cap (default 5,
hard ceiling 50) prevents runaway loops. Rejected runs
have the branch hard-deleted — zero residue. Ships with
an 11-recipe cookbook (weekly review,
daily summary, TODO extraction, translation, citation
cleanup, CJK proofread agent, …) — install one, edit it,
run it.
3 · Agent Trace View
Every run (Panel chat OR Recipe) emits a
trace.jsonl per step:
prompt / model_call /
tool_call / tool_result /
git_commit / done. Step cards
expand to show args, results, token counts, cost
estimate, AutoGit branch refs.
Replay-from-step button rewinds the run
to step N and re-executes from there with edited inputs —
the path to self-correcting recipes. New MCP tool
read_agent_trace(run_id) exposes traces to
other agents.
4 · Workspace Federation
solomd-mcp --workspace path1 --workspace path2 --workspace path3
— one MCP session, many vaults. Tool signatures gain an
optional workspace parameter; default = first
passed (fully back-compat with single-workspace clients).
AutoGit branches stay isolated per workspace. Settings
→ Integrations adds an MCP profiles UI: name a
bundle of vaults, copy the Claude Desktop config snippet
with one click.
5 · Ollama first-class
We do NOT bundle a local LLM runtime —
Ollama already does that well. v4.0 polishes the
integration: auto-detect at localhost:11434
(green status indicator in Settings → AI), one-click
install hint when not found, three model presets
(rewrite → qwen2.5:7b · quick →
qwen2.5:1.5b · cjk → qwen2.5:14b),
recommended pull from inline UI when no models installed.
Recipes can specify provider: local (alias
of ollama) for cheap autonomous loops with zero cloud
cost. Your notes never leave the machine — true
today via BYOK Ollama; v4.0 makes it discoverable.
🛡️ Safety rails (the bit nobody else does)
-
AutoGit branch sandbox. Every recipe run
starts on its own branch. Your
mainstays untouched until you click Accept. A rejected run leaves nothing in your history — branch deleted, file tree reverted. - Per-run write cap. A model that asks to write 50 files when the cap is 5 gets refusals at the 6th tool call. No half-applied state, no surprise mass-edits.
- Refuses to start on a dirty workspace. If you have uncommitted edits when a recipe fires, it errors out cleanly instead of sweeping your work-in-progress into an agent commit.
-
Path-traversal hardening. Both the
in-process tool surface and every Tauri command that joins
user-supplied
run_id/patharguments now reject..segments and absolute paths upfront. The agent literally can't write outside its workspace. - Replayable trace. Every step on disk in line-delimited JSON. Suspicious behavior in the panel? Walk the trace, find the bad step, replay from N–1 with edited inputs.
Quality bar
- First-run wizard. New install meets the Agent Panel within 60 seconds — guides you through BYOK key entry OR Ollama setup. Re-launchable from Help.
- Recipe cookbook (11 starters). Settings → Recipes → Browse cookbook. Weekly review, daily summary, TODO extraction, translation pass, citation cleanup, CJK proofread agent, link-rot detector, frontmatter normalizer, outline-to-blog, refactor pass, weekly tag triage. Install one, edit the prompt, run it.
- Public REST API (localhost only, token auth). Same surface as MCP for clients that don't speak MCP yet — Alfred / Raycast / n8n / your own scripts.
- BYOK cost meter. Per-provider running tokens-spent counter, opt-in. Settings → Integrations.
- Localization. ja / ko translations scaffolded for README + iPad metadata. en/zh remain the full-coverage UI languages.
UX polish you'll notice on day one
- IME composition guard everywhere. Pinyin users typing Chinese, Japanese kana mode, Korean Hangul — pressing Enter to commit a candidate no longer fires "send" in chat / "rename" in file tree / "open" in command palette and search. Fixed across 7 input surfaces.
- Insert / Copy on assistant replies. Two buttons under each completed reply. Insert respects the current editor selection (replaces it) or falls back to cursor insertion. Copy is plain clipboard.
- Window UX on macOS. Launch activation timing is right — SoloMD becomes frontmost on cold start instead of opening behind Finder. Restored window position stays inside the current monitor work area; bad saved state from a now-disconnected secondary monitor recenters cleanly instead of opening off-screen.
- Stuck "streaming…" with no error. Fixed. A misconfigured provider (e.g. Ollama with a model that isn't pulled) used to hang the panel forever. Now you see a red error banner with the actual response from the backend, and the Send button comes back.
What v4.0 explicitly skips (and why)
Saying "no" is part of the product. These were considered and consciously not shipped:
- Bundled local LLM runtime. Ollama already covers this; re-implementing violates "write less code we maintain forever." BYOK provider stays the path.
- Online recipe marketplace. Server ops + moderation = off-mission. Cookbook ships in-tree.
- Multi-user / team agents. Violates "one window, one writer." This product is for the single author; collaboration belongs to a different product.
- Copilot-style ghost-text autocomplete. Different brand. Ghost-text dilutes the writer's voice; our agents work at vault granularity instead, with batched reviewable writes.
Upgrade notes
-
No file-format changes. Your existing
.mdfiles, AutoGit history, sync setup, BYOK keys all carry over untouched. -
Agent Panel auto-enables on first launch.
v3.6.x users had a hidden
showAgentPanel: falsefrom the v4-beta scaffolding period; a one-time migration flips it on so you actually see the marquee feature. Toggle off via⌘⇧P → View: Toggle Agent Panelif you don't want it. - Settings layout adds Recipes and Cost meter tabs under Integrations. Existing settings keep their previous tabs.
-
The MCP server (
solomd-mcp) gained a--workspaceflag (repeatable). Older MCP clients with a single workspace argument keep working unchanged; the federation behavior is opt-in.
🔮 What's next
The 5 pillars + quality bar are the headline drop. The v4.x and beyond open directions on the roadmap: a sandboxed scripting API, a CLI v2 (rewrite / commit / semantic search / recipe-trigger from terminal), and the long-deferred "should SoloMD become a business?" question (paid sync — original v3.0 question, still unanswered, no engineering until decided).
Thanks to everyone who filed issues, opened PRs, and ran the v4-beta builds through real vaults during the quiet phase. v4.0 shipped because dogfooding caught the bugs that integration tests didn't. Earlier: browse the blog →