turtle-alert

๐Ÿข ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด (Turtle Alert)

โ€œ์–ดํœด~ ๊ฑฐ๋ถ์ด๋˜๊ฒ ๋‹ค~โ€ ์ž”์†Œ๋ฆฌํ˜• ์ž์„ธ ๊ต์ • ์•Œ๋ฆผ ์•ฑ (macOS ๋ฉ”๋‰ด๋ฐ” ์ƒ์ฃผ)

๐Ÿ“ฅ ๋‹ค์šด๋กœ๋“œ

์‚ฌ์šฉ์ž๋ผ๋ฉด ๐Ÿ‘‰ DOWNLOAD.md ์—์„œ ์„ค์น˜ ๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

์นฉ ๋ฐ”๋กœ ๋‹ค์šด๋กœ๋“œ
๐ŸŽ Apple Silicon (M1/M2/M3/M4) TurtleAlert-arm64.dmg
๐Ÿ’ป Intel Mac TurtleAlert-x64.dmg

๐Ÿ“ฆ ์ „์ฒด ๋ฆด๋ฆฌ์ฆˆ ๋ณด๊ธฐ

๐Ÿ“‘ ๋ชฉ์ฐจ


1. ๊ฐœ์š”

ํ•ญ๋ชฉ ๊ฐ’
์•ฑ ์ด๋ฆ„ ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด
ํ”„๋กœ์ ํŠธ๋ช… turtle-alert
ํ”Œ๋žซํผ macOS (Electron)
ํƒ€์ž… ๋ฉ”๋‰ด๋ฐ” ์ƒ์ฃผ ์•ฑ (์ฐฝ ์—†์Œ, Dock ์ˆจ๊น€)
์„ค์น˜ ์œ„์น˜ /Applications/๊ฑฐ๋ถ์ด๊ฒฝ๋ณด.app
์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ pnpm dev
์ €์žฅ์†Œ project-hh-com/turtle-alert
์ด์Šˆ/๊ฑด์˜ GitHub Issues

2. ์ฃผ์š” ๊ธฐ๋Šฅ

2-1. ์ž์„ธ ๊ต์ • ์•Œ๋ฆผ

2-2. ์ž์„ธ ๊ฐ์‹œ AI (v0.4.0~)

2-3. ๋ฉ”๋‰ด๋ฐ” UI

2-4. ๋ฐ์ดํ„ฐ ์˜๊ตฌ ์ €์žฅ

2-5. ์ƒˆ ๋ฒ„์ „ ์•Œ๋ฆผ (v0.7.0~)


3. ์ŠคํŠธ๋ ˆ์นญ ์ข…๋ฅ˜

์ด๋ชจ์ง€ ์ด๋ฆ„ ์„ค๋ช…
๐Ÿง˜ ๋ชฉ ์ขŒ์šฐ ์ŠคํŠธ๋ ˆ์นญ ๊ณ ๊ฐœ๋ฅผ ์ฒœ์ฒœํžˆ ์ขŒ์šฐ๋กœ ๊ธฐ์šธ์—ฌ 10์ดˆ์”ฉ ์œ ์ง€
๐Ÿ’ช ์–ด๊นจ ์œผ์“ฑ ์–ด๊นจ๋ฅผ ๊ท€๊นŒ์ง€ ์˜ฌ๋ ธ๋‹ค ๋–จ์–ด๋œจ๋ฆฌ๊ธฐ (5ํšŒ)
๐Ÿข ๊ณ ๊ฐœ ๋’ค๋กœ ํ„ฑ์„ ๋’ค๋กœ ๋‹น๊ฒจ ์ด์ค‘ํ„ฑ ๋งŒ๋“ค๊ณ  10์ดˆ ์œ ์ง€
๐Ÿ™† ๊ฐ€์Šด ํŽด๊ธฐ ์–‘์† ๊น์ง€ ๋ผ๊ณ  ๊ฐ€์Šด ํ™œ์ง ํŽด๊ธฐ
๐Ÿ‘€ ๋ˆˆ ์šด๋™ 20-20-20 ๊ทœ์น™ (6m ๋ฐ– 20์ดˆ ๋ฐ”๋ผ๋ณด๊ธฐ)
๐Ÿ”„ ํ—ˆ๋ฆฌ ๋น„ํ‹€๊ธฐ ์˜์ž์— ์•‰์€ ์ฑ„ ์ƒ์ฒด ์ขŒ์šฐ ๋น„ํ‹€๊ธฐ
๐Ÿคš ์†๋ชฉ ์ŠคํŠธ๋ ˆ์นญ ์†๊ฐ€๋ฝ ๋‹น๊ฒจ ์†๋ชฉ ์ŠคํŠธ๋ ˆ์นญ
๐Ÿšถ ์ผ์–ด์„œ๊ธฐ ์ž๋ฆฌ์—์„œ ์ผ์–ด๋‚˜ 30์ดˆ ์ œ์ž๋ฆฌ ๊ฑธ์Œ

