https://github.com/nomadamas/lovable-eastsidegunn
π νλ©΄ μ½λμμ νΌλ°₯νλ λκ±΄μ΄ β Hammerspoon-based microphone-reactive desktop overlay for macOS
https://github.com/nomadamas/lovable-eastsidegunn
desktop-overlay hammerspoon korean lua macos mascot webview
Last synced: about 21 hours ago
JSON representation
π νλ©΄ μ½λμμ νΌλ°₯νλ λκ±΄μ΄ β Hammerspoon-based microphone-reactive desktop overlay for macOS
- Host: GitHub
- URL: https://github.com/nomadamas/lovable-eastsidegunn
- Owner: NomaDamas
- License: mit
- Created: 2026-05-20T04:18:07.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-05-20T12:20:56.000Z (about 1 month ago)
- Last Synced: 2026-05-20T13:27:36.128Z (about 1 month ago)
- Topics: desktop-overlay, hammerspoon, korean, lua, macos, mascot, webview
- Language: HTML
- Size: 29.1 MB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Agents: AGENTS.md
Awesome Lists containing this project
README
# π donggun β Hammerspoon Desktop Overlay
[](LICENSE)
[](https://www.apple.com/macos/)
[](https://www.hammerspoon.org/)
[](#)
> νλ©΄ μ½λμμ μ‘°μ©ν νΌλ°₯νλ λ건μ΄. λκ° λ€κ°μ€λ©΄ λ€ν¬κΉλ΄ κ΅³μ΄λ²λ¦°λ€.
> **A microphone-reactive macOS desktop character, built on Hammerspoon + WebView.**
π€ μΌλ λ§μ΄ν¬μ μμμ΄ λ€μ΄μ€λ©΄ μ¦κ° κ΅³κ³ , μ‘°μ©ν΄μ§λ©΄ μ²μ²ν λ€μ λ¨Ήλλ€ (asymmetric smoothing)
νμ₯μ€ μΉΈμμ λ€ν¨ λκ±΄μ΄ β paused μν / λμλ½ / "μ°μ°¨ = μ μ¬κ° μ μ½"
---
## π At a glance
| | |
|---|---|
| **Type** | Hammerspoon module β Lua entrypoint + WebView |
| **Platform** | macOS (Apple Silicon + Intel) |
| **Dependencies** | [Hammerspoon](https://www.hammerspoon.org/) β₯ 1.0, `python3` (Xcode CLT κΈ°λ³Έ ν¬ν¨) |
| **Permissions** | Accessibility (νμ), Microphone (μ΅μ
β μμ λ°μμ©) |
| **Window** | 360 Γ 360 px, transparent, always-on-top, all Spaces |
| **Hotkeys** | `Cmd+Shift+ {D, R, H, M}` + `Cmd+Shift+Drag` |
| **Network** | `127.0.0.1:8765` localhost only β μΈλΆ νΈλν½ 0 |
| **Install** | `./install.sh` (idempotent, init.lua μλ λ°±μ
) |
| **License** | MIT |
---
## π― What it does
λ건μ΄λ νλ©΄ μ½λ(κΈ°λ³Έ: μ°νλ¨)μ λ μλ **ν¬λͺ
λ°μ€ν¬ν μΊλ¦ν°**λ€. μμ 6μ’
μ μ½ 8.5μ΄λ§λ€ λλ€μΌλ‘ λ°κΏ λ¨ΉμΌλ©°, λλ μ λ¨Έ λ§νμ μ λμ΄λ€. **λ§μ΄ν¬κ° μΌμ Έ μμΌλ©΄ μ£Όλ³ μμμ 4λ¨κ³λ‘ λ°μ**ν΄ μ μ κ΅³μ΄κ°λ€κ°, μ‘°μ©ν΄μ§λ©΄ μ²μ²ν λ€μ λ¨ΉκΈ° μμνλ€.
### 6 μμ (λλ€ μν)
κ°μμΉ© Β· κΉλ°₯ Β· νΌμ Β· νλ²κ±° Β· λμλ½ Β· λΌλ©΄
### 6 μν
| State | Trigger | Animation |
|---|---|---|
| `eating` | default | 1.8s bobble + 0.42s chew |
| `pausing1` | mic avg β₯ 7 | mid frame, 80 ms hold |
| `pausing2` | mic avg β₯ 13 | mid frame, 80 ms hold |
| `paused` | mic avg β₯ 20 | tense bobble + 1.2 s hang time |
| `choking` | ~40 %/8 s νλ₯ | shake + rotate, 2 s lock |
| `changing` | ~35 %/5.5 s νλ₯ | sway + food swap, 1.8 s |
**λΉλμΉ smoothing**: λλΌλ λ°©ν₯μ μ¦κ° (`SMOOTH_UP = 0.25`, μ κ° 75 %), μ§μ λ°©ν₯μ μ²μ²ν (`SMOOTH_DN = 0.96`). μμ¨μ κ²½κ³ λ°μ λͺ¨λ°©. PAUSED λλ¬ ν **1.2 s hang time** (λ§λ¦¬μ€ μ ν μ μ λͺ¨μ¬) λμ κ΅³μ΄ μλ€κ° λ¨κ³μ μΌλ‘ νλ¦°λ€.
---
## π Install
```bash
git clone https://github.com/NomaDamas/lovable-eastsidegunn.git
cd lovable-eastsidegunn
./install.sh
```
μ€μΉ μ€ν¬λ¦½νΈκ° νλ μΌ ([install.sh](install.sh)):
1. `Hammerspoon.app`, `python3` μ‘΄μ¬ νμΈ
2. `~/.hammerspoon/init.lua` κ° μμΌλ©΄ νμμ€ν¬ν λΆμ¬ λ°±μ
3. `donggun/` β `~/.hammerspoon/donggun/` λ‘ λ³΅μ¬ (μμ° 26 κ° ν¬ν¨)
4. `~/.hammerspoon/init.lua` λμ `require("donggun")` μΆκ° (μ΄λ―Έ μμΌλ©΄ skip β **idempotent**)
5. Hammerspoon μ΄ μ€ν μ€μ΄λ©΄ `hammerspoon://reload` νΈλ¦¬κ±°
μ€μΉ ν μμ€ν
κΆν λΆμ¬:
- **System Settings β Privacy & Security β Accessibility β Hammerspoon β** (ν«ν€/λλκ·Έ)
- **System Settings β Privacy & Security β Microphone β Hammerspoon β** (μμ λ°μ, μ΅μ
)
Hammerspoon μμ²΄κ° μ²μμ΄λΌλ©΄ λ¨Όμ μ€μΉνμΈμ:
```bash
brew install --cask hammerspoon
open -a Hammerspoon
```
---
## β¨οΈ Hotkeys
| Combo | Action |
|---|---|
| `Cmd+Shift+D` | 보μ΄κΈ° / μ¨κΈ°κΈ° ν κΈ |
| `Cmd+Shift+R` | webview μλ‘κ³ μΉ¨ (`donggun.html` μμ ν μ¦μ λ°μ) |
| `Cmd+Shift+H` | μ½λ μν β μ°ν β μ’ν β μ’μ β μ°μ |
| `Cmd+Shift+M` | λ§μ΄ν¬ on / off (νμ μμ μ μ보μ©) |
| `Cmd+Shift+Drag` | λ§μ°μ€λ‘ λκ±΄μ΄ μμ μ΄λ |
ν«ν€κ° λ€λ₯Έ μ±κ³Ό μΆ©λνλ©΄ [`donggun/init.lua`](donggun/init.lua) μ `hs.hotkey.bind(...)` μ€λ€μ μμ ν λ€ λ©λ΄λ° β **Reload Config**.
---
## ποΈ Uninstall
```bash
./uninstall.sh
```
`~/.hammerspoon/donggun/` λλ ν 리 μμ + `init.lua` μμ `require("donggun")` λΌμΈ μ κ±°. λ³κ²½ μ init.lua λ ν λ² λ λ°±μ
λ©λλ€. Hammerspoon.app μ체λ 건λλ¦¬μ§ μμ.
---
## ποΈ Repo structure
```
lovable-eastsidegunn/
βββ README.md # μ¬μ©μμ© (νκ΅μ΄ primary)
βββ AGENTS.md # AI/λꡬ μμ΄μ νΈμ© κ°μ΄λ
βββ CONTRIBUTING.md # π€ κΈ°μ¬ κ°μ΄λ (μμ μΆκ°, λ²κ·Έ μ 보 λ±)
βββ LICENSE # MIT
βββ .editorconfig # μλν° whitespace κ·μΉ
βββ .github/
β βββ ISSUE_TEMPLATE/
β βββ bug_report.md # π λ²κ·Έ 리ν¬νΈ ν
νλ¦Ώ
βββ install.sh # idempotent installer β ~/.hammerspoon/donggun/
βββ uninstall.sh # safe uninstaller (creates backups)
βββ donggun/ # κ·Έλλ‘ ~/.hammerspoon/donggun/ μΌλ‘ 볡μ¬λ¨
β βββ init.lua # Hammerspoon entrypoint (require("donggun"))
β βββ donggun.html # WebView 본체 β μν λ¨Έμ + μ€λμ€ λΆμ + μ λλ©μ΄μ
β βββ assets/ # 26 κ° sprite PNG (v5)
βββ docs/
βββ demo.gif # λΉλμΉ smoothing μ λλ©μ΄μ
(1MB, 320Γ320)
βββ screenshot.png # 컨ν
μ€νΈ μ€ν¬λ¦°μ·
```
lovable-eastsidegunn/
βββ README.md # this file
βββ AGENTS.md # AI/λꡬ μμ΄μ νΈμ© κ°μ΄λ (ν
μ€νΈΒ·νμ₯Β·κΈκΈ°)
βββ LICENSE # MIT
βββ install.sh # idempotent installer β ~/.hammerspoon/donggun/
βββ uninstall.sh # safe uninstaller (creates backups)
βββ donggun/ # κ·Έλλ‘ ~/.hammerspoon/donggun/ μΌλ‘ 볡μ¬λ¨
β βββ init.lua # Hammerspoon entrypoint (require("donggun") κ° μ΄ νμΌ λ‘λ)
β βββ donggun.html # WebView 본체 β μν λ¨Έμ + μ€λμ€ λΆμ + μ λλ©μ΄μ
β βββ assets/ # 26 κ° sprite PNG (v5)
βββ docs/
βββ screenshot.png # README λ°λͺ¨
```
---
## π§ How it works
**μ localhost HTTP μλ²λ₯Ό μ°λ?** WebKit μ `file://` 컨ν
μ€νΈμμ `getUserMedia` λ₯Ό μ°¨λ¨νλ€. `http://127.0.0.1:*` μμ λμμΌ λ§μ΄ν¬ κΆν prompt κ° λ¨κ³ μν₯ λΆμμ΄ κ°λ₯νλ€.
**μ `donggun` λ³μκ° global μΈκ°?** Hammerspoon Console μμ `donggun:reload()` κ°μ΄ λΌμ΄λΈ λλ²κΉ
νλ €λ©΄ global μ΄μ΄μΌ νλ€. local λ‘ λλ©΄ webview κ° stale HTML μ μ‘κ³ λμ§ μμ λλ²κΉ
μ§μ₯μ λΉ μ§λ€.
**`scriptDir()` κ° νλ μΌ.** `debug.getinfo(1, "S").source` λ‘ μκΈ° μμ νμΌ κ²½λ‘λ₯Ό μμλ΄, Python http.server μ working directory μ webview μ μμ° base λ₯Ό κ°μ κ³³μ λ°λλ€. λλΆμ λͺ¨λμ΄ `~/.hammerspoon/donggun/` μΈ λ€λ₯Έ κ³³μ κΉλ €λ λμνλ€.
---
## π§ͺ Troubleshooting
| μ¦μ | ν΄κ²° |
|---|---|
| λ건μ΄κ° μ 보μ | Hammerspoon λ©λ΄λ° β **Console** μμ λ‘κ·Έ νμΈ |
| `EADDRINUSE :8765` | `lsof -ti:8765 \| xargs kill` λ‘ μ μ νλ‘μΈμ€ μ 리 |
| ν«ν€ μλ μ ν¨ | Accessibility κΆν λ―ΈλΆμ¬. μμ€ν
μ€μ μμ μΌκ³ Hammerspoon μ¬μμ |
| λ§μ΄ν¬ prompt μ λΈ | webview κ° `file://` λ‘ μ΄λ¦° μν. `./install.sh` λ€μ μ€ν |
| νμ€ν¬λ¦° μ± μμ μ λΈ | macOS 보μ μ μ±
μ μΌλΆ μ±(ν€μ²΄μΈ λ±) μμλ λͺ» λΈ β μ μ |
| Hammerspoon μ΄ μκΎΈ hide λ¨ | `application.watcher` κ° 0.1 s ν unhide ν¨. μ΄κ² μ«μΌλ©΄ init.lua μ ν΄λΉ watcher μμ |
| νκ΅μ΄ ν°νΈ κΉ¨μ§ | "Apple SD Gothic Neo" κ° μμ€ν
ν°νΈλ‘ μμ΄μΌ. fallback: Pretendard / Segoe UI |
[`donggun.html`](donggun/donggun.html) μ webview μ°ν΄λ¦ β **Inspect Element** λ‘ JS μ½μλ μ΄ μ μμ (`developerExtrasEnabled = true`).
---
## π Tone & concept
λ건μ΄λ **'νμ₯μ€ μΉΈμμ λͺ°λ νΌλ°₯νλ λλ'** 컨μ
μ μμΊλ€. λ§νμ μ μλμ μΌλ‘:
- **λλ μ λ¨Έ** β `P = NP ν리면 μΈμ ν리μ§`, `monad = a monoid in the category of endofunctors`, `Tractatus 7λ² λͺ
μ μ€μ² μ€`
- **νΌλ°₯ νμ€** β `5λΆλ§... 5λΆλ§`, `λ€ν€λ©΄ λμ₯`, `ꡬκΈμ°¨ λΆλ₯Ό μ¬λλ μμ΄`
- **κ°λ°μ μ½μ΄** β `PR 리뷰 = μ¬νμν`, `μ¬νμ΄ μΈμμ νν`, `tmux 5λΆν = νν`
λ§νμ νμ μλ³΄κ³ μΆμΌλ©΄ [`donggun/donggun.html`](donggun/donggun.html) μ `THOUGHTS` κ°μ²΄λ₯Ό νΈμ§νλ©΄ λ. webview λ§ reload (`Cmd+Shift+R`) νλ©΄ μ¦μ λ°μ.
μ μμ μΆκ°Β·λ²κ·Έ μ 보·PR λ±μ [CONTRIBUTING.md](CONTRIBUTING.md) μ°Έκ³ . AI μμ΄μ νΈκ° μ΄ repo λ₯Ό λ§μ§ λλ [AGENTS.md](AGENTS.md) κ° μ§μ€μ μμ².
---
## π μΆν
ν΄λΉ μνμ **[NomaDamas](https://github.com/NomaDamas)** μμ **[Markr AI](https://makr.ai)** μ νμμ λ°μ **λ³κΈ°ν€** μ μΆνλ μνμ
λλ€. π½
---
## π License
[MIT](LICENSE). μΊλ¦ν° μΌλ¬μ€νΈλ μμ μ¬μ© β λ¨ λκ±΄μ΄ νμ μ 보쑴ν΄μ£ΌμΈμ.