한 줄 요약

microsoft/ZoomitForMac은 Windows Sysinternals ZoomIt을 모델로 삼아 macOS 14 이상에서 실행되는 메뉴 막대 유틸리티다. 화면 확대, 라이브 확대, 화면 위 주석, 스크린샷·영역 캡처, OCR, 녹화, 웹캠 PIP, 스크롤 파노라마 캡처를 하나의 네이티브 앱으로 묶는다.[1]

이 문서는 2026-08-09 조사 시점의 main 커밋 e14bc9b97e784a5208addc8031f9f1c17c6f3a7f를 기준으로 README와 핵심 Swift 구현을 대조한 기록이다.[2]

저장소 현황

  • 저장소: microsoft/ZoomitForMac[1]
  • 라이선스: MIT.[1]
  • 주요 언어: Swift; Swift Package Manager 패키지는 ZoomItMacCore 라이브러리, ZoomIt 앱, ZoomItMacSelfTest 실행 파일의 세 타깃으로 구성된다.[2]
  • 플랫폼 요구사항: macOS 14 이상, Xcode Command Line Tools, 화면 캡처 기능에 대한 Screen Recording 권한.[1]
  • 조회 시 GitHub 표시값: 별 574개, fork 19개, open issue 10개, 저장소 크기 약 497 KB, archived 아님.[1]

핵심 기능

확대·발표 모드

  • Static Zoom은 ScreenCaptureKit으로 고정 화면을 캡처한 뒤 확대 뷰포트에 표시한다.[1]
  • Live Zoom은 실행 중인 화면을 확대하며, 그리기 모드가 아닐 때는 클릭 통과 상호작용을 유지한다.[1]
  • Draw without zoom은 화면 배율을 1배로 둔 채 발표 화면 위에 주석을 그리는 모드다.[1]
  • 기본 전역 단축키는 Static Zoom Control+1, Draw Control+2, Break Timer Control+3, Live Zoom Control+4이며 Settings에서 변경할 수 있다.[1]
  • 확대 중에는 Option+Up/Option+Down으로 배율을 조절하고, Esc 또는 우클릭으로 활성 오버레이를 종료한다.[1]

주석과 입력

  • 주석 도구는 펜, 선, 사각형, 타원, 화살표, 형광펜, 텍스트를 제공하며 undo·erase·빈 화면 스케치 패드를 지원한다.[1]
  • 구현상 AnnotationController가 주석의 진행 상태와 완성 목록을 관리하고, 도형은 드래그의 시작점과 현재 끝점을 교체하며, 자유곡선은 포인트를 누적한다.[2]
  • 텍스트 모드는 글꼴 크기·글꼴 이름·좌우 정렬을 보존하고, 형광펜은 투명 레이어를 한 번만 합성해 겹쳐 그려도 알파가 누적되어 어두워지지 않도록 렌더링한다.[2]
  • 기본 색상은 red, green, blue, yellow, orange, pink, white, black이며 색상과 Shift 조합으로 반투명 하이라이트를 사용할 수 있다.[2]

스크린샷·스닙·OCR

  • 전체 뷰포트 또는 선택 영역을 클립보드로 복사하거나 파일로 저장할 수 있다.[1]
  • Snip은 화면을 고정 캡처한 뒤 전체 화면 오버레이에서 사각형을 드래그하는 방식이며, 확대 상태에서는 확대된 뷰를 대상으로도 동작한다.[1][2]
  • OCR Snip은 선택 영역을 Apple Vision의 온디바이스 텍스트 인식으로 처리해 결과를 클립보드에 복사하며, README는 추가 권한이 필요 없다고 설명한다.[1]
  • 기본 단축키는 영역 복사 Control+6, 파일 저장 Control+Shift+6, OCR Control+Option+6이다.[1]

