A self-hosted, file-based Markdown editor
Markoun is a lightweight, self-hosted, and entirely file-based Markdown editor designed for users who prioritize privacy and simplicity.
The UI layout of Markoun is inspired by Haptic and Obsidian — both excellent Markdown editing tools.
-
Clean UI: Minimal interface with smooth animations and complete core editing features
-
File-Based Architecture: Works directly on local files — no database, no indexing, fully portable
-
LaTeX support: Live Markdown preview with built-in LaTeX support
-
Image Upload: Supports file upload and
Ctrl + Vclipboard image paste -
Rich Configuration: Flexible config.yaml options for logging, authentication, and file control
You can deploy Markoun using Docker:
export MARKOUN_PORT=10000
export MARKOUN_ROOT=./
touch ${MARKOUN_ROOT:-./}/config.yaml
docker run -itd --name markoun \
--restart unless-stopped \
-p ${MARKOUN_PORT:-10000}:80 \
-v ${MARKOUN_ROOT:-$(pwd)}/data:/app/data \
-v ${MARKOUN_ROOT:-$(pwd)}/config.yaml:/app/config.yaml \
tropicalalgae/markoun:latest
Then run docker logs -f markoun to check the logs for the default administrator password.
You can also create a new regular user from the homepage.
| Path | Description |
|---|---|
/app/data |
Directory where Markdown files are stored. |
/app/config.yaml |
Main configuration file. |
Markoun is configured via a config.yaml file. Below are some important options:
| Key | Description | Default |
|---|---|---|
DEBUG |
Enables/disable debug-level logging for the backend service. | false |
ACCESS_TOKEN_DEFAULT_EXPIRE_MINUTES |
Standard Session Lifetime: Duration (in minutes) a user remains logged in before the session expires. | 1440 |
ACCESS_TOKEN_EXTENDED_EXPIRE_MINUTES |
Persistent Session Lifetime: Duration (in minutes) for users who select "Remember Me" during login. | 43200 |
DISPLAYED_FILE_TYPES |
File Filter: A list of file extensions that the editor is permitted to display. | ["md", "png", "jpg", "jpeg", "bmp", "svg"] |
For more configurable options, see config.py
Relative Image Paths: When inserting images into a Markdown file, image paths are generated relative to the Markdown file’s location — not the project root. This ensures portability and correct rendering even if folders are moved.
Rename by Long Press: Long-press on a file or folder name in the sidebar to rename it.
File Visibility Rules: By default, the sidebar displays only Markdown files and common image formats. To show additional file types, modify DISPLAYED_FILE_TYPES in config.yaml.
System configuration: The administrator can enable or disable user registration in the settings section of the sidebar.
- Image security: static image routes currently lack authentication checks
- File system architecture: design can be further optimized
- UI polish: incomplete animation feedback and styling inconsistencies
- Frontend refactoring: codebase requires further optimization
- File synchronization: support syncing files with a remote source
- Version management: introduce file versioning with history tracking and restore capability
This project is licensed under the MIT License.

