# FlyMD: a local first Markdown editor built on Tauri and Milkdown

> FlyMD is a desktop Markdown note tool built with Tauri and the Milkdown editor, with a plugin system that adds AI assistance, PDF parsing, todo push notifications, a RAG knowledge base and WebDAV sync. It ships a free built-in AI model by default, runs on Windows, Linux and macOS, and its source is published under a non-commercial licence.

**flyhunterl/flymd** — 高性能Markdown笔记工具！免费AI，智能便签、TODO推送、本地知识库、AI小说引擎。PDF解析、自动语音笔记、录音转文本。毫秒级启动High-performance Markdown note tool! Free AI, smart notes, TODO reminders, local knowledge base, AI novel engine. PDF parsing, auto voice notes, audio-to-text. Millisecond startup.

- Repository: https://github.com/flyhunterl/flymd
- Website: http://flymd.llingfei.com/
- Stars: 898 · Forks: 65
- Language: JavaScript
- License: NOASSERTION
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/flyhunterl-flymd

## A Tauri shell around Milkdown, not a web app in a browser tab

FlyMD is described as a lightweight, high performance local Markdown editor supporting high precision PDF parsing and AI assisted writing with smart todo reminders, and it states the philosophy directly as local first, with data under your control and usable out of the box. The site is at flymd.llingfei.com.

The technical stack is where the performance claims come from. The package.json shows a Tauri application, with @tauri-apps/cli at 2.x and the Tauri plugins for dialog, fs, http, opener and store, plus a src-tauri/ directory for the Rust side. The frontend is Vite with TypeScript 5.4, and the editor itself is Milkdown, with the core, the Crepe theme, the kit, the Prose packages, and the plugins for math, GFM and automd all at 7.17.1.

That combination is what separates it from a browser based Markdown editor. Milkdown gives a structured WYSIWYG editor on top of ProseMirror rather than a contenteditable textarea, and Tauri gives a native desktop binary with access to the filesystem through Rust rather than a sandboxed browser. The claim in the documentation is that the DOM is ready in 5ms and that a note of 80,000 Chinese characters shows no lag, which is a project measurement rather than an independent one, but the choice of framework is consistent with it.

The rest of the dependency list explains the feature set rather than the editor. pdfjs-dist for reading PDFs, html2pdf.js and html-to-docx and html-docx-js for export, mermaid for diagrams, katex and markdown-it-katex for maths, highlight.js for code highlighting, dompurify for sanitising, canvg for rendering SVG, pinyin-pro for Chinese pinyin, and js-yaml for frontmatter.

The release history is regular: v1.4.2 on 2026-07-05, v1.4.3 on 2026-07-07 and v1.4.4 on 2026-07-22, with the last push on 2026-07-22.

## The plugin system is the product, not an afterthought

FlyMD presents itself as having a rich plugin ecosystem, with the capability to extend functionality through extension plugins without limit. The documentation then lists featured plugins by category, and the categories tell you what the author thinks a note tool in 2026 needs.

For AI and writing there is the AI assistant, which helps with writing, polishing and correcting, supports Markdown rendering and code highlighting, and ships a free built in model so it works out of the box. Alongside it is a Xiaohongshu copywriting plugin with built in viral styles, one click polishing, expansion and custom prompt templates.

For document processing there is high precision PDF parsing, which uses a large model to recognise PDFs into Markdown or Docx with support for handwriting, layout, formulas and tables, and a Markdown table assistant that inserts a table at the cursor.

For publishing and reminders there is Typecho blog management, which pulls the post list from a Typecho site, downloads it as local Markdown, filters by time or category, and can overwrite a remote article from the current document. There is also the xxtui todo push plugin, which scans a document for unfinished todos and pushes them to WeChat, SMS, email and other channels, which the documentation describes as suited to personal task reminders.

For knowledge management there are bidirectional links based on the [[title]] syntax with AI relationship recommendations, a graph view built on that backlink index, and the RAG knowledge base index plugin.

There is a separate AI novel engine plugin, which generates at least three plot directions, does foreshadowing recovery and automatic auditing, updates the progress thread with multi-level concurrent recall, manages character state and chapter word counts with draft review, supports multiple models working together and can work with the Git version control plugin, and has its own backend agent tools for section management.

The collaborative editing feature is implemented as an extension plugin for real time multi person editing, and the documentation says to ask the QQ group for details. That is a signal about the maturity of that part of the project.

## Local first, but the AI assistant installs itself in the background