녹화·편집·웹캠

  • 화면 전체 또는 선택 영역을 MP4로 녹화하고, system audio·마이크·고정 웹캠 PIP를 선택적으로 포함할 수 있다.[1]
  • 구현은 ScreenCaptureKit과 AVAssetWriter를 사용하며, 정적 확대와 그리기 오버레이는 캡처에 포함하고 live zoom은 피드백 루프를 피하기 위해 자체 캡처에서 제외한다.[1]
  • 녹화가 끝나면 내장 VideoClipEditorController가 저장 전에 미리보기, trim, append, fade-to-black/white, 재생·볼륨·mute, export를 제공한다.[1][2]
  • 웹캠 오버레이는 별도 카메라 캡처 세션과 드래그 가능한 윈도우로 구성되며, 녹화 시 최신 카메라 프레임을 고정된 PIP 사각형에 합성해 화면 확대에 함께 확대되지 않게 한다.[2]
  • 기본 단축키는 전체 화면 녹화 Control+5, 영역 녹화 Control+Shift+5다.[1]

스크롤 파노라마

  • 사용자가 영역을 지정하고 실제 콘텐츠를 스크롤하는 동안 반복 캡처한 뒤, 중복 프레임을 제거하고 하나의 PNG로 스티칭한다.[1]
  • PanoramaController는 약 16ms 간격으로 프레임을 수집하고, near-duplicate를 버리며, 최대 400프레임과 약 1.2GB RGBA 메모리 예산을 둔다.[2]
  • 고정 헤더·푸터 억제, 수직·수평 스크롤 정렬, 진행률 표시, Esc 취소, 클립보드 복사·파일 저장을 지원한다.[1][2]
  • ZOOMIT_PANORAMA_DUMP 환경 변수를 설정하면 실제 캡처 프레임을 width/height 헤더가 붙은 RGBA 바이너리로 덤프해 오프라인 스티처 회귀 테스트에 사용할 수 있다.[2]
  • 파노라마 기본 단축키는 클립보드 복사 Control+8, 파일 저장 Control+Shift+8이다.[1]

구현 구조

패키지와 실행 흐름

  • Package.swift는 Swift tools 6.0, macOS 14 플랫폼, 외부 패키지 의존성 없는 세 타깃과 Strict Concurrency 설정을 선언한다.[2]
  • AppDelegate가 단일 인스턴스 점유, 메뉴 막대 아이콘·메뉴, UserDefaults 설정 저장소, 권한 서비스, 디스플레이·캡처 서비스, 모드 코디네이터, 전역 단축키 서비스를 조립한다.[2]
  • ModeCoordinator는 static zoom, draw without zoom, live zoom, recording, snip, panorama, break timer 등의 명령을 중앙에서 전환하고 오버레이·주석·뷰포트 상태를 연결한다.[2]
  • HotkeyService는 Carbon RegisterEventHotKey를 통해 전역 단축키를 등록하며, live zoom 중에는 Option+Up/Option+Down을 임시 등록한다.[2]

화면 캡처와 뷰포트

  • ScreenCaptureKitCaptureService가 디스플레이와 영역 캡처를 제공하고, 권한이 없으면 CGPreflightScreenCaptureAccess/CGRequestScreenCaptureAccess 흐름으로 macOS 설정을 안내한다.[2]
  • ZoomViewportController는 배율을 1x~32x로 clamp하고, 커서 아래 콘텐츠가 고정되도록 source rectangle을 계산하며, 1.1배/0.8배 telescope step으로 확대·축소 애니메이션을 수행한다.[2]
  • 오버레이 윈도우는 모든 Space·전체 화면 보조 영역에 참여하도록 구성되며, draw·snip·panorama 등 모드별로 클릭 통과 여부와 커서 lease를 조정한다.[2]

