{"id":51106462,"url":"https://github.com/nomadamas/lovable-eastsidegunn","last_synced_at":"2026-06-24T14:02:36.860Z","repository":{"id":359036165,"uuid":"1244215763","full_name":"NomaDamas/lovable-eastsidegunn","owner":"NomaDamas","description":"🍙 화면 코너에서 혼밥하는 동건이 — Hammerspoon-based microphone-reactive desktop overlay for macOS","archived":false,"fork":false,"pushed_at":"2026-05-20T12:20:56.000Z","size":30518,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-20T13:27:36.128Z","etag":null,"topics":["desktop-overlay","hammerspoon","korean","lua","macos","mascot","webview"],"latest_commit_sha":null,"homepage":null,"language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NomaDamas.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-20T04:18:07.000Z","updated_at":"2026-05-20T12:31:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/NomaDamas/lovable-eastsidegunn","commit_stats":null,"previous_names":["hyunwook-kwon/lovable-eastsidegunn","nomadamas/lovable-eastsidegunn"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/NomaDamas/lovable-eastsidegunn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NomaDamas%2Flovable-eastsidegunn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NomaDamas%2Flovable-eastsidegunn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NomaDamas%2Flovable-eastsidegunn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NomaDamas%2Flovable-eastsidegunn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NomaDamas","download_url":"https://codeload.github.com/NomaDamas/lovable-eastsidegunn/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NomaDamas%2Flovable-eastsidegunn/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34735270,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-24T02:00:07.484Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["desktop-overlay","hammerspoon","korean","lua","macos","mascot","webview"],"created_at":"2026-06-24T14:02:36.064Z","updated_at":"2026-06-24T14:02:36.846Z","avatar_url":"https://github.com/NomaDamas.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🍙 donggun — Hammerspoon Desktop Overlay\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Platform: macOS](https://img.shields.io/badge/platform-macOS-blue.svg)](https://www.apple.com/macos/)\n[![Runtime: Hammerspoon](https://img.shields.io/badge/runtime-Hammerspoon-orange.svg)](https://www.hammerspoon.org/)\n[![Lang: Korean primary](https://img.shields.io/badge/lang-한국어-red.svg)](#)\n\n\u003e 화면 코너에서 조용히 혼밥하는 동건이. 누가 다가오면 들킬까봐 굳어버린다.\n\u003e **A microphone-reactive macOS desktop character, built on Hammerspoon + WebView.**\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/demo.gif\" alt=\"동건이가 소음에 놀라 굳었다가 천천히 진정하는 데모\" width=\"320\"\u003e\n  \u003cbr\u003e\n  \u003csub\u003e🎤 켜둔 마이크에 소음이 들어오면 즉각 굳고, 조용해지면 천천히 다시 먹는다 (asymmetric smoothing)\u003c/sub\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshot.png\" alt=\"donggun in context: 화장실 칸에서 도시락 먹다 들킨 동건이\" width=\"640\"\u003e\n  \u003cbr\u003e\n  \u003csub\u003e화장실 칸에서 들킨 동건이 — paused 상태 / 도시락 / \"연차 = 점심값 절약\"\u003c/sub\u003e\n\u003c/p\u003e\n\n---\n\n## 📋 At a glance\n\n| | |\n|---|---|\n| **Type** | Hammerspoon module — Lua entrypoint + WebView |\n| **Platform** | macOS (Apple Silicon + Intel) |\n| **Dependencies** | [Hammerspoon](https://www.hammerspoon.org/) ≥ 1.0, `python3` (Xcode CLT 기본 포함) |\n| **Permissions** | Accessibility (필수), Microphone (옵션 — 소음 반응용) |\n| **Window** | 360 × 360 px, transparent, always-on-top, all Spaces |\n| **Hotkeys** | `Cmd+Shift+ {D, R, H, M}` + `Cmd+Shift+Drag` |\n| **Network** | `127.0.0.1:8765` localhost only — 외부 트래픽 0 |\n| **Install** | `./install.sh` (idempotent, init.lua 자동 백업) |\n| **License** | MIT |\n\n---\n\n## 🎯 What it does\n\n동건이는 화면 코너(기본: 우하단)에 떠 있는 **투명 데스크탑 캐릭터**다. 음식 6종을 약 8.5초마다 랜덤으로 바꿔 먹으며, 너드 유머 말풍선을 띄운다. **마이크가 켜져 있으면 주변 소음에 4단계로 반응**해 점점 굳어가다가, 조용해지면 천천히 다시 먹기 시작한다.\n\n### 6 음식 (랜덤 순환)\n감자칩 · 김밥 · 피자 · 햄버거 · 도시락 · 라면\n\n### 6 상태\n\n| State | Trigger | Animation |\n|---|---|---|\n| `eating` | default | 1.8s bobble + 0.42s chew |\n| `pausing1` | mic avg ≥ 7 | mid frame, 80 ms hold |\n| `pausing2` | mic avg ≥ 13 | mid frame, 80 ms hold |\n| `paused` | mic avg ≥ 20 | tense bobble + 1.2 s hang time |\n| `choking` | ~40 %/8 s 확률 | shake + rotate, 2 s lock |\n| `changing` | ~35 %/5.5 s 확률 | sway + food swap, 1.8 s |\n\n**비대칭 smoothing**: 놀라는 방향은 즉각 (`SMOOTH_UP = 0.25`, 새 값 75 %), 진정 방향은 천천히 (`SMOOTH_DN = 0.96`). 자율신경계 반응 모방. PAUSED 도달 후 **1.2 s hang time** (마리오 점프 정점 모사) 동안 굳어 있다가 단계적으로 풀린다.\n\n---\n\n## 🚀 Install\n\n```bash\ngit clone https://github.com/NomaDamas/lovable-eastsidegunn.git\ncd lovable-eastsidegunn\n./install.sh\n```\n\n설치 스크립트가 하는 일 ([install.sh](install.sh)):\n\n1. `Hammerspoon.app`, `python3` 존재 확인\n2. `~/.hammerspoon/init.lua` 가 있으면 타임스탬프 붙여 백업\n3. `donggun/` → `~/.hammerspoon/donggun/` 로 복사 (자산 26 개 포함)\n4. `~/.hammerspoon/init.lua` 끝에 `require(\"donggun\")` 추가 (이미 있으면 skip — **idempotent**)\n5. Hammerspoon 이 실행 중이면 `hammerspoon://reload` 트리거\n\n설치 후 시스템 권한 부여:\n\n- **System Settings → Privacy \u0026 Security → Accessibility → Hammerspoon ✓** (핫키/드래그)\n- **System Settings → Privacy \u0026 Security → Microphone → Hammerspoon ✓** (소음 반응, 옵션)\n\nHammerspoon 자체가 처음이라면 먼저 설치하세요:\n\n```bash\nbrew install --cask hammerspoon\nopen -a Hammerspoon\n```\n\n---\n\n## ⌨️ Hotkeys\n\n| Combo | Action |\n|---|---|\n| `Cmd+Shift+D` | 보이기 / 숨기기 토글 |\n| `Cmd+Shift+R` | webview 새로고침 (`donggun.html` 수정 후 즉시 반영) |\n| `Cmd+Shift+H` | 코너 순환 — 우하 → 좌하 → 좌상 → 우상 |\n| `Cmd+Shift+M` | 마이크 on / off (회의 시작 전 양보용) |\n| `Cmd+Shift+Drag` | 마우스로 동건이 자유 이동 |\n\n핫키가 다른 앱과 충돌하면 [`donggun/init.lua`](donggun/init.lua) 의 `hs.hotkey.bind(...)` 줄들을 수정한 뒤 메뉴바 → **Reload Config**.\n\n---\n\n## 🗑️ Uninstall\n\n```bash\n./uninstall.sh\n```\n\n`~/.hammerspoon/donggun/` 디렉토리 삭제 + `init.lua` 에서 `require(\"donggun\")` 라인 제거. 변경 전 init.lua 는 한 번 더 백업됩니다. Hammerspoon.app 자체는 건드리지 않음.\n\n---\n\n## 🗂️ Repo structure\n\n```\nlovable-eastsidegunn/\n├── README.md                 # 사용자용 (한국어 primary)\n├── AGENTS.md                 # AI/도구 에이전트용 가이드\n├── CONTRIBUTING.md           # 🤝 기여 가이드 (음식 추가, 버그 제보 등)\n├── LICENSE                   # MIT\n├── .editorconfig             # 에디터 whitespace 규칙\n├── .github/\n│   └── ISSUE_TEMPLATE/\n│       └── bug_report.md     # 🐛 버그 리포트 템플릿\n├── install.sh                # idempotent installer → ~/.hammerspoon/donggun/\n├── uninstall.sh              # safe uninstaller (creates backups)\n├── donggun/                  # 그대로 ~/.hammerspoon/donggun/ 으로 복사됨\n│   ├── init.lua              # Hammerspoon entrypoint (require(\"donggun\"))\n│   ├── donggun.html          # WebView 본체 — 상태 머신 + 오디오 분석 + 애니메이션\n│   └── assets/               # 26 개 sprite PNG (v5)\n└── docs/\n    ├── demo.gif              # 비대칭 smoothing 애니메이션 (1MB, 320×320)\n    └── screenshot.png        # 컨텍스트 스크린샷\n```\nlovable-eastsidegunn/\n├── README.md            # this file\n├── AGENTS.md            # AI/도구 에이전트용 가이드 (테스트·확장·금기)\n├── LICENSE              # MIT\n├── install.sh           # idempotent installer → ~/.hammerspoon/donggun/\n├── uninstall.sh         # safe uninstaller (creates backups)\n├── donggun/             # 그대로 ~/.hammerspoon/donggun/ 으로 복사됨\n│   ├── init.lua         # Hammerspoon entrypoint (require(\"donggun\") 가 이 파일 로드)\n│   ├── donggun.html     # WebView 본체 — 상태 머신 + 오디오 분석 + 애니메이션\n│   └── assets/          # 26 개 sprite PNG (v5)\n└── docs/\n    └── screenshot.png   # README 데모\n```\n\n---\n\n## 🧠 How it works\n\n**왜 localhost HTTP 서버를 쓰나?** WebKit 은 `file://` 컨텍스트에서 `getUserMedia` 를 차단한다. `http://127.0.0.1:*` 에서 띄워야 마이크 권한 prompt 가 뜨고 음향 분석이 가능하다.\n\n**왜 `donggun` 변수가 global 인가?** Hammerspoon Console 에서 `donggun:reload()` 같이 라이브 디버깅하려면 global 이어야 한다. local 로 두면 webview 가 stale HTML 을 잡고 놓지 않아 디버깅 지옥에 빠진다.\n\n**`scriptDir()` 가 하는 일.** `debug.getinfo(1, \"S\").source` 로 자기 자신 파일 경로를 알아내, Python http.server 의 working directory 와 webview 의 자산 base 를 같은 곳에 박는다. 덕분에 모듈이 `~/.hammerspoon/donggun/` 외 다른 곳에 깔려도 동작한다.\n\n---\n\n## 🧪 Troubleshooting\n\n| 증상 | 해결 |\n|---|---|\n| 동건이가 안 보임 | Hammerspoon 메뉴바 → **Console** 에서 로그 확인 |\n| `EADDRINUSE :8765` | `lsof -ti:8765 \\| xargs kill` 로 점유 프로세스 정리 |\n| 핫키 작동 안 함 | Accessibility 권한 미부여. 시스템 설정에서 켜고 Hammerspoon 재시작 |\n| 마이크 prompt 안 뜸 | webview 가 `file://` 로 열린 상태. `./install.sh` 다시 실행 |\n| 풀스크린 앱 위에 안 뜸 | macOS 보안 정책상 일부 앱(키체인 등) 위에는 못 뜸 — 정상 |\n| Hammerspoon 이 자꾸 hide 됨 | `application.watcher` 가 0.1 s 후 unhide 함. 이게 싫으면 init.lua 의 해당 watcher 삭제 |\n| 한국어 폰트 깨짐 | \"Apple SD Gothic Neo\" 가 시스템 폰트로 있어야. fallback: Pretendard / Segoe UI |\n\n[`donggun.html`](donggun/donggun.html) 의 webview 우클릭 → **Inspect Element** 로 JS 콘솔도 열 수 있음 (`developerExtrasEnabled = true`).\n\n---\n\n## 🎭 Tone \u0026 concept\n\n동건이는 **'화장실 칸에서 몰래 혼밥하는 너드'** 컨셉의 자캐다. 말풍선은 의도적으로:\n\n- **너드 유머** — `P = NP 풀리면 인생 풀리지`, `monad = a monoid in the category of endofunctors`, `Tractatus 7번 명제 실천 중`\n- **혼밥 현실** — `5분만... 5분만`, `들키면 끝장`, `구급차 부를 사람도 없어`\n- **개발자 코어** — `PR 리뷰 = 사회생활`, `재택이 인생의 평화`, `tmux 5분할 = 평화`\n\n말풍선 풀을 손보고 싶으면 [`donggun/donggun.html`](donggun/donggun.html) 의 `THOUGHTS` 객체를 편집하면 끝. webview 만 reload (`Cmd+Shift+R`) 하면 즉시 반영.\n\n새 음식 추가·버그 제보·PR 등은 [CONTRIBUTING.md](CONTRIBUTING.md) 참고. AI 에이전트가 이 repo 를 만질 때는 [AGENTS.md](AGENTS.md) 가 진실의 원천.\n\n---\n\n## 🏆 출품\n\n해당 작품은 **[NomaDamas](https://github.com/NomaDamas)** 에서 **[Markr AI](https://makr.ai)** 의 후원을 받아 **변기톤** 에 출품된 작품입니다. 🚽\n\n---\n\n## 📜 License\n\n[MIT](LICENSE). 캐릭터 일러스트도 자유 사용 — 단 동건이 표정은 보존해주세요.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnomadamas%2Flovable-eastsidegunn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnomadamas%2Flovable-eastsidegunn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnomadamas%2Flovable-eastsidegunn/lists"}