PiPAny
아이폰에서 맥미니를 편하게 쓰려고 만든 개인용 앱. tmux·Claude Code 세션을 PiP 창과 다이나믹 아일랜드로 계속 지켜봅니다.
- Year
- 2026
- Role
- Solo · 개인용 도구
- Platform
- iOS
남한테 팔려고 만든 게 아니라, 내가 쓰려고 만든 도구에요.
맥미니에서 tmux 안에 Claude Code를 띄워두고 작업하는데, 밖에 나가거나 다른 일을 할 때도
그 세션이 지금 뭘 하고 있는지 계속 보고 싶었어요.
Termius로 SSH를 붙어도 앱을 나가면 끊기고, 화면을 계속 켜둘 수도 없죠.
그래서 아무 웹앱이나 유튜브처럼 PiP(떠 있는 작은 창)로 띄워두는 앱을 직접 만들었습니다. ttyd로 열어둔 터미널을 PiP로 띄우면, 홈 화면으로 나가도 창이 살아서 Claude 출력이 계속 흘러가요.
어떻게 동작하나
- 원래 영상에만 되는 PiP를 웹 화면에 끼워 넣습니다 —
WKWebView스냅샷을 영상 프레임으로 바꿔서AVPictureInPictureController(sample-buffer)로 승격 - PiP가 떠 있는 동안은 앱이 안 죽어서, 홈으로 나가도 캡처랑 갱신이 계속돼요 (APNs 없이)
- 맥에서 ttyd로 tmux 세션을 웹 터미널로 열고, 그 주소를 앱에 소스로 등록해 PiP로 띄웁니다
- Claude Code 상태는 따로 — 맥의 훅이 relay 서버로 쏘고, 앱이 WebSocket으로 받아 다이나믹 아일랜드·잠금화면에 “작업 중 · 입력 대기 · 완료”로 보여줍니다
만들면서
AVPictureInPictureController를 영상이 아닌 것에 쓰는 건 원래 의도된 사용이 아니라서,
스냅샷을 CMSampleBuffer로 밀어 넣고 백그라운드에서 캡처가 스로틀되는 걸 피하는 부분이 제일 까다로웠어요.
Live Activity랑 WidgetKit, WebSocket도 이번에 처음 붙여봤고요.
한계도 분명해요. 비영상 PiP라 App Store 심사에서 리젝될 수 있어서 개인 사이드로드를 전제로 했고 (무료 계정은 7일마다 다시 설치), PiP 창은 보기 전용이라 조작은 앱으로 돌아와서 해야 합니다. 맥이랑 폰이 같은 Wi-Fi(밖에서는 Tailscale)에 있어야 하고요.
앱스토어에 낼 완성품은 아니지만, 불편하면 그냥 만들어 쓰면 된다는 걸 다시 확인한 작업이라 개인적으로 애착이 가요.