milkup: a cross-platform Markdown editor chasing the Typora editing feel
A cross-platform, instant-rendering desktop Markdown editor 一个跨平台的、即时渲染桌面端 Markdown 编辑器
At a glance
- What is it?
- milkup is a TypeScript desktop Markdown editor built on Electron, Vue and a self-developed instant rendering engine. The feature list is broad for an early project, but plugin support is still marked as in progress and the README does not document an install path for end users.
- Who is it for?
- milkup is worth a look for writers who want a Typora style instant rendering editor on Windows, macOS or Linux and are willing to build it from source with pnpm. It is not a fit for anyone who wants a packaged installer today or a working plugin ecosystem, since the README leaves plugin extension as in progress and gives no download instructions.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository received new commits within the last day.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.
Editorial analysis
A Markdown editor built around an instant rendering engine of its own
milkup is a desktop Markdown editor that renders as you type, and the README describes the rendering engine as self developed, aiming at an editing experience comparable to Typora. The stated goals are concrete: match that editing feel, offer plenty of customization options, and grow an active open source community. The interesting part of the design is that the rendering is not a preview pane bolted onto a code editor. A markdown file opens and the formatted output appears in place, with syntax hidden until you focus the line you are editing. For the intended user, someone who writes documentation, notes or long prose in Markdown and finds the split between a raw text pane and a rendered pane disruptive, that difference is the whole point. The editor also keeps a source mode, so the same document can be read as raw Markdown when you need to see the syntax itself.
The feature surface is wide for a project still on version 1.0.x
The README lists eleven capabilities, and it is worth reading them as a design brief rather than a spec. Instant rendering and a dual mode editor sit at the core, followed by multiple themes with a theme editor that can import and export themes, opening and saving local Markdown files, and a tab bar for keeping several files open at once. On top of that sit keyboard shortcuts, an automatically generated document outline for navigation, image upload with a configurable image host, built-in spell check, and cross-platform support for Windows, macOS and Linux. The last item on the list, extensive customization and plugin extension, is explicitly marked as under way. That marker matters, because a Markdown editor without extensions tends to stay a single purpose writing tool. Everything else on the list is described as working today.
The stack is Electron, Vue, Vite and esbuild, split across main, preload and renderer
The package manifest describes the project as a Markdown editor built with Milkup core and Vue.js, and the build scripts make the architecture visible. Two esbuild passes compile the Electron main process from src/main/index.ts and the preload script from src/preload.ts, both marked as external against electron, and the preload bundle is emitted in commonjs format. A separate Vite build then handles the renderer, which is where the Vue application and the self developed rendering engine live. The manifest entry point points at dist-electron/main/index.js, so the packaged app boots from the bundled main process rather than from source. Because the preload script is a distinct artifact with its own bundle, the renderer reaches the main process through an explicit bridge rather than direct Node access, which is the usual way to keep a web renderer from holding full system privileges.
Building and running from a checkout with pnpm, esbuild and Vite
The README does not give installation steps for people who just want to use the editor, so the working path is the repository itself. The manifest sets a preinstall hook that allows only pnpm, which means npm and yarn installs are rejected before anything else runs. The Node.js badge in the README asks for version 20.17.0 or newer. The script list shows the full pipeline, from building the preload and main bundles to launching Vite for the renderer.
"scripts": {
"build:main": "esbuild src/main/index.ts --bundle --platform=node --external:electron --outfile=dist-electron/main/index.js",
"build:preload": "esbuild src/preload.ts --bundle --platform=neutral --outfile=dist-electron/preload.js --external:electron --format=cjs",
"build": "pnpm run build:preload && pnpm run build:main && vite build",
"dev": "pnpm run build:preload && pnpm run build:main && vite",
"start:electron": "pnpm run build:preload && pnpm run build:main && electron dist-electron/main/index.js",
"generate-icons": "node scripts/generate-icons.mjs",
"dist": "pnpm run generate-icons && pnpm run build && electron-builder",
"dist:mac-x64": "pnpm run generate-icons && pnpm run build && electron-builder --mac --x64",
"dist:mac-arm64": "pnpm run generate-icons && pnpm run build && electron-builder --mac --arm64",
"dist:linux-x64": "pnpm run generate-icons && pnpm run build && electron-builder --linux --x64",
"dist:linux-arm64": "pnpm run generate-icons && pnpm run build && electron-builder --linux --arm64",
"dist:win-x64": "pnpm run generate-icons && pnpm run build && electron-builder --win --x64",Packaging is handled by electron-builder, with separate targets for macOS on both x64 and arm64, Linux on x64 and arm64, and Windows on x64. The generate-icons step runs a Node script under scripts before every packaging run, which suggests the icon set is produced rather than checked in as binary assets.
Linting, formatting and tests run on Node's own test runner
The toolchain is deliberately light. Formatting and linting are handled by oxlint and oxfmt, with a lint script that checks and a format script that fixes, and both are wired into the repository as configuration files at the top level. Tests run through Node's built-in test runner with type stripping enabled, meaning the test files are executed directly as JavaScript modules with TypeScript syntax removed at load time rather than through a separate compiler step. A separate typecheck tool sits in the dependency groups alongside stub packages for type hints, and a prepare hook installs simple-git-hooks so that commits are checked before they land. The repository root also carries a spell check dictionary, which lines up with the built-in spell check feature listed in the README, and a changelog generator configuration that produces release notes.
What is still missing: packaged installs, plugins and English documentation
Three gaps stand out. First, the README is written in Chinese and there is no English documentation page linked for usage; the docs directory exists in the repository but the README does not describe its contents. Second, the README does not document how an end user installs the editor, so the release tags on GitHub are the only distribution route the project points to, and even that is left implicit. Third, plugin extension is listed as still under way, and there is a separate repository entry named promptfolio_payload.json that suggests work in progress around content handling which the README never explains. The README also states plainly that the project is at an early development stage and points to a TODO list kept as issue 37, plus the issue tracker for ideas, which is the clearest signal about what is finished and what is not.
An MIT-licensed project with recent releases and a fresh last push
The licence is MIT, declared in both the README and the package manifest, so the code can be reused and modified under permissive terms as long as the notice is kept. Anyone shipping a fork should read the LICENSE file for the exact wording rather than trusting a summary. The repository is not archived, and the last push was on 2026-10-20, so the code is moving. Recent tags show v1.0.18 released on 2026-06-21, v1.0.17 on 2026-05-21 and v1.0.16 on 2026-05-20, a 1.0.x line with monthly movement rather than a stable long term release. The README is candid that the project is early and welcomes contributions through a contributing guide, with a TODO list and an issue tracker as the two entry points for people who want to help.
Editorial conclusion
milkup is worth a look for writers who want a Typora style instant rendering editor on Windows, macOS or Linux and are willing to build it from source with pnpm. It is not a fit for anyone who wants a packaged installer today or a working plugin ecosystem, since the README leaves plugin extension as in progress and gives no download instructions. Check first that the instant rendering engine produces the Markdown dialect you actually write, and read the TODO list kept as issue 37 to see whether the gap that matters to you is still open.
Frequently asked questions
What is milkup and what does it do?
milkup is a cross-platform desktop Markdown editor for Windows, macOS and Linux, built with Electron, Vue and a self developed instant rendering engine, with a source editing mode alongside the rendered view.
How do I install milkup?
The README does not document an install path for end users. From the repository, the manifest sets a preinstall hook that allows only pnpm, requires Node.js 20.17.0 or newer, and the dev script builds the preload and main bundles before starting Vite.
Does milkup support plugins and themes?
Themes are described as supported, including a theme editor with import and export. Plugin extension is listed as under way rather than finished, so plugin support should be treated as incomplete.
Which platforms can milkup be packaged for?
The README states cross-platform support for Windows, macOS and Linux, and the packaging scripts provide electron-builder targets for macOS x64 and arm64, Linux x64 and arm64, and Windows x64.