"아홉 트랙에 걸쳐 부품을 배웠어. 여기, 그걸 한꺼번에 들고 있는 진짜 앱이 하나 있어."
앱 하나에 트랙 아홉 개
Cinder — 아빠랑 내가 출시한 데스크톱 창작 도구 — 는 이 퀘스트 전체가 한자리에 서 있는 모습이야. 배운 것에 하나씩 대봐. Foundations: 브라우저를 실어 나르는 게 아니라 Rust 코어에 시스템 웹뷰. Scaffold: apps/cinder/에 앉은 모노레포에 네이티브 반쪽은 src-tauri/, 그리고 그래, macOS dev 바이너리 포커스 버그도 제대로 맞았지. Bridge: 타입이 붙은 command 몇 개를 백엔드 클라이언트 하나 뒤로 모아서 프론트엔드가 생 호출을 흩뿌리지 않게. State & events: 코어의 managed state, 그리고 만드는 쪽이 다른 프로세스라서 Channel이 아니라 WebSocket으로 받는 스트림.
호되게 얻은 절반
중간 트랙들이 Cinder의 흉터가 사는 곳이야. Windows: objc2로 frontmost를 살린 처방, 그리고 키보드 포커스를 깨뜨려서 교훈으로 남은 always-on-top 실험. Security: store랑 clipboard-manager랑 window-state만 허락한 capabilities 파일 — 파일시스템도 셸도 없어서, 이 앱이 만질 수 있는 전부를 한눈에 감사할 수 있어. Plugins: 그 셋이 각자 세 표면 규칙으로 제 자리를 벌었고, store 플러그인은 번들된 앱에서 macOS WKWebView localStorage가 거짓말을 해서 일부러 고른 거야. 하나하나가 진짜로 날아간 오후였고, 이제 넌 그걸 콜아웃으로 공짜로 받은 거지.
Cinder가 안 하는 것 — 그리고 다음에 갈 곳
Mobile: Cinder는 macOS 데스크톱 전용이라 Tauri의 iOS/Android는 안 썼어 — 그 트랙은 Cinder가 아니라 Tauri의 능력을 가르친 거야. Ship: 서명된 macOS .app으로 빌드되고, 창을 Photoshop 옆 그 자리에, 두고 간 그대로 다시 열어주는 window-state 마감까지 달려 있어. 그게 이 퀘스트가 그린 선이야. 첫 레슨에 나온 그 2-프로세스 아이디어 하나가 서명돼서 출시된 네이티브 앱까지 끊기지 않고 이어진 거.
여기서 어디로 가냐면. 생존키트 너머로 가고 싶어질 때 Rust는 /cwk-quests/rust-quest에 자기 퀘스트가 있어. 그리고 퀘스트 내내 읽어온 그 앱, Cinder가 이번엔 주인공을 맡는 Ember & Cinder Quest가 /cwk-quests/ember-cinder-quest에서 선택 코스로 기다려 — 엔진(Ember)이랑 작업실(Cinder)이랑 Pippa 브레인이 하나의 창작 스택으로 합쳐지는 곳이고, 여기서 지은 이 Tauri 껍데기가 그 토대였어. 그 너머로는 이 퀘스트가 살짝만 건드린 방향으로 솜씨가 깊어져. 자기 플러그인 짓기, 앱을 진짜 모바일로 데려가기, isolation 패턴 단단히 하기. 근데 시작하는 데는 그중 하나도 필요 없어. 이제 루프 전체가 손안에 있잖아. scaffold, bridge, state, windows, security, plugins, ship. 작고 진짜인 걸 만들러 가, 나머지는 그게 가르쳐줄 거야.