# FlareMo ๐Ÿ”ฅ

์„œ๋ฒ„ ์ œ๋กœ ยท ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ์ œ๋กœ ยท 24์‹œ๊ฐ„ ๊ธ€๋กœ๋ฒŒ ์—ฃ์ง€ ์ƒ์‹œ ๊ฐ€๋™ ยท ์™„์ „ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์œ ๊ถŒ
๊ฐœ์ธ์—๊ฒŒ๋Š” ์กฐ์šฉํ•˜๊ณ  ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๊ฐ ๊ธฐ๋ก ๊ณต๊ฐ„์ด์ž ์ œ2์˜ ๋‡Œ, ํŒ€์—๊ฒŒ๋Š” ์„ธ๋ฐ€ํ•œ ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ๊ฐ–์ถ˜ ๊ณต์œ  ์ง€์‹ ๋ฒ ์ด์Šค.

English โ€ข ็ฎ€ไฝ“ไธญๆ–‡ โ€ข ๆ—ฅๆœฌ่ชž โ€ข Franรงais โ€ข Espaรฑol โ€ข ํ•œ๊ตญ์–ด โ€ข ะ ัƒััะบะธะน โ€ข ุงู„ุนุฑุจูŠุฉ

GitHub stars License Cloudflare Workers Memos Compatible Better Auth Website

