curl -fsSL https://raw.githubusercontent.com/dgv7/nx-mac/main/install.sh | bash설치가 끝나면 한 번: NX Launcher.app 우클릭 → 열기 (Gatekeeper 1회).
이게 전부입니다. 이후는 .app 더블클릭 → 7.3초 후 로그인 창.
Last verified
2026-05-09· macOS 15.3 · MacBook Pro M2 Pro · 바람의나라 라이브 서버
Tested chain Sikarugir CX 24.0.7 · NexonPlug · GameGuard 통과 · 캐릭터·필드 진입까지
|
요구사항 macOS 14+ · Apple Silicon · 약 25GB 여유 디스크
지원 게임 바람의나라 (v0.1) · 다른 넥슨 게임은 Compatibility 참조
중단 안전 원라이너는 멱등 — 같은 명령으로 재개됩니다
게임사가 안 만들어주니 본인이 Mac에서 바람의나라를 하려고 만들었습니다. 기술적으로는 Wine wrapper(Sikarugir CX 24.0.7) 위에 바람의나라 전용 프리셋을 얹은 launcher 번들입니다.
v0.1은 바람의나라 전용. 다른 넥슨 게임 확장은 ROADMAP v0.2+에서. 프로젝트 성격·정책은 CLAUDE.md에 정리 — 무료 백엔드만, 안정성·재현성 최우선, 사업성/상업성 0.
3일 12시간, 16개 블로커를 뚫고 나서야 한 줄이 됐습니다.
2026-04-22 Day 1 Sikarugir + Wine 10 풀 체인 가동
Chromium 검은화면 (VizDisplayCompositor flag)
AppleScript URL handler
NexonLauncher pre-spawn 트릭
MS gulim.ttc 수동 배치 (당시)
2026-04-23 Day 2 한글 IME 조합 버그 — Wine 10 Mac driver가 IMM32에 pre-edit 안 흘림
└─ CX 24.0.7 엔진 교체로 해결
libinotify rpath가 SharedSupport/에도 필요한 것 발견
2026-04-24 Day 3 Cold-start 50초의 정체 — Nexon Launcher 서비스 auto-start 40초 timeout
└─ 서비스 disabled로 50s → 7.3s (7배 단축)
SwiftUI Splash · exit-watcher · NX Launcher 리브랜딩
GitHub public repo 공개
2026-05-08 v0.1.1 개인용 DMG 빌더 (~3GB 슬림화, 게임 데이터 제외 — Plug이 첫 실행 시 다운로드)
2026-05-09 v0.1.2 fonts/gulim.ttc 동봉
└─ "Windows에서 복사" 수동 단계 제거 → 진정한 한 줄 부트스트랩
세부 기록 → STATUS.md · 전략 분기와 폐기 기준 → ROADMAP.md · 스모크 체크리스트 → SMOKE_TEST.md
flowchart LR
Click["double-click"] --> Router["NX Launcher.app<br/>AppleScript Router"]
Router --> Splash["NX Splash.app<br/>SwiftUI borderless"]
Router --> Shell["shell cmd<br/>cleanup · symlink · spawn"]
Shell --> Wrapper["Baram.app<br/>Sikarugir CX 24.0.7"]
Wrapper --> Plug["NexonPlug.exe<br/>자체 로그인"]
Plug --> Game["gamer.exe<br/>바람의나라"]
URL handler (nexonplug://, ngm://)도 함께 등록되어 baram.nexon.com 브라우저 로그인 경로도 같은 Router로 수렴합니다. 설계 결정의 배경은 Design notes에.
|
Working
|
Roadmap
Known limits
|
수동 설치 (5단계)
# Xcode Command Line Tools — git/clang/codesign 포함
xcode-select --install
# Homebrew (없다면)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
eval "$(/opt/homebrew/bin/brew shellenv)"brew tap Sikarugir-App/sikarugir
brew install --cask sikarugir
open -a "Sikarugir Creator"Sikarugir Creator → New Blank Wrapper → 다음 설정:
| Setting | Value |
|---|---|
| Name | Baram |
| Engine | WS12WineCX24.0.7 |
| OS | Windows 10 |
엔진은 반드시 CX 24.0.7. 다른 버전에서는 한글 IME 조합 버그가 재현됩니다.
git clone https://github.com/dgv7/nx-mac
cd nx-mac
./scripts/build-baram-app.sh빌더가 자동 처리하는 것:
- libinotify dylib 심링크 (
wine/lib/+SharedSupport/양쪽) dosdevices/c:절대경로 교정- winetricks 한글 환경 (
corefonts → cjkfonts → vcrun2019) fonts/gulim.ttc→ wrapper Fonts/ 자동 복사- NexonPlug 설치
Nexon LauncherWindows 서비스 disabled — cold-start 50→7초 핵심- exit-watcher 배치
NX Launcher.app생성 +nexonplug://URL handler 등록- SwiftUI Splash 컴파일 + 번들
첫 실행은 10~20분 걸립니다 —
cjkfonts단계에서 터미널이 조용해져도 종료하지 마세요. 수 GB 폰트 패키지 다운로드 중입니다.
~/Applications/Sikarugir/NX Launcher.app을 더블클릭.
"확인되지 않은 개발자" 경고가 뜨면:
- 우클릭 → 열기 → 다시 열기 클릭 (한 번만)
- 또는 시스템 설정 → 개인정보 보호 및 보안 → "그래도 열기"
Splash가 즉시 뜨고 단계별 텍스트가 흐르며, Plug 로그인 창이 나타나면 자동 소멸합니다.
"게임 실행에 실패했습니다" 팝업은 무시하세요 — Plug에서
게임시작누르면 잠깐 뜨지만 실제로는 정상 실행됩니다.확인클릭하면 OTP 입력 창 또는 게임 창이 뒤이어 올라옵니다.Plug이 Mac Wine 환경에서 게임 프로세스의 exit code를 오해석해 띄우는 false alarm. OTP/공지처럼 진짜 읽어야 할 팝업과 다이얼로그 스타일이 같아 자동 dismiss는 의도적으로 구현하지 않았습니다.
repo의 fonts/gulim.ttc가 자동 적용되지만, 본인 Windows의 폰트로 덮어쓰고 싶다면:
cp /path/to/your/gulim.ttc \
~/Applications/Sikarugir/Baram.app/Contents/SharedSupport/prefix/drive_c/windows/Fonts/gulim.ttc폰트가 깨질 때 (한글이 □로 표시) 외에는 손댈 필요 없습니다.
Splash가 사라지지 않아요
Plug 로그인 창이 떴는데도 Splash가 남아있다면:
ESC키 또는 Splash의취소버튼 (Wine 트리 전체 종료)pkill -f "NX Splash"강제 종료- 30초 이상 같은 텍스트면 Wine hang —
ESC로 종료 후 재실행
게임을 어떻게 정상 종료하나요?
가장 안전한 순서:
- 게임 내에서 로그아웃 (캐릭터 선택 창까지)
- Plug 창의 X 버튼으로 Plug 닫기
baram-exit-watcher가 자동으로 wine 트리 teardown
강제 종료가 필요하면:
pkill -9 -f 'NexonPlug|wine/bin|gamer.exe'다음 실행은 항상 cold-start입니다 (상주 0 정책).
Cold-start가 60초 넘게 걸려요
Nexon Launcher 서비스가 살아있을 가능성:
~/Applications/Sikarugir/Baram.app/Contents/SharedSupport/wine/bin/wine \
sc query "Nexon Launcher"STATE: STOPPED 또는 에러가 정상. RUNNING이면 빌더 재실행 (idempotent):
cd ~/nx-mac && ./scripts/build-baram-app.shSikarugir Creator에서 Refresh 후 설정이 리셋됐어요
Creator의 Refresh는 libinotify 심링크와 Nexon Launcher 서비스 설정을 날립니다. 빌더 재실행으로 복구:
cd ~/nx-mac && ./scripts/build-baram-app.sh한글이 네모(□)로 표시돼요
fonts/gulim.ttc가 wrapper로 복사되지 않았을 가능성. 빌더 재실행:
cd ~/nx-mac && ./scripts/build-baram-app.sh직접 배치하려면 수동 설치 — 4단계 참고.
완전히 삭제하고 싶어요
rm -rf ~/Applications/Sikarugir/NX\ Launcher.app
rm -rf ~/Applications/Sikarugir/Baram.app
brew uninstall --cask sikarugir # 다른 wrapper 안 쓰면
rm -rf ~/nx-mac
# URL handler 캐시 재구축
/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister \
-kill -domain local -domain system -domain user여기 없는 문제는 Issues에 올려주세요.
설계 결정의 배경 — 미래의 본인이 "이거 왜 이렇게 했지?"를 다시 묻지 않도록.
초기 측정치 50초에서 phase profiling으로 구간별 시간을 재자, 실제 병목은 wine이 아니라 Plug이 호출하는 Nexon Launcher Windows 서비스의 auto-start timeout 40초였습니다. 서비스를 disabled로 두고 Plug이 필요한 시점에 on-demand로 spawn하게 두자 7.3초로 떨어졌습니다. 기능 손실 0.
Wine 10 + macOS Mac driver 조합은 한글 IME pre-edit을 IMM32로 전달하지 않아 모든 채팅 입력이 막힙니다. CX 24.0.7 엔진 교체로 해결. CX24는 libinotify rpath가 기존 wine/lib/에 더해 SharedSupport/도 필요해 빌더가 양쪽 모두 심링크합니다.
Cold-start 편차가 큽니다 — M-series 7초, 오래된 Intel 30초+. 고정 예상 시간은 어느 쪽에서든 거짓말이므로 제거했습니다.
- AppleScript shell이
/tmp/nx-launcher-status에 단계 마커 작성 (cleanup→symlink→spawn→waiting) - SwiftUI splash가 마커를 읽어 상태 텍스트만 업데이트 (숫자 없음)
CGWindowListCopyWindowInfo로 Plug 창 감지 → 자동 dismiss- 한 단계가 15초 넘게 지속되면 subtle hint 페이드인 (ESC 취소 안내)
스피너 = "살아있음" 신호, 텍스트 = "현재 상태" 신호. 둘을 섞지 않습니다.
Plug 또는 gamer.exe 종료 시 baram-exit-watcher.sh가 wine 트리 전체를 teardown합니다. 백그라운드 상주 없음 — 매 실행이 cold-start. 의도적 선택입니다. 상주 프로세스는 macOS의 "앱은 명시적으로 연다/닫는다" 멘탈 모델과 충돌하고, 넥슨 서버 측 세션 추적을 혼란시킬 수 있습니다.
macOS LaunchServices는 nexonplug:// / ngm:// 같은 URL scheme을 오직 .app bundle에만 바인딩합니다. CLI 바이너리로는 브라우저 경로를 가로챌 수 없습니다. AppleScript applet은 osacompile로 빌드 가능해 Swift 툴체인 없이도 URL handler를 만들 수 있어 채택했습니다.
당초 MS EULA를 이유로 repo에서 제외했지만, "다른 본인 Mac에서 한 줄 부트스트랩" 요구를 만족시키려면 어딘가에 폰트가 있어야 했습니다. 옵션 비교 결과: GitHub Release 자산은 어차피 누구나 받을 수 있고, 별도 private repo는 부트스트랩 복잡도를 높이고, DMG에만 두는 건 git clone 경로를 막습니다. 단순함을 택해 fonts/gulim.ttc로 commit. takedown 시 .gitignore 한 줄 되돌리고 별도 자산 채널로 전환할 수 있게 격리 유지.
다른 넥슨 게임 실행 가능성 예측 (실측 전):
| 예측 등급 | 게임 (대표) |
|---|---|
| 가능성 높음 (2D · 약한 NGS) | 크레이지아케이드, 카트라이더 러쉬플러스 |
| 가능성 중간 | 마비노기 영웅전 구버전 |
| 가능성 낮음 (NGS 강화) | 마비노기 현행 |
| 거의 불가능 (이중 보호) | 메이플스토리 현행, 던전앤파이터 |
| 불가능 (hardcore anti-cheat) | 서든어택, FC온라인 |
구조 재사용률 ~30%, 게임별 실측 ~70%. Plug / wine / router 레이어는 공통이지만 각 게임의 anti-cheat, 패처, 실행 파라미터 패턴은 독립 실험이 필요합니다. v0.2+에서 scripts/presets/ 디렉토리로 게임별 설정 분리 예정. 실측 결과 공유는 Issues 환영.
의식적으로 내린 선택과 받아들인 한계:
fonts/gulim.ttc동봉 — MS EULA 회색지대지만 부트스트랩 단순함을 우선. 문제 시 격리 유지된 채로 제거 가능.- "실행 실패" 팝업 — Plug의 false alarm.
확인클릭 후 게임 정상 진행. 자동 dismiss는 OTP/공지 오탐 위험으로 포기. - NGS 룰 변경 리스크 — 2026-04 기준 검증. Nexon이 anti-cheat 규칙을 강화하면 예고 없이 차단될 수 있음.
- Sikarugir Creator Refresh 시 설정 소실 — 빌더가 idempotent 설계이므로 재실행으로 복구.
- x86_64 Wine 엔진 — Apple Game Porting Toolkit 기반 ARM 네이티브 경로는 Chromium-in-Plug 호환성이 CX24보다 약함. Plan B에서 재평가.
nx-mac/
├── install.sh # 원라이너 installer
├── fonts/
│ └── gulim.ttc # MS 한글 폰트 (build-baram-app.sh가 자동 적용)
├── scripts/
│ ├── build-baram-app.sh # 빈 wrapper → 완성 상태 자동 변환
│ ├── build-personal-dmg.sh # 개인용 DMG 빌더 (게임 데이터 제외)
│ ├── baram-router.applescript # URL handler + splash 스폰
│ ├── baram-exit-watcher.sh # 상주 금지 watcher
│ └── nx-splash/
│ ├── NXSplash.swift # SwiftUI borderless splash
│ └── build-splash.sh # universal binary 빌드
├── CLAUDE.md # 프로젝트 성격·정책
├── ROADMAP.md # Plan A / B / C 전략
├── STATUS.md # 누적 진행 상황
└── SMOKE_TEST.md # 스모크 체크리스트
MIT — 스크립트 · AppleScript · Swift · 문서. 게임 바이너리, 폰트, Wine 엔진, Sikarugir는 각 저작권자 소유.