The data safety section makes a strong claim: local first, with zero background network and data under your control.

Most of the features are consistent with that. Image hosting is plugin based, so S3, R2 or third party hosting is opt in. WebDAV sync across devices and document libraries supports end to end encryption and an HTTP host allow list. The portable mode writes all configuration into the application root, which suits carrying the whole thing on a USB stick. Export covers PDF and DOCX, with PDF export optimised for pagination and line breaks and print as the fallback in extreme cases.

But the AI assistant breaks the pattern, and the documentation is explicit about it. The AI assistant extension silently installs itself in the background after the first launch, and if you uninstall it, it will not install itself again automatically.

That is a design decision a user should know about before the first launch rather than after, because a background installer is exactly the behaviour that the local first claim would seem to rule out. The resolution is that the model is described as a built in free model intended to lower the barrier to using AI applications, and the application applies strict rate limits to the built in model with a warning not to abuse it. The documentation recommends registering a SiliconFlow account to unlock stronger models and higher quotas.

For a note tool, the built in model being the default is what makes the AI features usable without a key, and the background install is what makes the first run work. The cost is that the app reaches out on launch unless you opt out, and a reviewer with a strict zero background network policy will want to uninstall the extension explicitly.

## Search has three modes, and one of them needs a plugin you do not have

The library sidebar search is worth a paragraph because the three modes are easy to confuse.

By default, typing a keyword filters file names and paths. That is a filename filter, not a content search, and it is instantaneous because it only touches the index of files.

Full text search uses a single colon prefix, so :keyword, and you press Enter to start it. There is a continue deep search control that scans the full text. So the pattern is that the colon prefix moves from names to contents.

Knowledge base search uses a double colon, ::keyword, and again requires Enter. The documentation is explicit that this one needs the flymd-RAG plugin installed or enabled and the index completed. Without that extension, the double colon form does nothing useful.

That is a small design smell worth naming, since two nearly identical prefixes differ by one character and have completely different prerequisites. A user who tries ::keyword without the RAG plugin will conclude the feature is broken rather than that a plugin is missing.

Other input details in the documentation are more polished. In the library sidebar, Ctrl+click on a document opens it in a new tab and enters source mode. The main editor shortcuts are conventional enough to guess, with Ctrl+N for a new file, Ctrl+O to open, Ctrl+S to save, Ctrl+T for a new tab, Ctrl+W to toggle the WYSIWYG view, Ctrl+E to toggle edit and preview, Ctrl+Shift+F for focus mode, Ctrl+H for find and replace, and Ctrl+Shift+P for the command palette. Tab and Shift+Tab cycle through tabs, and Alt+W closes the current tab.

The page operations are the kind of detail that shows the app was designed rather than assembled. Shift plus the scroll wheel adjusts the content area width, which is the page margin, and Ctrl plus the scroll wheel zooms text and images. Shift plus right click brings up the native context menu, which exists specifically for the case where a plugin has taken over the right click menu.

## Installing on three platforms, and the macOS gatekeeper problem

Installers come from the Releases page for Windows, macOS and Linux, and there is a separate Android build in beta, with the plugin list for Android covering WebDAV sync, the RAG knowledge base, todo push, the todo diary, Typecho management and the AI assistant.

On Windows the package manager route is winget.

```bash
winget install flyhunterl.FlyMD
```

On Linux, mainstream desktop environments are supported, and for Arch based distributions the AUR package is the recommendation.

```bash
yay -S flymd
```

The documentation also carries a specific warning for Arch and Manjaro: the AppImage version may show a white screen because of WebKitGTK or graphics drivers, so the AUR package is preferred, and the old deb to debtap to PKGBUILD to pacman route is no longer recommended.

macOS supports both Intel and Apple Silicon. There is a collapsible section on macOS installation notes, because the application has not been notarised, so the first launch may report that the app is damaged and cannot be opened. The recommended fix is a terminal command that clears the quarantine attribute.

```bash
sudo xattr -r -d com.apple.quarantine /Applications/flymd.app
```

The alternative is to open Finder, find the app, hold Control to click the icon, choose Open, and then click Open in the dialog. The documentation's own explanation is that FlyMD is open source software with fully transparent code, and that the damaged message appears only because the app is not code signed.

That is a fair explanation of the cause and an awkward position for a user, since an unnotarised macOS build is exactly what the gatekeeper warning is designed to catch. Building from source avoids the problem entirely, and the repository has the scripts/ directory and the src-tauri/ Rust sources needed for that, along with BUILD_ANDROID.md for the mobile build.