| โ˜€๏ธ ๋ฐ์Šคํฌํ†ฑ ยท ๋ผ์ดํŠธ ๋ชจ๋“œ | ๐ŸŒ™ ๋ฐ์Šคํฌํ†ฑ ยท ๋‹คํฌ ๋ชจ๋“œ | ๐Ÿ“ฑ ๋ชจ๋ฐ”์ผ ยท ๋ฐ˜์‘ํ˜• | | :---: | :---: | :---: | | FlareMo ๋ฐ์Šคํฌํ†ฑ ๋ผ์ดํŠธ ๋ชจ๋“œ | FlareMo ๋ฐ์Šคํฌํ†ฑ ๋‹คํฌ ๋ชจ๋“œ | FlareMo ๋ชจ๋ฐ”์ผ ํ™”๋ฉด | ์‹ค์ œ ์šด์˜ ํ™”๋ฉด ์Šคํฌ๋ฆฐ์ƒท: ๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ ๋งค๋„๋Ÿฌ์šด ์ „ํ™˜๊ณผ ๋ชจ๋ฐ”์ผ ์™„์ „ ๋ฐ˜์‘ํ˜•. ํ™”๋ฉด์— ๋ณด์ด๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ธฐ๋Šฅ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
--- ## ๐Ÿ’ก ์™œ FlareMo์ธ๊ฐ€? Flomo์™€ Memos ๊ฐ™์€ ๋„๊ตฌ๋“ค์€ ๋ถ€๋‹ด ์—†๋Š” ๋ฉ”๋ชจ ๊ธฐ๋ก๊ณผ ๋ฐฉํ•ด๋ฐ›์ง€ ์•Š๋Š” ํƒ€์ž„๋ผ์ธ์ด ์ง€๋‹Œ ํฐ ๊ฐ€์น˜๋ฅผ ์ฆ๋ช…ํ•ด ์™”์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ „ํ†ต์ ์ธ ๋…ธํŠธ ํ™˜๊ฒฝ์„ ์ž์ฒด ํ˜ธ์ŠคํŒ…ํ•˜๋ ค๋ฉด VPS ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๊ณ , Docker์™€ PostgreSQL์„ ์„ค์ •ํ•˜๊ณ , ์ž๋™ ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑยท๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋””์Šคํฌ๋‚˜ ํ•˜๋“œ์›จ์–ด ๊ณ ์žฅ์„ ๊ฑฑ์ •ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. FlareMo๋Š” ๋” ๋‹จ์ˆœํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•ฉ๋‹ˆ๋‹ค: **๋ฌด๋ฃŒ Cloudflare ๊ณ„์ • ํ•˜๋‚˜๋งŒ์œผ๋กœ, ์„œ๋ฒ„ ์œ ์ง€๋ณด์ˆ˜ ์—†์ด 24์‹œ๊ฐ„ ์˜จ๋ผ์ธ์œผ๋กœ ์‚ด์•„์žˆ๊ณ  ์ „ ์„ธ๊ณ„์—์„œ ๊ฐ€์†๋˜๋Š” ์ง€์‹ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์„๊นŒ?** - **์ง„์ •ํ•œ ์„œ๋ฒ„๋ฆฌ์Šค**: ์ฝ”๋“œ์™€ ์ •์  ์ž์‚ฐ ๋ชจ๋‘ ์‚ฌ์šฉ์ž ๋ฐ”๋กœ ๊ทผ์ฒ˜์˜ Cloudflare Workers ์—ฃ์ง€ ๋…ธ๋“œ์—์„œ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„ ์ง€์—ฐ์œผ๋กœ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. - **๊ธฐ๋ณธ ๊ฐ–์ถฐ์ง„ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋‚ด๊ตฌ์„ฑ**: Cloudflare D1์ด ๋ฉ”๋ชจ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , Cloudflare R2๊ฐ€ ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ๋ณต์ œ๋กœ ๋ฏธ๋””์–ด ์ฒจ๋ถ€ํŒŒ์ผ์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. - **AI ๋„ค์ดํ‹ฐ๋ธŒ ์ œ2์˜ ๋‡Œ**: Agent Memory ํ—ˆ๋ธŒ์— CLI์™€ ํฌ๋กœ์Šค ์—์ด์ „ํŠธ ์Šคํ‚ฌ์ด ๋‚ด์žฅ๋˜์–ด, AI ์—์ด์ „ํŠธ(Claude, Cursor, Codex, ChatGPT, ZCode)๊ฐ€ ์žฅ๊ธฐ ์„ ํ˜ธ๋„์™€ ๊ธฐ์–ต ๋ฒ”์œ„๋ฅผ ์ฝ๊ณ  ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. MCP ์—”๋“œํฌ์ธํŠธ๋„ ํ•จ๊ป˜ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. - **ํ˜ผ์ž์„œ๋Š” ์กฐ์šฉํžˆ, ํ•จ๊ป˜๋ผ๋ฉด ๊ฐ•๋ ฅํ•˜๊ฒŒ**: ๊ธฐ๋ณธ๊ฐ’์€ ์•”ํ˜ธํ™”๋œ ๋น„๊ณต๊ฐœ 1์ธ์šฉ ์•ˆ์‹์ฒ˜์ž…๋‹ˆ๋‹ค. ํŒ€ ๋ชจ๋“œ๋ฅผ ์ผœ๋ฉด ์—ญํ• ๊ณผ 3๋‹จ๊ณ„ ๊ณต๊ฐœ ๋ฒ”์œ„๋ฅผ ๊ฐ–์ถ˜ ํ˜‘์—… ๊ณต๊ฐ„์œผ๋กœ ์ฆ‰์‹œ ๋ฐ”๋€๋‹ˆ๋‹ค. - **์‹ฌํ”Œํ•˜๋˜ ๋‹จ์ˆœํ•˜์ง€ ์•Š๊ฒŒ**: ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์กฐ์šฉํ•˜๊ณ  ๋ชจ๋“  ์ปจํŠธ๋กค์€ ์กด์žฌ ์ด์œ ๊ฐ€ ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค โ€” ์ฃผ์˜๋ฅผ ๋„๋Š” ์žฅ์‹๋„, ๋น ์ง„ ๊ธฐ๋Šฅ๋„ ์—†์Šต๋‹ˆ๋‹ค. --- ## โœจ ํ•ต์‹ฌ ๊ธฐ๋Šฅ ### 1. ์ฆ‰์„ ๊ธฐ๋ก & ์˜๊ฐ์„ ์ฃผ๋Š” ํšŒ๊ณ  - **๋ฐ€๋ฆฌ์ดˆ ๋งŒ์— ๊ธฐ๋ก**: ์นด๋“œํ˜• ํƒ€์ž„๋ผ์ธ, ํƒœ๊ทธ, Markdown/GFM, ์ด๋ฏธ์ง€ยท์˜ค๋””์˜ค ์ฒจ๋ถ€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ. - **๋ฒˆ๊ฐœ๊ฐ™์€ ๊ฒ€์ƒ‰**: SQLite FTS5 ์ „๋ฌธ ์ธ๋ฑ์‹ฑ๊ณผ ์ฟผ๋ฆฌ ์—ฐ์‚ฐ์ž ์ง€์› (`has:attachment`, `is:pinned`, `before:YYYY-MM-DD`, `after:YYYY-MM-DD`, `in:timeline|archive|trash`). - **์˜๋ฏธ ๊ธฐ๋ฐ˜ '์ฐพ๊ธฐ' (๋ฒกํ„ฐ ๊ฒ€์ƒ‰)**: Workers AI ์ž„๋ฒ ๋”ฉ๊ณผ Vectorize ํŒŒ์ƒ ๋ฒกํ„ฐ ์ธ๋ฑ์Šค๋ฅผ ๊ฒฐํ•ฉํ•ด ๋ฌธ๋งฅ์— ๋งž๋Š” ํšŒ์ƒ์„ ์ œ๊ณตํ•˜๋ฉฐ, D1 ๊ถŒํ•œ์„ ์žฌ๊ฒ€์ฆํ•˜๊ณ  ํ•„์š” ์‹œ FTS5๋กœ ๋งค๋„๋Ÿฝ๊ฒŒ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. - **์ƒ๊ฐ ํ™œ์„ฑํ™”**: ๋‚ด์žฅ **๋ฐ์ผ๋ฆฌ ๋ฆฌ๋ทฐ**(๊ณผ๊ฑฐ์˜ ์˜ค๋Š˜), **๋žœ๋ค ์›Œํฌ**(ํƒœ๊ทธยท๋ฐฑ๋งํฌ ๊ทธ๋ž˜ํ”„๋ฅผ ํƒํ—˜ํ•˜๋ฉฐ ์—ฝ์„œ ์š”์•ฝ ์ˆ˜์ง‘), ๊ด€๋ จ ๋…ธํŠธ ์ถ”์ฒœ. - **๋ฒ„์ „ ์ด๋ ฅ**: ์ „์ฒด ๋ฒ„์ „ diff ๋น„๊ต์™€ ํด๋ฆญ ํ•œ ๋ฒˆ์œผ๋กœ ๊ณผ๊ฑฐ ๋ฒ„์ „ ๋ณต์›. ### 2. AI ์žฅ๊ธฐ ๊ธฐ์–ต (CLI + Skills) - **Agent Memory**: `flaremo` CLI์™€ `flaremo-memory` ์Šคํ‚ฌ์„ ๋™๋ด‰ โ€” AI ์—์ด์ „ํŠธ๊ฐ€ ๊ณต์šฉ REST ๊ธฐ๋ฐ˜์„ ํ†ตํ•ด ์„ธ์…˜์„ ๋„˜์–ด ์ด์–ด์ง€๋Š” ์žฅ๊ธฐ ๊ธฐ์–ต(์„ ํ˜ธ๋„, ํ”„๋กœ์ ํŠธ ๊ฒฐ์ •, ์ œ์•ฝ ์กฐ๊ฑด, ๊ตํ›ˆ)์„ ๊ธฐ๋กยท๊ฐฑ์‹ ํ•ฉ๋‹ˆ๋‹ค. - **Human in the loop**: `/memory` ํ™”๋ฉด์—์„œ AI๊ฐ€ ๊ธฐ๋กํ•œ ๊ธฐ์–ต์„ ๊ฒ€ํ† ํ•˜๊ณ , ํ™•์ธยท์ž ๊ธˆยท์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - **์—ด๋ฆฐ ์ƒํƒœ๊ณ„**: ๊ถŒ์žฅ ๊ฒฝ๋กœ๋Š” CLI + Skills์ด๋ฉฐ, ๊ธฐ์กด MCP ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•ด `/memory/mcp`(Streamable HTTP MCP)์™€ `/mcp` ์—”๋“œํฌ์ธํŠธ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ### 3. ํ”„๋กœ์ ํŠธ & ์ž‘์—… - **ํ”„๋กœ์ ํŠธ๋กœ ์ž‘์—… ๋ชจ์œผ๊ธฐ**: ๊ด€๋ จ ๋ฉ”๋ชจ์™€ ํ•  ์ผ์„ ํ”„๋กœ์ ํŠธ๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ƒํƒœ ์—ด์„ ๋“œ๋ž˜๊ทธ๋กœ ์˜ฎ๊ธฐ๋Š” ์นธ๋ฐ˜ ๋ณด๋“œ, ์šฐ์„ ์ˆœ์œ„, ์ˆ˜๋™ ์ •๋ ฌ, ๋งˆ๊ฐ์ผ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. - **๊ฐœ์ธ ์ „์šฉ, ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ์‚ญ์ œ**: ์ž‘์—…์€ ์†Œ์œ ์ž ํ•œ ์‚ฌ๋žŒ์˜ ์†Œ์œ ์ด๋ฉฐ, ์‚ญ์ œ ์‹œ ํœด์ง€ํ†ต์œผ๋กœ ์ด๋™ํ•ด ๋ณต์›ํ•˜๊ฑฐ๋‚˜ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์˜๊ตฌ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ### 4. ์ž‘์—… ๊ด€๋ฆฌ & ์•Œ๋ฆผ - **์ž‘์—…์€ ํ”„๋กœ์ ํŠธ ์•ˆ์—**: `/projects` ๋ณด๋“œ(์ƒํƒœ ์—ด ๊ฐ„ ๋“œ๋ž˜๊ทธ), ์šฐ์„ ์ˆœ์œ„, ์ˆ˜๋™ ์ •๋ ฌ, ๋งˆ๊ฐ์ผ ๋•๋ถ„์— ํ”„๋กœ์ ํŠธ ํŽ˜์ด์ง€๊ฐ€ ์ผ์ • ๊ด€๋ฆฌ์˜ ๋‹จ์ผํ•œ ํ™ˆ์ด ๋ฉ๋‹ˆ๋‹ค. - **์ผ์ •์ด ํ•œ๋ˆˆ์—**: ํƒ์ƒ‰๊ธฐ ํ™ˆ ํ™”๋ฉด์ด ๋ฏธ๋‹ˆ ์›”๊ฐ„ ์บ˜๋ฆฐ๋”์™€ ๊ธฐํ•œ ์ดˆ๊ณผ/์˜ค๋Š˜ ์•Œ๋ฆผ์„ ํ•จ๊ป˜ ๋ณด์—ฌ์ค˜, ๋งˆ๊ฐ์ด ๋ณด๋“œ ๋’ค์— ์ˆจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - **๊ธฐํ•œ ์ดˆ๊ณผ ์•Œ๋ฆผ**: ๊ธฐํ•œ์ด ์ง€๋‚œ ์ž‘์—…์€ ์•ฑ ๋‚ด ์•Œ๋ฆผ์„ ๋„์šฐ๊ณ , ๋ธŒ๋ผ์šฐ์ € ์›น ํ‘ธ์‹œ๋„ ์„ ํƒ์ ์œผ๋กœ ์ผค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### 5. ํŒ€ ํ˜‘์—… & 3๋‹จ๊ณ„ ๊ณต๊ฐœ ๋ฒ”์œ„ - **์—ญํ•  ๊ฑฐ๋ฒ„๋„Œ์Šค**: `owner`, `admin`, `member` ์—ญํ• . ๊ด€๋ฆฌ์ž๋Š” 1ํšŒ์šฉ ํ™œ์„ฑํ™” ๋งํฌ๋กœ ๋ฉค๋ฒ„๋ฅผ ์ดˆ๋Œ€ํ•˜๊ณ , ๋ฉค๋ฒ„๊ฐ€ ์ง์ ‘ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(๊ด€๋ฆฌ์ž๋Š” ํ‰๋ฌธ ์ž๊ฒฉ ์ฆ๋ช…์„ ์ ˆ๋Œ€ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค). - **3๋‹จ๊ณ„ ๊ณต๊ฐœ ๋ฒ”์œ„**: - ๐Ÿ”’ **๋น„๊ณต๊ฐœ**: ์ž‘์„ฑ์ž ๋ณธ์ธ๋งŒ ์—ด๋žŒ ๊ฐ€๋Šฅ. - ๐Ÿ‘ฅ **ํŒ€ ๊ณต๊ฐœ**: ํ™œ์„ฑ ํŒ€์›์—๊ฒŒ ์ฝ๊ธฐ ์ „์šฉ ๊ณต์œ . - ๐ŸŒ **์ „์ฒด ๊ณต๊ฐœ**: ๊ธฐํ•œ์ด ์žˆ๋Š” ๊ณต์œ  ๋งํฌ๋กœ ์ต๋ช… ์ฝ๊ธฐ ์ „์šฉ ์ ‘๊ทผ. - **์•ˆ์ „ํ•œ ๋ฉค๋ฒ„ ์ œ์™ธ**: ๋ฉค๋ฒ„ ์ œ๊ฑฐ ์‹œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ •๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜์–ด ๋น„๊ณต๊ฐœ ๋ฐ์ดํ„ฐ๋Š” ์™„์ „ํžˆ ์‚ญ์ œํ•˜๊ณ  ํŒ€ ๋ฐ ๊ณต๊ฐœ ๋ฉ”๋ชจ๋Š” ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค. - **๋ฆฌ๋” ์‹œํŠธ**: ๊ธฐํ•œ์ด ์žˆ๋Š” ์ฝ๊ธฐ ์ „์šฉ ์‹œํŠธ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ๊ฒŒ์ŠคํŠธ ๋…์ž, ๊ฐ•์˜ ์ˆ˜๊ฐ•์ƒ, ๊ณ ๊ฐ ๋‚ฉํ’ˆ ๋“ฑ. ์‹œํŠธ๋Š” ๋งŒ๋ฃŒ ์‹œ์ ์— ์ž๋™์œผ๋กœ ์ ‘๊ทผ์ด ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค(์ž๊ฒฉ ํ•ด์„ ์‹œ fail-closed, ํฌ๋ก  ๋ถˆํ•„์š”). ๋ฉค๋ฒ„ ํŽ˜์ด์ง€์—์„œ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, Personal Access Token์œผ๋กœ `PUT /api/app/admin/team/reader` ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ˜ธ์ถœํ•ด ์ด๋ฉ”์ผ๋กœ ๊ฐœํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(`docs/team-mode.md` ์ฐธ์กฐ). ### 6. ์˜คํ”„๋ผ์ธ ์šฐ์„  & PWA ๊ฒฝํ—˜ - **์„ค์น˜ํ˜• PWA**: macOS, Windows, iOS, Android ํ™ˆ ํ™”๋ฉด์— ์„ค์น˜ํ•ด ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ๊ฐ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - **์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”„๋ผ์ธ ๋™๊ธฐํ™”**: ์ดˆ์•ˆ์€ ์ฆ‰์‹œ ๋กœ์ปฌ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ์˜คํ”„๋ผ์ธ ์ƒํƒœ์˜ ์ œ์ถœ๊ณผ ์—…๋กœ๋“œ๋Š” ํ์— ์Œ“์˜€๋‹ค๊ฐ€ ์—ฐ๊ฒฐ์ด ๋ณต๊ตฌ๋˜๋ฉด ์ž๋™์œผ๋กœ ์žฌ์ƒ๋ฉ๋‹ˆ๋‹ค. - **์‹ค์‹œ๊ฐ„ ์Œ์„ฑ ๊ธฐ๋ก**: `/capture` ํŽ˜์ด์ง€์—์„œ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์Œ์„ฑ ์ธ์‹(ASR) ์ „์‚ฌ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ### 7. ๊ฐ•๋ ฅํ•œ Better Auth ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ - **Better Auth ๊ธฐ๋ฐ˜**: `HttpOnly`, `SameSite=Lax` ๋ธŒ๋ผ์šฐ์ € ์ฟ ํ‚ค ์„ธ์…˜๊ณผ, ์Šคํฌ๋ฆฝํŠธยทCLIยทMCP์šฉ์œผ๋กœ ํ๊ธฐ ๊ฐ€๋Šฅํ•œ `memos_pat_` Personal Access Token์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - **์—„๊ฒฉํ•œ Origin ๋ณดํ˜ธ**: ์ƒํƒœ ๋ณ€๊ฒฝ ์š”์ฒญ์—๋Š” ์ •ํ™•ํ•œ Origin ํ™”์ดํŠธ๋ฆฌ์ŠคํŠธ ๊ฒ€์ฆ์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค. Cloudflare Access๋Š” ์„ ํƒ์  ์™ธ๋ถ€ ๋ฐฉ์–ด์„ ์œผ๋กœ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### 8. Memos ํ˜ธํ™˜ & ๋งค๋„๋Ÿฌ์šด ์ด์ „ - **Memos `/api/v1` ํ˜ธํ™˜**: ํ•ต์‹ฌ Memos API ์—”๋“œํฌ์ธํŠธ(๊ธฐ๋ณธ camelCase, ํ—ค๋”๋กœ legacy snake_case)์™€ OpenAPI ์Šคํ‚ค๋งˆ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. - **์„œ๋“œํŒŒํ‹ฐ ์•ฑ ๋Œ€์‘**: Moe Memos ๊ฐ™์€ ๋ชจ๋ฐ”์ผ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ”๋กœ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - **์–‘๋ฐฉํ–ฅ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ**: Memos / flomo์—์„œ ์ถฉ๋Œ ์ฒ˜๋ฆฌ ์ „๋žต๊ณผ ํ•จ๊ป˜ ์›ํด๋ฆญ ๊ฐ€์ ธ์˜ค๊ธฐ, ์ „์ฒด ์›๋ณธ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฒˆ๋“ค์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. --- ### 9. ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ: ์นด๋“œ๋„ ํ”Œ๋Ÿฌ๊ทธ์ธ - **๊ธฐ๋ณธ ์นด๋“œ 5์žฅ**: Plain, Daily, Ticket, Postcard, ๊ทธ๋ฆฌ๊ณ  canvas๋กœ ๊ทธ๋ฆฌ๋Š” Postmark ๋ฐ๋ชจ. - **์Šคํ† ์–ด์™€ ํ๋ ˆ์ด์…˜**: ์„ค์ •์—์„œ ๋””๋ ‰ํ„ฐ๋ฆฌ ํƒ์ƒ‰, ์›ํด๋ฆญ ์„ค์น˜(SHA-256 ๊ฒ€์ฆ), ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”, ์ˆœ์„œ ๋ณ€๊ฒฝ, ๊ธฐ๋ณธ ์นด๋“œ ์ง€์ •, ์ˆจ๊ธฐ๊ธฐ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ณต์‹ ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” [flaremo.app/plugins](https://flaremo.app/plugins/registry.json)์— ์žˆ์Šต๋‹ˆ๋‹ค. - **์ง์ ‘ ์—…๋กœ๋“œ**: ๊ด€๋ฆฌ์ž๋Š” ๋กœ์ปฌ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค โ€” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์—๋งŒ ์กด์žฌํ•˜๋ฉฐ ์–ด๋””๋กœ๋„ ์ „์†ก๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - **์ œ์ž‘ ๋„๊ตฌ**: `pnpm plugin:new`๋กœ ์Šค์บํด๋”ฉํ•˜๊ณ , `pnpm plugin:check`๋Š” **์ธ์Šคํ„ด์Šค๊ฐ€ ์„ค์น˜ ์‹œ ๊ฐ•์ œํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ๊ทœ์น™**์œผ๋กœ ๊ฒ€์ฆํ•˜๋ฉฐ, `pnpm plugins:build`๋กœ ํŒจํ‚ค์ง•ํ•ฉ๋‹ˆ๋‹ค. document ์นด๋“œ๋Š” ์ˆœ์ˆ˜ JSON ๋ ˆ์ด์•„์›ƒ, sandbox ์นด๋“œ๋Š” ์ง์ ‘ ์ž‘์„ฑํ•œ HTML/CSS/JS๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ [ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ€์ด๋“œ](./docs/en/plugins.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. - **๊ธฐ๋ณธ์ด ์•ˆ์ „**: ์นด๋“œ๋Š” ๋ถˆํˆฌ๋ช… ์˜ค๋ฆฌ์ง„ ์ƒŒ๋“œ๋ฐ•์Šค์—์„œ **๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ์—†์ด** ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ/๋ธŒ๋žœ๋“œ ํŒฉ์€ ๊ด€๋ฆฌ์ž๊ฐ€ ์ผœ๊ธฐ ์ „๊นŒ์ง€ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ## ๐Ÿ“Š Cloudflare ๋ฌด๋ฃŒ ์ œ๊ณต๋Ÿ‰์€ ์–ผ๋งˆ๋‚˜ ๋„‰๋„‰ํ•œ๊ฐ€? '๋ฌด๋ฃŒ'๋Š” ๊ณง '๊ทน์‹ฌํ•œ ์ œํ•œ'์ด๋ผ๊ณ  ์—ฌ๊ธฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ…์ŠคํŠธ ์ค‘์‹ฌ์˜ ๊ฐœ์ธ ์ง€์‹ ๋ฒ ์ด์Šค์—๋Š” Cloudflare์˜ ๋ฌด๋ฃŒ ํ• ๋‹น๋Ÿ‰์ด ์‚ฌ์‹ค์ƒ ๋ฌดํ•œ๋Œ€์ž…๋‹ˆ๋‹ค: | ๋ฆฌ์†Œ์Šค | ๋ฌด๋ฃŒ ์ œ๊ณต๋Ÿ‰ | ํ™˜์‚ฐ ์šฉ๋Ÿ‰ | ์‹ค์ œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ธฐ๊ฐ„ | | :--- | :--- | :--- | :--- | | **Cloudflare D1** | **5 GB ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค** | ํ…์ŠคํŠธ ๋ฉ”๋ชจ ์•ฝ **250๋งŒ ๊ฐœ** | ๋งค์ผ 100๊ฐœ์”ฉ ์ž‘์„ฑํ•ด๋„ ์ฑ„์šฐ๋Š” ๋ฐ **68๋…„** ์†Œ์š” | | **Cloudflare R2** | **10 GB ์Šคํ† ๋ฆฌ์ง€** | ์‚ฌ์ง„ ์•ฝ **5,000โ€“10,000์žฅ** / ์Œ์„ฑ **80์‹œ๊ฐ„** | **์•„์›ƒ๋ฐ”์šด๋“œ ์š”๊ธˆ $0**; ๊ณต๊ฐœ ๊ณต์œ ๋กœ๋„ ๋Œ€์—ญํญ ์ฒญ๊ตฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ | | **Cloudflare Workers** | ๋„‰๋„‰ํ•œ ๋ฌด๋ฃŒ ์š”์ฒญ ํ•œ๋„ | ์ „ ์„ธ๊ณ„ 300๊ฐœ ์ด์ƒ ์—ฃ์ง€ ๋กœ์ผ€์ด์…˜ | ์ฝœ๋“œ ๋ถ€ํŠธ ์—†๋Š” ์ „ ์„ธ๊ณ„ ๋ฐ€๋ฆฌ์ดˆ ์‘๋‹ต | --- ## ๐ŸฅŠ ๋น„๊ต: Cloudflare ๋„ค์ดํ‹ฐ๋ธŒ vs ํ™ˆ NAS vs ์ „ํ†ต์  VPS | ๊ธฐ์ค€ | Cloudflare ๋„ค์ดํ‹ฐ๋ธŒ (FlareMo) | ํ™ˆ NAS / ๋ฏธ๋‹ˆ PC | ์ „ํ†ต์  VPS | | :--- | :--- | :--- | :--- | | **๋ฐ์ดํ„ฐ ๋‚ด๊ตฌ์„ฑ** | **์—”ํ„ฐํ”„๋ผ์ด์ฆˆ๊ธ‰ ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ๋ณต์ œ**, ํ•˜๋“œ์›จ์–ด ๊ณ ์žฅ ์œ„ํ—˜ ์ œ๋กœ | ๋‹จ์ผ ๋””์Šคํฌ ๊ณ ์žฅ์ด๋‚˜ ์ •์ „ ํ•œ ๋ฒˆ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ „์ฒด ์†์‹ค ๊ฐ€๋Šฅ | ์ˆ˜๋™ ์Šค๋ƒ…์ƒทยท๋ฐฑ์—… ๋ฃจํ‹ด์— ์˜์กด | | **์œ ์ง€๋ณด์ˆ˜** | **์ œ๋กœ**: OS ํŒจ์น˜๋„, Docker compose๋„, DB ๊ด€๋ฆฌ๋„ ์—†์Œ | OS ์—…๋ฐ์ดํŠธ, Docker ๊ด€๋ฆฌ, SMART ๋””์Šคํฌ ์•Œ๋ฆผ, ๋ผ์šฐํ„ฐ ์„ค์ • | ์ปค๋„ ์—…๊ทธ๋ ˆ์ด๋“œ, ๋ณด์•ˆ ํŒจ์น˜, ๊ฐ์‹œ ๋ฐ๋ชฌ ๊ด€๋ฆฌ | | **์ ‘์† ์ง€์—ฐ** | **๊ธ€๋กœ๋ฒŒ ์—ฃ์ง€ CDN**, ์–ด๋””์„œ๋‚˜ 100ms ๋ฏธ๋งŒ ์‘๋‹ต | DDNS / frp / Tailscale ํ„ฐ๋„ ํ•„์š”, ๊ฐ€์ •์šฉ ํšŒ์„  ์—…๋งํฌ์— ์ œ์•ฝ | ๋‹จ์ผ ํด๋ผ์šฐ๋“œ ๋ฆฌ์ „์— ์˜์กด, ๊ตญ๊ฒฝ ๊ฐ„ ์ง€์—ฐ ํผ | | **SSL & ๋„๋ฉ”์ธ** | **์ž๋™ HTTPS** ๋ฐ ์ปค์Šคํ…€ ๋„๋ฉ”์ธ ๋ฐ”์ธ๋”ฉ | ์ˆ˜๋™ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰, ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ • | Nginx / Caddy ์„ค์ •๊ณผ Let's Encrypt ๊ฐฑ์‹  ๊ด€๋ฆฌ | | **๋น„์šฉ** | ๋ฌด๋ฃŒ ํ‹ฐ์–ด์—์„œ **์›” $0** | ๋†’์€ ์ดˆ๊ธฐ ํ•˜๋“œ์›จ์–ด ๋น„์šฉ + ์ง€์†์ ์ธ ์ „๊ธฐ๋ฃŒ | ๋งค์›”/๋งค๋…„ ์ฒญ๊ตฌ๋˜๋Š” ์„œ๋ฒ„ยท๋Œ€์—ญํญ ๋น„์šฉ | --- ## ๐Ÿš€ 5๋ถ„ ๋งŒ์— ๋ฐฐํฌํ•˜๊ธฐ ### ๋ฐฉ๋ฒ• 1: ์›ํด๋ฆญ Cloudflare ๋ฐฐํฌ [![Deploy to Cloudflare](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/realchendahuang/FlareMo) ์ €์žฅ์†Œ๋ฅผ ๋‚ด GitHub ๊ณ„์ •์œผ๋กœ ๋ณต์ œํ•˜๊ณ  D1, R2, Queues, Vectorize๋ฅผ ์ž๋™์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์ดˆ ๋ฐฐํฌ ํ›„ `FLAREMO_PUBLIC_URL`๊ณผ ์‹œํฌ๋ฆฟ์„ ์„ค์ •ํ•˜์„ธ์š”([docs/en/deploy.md](./docs/en/deploy.md#one-click-deploy-community-supported) ์ฐธ์กฐ). ์ฒซ ์‹œ๋„์—์„œ "Github API Limit Exceeded"๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๋ช‡ ๋ถ„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๋‹ค์‹œ ์‹œ๋„ํ•˜์„ธ์š”. ### ๋ฐฉ๋ฒ• 2: GitHub Action (์…€ํ”„ ํ˜ธ์ŠคํŒ… ํฌํฌ) ํฌํฌ์—์„œ Actions์˜ **Deploy to Cloudflare**๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ํ”„๋กœ๋น„์ €๋‹, Worker ๋ฐฐํฌ, ์ธ์ฆ ์‹œํฌ๋ฆฟ ๋™๊ธฐํ™”๊ฐ€ ํ•œ ๋ฒˆ์— ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. push๋งŒ์œผ๋กœ๋Š” ๋ฐฐํฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. [docs/en/github-action-deploy.md](./docs/en/github-action-deploy.md)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ### ๋ฐฉ๋ฒ• 3: AI ์—์ด์ „ํŠธ๋กœ ๋ฐฐํฌ (๊ถŒ์žฅ) ํ„ฐ๋ฏธ๋„ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” AI ์—์ด์ „ํŠธ(Claude Code, Cursor Agent, Codex ๋“ฑ)์—๊ฒŒ ์ €์žฅ์†Œ์™€ ํ•จ๊ป˜ [docs/en/agent-deploy.md](./docs/en/agent-deploy.md)๋ฅผ ์ „๋‹ฌํ•˜์„ธ์š”: > "docs/en/agent-deploy.md ๋ฌธ์„œ์— ๋”ฐ๋ผ ๋‚ด Cloudflare ๊ณ„์ •์— FlareMo๋ฅผ ๋ฐฐํฌํ•ด ์ค˜." --- ### ๋ฐฉ๋ฒ• 4: 3๋‹จ๊ณ„ ์ˆ˜๋™ ๋ฐฐํฌ #### 1. Cloudflare ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ ```bash pnpm exec wrangler whoami pnpm exec wrangler d1 create flaremo pnpm exec wrangler r2 bucket create flaremo-attachments ``` ๋˜๋Š” `pnpm provision:remote`๋ฅผ ๋Œ€์‹  ์‹คํ–‰ํ•˜์„ธ์š”: ๋ˆ„๋ฝ๋œ D1 / R2 / Queue / Vectorize ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  D1 `database_id`๋ฅผ `wrangler.jsonc`์— ๋Œ€์‹  ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ฉฑ๋“ฑํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋ฉฐ ๊ธฐ์กด ๋ฆฌ์†Œ์Šค๋Š” ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค. #### 2. ์„ค์ • ๋ฐ ์‹œํฌ๋ฆฟ ๊ตฌ์„ฑ ```bash cp wrangler.jsonc.example wrangler.jsonc ``` ์ƒ์„ฑ๋œ `database_id`๋ฅผ ์ฑ„์šฐ๊ณ  `FLAREMO_PUBLIC_URL`์„ ํ”„๋กœ๋•์…˜ ๋„๋ฉ”์ธ์œผ๋กœ ์„ค์ •ํ•˜์„ธ์š”. ๊ทธ๋‹ค์Œ ์‹œํฌ๋ฆฟ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค: ```bash pnpm exec wrangler secret put BETTER_AUTH_SECRET --config ./wrangler.jsonc pnpm exec wrangler secret put FLAREMO_BOOTSTRAP_SECRET --config ./wrangler.jsonc ``` #### 3. ๋ฐฐํฌ ```bash pnpm deploy:dry-run pnpm deploy ``` (์ „์ฒด `pnpm verify` ๊ฒŒ์ดํŠธ๋Š” ์œ ์ง€๊ด€๋ฆฌ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ์š”์ฒญํ•  ๋•Œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.) ํ”„๋กœ๋•์…˜ ๋„๋ฉ”์ธ์˜ `/setup`์— ์ ‘์†ํ•ด `FLAREMO_BOOTSTRAP_SECRET`์„ ์ž…๋ ฅํ•˜๊ณ  Owner ๊ณ„์ •์„ ์ดˆ๊ธฐํ™”ํ•˜์„ธ์š”. ์ƒ์„ธ ๊ฐ€์ด๋“œ: [๋ฐฐํฌ ๊ฐ€์ด๋“œ](./docs/en/deploy.md) ยท [GitHub Action ๋ฐฐํฌ](./docs/en/github-action-deploy.md) ยท [์—…๋ฐ์ดํŠธ ๊ฐ€์ด๋“œ](./docs/en/update.md). --- ## ๐Ÿงฑ ์•„ํ‚คํ…์ฒ˜ & ๊ธฐ์ˆ  ์Šคํƒ ```mermaid flowchart LR Browser["FlareMo Web UI (React 19 / PWA)"] --> Worker["Cloudflare Worker"] Clients["Memos Clients / Scripts / MCP"] --> Worker Worker --> Auth["Better Auth (Session / PAT)"] Worker --> D1["Cloudflare D1 (Memos / Relations / Settings)"] Access["Cloudflare Access (Optional Outer Perimeter)"] -.-> Worker Worker --> R2["Cloudflare R2 (Attachments & Exports)"] Worker --> Assets["Workers Static Assets"] ``` - **๋Ÿฐํƒ€์ž„**: Cloudflare Workers - **ํ”„๋ก ํŠธ์—”๋“œ**: React 19, Vite, TanStack Router, Tailwind CSS 4, Radix UI - **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**: Cloudflare D1, Drizzle ORM - **์Šคํ† ๋ฆฌ์ง€**: Cloudflare R2 - **์ธ์ฆ**: Better Auth (HttpOnly ์ฟ ํ‚ค ์„ธ์…˜ + ํ๊ธฐ ๊ฐ€๋Šฅํ•œ `memos_pat_`) - **AI & ๊ฒ€์ƒ‰**: Workers AI, Vectorize, SQLite FTS5 - **ํ”Œ๋Ÿฌ๊ทธ์ธ**: ์Šฌ๋กฏ ๊ธฐ๋ฐ˜ ํ™•์žฅ ํ”Œ๋žซํผ([ํ‘œ์ค€](./docs/plugin-platform-standard.md), [๊ฐ€์ด๋“œ](./docs/en/plugins.md)); ํŒจํ‚ค์ง€๋Š” R2์— ์ €์žฅ๋˜๋ฉฐ ์ƒŒ๋“œ๋ฐ•์Šค ์นด๋“œ๋Š” ๋„คํŠธ์›Œํฌ ์ ‘๊ทผ ์—†์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค --- ## ๐ŸŒŸ Star History [![Star History Chart](https://api.star-history.com/svg?repos=realchendahuang/FlareMo&type=Date)](https://star-history.com/#realchendahuang/FlareMo&Date) --- ## ๐Ÿ“„ ๋ผ์ด์„ ์Šค [GNU AGPL-3.0](./LICENSE) ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ์˜คํ”ˆ์†Œ์Šค๋กœ ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค. Copyright (c) 2026 realchendahuang.