4. ํŒŒ์ผ ๊ตฌ์กฐ

turtle-alert/
โ”œโ”€โ”€ main.js              # Electron ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค (ํŠธ๋ ˆ์ด, ํƒ€์ด๋จธ, ์•Œ๋ฆผ)
โ”œโ”€โ”€ lib.js               # ์•ฑ ์ฝ”์–ด ๋กœ์ง (ํƒ€์ด๋จธ, ์•Œ๋ฆผ, ์ž์„ธ ๊ฐ์‹œ ํ†ตํ•ฉ)
โ”œโ”€โ”€ lib/
โ”‚   โ”œโ”€โ”€ posture-detector.js  # ์ž์„ธ ํŒ์ • ์ˆœ์ˆ˜ ๋กœ์ง (์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜, 8๊ฐ€์ง€ ๊ฐ์ง€)
โ”‚   โ””โ”€โ”€ posture-capture.js   # ์นด๋ฉ”๋ผ/TensorFlow.js ์˜์กด ํ•จ์ˆ˜
โ”œโ”€โ”€ __tests__/           # Vitest ํ…Œ์ŠคํŠธ (์ปค๋ฒ„๋ฆฌ์ง€ 80%+)
โ”œโ”€โ”€ package.json         # ํ”„๋กœ์ ํŠธ ์„ค์ • + electron-builder ์„ค์ •
โ”œโ”€โ”€ assets/
โ”‚   โ”œโ”€โ”€ icon.svg         # ์›๋ณธ ์•„์ด์ฝ˜ (SVG)
โ”‚   โ””โ”€โ”€ icon.png         # ์•ฑ ์•„์ด์ฝ˜ (512x512 PNG, ์ž๋™ icns ๋ณ€ํ™˜)
โ””โ”€โ”€ dist/                # ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ (.app, .dmg, .zip)

5. ๊ธฐ์ˆ  ์Šคํƒ

์˜์—ญ ๊ธฐ์ˆ 
๋Ÿฐํƒ€์ž„ Electron 41
์ €์žฅ์†Œ electron-store
AI TensorFlow.js + MoveNet (๋กœ์ปฌ ์ถ”๋ก )
์นด๋ฉ”๋ผ imagesnap (macOS CLI)
๋นŒ๋“œ electron-builder
ํ…Œ์ŠคํŠธ Vitest + v8 coverage (80%+)
ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € pnpm

6. ๊ฐœ๋ฐœ ํžˆ์Šคํ† ๋ฆฌ

v0.7.0 / v0.7.1 โ€” ์ƒˆ ๋ฒ„์ „ ์•Œ๋ฆผ (์—…๋ฐ์ดํŠธ ์ฒด์ปค)

  1. ์•ฑ ์‹œ์ž‘ ์‹œ GitHub Releases ํ™•์ธ โ€” ์ƒˆ ๋ฒ„์ „์ด ์˜ฌ๋ผ์™€์žˆ์œผ๋ฉด ํŠธ๋ ˆ์ด ๋ฉ”๋‰ด ์ตœ์ƒ๋‹จ์— โ€œ๐Ÿ†• ์ƒˆ ๋ฒ„์ „ vX.Y.Z ๋ฐ›๊ธฐโ€ ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋˜๊ณ  ์•Œ๋ฆผ์„ ํ•œ ๋ฒˆ ๋„์›€
  2. ์‹คํŒจ๋Š” ์กฐ์šฉํžˆ โ€” ๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜ / rate limit ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์˜ํ–ฅ ์—†์Œ
  3. ์ž๋™ ์„ค์น˜ ์•„๋‹˜ โ€” Apple Developer ์„œ๋ช…์ด ์—†์–ด ํ’€ ์ž๋™ ์—…๋ฐ์ดํŠธ๋Š” ์ œ์•ฝ์ด ํฌ๋ฏ€๋กœ, ํด๋ฆญ ํ•œ ๋ฒˆ์œผ๋กœ ๋ฆด๋ฆฌ์ฆˆ ํŽ˜์ด์ง€๋ฅผ ์—ฌ๋Š” ๋ฐ˜์ž๋™ ๋ฐฉ์‹๋งŒ ๋„์ž…
  4. v0.7.1: ์ฃผ๊ธฐ ํด๋ง(6์‹œ๊ฐ„๋งˆ๋‹ค)์„ ์ œ๊ฑฐํ•˜๊ณ  ์•ฑ ์‹œ์ž‘ ์‹œ 1ํšŒ ํ™•์ธ์œผ๋กœ ๋‹จ์ˆœํ™” โ€” ๋ฉ”๋‰ด๋ฐ” ์•ฑ ํŠน์„ฑ์ƒ ์ฃผ๊ธฐ ํด๋ง์˜ ์ด๋“์ด ๋ณต์žก๋„ ๋Œ€๋น„ ํฌ์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ

