"์ดํด~ ๊ฑฐ๋ถ์ด๋๊ฒ ๋ค~" ์์๋ฆฌํ ์์ธ ๊ต์ ์๋ฆผ ์ฑ (macOS ๋ฉ๋ด๋ฐ ์์ฃผ)
์ฌ์ฉ์๋ผ๋ฉด ๐ DOWNLOAD.md ์์ ์ค์น ๊ฐ์ด๋๋ฅผ ํ์ธํ์ธ์.
| ์นฉ | ๋ฐ๋ก ๋ค์ด๋ก๋ |
|---|---|
| ๐ Apple Silicon (M1/M2/M3/M4) | TurtleAlert-arm64.dmg |
| ๐ป Intel Mac | TurtleAlert-x64.dmg |
- 1. ๊ฐ์
- 2. ์ฃผ์ ๊ธฐ๋ฅ
- 3. ์คํธ๋ ์นญ ์ข ๋ฅ
- 4. ํ์ผ ๊ตฌ์กฐ
- 5. ๊ธฐ์ ์คํ
- 6. ๊ฐ๋ฐ ํ์คํ ๋ฆฌ
- 7. ๋น๋ & ๋ฐฐํฌ
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| ์ฑ ์ด๋ฆ | ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด |
| ํ๋ก์ ํธ๋ช | turtle-alert |
| ํ๋ซํผ | macOS (Electron) |
| ํ์ | ๋ฉ๋ด๋ฐ ์์ฃผ ์ฑ (์ฐฝ ์์, Dock ์จ๊น) |
| ์ค์น ์์น | /Applications/๊ฑฐ๋ถ์ด๊ฒฝ๋ณด.app |
| ์คํ ์คํฌ๋ฆฝํธ | pnpm dev |
| ์ ์ฅ์ | project-hh-com/turtle-alert |
| ์ด์/๊ฑด์ | GitHub Issues |
- ์ค์ ํ ์ฃผ๊ธฐ๋ง๋ค macOS ๋ค์ดํฐ๋ธ ์๋ฆผ ๋ฐ์ก
- ์๋ฆผ ์ ๋ชฉ: "๐จ ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด ๋ฐ๋ น!"
- 8๊ฐ์ง ์คํธ๋ ์นญ ๊ฐ์ด๋ ์ค ๋๋ค ์ ํ
- ์๋ฆผ ์ผํฐ์์ ํ์ธ ๊ฐ๋ฅ (์ฑ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ ์ค์๋ ๋์)
- TensorFlow.js MoveNet ๋ชจ๋ธ๋ก ์น์บ ์ค์๊ฐ ์์ธ ๋ถ์ (๋ก์ปฌ AI, ๊ณผ๊ธ ์์)
- ๊ธฐ์ค ์์ธ ์บ๋ฆฌ๋ธ๋ ์ด์ : ๋ณธ์ธ์ ๋ฐ๋ฅธ ์์ธ๋ฅผ ๊ธฐ๋กํ์ฌ ํธ์ฐจ ๊ธฐ๋ฐ ํ์ โ ์๋ธ๋ชจ๋ํฐ ๋๊ฐ์ ์นด๋ฉ๋ผ์์๋ ์คํ ์์
- 8๊ฐ์ง ๊ฐ์ง ํญ๋ชฉ: ๊ฑฐ๋ถ๋ชฉ, ์ด๊นจ ๊ธฐ์ธ์ด์ง, ๊ณ ๊ฐ ์ ๋ฐฉ ๋์ถ, ๊ณ ๊ฐ ํ์ , ํ๋ฉด์ ๋๋ฌด ๊ฐ๊น์, ๊ณ ๊ฐ ๊ธฐ์ธ์ด์ง, ํ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด์ง, ๊ตฌ๋ถ์ ํ ์์ธ
- ์ฐ์ 2ํ ๊ฐ์ง ์ ์๋ฆผ ๋ฐ์ก
- ์๊ตฌ์ฌํญ: ์นด๋ฉ๋ผ ๊ถํ (์ฑ ์ฒซ ์คํ ์ macOS๊ฐ ์๋ ์์ฒญ). imagesnap ๋ฐ์ด๋๋ฆฌ๋ ์ฑ์ ๋ฒ๋ค๋์ด ๋ณ๋ ์ค์น ๋ถํ์.
- ์๋จ๋ฐ์ ๐ข ์ด๋ชจ์ง + ๋จ์ ์๊ฐ ์ค์๊ฐ ํ์ (์:
๐ข 29:59) - ์ฐํด๋ฆญ/ํด๋ฆญ ๋ฉ๋ด์์ ๋ชจ๋ ์กฐ์ ๊ฐ๋ฅ
- ์์/์ค์ง
- ์๋ฆผ ๊ฐ๊ฒฉ ๋ณ๊ฒฝ (15๋ถ / 30๋ถ / 45๋ถ / 1์๊ฐ)
- ์์ธ ๊ฐ์ AI ํ ๊ธ / ๊ธฐ์ค ์์ธ ์ค์
- ์ค๋ ์คํธ๋ ์นญ ํ์ ํ์ธ
- ์ข ๋ฃ
- ์๋ฆผ ๋ฐ์ ์ ์๋จ๋ฐ ๐จ 5์ด ๊น๋นก์ ํจ๊ณผ
electron-store์ฌ์ฉ- ์ ์ฅ ํญ๋ชฉ: ์๋ฆผ ๊ฐ๊ฒฉ, ์ค๋ ์คํธ๋ ์นญ ํ์, ๋ง์ง๋ง ๋ฆฌ์ ๋ ์ง, ์บ๋ฆฌ๋ธ๋ ์ด์ ๋ฐ์ดํฐ
- ์์ ๋์ผ๋ฉด ํ์ ์๋ ๋ฆฌ์
- ์ฑ ์์ ์ 1ํ GitHub Releases ๋ฅผ ์กฐํํ์ฌ ์ ๋ฒ์ ์ด ์ฌ๋ผ์๋์ง ํ์ธ
- ์ ๋ฒ์ ์ด ์์ผ๋ฉด ํธ๋ ์ด ๋ฉ๋ด ์ต์๋จ์ "๐ ์ ๋ฒ์ vX.Y.Z ๋ฐ๊ธฐ" ํญ๋ชฉ์ด ํ์๋๊ณ ์๋ฆผ์ ํ ๋ฒ ๋์
- ํด๋ฆญํ๋ฉด ๋ฆด๋ฆฌ์ฆ ํ์ด์ง๊ฐ ์ด๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์ DMG ๋ฅผ ๋ฐ์ ๋ค์ ์ค์น
- ์๋ ์ค์น ์๋ โ ์ฝ๋ ์๋ช ์ด ์์ด์ ๋ฐ์๋(์๋ฆผ + ์ํด๋ฆญ ๋ค์ด๋ก๋ ๋งํฌ) ๋ฐฉ์ ์ ์ง
| ์ด๋ชจ์ง | ์ด๋ฆ | ์ค๋ช |
|---|---|---|
| ๐ง | ๋ชฉ ์ข์ฐ ์คํธ๋ ์นญ | ๊ณ ๊ฐ๋ฅผ ์ฒ์ฒํ ์ข์ฐ๋ก ๊ธฐ์ธ์ฌ 10์ด์ฉ ์ ์ง |
| ๐ช | ์ด๊นจ ์ผ์ฑ | ์ด๊นจ๋ฅผ ๊ท๊น์ง ์ฌ๋ ธ๋ค ๋จ์ด๋จ๋ฆฌ๊ธฐ (5ํ) |
| ๐ข | ๊ณ ๊ฐ ๋ค๋ก | ํฑ์ ๋ค๋ก ๋น๊ฒจ ์ด์คํฑ ๋ง๋ค๊ณ 10์ด ์ ์ง |
| ๐ | ๊ฐ์ด ํด๊ธฐ | ์์ ๊น์ง ๋ผ๊ณ ๊ฐ์ด ํ์ง ํด๊ธฐ |
| ๐ | ๋ ์ด๋ | 20-20-20 ๊ท์น (6m ๋ฐ 20์ด ๋ฐ๋ผ๋ณด๊ธฐ) |
| ๐ | ํ๋ฆฌ ๋นํ๊ธฐ | ์์์ ์์ ์ฑ ์์ฒด ์ข์ฐ ๋นํ๊ธฐ |
| ๐ค | ์๋ชฉ ์คํธ๋ ์นญ | ์๊ฐ๋ฝ ๋น๊ฒจ ์๋ชฉ ์คํธ๋ ์นญ |
| ๐ถ | ์ผ์ด์๊ธฐ | ์๋ฆฌ์์ ์ผ์ด๋ 30์ด ์ ์๋ฆฌ ๊ฑธ์ |
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)
| ์์ญ | ๊ธฐ์ |
|---|---|
| ๋ฐํ์ | Electron 41 |
| ์ ์ฅ์ | electron-store |
| AI | TensorFlow.js + MoveNet (๋ก์ปฌ ์ถ๋ก ) |
| ์นด๋ฉ๋ผ | imagesnap (macOS CLI) |
| ๋น๋ | electron-builder |
| ํ ์คํธ | Vitest + v8 coverage (80%+) |
| ํจํค์ง ๋งค๋์ | pnpm |
- ์ฑ ์์ ์ GitHub Releases ํ์ธ โ ์ ๋ฒ์ ์ด ์ฌ๋ผ์์์ผ๋ฉด ํธ๋ ์ด ๋ฉ๋ด ์ต์๋จ์ "๐ ์ ๋ฒ์ vX.Y.Z ๋ฐ๊ธฐ" ํญ๋ชฉ์ด ์ถ๊ฐ๋๊ณ ์๋ฆผ์ ํ ๋ฒ ๋์
- ์คํจ๋ ์กฐ์ฉํ โ ๋คํธ์ํฌ ์ค๋ฅ / rate limit ์ ์ฌ์ฉ์์๊ฒ ์ํฅ ์์
- ์๋ ์ค์น ์๋ โ Apple Developer ์๋ช ์ด ์์ด ํ ์๋ ์ ๋ฐ์ดํธ๋ ์ ์ฝ์ด ํฌ๋ฏ๋ก, ํด๋ฆญ ํ ๋ฒ์ผ๋ก ๋ฆด๋ฆฌ์ฆ ํ์ด์ง๋ฅผ ์ฌ๋ ๋ฐ์๋ ๋ฐฉ์๋ง ๋์
- v0.7.1: ์ฃผ๊ธฐ ํด๋ง(6์๊ฐ๋ง๋ค)์ ์ ๊ฑฐํ๊ณ ์ฑ ์์ ์ 1ํ ํ์ธ์ผ๋ก ๋จ์ํ โ ๋ฉ๋ด๋ฐ ์ฑ ํน์ฑ์ ์ฃผ๊ธฐ ํด๋ง์ ์ด๋์ด ๋ณต์ก๋ ๋๋น ํฌ์ง ์๋ค๊ณ ํ๋จ
- AI ์์ธ ๊ฒ์ฌ ๋ฐฑ์๋ ๋๋ฝ ํด๊ฒฐ โ v0.6.0 ์์
@mediapipe/pose๋ ์ถ๊ฐํ์ง๋ง ์ค์ ๋ก๋@tensorflow/tfjs-backend-cpu๋ ๋น ์ ธ์์ดcreateDetector๋จ๊ณ์์ "No backend found in registry" ๋ก ์คํจํ๋ ๋ฌธ์ . ๋ฐฑ์๋ ํจํค์ง ์ถ๊ฐ +tf.setBackend('cpu')/tf.ready()๋ช ์ ํธ์ถ
- AI ์์ธ ๊ฒ์ฌ ๋ก๋ ์คํจ ์์ โ
@mediapipe/pose๊ฐ ํ๋ก๋์ ๋น๋์์ ๋๋ฝ๋์ด ํธ๋ ์ด์์ AI ์์ธ ๊ฒ์ฌ๋ฅผ ์ผค ๋ "TensorFlow.js ๋ชจ๋ธ์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค" ์๋ฌ๊ฐ ๋๋ ๋ฌธ์ ํด๊ฒฐ. ์์ธํ ์์ธ๊ณผ ๋๋ฒ๊น ๊ณผ์ ์ docs/2026-04-24-ai-posture-mediapipe.md ์ฐธ๊ณ - Finder ์ฑ ์ด๋ฆ ํ๊ธ ํ์ โ macOS SIGTRAP ํํผ๋ฅผ ์ํด ๋ฒ๋ค๋ช
์ ์๋ฌธ(
TurtleAlert) ์ผ๋ก ๋๋,CFBundleDisplayName+.lproj๋ก์ปฌ๋ผ์ด์ ์ด์ ์ผ๋ก Finder/Dock/๋ฉ๋ด๋ฐ ํ์๋ฅผ๊ฑฐ๋ถ์ด๊ฒฝ๋ณดํ๊ธ๋ก ๋ณต์
- imagesnap ๋ฐ์ด๋๋ฆฌ ๋ฒ๋ค โ ์ฌ์ฉ์๊ฐ
brew install imagesnap์ ๋ฐ๋ก ํ์ง ์์๋ ์ค๋ ์ท/AI ๊ธฐ๋ฅ ๋์ (v0.5.1) - ํ ์ค ๋ฆด๋ฆฌ์ฆ ์๋ํ โ
pnpm release:tag์คํฌ๋ฆฝํธ๋ก ๋ฒ์ bump โ ํ๊ทธ push โ CI ์๋ ๋น๋ยท๋ฐฐํฌ (v0.5.0) - ๊ณ ์ ์์ฐ๋ช
โ ๋ฆด๋ฆฌ์ฆ ์์ฐ์
TurtleAlert-arm64.dmg/TurtleAlert-x64.dmg๋ก ๊ณ ์ ํ์ฌreleases/latest/download/์๊ตฌ ๋งํฌ ๋ณด์ฅ - ์ทจ์ฝ์ ๋์ โ
@xmldom/xmldom์ โฅ0.8.13 ์ผ๋ก pnpm override - UX ๊ฐ์ โ ๊ฐ์ ๋ชจ๋ ๋ถ๋ฆฌ(์๋ฆผ๋ง / AI ์์ธ ๊ฒ์ฌ), AI ๊ฐ์ ๊ฐ๊ฒฉ ์ ํ(20์ด~5๋ถ), ์คํธ๋ ์นญ 27์ข ํ๋, ์บ๋ฆฌ๋ธ๋ ์ด์ ์ ๊ฑฐ ํ ์ ๋ ๊ธฐ์ค ์ ํ
- TensorFlow.js MoveNet ๊ธฐ๋ฐ ์ค์๊ฐ ์์ธ ๋ถ์ ๊ธฐ๋ฅ ์ถ๊ฐ
- ๊ธฐ์ค ์์ธ ์บ๋ฆฌ๋ธ๋ ์ด์ โ ์ ๋ ์๊ณ๊ฐ โ ๋ณธ์ธ ๊ธฐ์ค ํธ์ฐจ ๋ฐฉ์์ผ๋ก ์ ํ
- 8๊ฐ์ง ์์ธ ๊ฐ์ง โ ๊ฑฐ๋ถ๋ชฉ, ์ด๊นจ ๊ธฐ์ธ์ด์ง, ๊ณ ๊ฐ ์ ๋ฐฉ ๋์ถ, ๊ณ ๊ฐ ํ์ , ํ๋ฉด์ ๋๋ฌด ๊ฐ๊น์, ๊ณ ๊ฐ ๊ธฐ์ธ์ด์ง, ํ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด์ง, ๊ตฌ๋ถ์ ํ ์์ธ
- ์๋จ๋ฐ ๊น๋นก์ ํจ๊ณผ โ ์๋ฆผ ๋ฐ์ ์ ๐จ 5์ด ๊น๋นก์
- ๋ชจ๋ ๋ถ๋ฆฌ โ ์์ ํ์ ๋ก์ง(
posture-detector.js)๊ณผ ์นด๋ฉ๋ผ ์์กด ํจ์(posture-capture.js) ๋ถ๋ฆฌ - ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง 80%+ ๋ฌ์ฑ (Vitest + v8)
- macOS 26.2 ํ๊ธ productName SIGTRAP ํํผ (productName ์๋ฌธ ๊ณ ์ )
- Electron 41 ํธ๋ ์ด ์์ด์ฝ ํฌ๋์ ํํผ ๋ฐ afterPack ํ ์ถ๊ฐ
- imagesnap ๊ธฐ๋ฐ ์์ธ ์ค๋ ์ท ์ดฌ์ ๊ธฐ๋ฅ ์ถ๊ฐ
- ์ค๋ ์ท ์๋ ์ ๋ฆฌ โ ๋ณด๊ด ๊ธฐ๊ฐ ๊ฒฝ๊ณผ ์ ์๋ ์ญ์
- ์ฐ์ ์ดฌ์ ์คํจ ์ ์๋ ๋นํ์ฑํ (3ํ ์ฐ์ ์คํจ)
- Next.js ์น ์ฑ์ผ๋ก ์์ โ ๋ธ๋ผ์ฐ์ ํ์
- Electron ์ ํ โ ์ฐฝ ๊ธฐ๋ฐ ๋ค์ดํฐ๋ธ ์ฑ
- ๋ฉ๋ด๋ฐ ์ ์ฉ ์ฑ์ผ๋ก ๊ฐ์ํ โ ์ฐฝ ์ ๊ฑฐ, ํธ๋ ์ด๋ง ๋จ๊น
- ์ด๋ฆ ๋ณ๊ฒฝ: Alert or Turtle โ ๊ฑฐ๋ถ์ด๊ฒฝ๋ณด
- ์์ด์ฝ ์ถ๊ฐ: ๊ท์ฌ์ด ๊ฑฐ๋ถ์ด + ๋นจ๊ฐ ๊ฒฝ๋ณด ํ์
- ํ๋ก์ ํธ๋ช
๋ณ๊ฒฝ:
alert-or-turtleโturtle-alert
pnpm install
pnpm dev์นฉ์ ๋ณ ๊ฐ๋ณ ๋น๋ (์ฉ๋ โ)
npx electron-builder --mac --x64 --arm64 --publish never์ ๋๋ฒ์ค ๋น๋ (ํ ํ์ผ๋ก ํตํฉ, ์ฉ๋ โ)
npx electron-builder --mac --universal --publish never๋น๋ ๊ฒฐ๊ณผ:
dist/mac-arm64/TurtleAlert.appโ Apple Silicon์ฉ ์ฑdist/mac/TurtleAlert.appโ Intel์ฉ ์ฑdist/TurtleAlert-X.Y.Z-arm64.dmgโ Apple Silicon DMGdist/TurtleAlert-X.Y.Z.dmgโ Intel DMG
cp -R "dist/mac-arm64/TurtleAlert.app" /Applications/Spotlight(Cmd+Space)์์ "๊ฑฐ๋ถ์ด๊ฒฝ๋ณด" ๊ฒ์ ํ ์คํ.
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 + ์
๋ก๋- ๋ฉ๋ด๋ฐ ์์ด์ฝ์ 16x16 ํฌ๋ช
PNG +
tray.setTitle("๐ข")๋ฐฉ์์ผ๋ก ์ด๋ชจ์ง ์ง์ ํ์ - macOS ๋ค์ดํฐ๋ธ ์๋ฆผ์
urgency: "critical"๋ก ์ค์ ํด ์๋ฆผ ์ผํฐ ์ ์ง app.dock.hide()๋ก Dock ์์ด์ฝ ์จ๊น โ ๋ฉ๋ด๋ฐ์๋ง ์์ฃผ- ๋น๋ ์ ๋์ค๋
Cannot cleanup์๋ฌ๋ publish ์ค์ ๋๋ฝ ๊ด๋ จ์ผ๋ก,.app์์ฑ์๋ ์ํฅ ์์