๊ฐ๋ณ๊ฒ ์์ด๋ ์๊ฐ, ์ ๋๋ Markdown ๋
ธํธ
Android์ฉ ๋ก์ปฌ ์ฐ์ (Local-first) ๋ฏธ๋๋ฉ Markdown ๋ฉ๋ชจ ์ฑ
Markleaf๋ ๊ตฐ๋๋๊ธฐ๋ฅผ ๋์ด๋ด๊ณ ์ค์ง '๊ธฐ๋ก'๊ณผ '์ ๋ฆฌ'์๋ง ์ง์คํ ์ ์๋๋ก ์ค๊ณ๋ Android Markdown ๋ฉ๋ชจ ์ฑ์ ๋๋ค. ๋น์ ์ ๋ฐ์ดํฐ๋ ์ค์ง ๋น์ ์ ๊ธฐ๊ธฐ์๋ง ์ ์ฅ๋๋ฉฐ, ํ์ค Markdown ํ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์์ ๊ถ๊ณผ ์ด์์ฑ์ ์๋ฒฝํ ๋ณด์ฅํฉ๋๋ค. ๋๊ธฐํ๋ ๋น์ ์ด ์ ํํ ํด๋ ๋ฅผ ํตํด์๋ง ์ผ์ด๋ฉ๋๋ค โ Markleaf ์์ฒด๋ ์ธํฐ๋ท์ ๋๊ฐ์ง ์์ต๋๋ค.
๋ธ๋๋ฉ ํ์ด์ง ๋ณด๊ธฐ ยท ํ์ฌ ๋ฒ์ : v2.16.2 ยท Privacy Policy ยท F-Droid ยท Google Play
- ์ค์๊ฐ Markdown ๋ฏธ๋ฆฌ๋ณด๊ธฐ โ ํธ์ง๊ณผ ์ฆ์ ์ ํ๋๋ ํ๋ฆฌ๋ทฐ, ๋๋ Show Markdown syntax ์ต์ ์ผ๋ก ๋ผ์ด๋ธ syntax ์ปฌ๋ฌ๋ง
- GFM ํ / ์ฒดํฌ๋ฐ์ค / ์ธ์ฉ๋ฌธ / ์ฝ์์ (
> [!NOTE]โฆ) โ ๋ชจ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ ๋๋ง - ์ฝ๋ ๋ธ๋ก syntax highlighting โ Kotlin, Java, Python, JavaScript/TypeScript, Bash, JSON, YAML, XML, SQL 10๊ฐ ์ธ์ด ํ ํฐ ์ปฌ๋ฌ๋ง
- ๊ฐ์ฃผ(
[^N]) ref โ def ์ ํ โ ์์ฒจ์๋ฅผ ํญํ๋ฉด ์ ์๋ก ๋ถ๋๋ฝ๊ฒ ์คํฌ๋กค - ์ด๋ฏธ์ง ์ฒจ๋ถ + alt ํ ์คํธ ํธ์ง โ ์ฑ ๋ด๋ถ ์ ์ฅ์์ ๊ฒฉ๋ฆฌ๋ ์ฌ๋ณธ์ผ๋ก ๋ณด๊ด (๋ฏธ๋์ด ๊ถํ ๋ถํ์)
- ์ค๋งํธ Markdown ํฌ๋งทํ ํ ๊ธ โ ์ ํ ์์ญ ๋๋ ์ปค์ ์ฃผ๋ณ ๋จ์ด๋ฅผ Bold/Italic/Strike/Inline Code๋ก ๊ฐ์ธ๊ณ , ์ด๋ฏธ ๊ฐ์ธ์ง ํ ์คํธ๋ ํ ๋ฒ ๋ ๋๋ฌ ์์ฐ์ค๋ฝ๊ฒ ํด์
- ํฌ์ปค์ค ๋ชจ๋ / ๋จ์ดยท๊ธ์ยท์ฝ๊ธฐ ์๊ฐ ํต๊ณ / ๋ ธํธ ์์์ ์ฐพ๊ธฐยท๋ฐ๊พธ๊ธฐ
- ํ๊ทธ ๊ธฐ๋ฐ ๋ถ๋ฅ โ ๋ณธ๋ฌธ์
#ํ๊ทธ๋ง ์ฐ๋ฉด ์๋ ์ธ๋ฑ์ฑ, ํด๋ ์์ - Wikilinks (
[[Title]]) + ๋ฐฑ๋งํฌ ํจ๋ โ ์๋ ์์ฑ, ๋๊ฐ ์ด ๋ ธํธ๋ฅผ ๊ฐ๋ฆฌํค๋์ง ํ๋์ - ๋น ๋ฅธ ์ด๋ (Quick switcher / Ctrl+K) โ Obsidian ์คํ์ผ ์ ๋ชฉ substring ์ ํ
- SQLite FTS ๊ธฐ๋ฐ ์ ๋ฌธ ๊ฒ์ โ ๋ณธ๋ฌธ๊น์ง ๋น ๋ฅด๊ฒ
- ํ / ์์นด์ด๋ธ / ํด์งํต โ ํด์งํต์ ์๊ตฌ ์ญ์ ์ ์ ํ ๋ฒ ๋ ๋ฌป์ต๋๋ค
- ํด๋ ๋ฏธ๋ฌ ๋๊ธฐํ โ SAF๋ก ์ฌ์ฉ์๊ฐ ์ ํํ ํด๋(Drive/Dropbox/Syncthing/OneDrive/NAS ๋ฑ)์ ๊ฐ ๋
ธํธ๋ฅผ
.mdํ์ผ๋ก ๋ฏธ๋ฌ๋ง. Markleaf ์์ฒด๋ ์ธํฐ๋ท์ ์ ๋๊ฐ๊ณ , ๋๊ธฐํ๋ ์ธ๋ถ ์ฑ์ด ๊ทธ ํด๋๋ฅผ ๋๊ธฐํํ๋ ๋ฐฉ์ ์ผ๋ก ์์ - ๊ฐ๋ณ / ์ ์ฒด ๋
ธํธ
.md๋ด๋ณด๋ด๊ธฐ - ์์คํ ๊ณต์ ์ํธ๋ก ๋ณด๋ด๊ธฐ
- Markleaf ๋ น์ ํ ๋ง + Material You ํ ๊ธ โ ์๋๋ก์ด๋ 12+ ์์คํ ์ํ์ดํผ ์์๋ ์ต์
- ์๋ ๋คํฌ ๋ชจ๋ โ ์์คํ ์ค์ ๋ฐ๋ผ
- ํ๋ธ๋ฆฟ 2-Pane ๋ ์ด์์ ์ต์ ํ โ ์ ๊ณ ํด๊ธฐ ๊ฐ๋ฅํ ๋ ธํธ ๋ชฉ๋ก
- 6๊ฐ ์ธ์ด UI โ ํ๊ตญ์ด / ์์ด / ์คํ์ธ์ด / ์ผ๋ณธ์ด / ํ๋์ค์ด / ๋ ์ผ์ด ๋ฆฌ์์ค ์ด์
- ์คํฌ๋ฆฐ์ท / ์ต๊ทผ ์ฑ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ฐจ๋จ ์ต์ โ ๋ฏผ๊ฐํ ๋ ธํธ์ฉ
Markleaf๋ ์ต์ Android ๊ฐ๋ฐ ํ์ค์ ์ค์ํ๋ฉฐ, ์ ์ง๋ณด์๊ฐ ์ฉ์ดํ ํ๋์ ์ธ ์คํ์ ์ฌ์ฉํฉ๋๋ค.
- UI: Jetpack Compose + Material 3 + Material You ๋ค์ด๋ด๋ฏน ์ปฌ๋ฌ
- Architecture: ๋จ์ํ ๋ ์ด์ด ๋ถ๋ฆฌ (core / data / domain / feature / ui) + Repository ํจํด
- Database: Room โ SQLite ๊ธฐ๋ฐ ๋ก์ปฌ ํผ์์คํด์ค, FTS4 ๊ฐ์ ํ ์ด๋ธ๋ก ์ ๋ฌธ ๊ฒ์
- Markdown ํ์: commonmark-java (CommonMark 0.30 + GFM ํ์ฅ: ํ, ์ทจ์์ , task lists, ๊ฐ์ฃผ, YAML frontmatter)
- Asynchronous: Kotlin Coroutines & Flow
- Storage Access Framework (SAF) โ ํด๋ ๋ฏธ๋ฌ ๋๊ธฐํ + ์ด๋ฏธ์ง ์ฒจ๋ถ
- ์ด๋ฏธ์ง ๋ก๋ฉ: Coil โ F-Droid ์นํ์ Apache 2.0
- DataStore Preferences โ ์ฑ ์ค์
- Profile Installer 1.4.0 + Macrobenchmark โ Cold start baseline profile ์ธก์ (TB320FC ๊ธฐ์ค 326ms)
- ํ ์คํธ: JUnit + Robolectric + Roborazzi ์๊ฐ ํ๊ท ํ ์คํธ (Linux ๊ณจ๋ , threshold 0.005)
- CI: GitHub Actions โ ๋น๋, ๋ฆด๋ฆฌ์ค(์๋ช ๋ APK + AAB), launch-smoke, record-roborazzi
Markleaf๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ํ ์คํธ ๊ฐ๋ฅ์ฑ์ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ ์ด์ด ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ค.
com.markleaf.notes
โโโ core # ๋งํฌ๋ค์ด ์ฒ๋ฆฌ, ์ฒจ๋ถ, ๋๊ธฐํ ๋ฑ ๊ณตํต ํต์ฌ ๋ก์ง
โโโ data # Room DB, Entity, Repository ๊ตฌํ์ฒด (Data Source)
โโโ domain # Model, Repository ์ธํฐํ์ด์ค (Business Logic)
โโโ feature # ํ๋ฉด๋ณ UI ๋ฐ ViewModel (Presentation)
โ โโโ editor # ํธ์ง๊ธฐ, Find/Replace, Wikilink ์๋์์ฑ, ์ฝ์์, ํ
โ โโโ notes # ๋
ธํธ ๋ชฉ๋ก, Quick Switcher, ์์นด์ด๋ธ
โ โโโ search # FTS ๊ธฐ๋ฐ ์ ๋ฌธ ๊ฒ์
โ โโโ tags # ํ๊ทธ ์ธ๋ฑ์ค
โ โโโ trash # ํด์งํต / ์๊ตฌ ์ญ์
โ โโโ settings # ํ
๋ง, ๋๊ธฐํ ํด๋, ์คํฌ๋ฆฐ์ท ์ฐจ๋จ ๋ฑ
โโโ navigation # Jetpack Compose Navigation ์ค์
โโโ ui # ํ
๋ง(Markleaf green / Material You), ๊ณตํต ์ปดํฌ๋ํธ
- F-Droid: Markleaf on F-Droid โ F-Droid ํด๋ผ์ด์ธํธ์์ ๊ฒ์ํ๊ฑฐ๋ ์ ๋งํฌ๋ก ๋ฐ๋ก ์ค์นํ ์ ์์ต๋๋ค. ๋์ผ ์๋ช
ํค(SHA-256
0be97352โฆf91a)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก GitHub Releases APK๋ก ์ฌ์ด๋๋ก๋ํ ๊ฒฝ์ฐ์๋ ๋๊น ์์ด ์ ๋ฐ์ดํธ๊ฐ ์ด์ด์ง๋๋ค. - Google Play: Markleaf on Google Play โ Play Store์์ ์ ์ ๋ฐฐํฌ๋๋ ๋ฒ์ ์ ์ค์นํฉ๋๋ค.
- APK ์ง์ ์ค์น: v2.16.2 Release ๋๋ Releases ํ์ด์ง์์ ์ต์ ๋ฒ์ ์ APK๋ฅผ ๋ค์ด๋ก๋ํ ๋ค Android ๊ธฐ๊ธฐ์์ ์คํํด ์ค์นํฉ๋๋ค.
์ง์ ๋น๋ํ๊ฑฐ๋ ๊ธฐ์ฌํ๊ณ ์ถ๋ค๋ฉด ๋ค์ ๊ณผ์ ์ ๋ฐ๋ฅด์ธ์.
# ์ ์ฅ์ ๋ณต์
git clone https://github.com/jeiel85/markleaf-android.git
# ํ๋ก์ ํธ ํด๋ ์ด๋
cd markleaf-android
# ๋น๋ ๋ฐ ์ค์น
./gradlew installDebugMarkleaf ์์ฒด๋ ์ ๋๋ก ๋คํธ์ํฌ์ ๋๊ฐ์ง ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๊ธฐ ๋ฐ์ผ๋ก ๋ณด๋ผ์ง ์ฌ๋ถ๋ ์ ์ ์ผ๋ก ๋น์ ์ ์ ํ ์ ๋๋ค.
- โ
android.permission.INTERNET๊ถํ ์ ์ธ ์์ โ Markleaf๋ ๋คํธ์ํฌ ์์ฒญ์ ์ง์ ์ํํ์ง ์์ต๋๋ค - โ Markleaf ์์ฒด ์๋ฒ / ์์ฒด ๋ฐฑ์๋ ์์
- โ ๋ถ์ / ๊ด๊ณ / ์ถ์ / ํ์ํ SDK ์์
- โ
android:allowBackup="false"โ Android ์๋ ๋ฐฑ์ / ๊ธฐ๊ธฐ ๊ฐ ์ ์ก์์ Markleaf ๋ฐ์ดํฐ ์ ์ธ - โ ์ฌ์ฉ์๊ฐ ์ง์ export, share, ์ธ๋ถ ๋งํฌ ์ด๊ธฐ, SAF ํด๋ ์ ํ์ ์ํํ ๋๋ง OS ๊ฒฝ๋ก๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์ด๋
- โ ์์ ํ ์คํ์์ค, Apache 2.0 ๋ผ์ด์ ์ค๋ก ๋๊ตฌ๋ ๊ฐ์ฌ ๊ฐ๋ฅ
"never leaves your device" ๊ฐ ์ด๋ป๊ฒ ์ ํํ ์๋ํ๋์ง๋ Privacy Policy ์ No-Cloud Certification ์ ์ ๋ฆฌ๋์ด ์์ต๋๋ค.
- ๊ธฐ๋ณธ์ ์ธ Markdown ํธ์ง ๋ฐ ์ ์ฅ
- ํ๊ทธ ๊ธฐ๋ฐ ํํฐ๋ง ๋ฐ ๊ฒ์
- ์๋ก์ด ์ฑ ์์ด์ฝ ๋ฐ ๋ธ๋๋ฉ ์ ์ฉ
- ์ค์๊ฐ ๋งํฌ๋ค์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ๋คํฌ ๋ชจ๋
- SQLite FTS ๊ธฐ๋ฐ ๊ณ ์ฑ๋ฅ ๊ฒ์
- ํ๋ธ๋ฆฟ์ฉ 2-Pane ๋ ์ด์์ ์ต์ ํ
- ๋จ์ผ/์ ์ฒด ๋ ธํธ Markdown ๋ด๋ณด๋ด๊ธฐ
- v1.0.0 ์ ์ ์ถ์ ์๋ฃ
- v2.3 CommonMark ํ์ ๋์ โ ์ฝ์์, GFM ์ทจ์์ , task lists, ๊ฐ์ฃผ, YAML frontmatter
- v2.4โ2.5 Wikilinks (
[[Title]]) + ์๋ ์์ฑ + ๋ฐฑ๋งํฌ ํจ๋ - v2.6 ์ด๋ฏธ์ง ์ฒจ๋ถ + alt ํ ์คํธ + ๋ผ์ดํธ๋ฐ์ค
- v2.7 SAF ํด๋ ๋ฏธ๋ฌ ๋๊ธฐํ (Drive/Dropbox/Syncthing ์์ํ, no INTERNET ์ ์ง)
- v2.8 Material You ํ ๊ธ + Markleaf ๋ น์ ํ ๋ง ๋ณต์
- v2.9 ์คํฌ๋ฆฐ์ท ์ฐจ๋จ ์ต์ , ์๊ฐ ํ๊ท ํ ์คํธ(Roborazzi) ์ ์ฐฉ
- v2.10 ์ฝ๋ ๋ธ๋ก syntax highlighting (10๊ฐ ์ธ์ด)
- v2.11 GFM ํ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ถํ
- v2.12 ๋น ๋ฅธ ์ด๋(Quick Switcher / Ctrl+K)
- v2.13 ๋ ธํธ ์์์ ์ฐพ๊ธฐ / ๋ฐ๊พธ๊ธฐ
- v2.14 ๊ฐ์ฃผ ref โ def ํด๋ฆญ ์ ํ
- v2.15 F-Droid ์ ์ถ ์์ ํ์ no-cloud ๋ฌธ์ ์ ๋น
- v2.16 ํ ํ๋ฉด ์์ ฏ, ์์ฒด ์ธ์ฆ ์ ๊ธ, ์คํ์์ค ํฌ๋ช ์ฑ, ์ค๋งํธ Markdown ํฌ๋งทํ
- Google Play ์ ์ ์ถ์ (ํ์ฌ ๋น๊ณต๊ฐ ํ ์คํธ ์ค)
์ด ํ๋ก์ ํธ๋ Apache License 2.0์ ๋ฐ๋ผ ๋ผ์ด์ ์ค๊ฐ ๋ถ์ฌ๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ LICENSE ํ์ผ์ ํ์ธํ์ธ์.
Made with โค๏ธ by Markleaf Team