mo is a Markdown viewer that opens .md files in a browser.
- GitHub-flavored Markdown (tables, task lists, footnotes, etc.)
- Syntax highlighting (Shiki)
- Mermaid diagram rendering
Dark /
light theme
File grouping
Table of contents panel
Flat /
tree sidebar view with drag-and-drop reorder and file search
- YAML frontmatter display (collapsible metadata block)
- MDX file support (renders as Markdown, strips
import/export, escapes JSX tags) Raw markdown view
Copy content (Markdown / Text / HTML)
Server restart with session preservation
- Auto session backup and restore
- Live-reload on save
homebrew tap:
$ brew install k1LoW/tap/momanually:
Download binary from releases page
$ mo README.md # Open a single file
$ mo README.md CHANGELOG.md docs/*.md # Open multiple files
$ mo spec.md --target design # Open in a named groupmo opens Markdown files in a browser with live-reload. When you save a file, the browser automatically reflects the changes.
By default, mo runs a single server on port 6275. If a server is already running on the same port, subsequent mo invocations add files to the existing session instead of starting a new one.
$ mo README.md # Starts a mo server in the background
$ mo CHANGELOG.md # Adds the file to the running mo serverTo run a completely separate session, use a different port:
$ mo draft.md -p 6276Files can be organized into named groups using the --target (-t) flag. Each group gets its own URL path and sidebar.
$ mo spec.md --target design # Opens at http://localhost:6275/design
$ mo api.md --target design # Adds to the "design" group
$ mo notes.md --target notes # Opens at http://localhost:6275/notesUse --watch (-w) to specify glob patterns. Matching files are opened automatically, and watched directories are monitored for new files.
$ mo --watch '**/*.md' # Watch and open all .md files recursively
$ mo --watch 'docs/**/*.md' --target docs # Watch docs/ tree in "docs" group
$ mo --watch '*.md' --watch 'docs/**/*.md' # Multiple patterns--watch cannot be combined with file arguments. The ** pattern matches directories recursively.
Use --unwatch to stop watching a previously registered pattern. Files already added remain in the sidebar.
$ mo --unwatch '**/*.md' # Stop watching a pattern (default group)
$ mo --unwatch 'docs/**/*.md' --target docs # Stop watching in a specific group
$ mo --unwatch '/Users/you/project/**/*.md' # Stop watching by absolute pathPatterns are resolved to absolute paths before matching, so you can specify either a relative glob or the full path shown by --status.
The sidebar supports flat and tree view modes. Flat view shows file names only, while tree view displays the directory hierarchy.
| Flat | Tree |
|---|---|
mo runs in the background by default — the command returns immediately, leaving the shell free for other work. This makes it easy to incorporate into scripts, tool chains, or LLM-driven workflows.
$ mo README.md
mo: serving at http://localhost:6275 (pid 12345)
$ # shell is available immediatelyUse --status to check all running mo servers, and --shutdown to stop one:
$ mo --status # Show all running mo servers
http://localhost:6275 (pid 12345, v0.12.0)
default: 5 file(s)
watching: /Users/you/project/src/**/*.md, /Users/you/project/*.md
docs: 2 file(s)
watching: /Users/you/project/docs/**/*.md
$ mo --shutdown # Shut down the mo server on the default port
$ mo --shutdown -p 6276 # Shut down the mo server on a specific port
$ mo --restart # Restart the mo server on the default portIf you need the mo server to run in the foreground (e.g. for debugging), use --foreground:
$ mo --foreground README.mdClick the restart button (bottom-right corner) or run
mo --restart to restart the mo server process. The current session — all open files and groups — is preserved across the restart. This is useful when you have updated the mo binary and want to pick up the new version without re-opening your files.
mo automatically saves session state (open files and watch patterns per group) when files are added or removed. When starting a new server, the previous session is automatically restored and merged with any files specified on the command line. Restored session entries appear first, followed by newly specified files.
$ mo README.md CHANGELOG.md # Start with two files
$ mo --shutdown # Shut down the server
$ mo # Restores README.md and CHANGELOG.md
$ mo TODO.md # Restores previous session + adds TODO.mdUse --clear to remove a saved session:
$ mo --clear # Clear saved session for the default port
$ mo --clear -p 6276 # Clear saved session for a specific port| Flag | Short | Default | Description |
|---|---|---|---|
--target |
-t |
default |
Group name |
--port |
-p |
6275 |
Server port |
--open |
Always open browser | ||
--no-open |
Never open browser | ||
--status |
Show all running mo servers | ||
--watch |
-w |
Glob pattern to watch for matching files (repeatable) | |
--unwatch |
Remove a watched glob pattern (repeatable) | ||
--shutdown |
Shut down the running mo server | ||
--restart |
Restart the running mo server | ||
--clear |
Clear saved session for the specified port | ||
--foreground |
Run mo server in foreground |
Requires Go and pnpm.
$ make build- yusukebe/gh-markdown-preview: GitHub CLI extension to preview Markdown looks like GitHub.