## Where FlyMD is the wrong choice

The licence is the first thing to resolve, and it is genuinely unclear from the repository alone. The licence badge on the readme says GPL-3.0, the package.json declares the licence as the string LicenseRef-flyMD-NC-1.0, and the repository metadata field says Other, a custom licence GitHub cannot classify. The NC in that identifier suggests non-commercial, which would contradict GPL-3.0, since the GPL grants use for any purpose.

There is a LICENSE file at the root and a THIRD_PARTY_NOTICES.md, so the actual terms exist and can be read. But a licence field that says one thing in one file and something else in another is a problem for any organisation that runs a licence check, and for anyone who wants to use the tool commercially.

The second limit is the platform. This is a desktop application built on Tauri, with an Android build in beta. There is no web version, and nothing in the documentation suggests one is planned. A user who wants to edit notes on a phone will find the Android build is beta, and a user who wants to edit notes in a browser has nothing to install.

The third limit is the plugin dependency for the features that matter most. The AI assistant, the PDF parser, the RAG search, the todo push, the backlinks, the graph view, the novel engine and collaborative editing are all extensions rather than core. That is a strength for a modular design and a weakness for evaluation: the feature list in the readme is a feature list of plugins, and each one has its own maturity, its own configuration and its own failure modes. The AI novel engine, for instance, is described as generating at least three plot directions with automatic auditing and a backend agent, which is a research project rather than a utility.

The alternative approaches differ in what they give up. A plain editor like Obsidian or the paid, proprietary Typora gives you a fast Markdown experience, though Obsidian itself relies on community plugins for many extras. A plain text editor with a Markdown preview plugin gives you the same and nothing else. FlyMD's bet is that the plugin ecosystem and the built in free model are worth the licence ambiguity and the desktop-only constraint, which is a defensible bet for an individual writer and a harder one for a company.

## Conclusion

FlyMD suits a writer or developer who wants a fast Markdown editor on their own machine, with a plugin ecosystem that covers AI assistance, document parsing and reminder push without a subscription. It does not suit a team that needs the source under a permissive licence, because the package declares a non-commercial licence reference while the badge points at GPL-3.0, and that contradiction needs resolving before any commercial use. Before installing, read the licence file, and note that the AI assistant extension installs itself silently in the background on first launch and that the built in model carries strict rate limits.

## FAQ

### What is FlyMD and what is it built on?

FlyMD is a lightweight, high performance local Markdown editor built on Tauri with a Vite and TypeScript frontend and the Milkdown editor on ProseMirror. It runs on Windows, Linux and macOS with an Android build in beta, and its features are delivered largely through a plugin system.

### How do I install FlyMD on Windows and Linux?

On Windows use winget install flyhunterl.FlyMD, or download the installer from the Releases page. On Linux the mainstream desktop environments are supported and for Arch based distributions the AUR package is recommended with yay -S flymd or paru -S flymd, because the AppImage may show a white screen on WebKitGTK or driver issues.

### Why does macOS say FlyMD is damaged and cannot be opened?

The application has not been notarised, so the gatekeeper blocks the first launch. The recommended fix is sudo xattr -r -d com.apple.quarantine /Applications/flymd.app, or holding Control to open it from Finder. The documentation explains that the message appears only because the app is not code signed.

### How does the FlyMD library sidebar search work?

Typing a keyword filters file names and paths by default. A single colon prefix such as :keyword starts a full text search, with a continue deep search control for scanning the full text, and a double colon such as ::keyword runs knowledge base semantic search, which requires the flymd-RAG plugin to be installed and indexed.

### What licence does FlyMD use?

The repository is unclear here. The readme badge says GPL-3.0, the package.json declares the licence as LicenseRef-flyMD-NC-1.0, and the repository metadata says Other with a custom licence GitHub cannot classify. There is a LICENSE file and a THIRD_PARTY_NOTICES.md in the root, and the latest release is v1.4.4 from 2026-07-22.

## Sources

- [flyhunterl/flymd on GitHub](https://github.com/flyhunterl/flymd)
- [Issues](https://github.com/flyhunterl/flymd/issues)
- [Project website](http://flymd.llingfei.com/)
- [README](https://github.com/flyhunterl/flymd/blob/main/README.md)
- [Releases](https://github.com/flyhunterl/flymd/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/flyhunterl-flymd