v0.6.1 โ€” AI ๋ฐฑ์—”๋“œ ์ดˆ๊ธฐํ™” ์ถ”๊ฐ€ (v0.6.0 ํ›„์† ํ”ฝ์Šค)

  1. AI ์ž์„ธ ๊ฒ€์‚ฌ ๋ฐฑ์—”๋“œ ๋ˆ„๋ฝ ํ•ด๊ฒฐ โ€” v0.6.0 ์—์„œ @mediapipe/pose ๋Š” ์ถ”๊ฐ€ํ–ˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” @tensorflow/tfjs-backend-cpu ๋„ ๋น ์ ธ์žˆ์–ด createDetector ๋‹จ๊ณ„์—์„œ โ€œNo backend found in registryโ€ ๋กœ ์‹คํŒจํ•˜๋˜ ๋ฌธ์ œ. ๋ฐฑ์—”๋“œ ํŒจํ‚ค์ง€ ์ถ”๊ฐ€ + tf.setBackend('cpu') / tf.ready() ๋ช…์‹œ ํ˜ธ์ถœ

v0.6.0 โ€” AI ๋ชจ๋ธ ๋กœ๋“œ ๋ฒ„๊ทธ ์ˆ˜์ • + Finder ํ•œ๊ธ€ ํ‘œ์‹œ

  1. AI ์ž์„ธ ๊ฒ€์‚ฌ ๋กœ๋“œ ์‹คํŒจ ์ˆ˜์ • โ€” @mediapipe/pose ๊ฐ€ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—์„œ ๋ˆ„๋ฝ๋˜์–ด ํŠธ๋ ˆ์ด์—์„œ AI ์ž์„ธ ๊ฒ€์‚ฌ๋ฅผ ์ผค ๋•Œ โ€œTensorFlow.js ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹คโ€ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋˜ ๋ฌธ์ œ ํ•ด๊ฒฐ. ์ž์„ธํ•œ ์›์ธ๊ณผ ๋””๋ฒ„๊น… ๊ณผ์ •์€ docs/2026-04-24-ai-posture-mediapipe.md ์ฐธ๊ณ 
  2. Finder ์•ฑ ์ด๋ฆ„ ํ•œ๊ธ€ ํ‘œ์‹œ โ€” macOS SIGTRAP ํšŒํ”ผ๋ฅผ ์œ„ํ•ด ๋ฒˆ๋“ค๋ช…์„ ์˜๋ฌธ(TurtleAlert) ์œผ๋กœ ๋‘๋˜, CFBundleDisplayName + .lproj ๋กœ์ปฌ๋ผ์ด์ œ์ด์…˜์œผ๋กœ Finder/Dock/๋ฉ”๋‰ด๋ฐ” ํ‘œ์‹œ๋ฅผ ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด ํ•œ๊ธ€๋กœ ๋ณต์›

