Thoughts that pile up lightly, tidy Markdown notes
A local-first, minimal Markdown note app for Android
English · 한국어 · 日本語 · Deutsch · Español · Français
GitHub repository · Discussions (feedback) · GitLab public mirror
/ quick insert → plain Markdown → live preview
Tablet 3-pane — tag rail · note list · editor on one screen
Markleaf is an Android Markdown note app designed to strip away the clutter so you can focus on just two things: capturing and organizing. Your data is stored only on your device, and standard Markdown guarantees full ownership and portability. Even sync happens only through a folder you choose — Markleaf itself never goes online.
View the branding page · Current version: v2.32.0 · Privacy Policy · F-Droid · Google Play
/Quick Insert — search commands at the start of a line to insert headings, lists, tables, callouts, wikilinks, images, and more as standard Markdown- Live Markdown preview — toggle instantly between editing and preview, or use the Show Markdown syntax option for live syntax coloring
- GFM tables / checkboxes / blockquotes / callouts (
> [!NOTE]…) — all rendered in preview - Code block syntax highlighting — token coloring for 10 languages: Kotlin, Java, Python, JavaScript/TypeScript, Bash, JSON, YAML, XML, SQL
- Footnote (
[^N]) ref ↔ def jump — tap the superscript to scroll smoothly to the definition - Image attachments + alt-text editing — kept as isolated copies in the app's internal storage (no media permission required)
- Smart Markdown formatting toggle — wrap the selection or the word around the cursor in Bold/Italic/Strikethrough/Inline Code, and tap again to cleanly unwrap text that's already wrapped
- Keyboard shortcuts — Ctrl/Cmd+B, I, K, Shift+S for bold, italic, link and strikethrough on a hardware keyboard
- Table of contents (TOC) — in preview mode, jump to H1–H3 headings to navigate long notes
- Serif / Sans font choice — switch the writing surface to a serif face for a book-like feel; code blocks always stay monospaced
- Focus mode / word, character & reading-time stats / find & replace within a note
- Tag-based classification + autocomplete — just write
#tagsin the body for automatic indexing, no folders; existing tags autocomplete as you type# - Wikilinks (
[[Title]]) + backlinks panel — autocomplete, and see at a glance what points to this note - Quick switcher (Ctrl+K) — Obsidian-style title substring jump
- SQLite FTS full-text search — fast, down to the body text
- Pin / archive / trash — trash asks once more before permanent deletion
- Folder mirror sync — mirrors each note as a title-named
.md/.txtfile to a folder you pick via SAF (Drive/Dropbox/Syncthing/OneDrive/NAS, etc.); rename a note and its file follows. Markleaf itself stays offline; sync is delegated to whatever external app syncs that folder - Import external
.md/.txtfiles — tap a file in your file manager or share one from another app to bring it in as a new note (the file name becomes the title when there's no heading). Tags in synced-in notes are recognized right away - Export individual / all notes as
.md - Send via the system share sheet
- Markleaf green theme + Material You toggle — Android 12+ system wallpaper colors optional
- Automatic dark mode — follows the system setting
- Tablet 3-pane layout — tag sidebar · note list · editor; tap a tag in the sidebar to filter the note list in place (note list still collapsible)
- UI in 6 languages — Korean / English / Spanish / Japanese / French / German resources
- Block screenshots / recent-apps preview option — for sensitive notes
Markleaf has no vault format of its own. Point it at a folder — including one that Obsidian, Logseq, or your text editor already opens — and it works on the files that are there.
- Plain files, already yours. One note is one
.md(or.txt) file. Drop existing files into the folder and Markleaf picks them up as notes the next time it comes to the foreground — no import step. - Your frontmatter survives. Markleaf adds a small YAML header (
markleaf_id, timestamps, pinned/archived) so it can match a file to a note across devices, and everything it does not recognize is carried back out byte-for-byte — the indented block lists Obsidian writes tags in, nested maps, comments and quoting all included. The header it adds is a strict subset of YAML that Obsidian, GitHub and VS Code all parse. - The same syntax you already write.
[[Wikilinks]]with a backlinks panel, inline#tags, GFM tables and checkboxes,> [!NOTE]callouts, and an Obsidian-styleCtrl+Kquick switcher. - Reconciles by itself, carefully. Changes made elsewhere are pulled in when Markleaf returns to the foreground (throttled to once a minute). An edit from another editor is seen even if that editor never touches Markleaf's frontmatter — the reconcile compares the body, not just the timestamp. A file only wins when it is genuinely newer; if both sides moved, the remote arrives as a separate note rather than overwriting your edits, and nothing is ever deleted automatically.
Important
Two things to know before you point Markleaf at a real vault.
- One folder, no subfolders. Markleaf reads the files directly inside the folder you pick and does not descend into subdirectories. A vault organized into nested folders will only meet Markleaf at its top level — by design, Markleaf organizes by tags instead of folders.
- Editing a note renames its file. Mirror filenames track the note title, so a file whose name differs from its heading gets renamed the first time you save it in Markleaf. Where
[[links]]in your vault point at the old filename, they will break.
If your vault is deeply foldered or link-heavy, point Markleaf at a separate folder and treat it as a mobile inbox you merge from, rather than as a second editor on the vault itself.
Markleaf follows current Android development standards with a modern, maintainable stack.
- UI: Jetpack Compose + Material 3 + Material You dynamic color
- Architecture: simple layered separation (core / data / domain / feature / ui) + Repository pattern
- Database: Room — SQLite-backed local persistence, FTS4 virtual tables for full-text search
- Markdown parser: commonmark-java (CommonMark 0.30 + GFM extensions: tables, strikethrough, task lists, footnotes, YAML frontmatter)
- Asynchronous: Kotlin Coroutines & Flow
- Storage Access Framework (SAF) — folder mirror sync + image attachments
- Image loading: Coil — F-Droid-friendly Apache 2.0
- DataStore Preferences — app settings
- Profile Installer 1.4.0 + Macrobenchmark — cold-start baseline profile measurement (326ms on a TB320FC)
- Testing: JUnit + Robolectric + Roborazzi visual regression tests (Linux goldens, threshold 0.005)
- CI: GitHub Actions + GitLab CI — independent builds and signed releases, launch-smoke, record-roborazzi
Markleaf uses the following layered structure for separation of concerns and testability.
com.markleaf.notes
├── core # shared core logic: markdown processing, attachments, sync
├── data # Room DB, entities, repository implementations (data source)
├── domain # models, repository interfaces (business logic)
├── feature # per-screen UI and ViewModels (presentation)
│ ├── editor # editor, find/replace, wikilink autocomplete, callouts, tables
│ ├── notes # note list, quick switcher, archive
│ ├── search # FTS full-text search
│ ├── tags # tag index
│ ├── trash # trash / permanent delete
│ └── settings # theme, sync folder, screenshot blocking, etc.
├── navigation # Jetpack Compose Navigation setup
└── ui # theme (Markleaf green / Material You), shared components
Note
Google Play updates are currently on hold. New versions won't be pushed to the Play Store until a Korean business-registration policy requirement for the solo developer is resolved. In the meantime, get the latest version from F-Droid, GitHub Releases, or GitLab Releases. (If you already installed it from the Play Store, it keeps working.)
- F-Droid (recommended): Markleaf on F-Droid — search in the F-Droid client or install via the link above. It uses the same signing key (SHA-256
0be97352…f91a), so updates continue seamlessly even if you sideloaded an APK from GitHub or GitLab Releases. - Direct APK install: download the APK from the GitHub v2.32.0 release, then run it on your Android device.
- Google Play: Markleaf on Google Play — updates are paused (see the note above). If you already have it, it keeps working, but get the latest version from F-Droid, GitHub, or GitLab.
If you'd like to build or contribute, follow these steps.
# Clone the repository
git clone https://github.com/jeiel85/markleaf-android.git
# Enter the project folder
cd markleaf-android
# Build and install
./gradlew installDebugMarkleaf's bug fixes mostly begin as somebody else's report. The people who wrote them are listed in THANKS.md.
Markleaf itself never goes to the network. Whether your data leaves the device is entirely your choice.
- ✅ No
android.permission.INTERNETdeclared — Markleaf makes no network requests itself - ✅ No Markleaf server / backend
- ✅ No analytics / ads / tracking / closed-source SDKs
- ✅
android:allowBackup="false"— Markleaf data is excluded from Android auto-backup / device transfer - ✅ Data only ever moves through OS paths when you export, share, open an external link, or pick a SAF folder
- ✅ Fully open source, auditable by anyone under Apache 2.0
How "never leaves your device" works exactly is documented in the Privacy Policy and the No-Cloud Certification.
- Basic Markdown editing and saving
- Tag-based filtering and search
- New app icon and branding
- Live Markdown preview and dark mode
- High-performance SQLite FTS search
- Tablet 2-pane layout optimization
- Single / all-note Markdown export
- v1.0.0 stable release
- v2.3 CommonMark parser — callouts, GFM strikethrough, task lists, footnotes, YAML frontmatter
- v2.4–2.5 Wikilinks (
[[Title]]) + autocomplete + backlinks panel - v2.6 Image attachments + alt text + lightbox
- v2.7 SAF folder mirror sync (Drive/Dropbox/Syncthing delegation, still no INTERNET)
- v2.8 Material You toggle + Markleaf green theme restored
- v2.9 Screenshot blocking option, visual regression testing (Roborazzi) established
- v2.10 Code block syntax highlighting (10 languages)
- v2.11 GFM table preview revived
- v2.12 Quick switcher (Ctrl+K)
- v2.13 Find / replace within a note
- v2.14 Footnote ref ↔ def click jump
- v2.15 F-Droid submission stabilization and no-cloud documentation
- v2.16 Home screen widget, biometric lock, open-source transparency, smart Markdown formatting
- v2.17 Open/share import of external
.md/.txtfiles, folder-sync duplicate-note and tag recognition fixes - v2.18 Folder-sync files named after the note title (rename follows) +
.md/.txtchoice - v2.19 Six sample notes on first launch + PDF/Markdown export no longer duplicates the title
- v2.20 Keyboard shortcuts,
#tagautocomplete, table of contents, serif font, tablet 3-pane (tag sidebar + in-place filter) layout - v2.21 Predictive back, polished transitions, list/card motion, foldable tablet tag rail, checklist toggles
- v2.22
/Quick Insert commands with touch, hardware-keyboard selection, and six localized menus - Google Play public launch — anyone can install it from the Play Store
This project is licensed under the Apache License 2.0. See the LICENSE file for details.
Made with ❤️ by Markleaf Team