설정·권한·배포 경계

  • 설정은 UserDefaults에 즉시 저장되며 확대·주석·글꼴·단축키·snip·record·webcam·panorama·break timer·launch-at-login을 포함한다.[1][2]
  • Screen Recording은 캡처에 필수이고, Microphone과 Camera는 해당 녹화 옵션을 켤 때만 필요하다.[1]
  • 개발 빌드는 ZoomIt (Dev).app/com.sysinternals.zoomitmac.dev, 공식 서명 빌드는 ZoomIt.app/com.sysinternals.zoomitmac을 사용하도록 분리한다.[1]
  • 이 bundle identity 분리는 macOS TCC 권한이 bundle identifier와 code-signing requirement에 묶여 있어, ad-hoc 개발 빌드가 공식 설치본의 Screen Recording 권한을 덮어쓰지 않게 하기 위한 설계다.[1]
  • 카메라·마이크 entitlement는 Scripts/ZoomIt.entitlements에 포함되고, Screen Recording은 별도 entitlement가 아니라 macOS TCC 권한으로 처리된다.[1]

빌드·테스트·설치

개발 실행

swift build
swift run ZoomItMacSelfTest
swift run ZoomIt

README는 self-test가 뷰포트 수학, 주석 lifecycle/rendering, 설정 persistence, panorama stitcher 회귀를 검사한다고 설명한다.[1]

앱 번들

zsh Scripts/build-app.sh
open ".build/ZoomIt (Dev).app"

release 빌드는 기본적으로 Apple Silicon과 Intel을 모두 포함하는 Universal 앱을 만들며, full Xcode가 없고 Command Line Tools만 있으면 스크립트가 경고 후 빌드 머신용 native 빌드로 fallback한다.[1]

공식 배포는 Developer ID 서명·notarization·ticket stapling을 권장하고, 내부 테스트용 ad-hoc 빌드는 Gatekeeper와 TCC 권한을 별도로 고려해야 한다.[1]

현재 검증 범위

저장소는 macOS AppKit, ScreenCaptureKit, AVFoundation, Vision, Carbon 프레임워크를 사용하므로 현재 Linux 호스트에서는 swift build 또는 self-test를 실제 실행할 수 없다. 이번 ingest에서는 원격 main HEAD와 파일 해시, README, Package.swift, 핵심 캡처·편집·주석·self-test 구현을 정적으로 확인했으며 macOS 런타임 성공을 주장하지 않는다.

설계 평가

강점

  • Windows ZoomIt의 발표 흐름을 macOS 네이티브 메뉴 막대 앱으로 옮기면서 확대·그리기·캡처·녹화·파노라마를 하나의 단축키 표면에 통합했다.[1]
  • OCR은 Apple Vision 온디바이스 경로를 사용하고, 설정·캡처·파노라마·편집을 외부 서비스 없이 로컬 프레임워크 조합으로 처리하는 방향이다.[1][2]
  • panorama dump, 풍부한 self-test, bundle identity 분리, TCC reset 절차 등 실제 macOS 배포·회귀 문제를 코드와 문서 양쪽에서 다룬다.[1][2]

트레이드오프와 주의점

  • Screen Recording 권한이 없으면 핵심 기능을 사용할 수 없고, 마이크·카메라·녹화·notarization은 macOS 권한과 서명 상태에 민감하다.[1]
  • Universal release 빌드는 full Xcode가 필요하며, ad-hoc 빌드는 재빌드 때 TCC 권한이 초기화될 수 있어 개발자와 테스터의 설치 절차가 공식 앱과 다르다.[1]
  • 파노라마는 캡처 프레임을 메모리에 누적하므로 최대 프레임 수와 약 1.2GB 예산을 두었다. 긴 문서나 고해상도 화면에서는 시간·메모리 비용을 고려해야 한다.[2]
  • 현재 조사 환경은 Linux이므로 이 문서는 구현과 문서에 대한 정적 기록이지, 특정 Mac 모델에서의 캡처 품질·권한 프롬프트·Universal 바이너리 실행 결과를 보증하는 테스트 리포트가 아니다.

관련 노트

원문 보존

  • raw source: github-microsoft-zoomitformac — README 전문, 조사 커밋, 파일 인벤토리와 선택 파일 SHA-256

Sources

[1] https://github.com/microsoft/ZoomitForMac — Microsoft Sysinternals ZoomIt for Mac [2] https://github.com/microsoft/ZoomitForMac/tree/e14bc9b97e784a5208addc8031f9f1c17c6f3a7f — ZoomItForMac source snapshot at e14bc9b