v0.5.x โ€” ๋ฆด๋ฆฌ์ฆˆ ํŒŒ์ดํ”„๋ผ์ธ + imagesnap ๋ฒˆ๋“ค

  1. imagesnap ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฒˆ๋“ค โ€” ์‚ฌ์šฉ์ž๊ฐ€ brew install imagesnap ์„ ๋”ฐ๋กœ ํ•˜์ง€ ์•Š์•„๋„ ์Šค๋ƒ…์ƒท/AI ๊ธฐ๋Šฅ ๋™์ž‘ (v0.5.1)
  2. ํ•œ ์ค„ ๋ฆด๋ฆฌ์ฆˆ ์ž๋™ํ™” โ€” pnpm release:tag ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฒ„์ „ bump โ†’ ํƒœ๊ทธ push โ†’ CI ์ž๋™ ๋นŒ๋“œยท๋ฐฐํฌ (v0.5.0)
  3. ๊ณ ์ • ์ž์‚ฐ๋ช… โ€” ๋ฆด๋ฆฌ์ฆˆ ์ž์‚ฐ์„ TurtleAlert-arm64.dmg / TurtleAlert-x64.dmg ๋กœ ๊ณ ์ •ํ•˜์—ฌ releases/latest/download/ ์˜๊ตฌ ๋งํฌ ๋ณด์žฅ
  4. ์ทจ์•ฝ์  ๋Œ€์‘ โ€” @xmldom/xmldom ์„ โ‰ฅ0.8.13 ์œผ๋กœ pnpm override
  5. UX ๊ฐœ์„  โ€” ๊ฐ์‹œ ๋ชจ๋“œ ๋ถ„๋ฆฌ(์•Œ๋ฆผ๋งŒ / AI ์ž์„ธ ๊ฒ€์‚ฌ), AI ๊ฐ์‹œ ๊ฐ„๊ฒฉ ์„ ํƒ(20์ดˆ~5๋ถ„), ์ŠคํŠธ๋ ˆ์นญ 27์ข… ํ™•๋Œ€, ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ ์ œ๊ฑฐ ํ›„ ์ ˆ๋Œ€ ๊ธฐ์ค€ ์ „ํ™˜

v0.4.0 โ€” ์ž์„ธ ๊ฐ์‹œ AI + ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜

  1. TensorFlow.js MoveNet ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์ž์„ธ ๋ถ„์„ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  2. ๊ธฐ์ค€ ์ž์„ธ ์บ˜๋ฆฌ๋ธŒ๋ ˆ์ด์…˜ โ€” ์ ˆ๋Œ€ ์ž„๊ณ„๊ฐ’ โ†’ ๋ณธ์ธ ๊ธฐ์ค€ ํŽธ์ฐจ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜
  3. 8๊ฐ€์ง€ ์ž์„ธ ๊ฐ์ง€ โ€” ๊ฑฐ๋ถ๋ชฉ, ์–ด๊นจ ๊ธฐ์šธ์–ด์ง, ๊ณ ๊ฐœ ์ „๋ฐฉ ๋Œ์ถœ, ๊ณ ๊ฐœ ํšŒ์ „, ํ™”๋ฉด์— ๋„ˆ๋ฌด ๊ฐ€๊นŒ์›€, ๊ณ ๊ฐœ ๊ธฐ์šธ์–ด์ง, ํ•œ์ชฝ์œผ๋กœ ๊ธฐ์šธ์–ด์ง, ๊ตฌ๋ถ€์ •ํ•œ ์ž์„ธ
  4. ์ƒ๋‹จ๋ฐ” ๊นœ๋นก์ž„ ํšจ๊ณผ โ€” ์•Œ๋ฆผ ๋ฐœ์ƒ ์‹œ ๐Ÿšจ 5์ดˆ ๊นœ๋นก์ž„
  5. ๋ชจ๋“ˆ ๋ถ„๋ฆฌ โ€” ์ˆœ์ˆ˜ ํŒ์ • ๋กœ์ง(posture-detector.js)๊ณผ ์นด๋ฉ”๋ผ ์˜์กด ํ•จ์ˆ˜(posture-capture.js) ๋ถ„๋ฆฌ
  6. ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ 80%+ ๋‹ฌ์„ฑ (Vitest + v8)

v0.3.1 โ€” macOS ํฌ๋ž˜์‹œ ์ˆ˜์ •

  1. macOS 26.2 ํ•œ๊ธ€ productName SIGTRAP ํšŒํ”ผ (productName ์˜๋ฌธ ๊ณ ์ •)
  2. Electron 41 ํŠธ๋ ˆ์ด ์•„์ด์ฝ˜ ํฌ๋ž˜์‹œ ํšŒํ”ผ ๋ฐ afterPack ํ›… ์ถ”๊ฐ€

v0.2.0 โ€” ์ž์„ธ ์Šค๋ƒ…์ƒท ๊ธฐ๋Šฅ

  1. imagesnap ๊ธฐ๋ฐ˜ ์ž์„ธ ์Šค๋ƒ…์ƒท ์ดฌ์˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  2. ์Šค๋ƒ…์ƒท ์ž๋™ ์ •๋ฆฌ โ€” ๋ณด๊ด€ ๊ธฐ๊ฐ„ ๊ฒฝ๊ณผ ์‹œ ์ž๋™ ์‚ญ์ œ
  3. ์—ฐ์† ์ดฌ์˜ ์‹คํŒจ ์‹œ ์ž๋™ ๋น„ํ™œ์„ฑํ™” (3ํšŒ ์—ฐ์† ์‹คํŒจ)

v0.1.0 โ€” ์ดˆ๊ธฐ ๋ฒ„์ „

  1. Next.js ์›น ์•ฑ์œผ๋กœ ์‹œ์ž‘ โ†’ ๋ธŒ๋ผ์šฐ์ € ํ•„์š”
  2. Electron ์ „ํ™˜ โ†’ ์ฐฝ ๊ธฐ๋ฐ˜ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ
  3. ๋ฉ”๋‰ด๋ฐ” ์ „์šฉ ์•ฑ์œผ๋กœ ๊ฐ„์†Œํ™” โ†’ ์ฐฝ ์ œ๊ฑฐ, ํŠธ๋ ˆ์ด๋งŒ ๋‚จ๊น€
  4. ์ด๋ฆ„ ๋ณ€๊ฒฝ: Alert or Turtle โ†’ ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด
  5. ์•„์ด์ฝ˜ ์ถ”๊ฐ€: ๊ท€์—ฌ์šด ๊ฑฐ๋ถ์ด + ๋นจ๊ฐ„ ๊ฒฝ๋ณด ํ‘œ์‹œ
  6. ํ”„๋กœ์ ํŠธ๋ช… ๋ณ€๊ฒฝ: alert-or-turtle โ†’ turtle-alert

7. ๋นŒ๋“œ & ๋ฐฐํฌ

๊ฐœ๋ฐœ ์‹คํ–‰

pnpm install
pnpm dev

macOS ์•ฑ ๋นŒ๋“œ

์นฉ์…‹๋ณ„ ๊ฐœ๋ณ„ ๋นŒ๋“œ (์šฉ๋Ÿ‰ โ†“)

npx electron-builder --mac --x64 --arm64 --publish never

์œ ๋‹ˆ๋ฒ„์„ค ๋นŒ๋“œ (ํ•œ ํŒŒ์ผ๋กœ ํ†ตํ•ฉ, ์šฉ๋Ÿ‰ โ†‘)

npx electron-builder --mac --universal --publish never

๋นŒ๋“œ ๊ฒฐ๊ณผ:

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ์„ค์น˜

cp -R "dist/mac-arm64/TurtleAlert.app" /Applications/

Spotlight(Cmd+Space)์—์„œ โ€œ๊ฑฐ๋ถ์ด๊ฒฝ๋ณดโ€ ๊ฒ€์ƒ‰ ํ›„ ์‹คํ–‰.

GitHub Release (๊ถŒ์žฅ: ํ•œ ์ค„)

pnpm release:tag patch    # 0.5.0 -> 0.5.1 (๋˜๋Š” minor / major / 0.6.0)

์Šคํฌ๋ฆฝํŠธ๊ฐ€ version bump โ†’ ์ปค๋ฐ‹ โ†’ ํƒœ๊ทธ โ†’ push๊นŒ์ง€ ์ฒ˜๋ฆฌํ•˜๋ฉด, CI(release.yml)๊ฐ€ ์ž๋™์œผ๋กœ ๋นŒ๋“œ + GitHub Release ์ƒ์„ฑ + ์ž์‚ฐ ์—…๋กœ๋“œ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ž์‚ฐ๋ช…์€ TurtleAlert-arm64.dmg, TurtleAlert-x64.dmg (๋ฒ„์ „ ์—†์Œ)๋กœ ๊ณ ์ •๋˜์–ด DOWNLOAD.md์˜ releases/latest/download/ ๋งํฌ๊ฐ€ ๋‹ค์Œ ๋ฆด๋ฆฌ์ฆˆ์—์„œ๋„ ๊ทธ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ๋นŒ๋“œ/์—…๋กœ๋“œ (๋””๋ฒ„๊น…์šฉ):

gh release create vX.Y.Z --title "๊ฑฐ๋ถ์ด๊ฒฝ๋ณด vX.Y.Z" --notes "..."
pnpm release    # ๋นŒ๋“œ + rename + ์—…๋กœ๋“œ

๐Ÿ“ ์ฐธ๊ณ