microsoft/Zoomit-Mac
microsoft/Zoomit-Mac has 1,085 GitHub stars and 51 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-09 10:33 UTC. Last push 2026-10-29.
Sysinternals ZoomIt for MacOS
What you can do
- Static zoom over a frozen ScreenCaptureKit display capture.
- Live zoom of the running screen, with click-through interaction when not drawing.
- Time-based, eased zoom animations for static and live zoom, with continuous motion when retargeting and no slowdown from delayed animation frames.
- Draw-without-zoom mode for annotating the screen at 1x.
Measured star growth
- in 24h
- 0
- in 7 days
- Collecting history
- in 15 days
- Collecting history
- in 1 month
- Collecting history
Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.
README.md
OriginalSysinternals ZoomIt for Mac
Sysinternals ZoomIt for Mac is a macOS menu-bar utility modeled after Sysinternals ZoomIt. It provides screen zoom, live zoom, drawing and typing annotations, screenshots, snips, recording, webcam picture-in-picture, and scrolling panorama capture.
Install
Install Sysinternals ZoomIt from the Homebrew Sysinternals tap:
brew install --cask microsoft/sysinternalstap/zoomit
If the tap is already configured, the shorter form also works:
brew install --cask zoomit
Uninstall
Uninstall ZoomIt with Homebrew:
brew uninstall --cask zoomit
Features
- Static zoom over a frozen ScreenCaptureKit display capture.
- Live zoom of the running screen, with click-through interaction when not drawing.
- Time-based, eased zoom animations for static and live zoom, with continuous motion when retargeting and no slowdown from delayed animation frames.
- Draw-without-zoom mode for annotating the screen at 1x.
- Pen, line, rectangle, ellipse, arrow, highlighter, undo, erase, blank-screen sketch pads, and typing annotations.
- Viewport screenshot copy/save and region snip copy/save.
- Optional snip dictation that records speech during a clipboard snip and copies the image and transcript together.
- OCR snip: select a screen region and copy its recognized text to the clipboard.
- Break timer with a configurable countdown, colors, opacity, background, and optional sound.
- MP4 screen recording for the whole screen or a selected region, with optional system audio, microphone audio, and fixed webcam picture-in-picture.
- Post-recording video editor with preview, trim, append, fades, playback controls, volume mute/slider, and export before save.
- Scrolling panorama capture with alignment, fixed header/footer suppression, progress, cancellation, and copy/save output.
- Tabbed Settings dialog for hotkeys, zoom, draw, type, snip, record, webcam, panorama, and launch-at-login preferences.
- Single-instance app behavior, menu-bar status, permission checks, and optional launch at login.
Requirements
- macOS 14 or newer.
- Xcode command-line tools.
- Screen Recording permission for capture.
- Microphone and Speech Recognition permissions are required only for microphone recording and optional snip dictation; Camera is required only for the webcam option.
Build, Test, Run
swift build
swift run ZoomItMacSelfTest
swift run ZoomIt
The self-test covers viewport math, annotation lifecycle/rendering, settings persistence, and panorama stitcher regressions.
Run the sandbox product-surface tests with the App Store compiler condition:
swift run -Xswiftc -DZOOMIT_APP_STORE ZoomItMacSelfTest
Launch at login requires running ZoomIt as an app bundle so macOS attributes the login item to ZoomIt instead of the host process used for development. Build the bundle with:
zsh Scripts/build-app.sh
open ".build/ZoomIt (Dev).app"
The contributor build is named ZoomIt (Dev).app (bundle id com.sysinternals.zoomitmac.dev) so it stays distinct from an installed official ZoomIt.app in the Screen Recording list. See Bundle identity below.
Default Hotkeys
| Action | Shortcut |
|---|---|
| Static zoom | Control+1 |
| Draw without zoom | Control+2 |
| Break timer | Control+3 |
| Live zoom | Control+4 |
| Record screen | Control+5 |
| Record region | Control+Shift+5 |
| Snip region to clipboard | Control+6 |
| Snip region to file | Control+Shift+6 |
| OCR region to clipboard | Control+Option+6 |
| Panorama to clipboard | Control+8 |
| Panorama to file | Control+Shift+8 |
All global hotkeys are configurable in Settings. While zoomed, use Option+Up and Option+Down to change zoom level, mouse wheel to zoom or resize tools depending on mode, Command+S / Command+C to save or copy the viewport, and Esc or right click to exit the active overlay mode.
Drawing And Typing
- Left click enters drawing mode; drag to draw.
- Hold
Shiftfor a line,Controlfor a rectangle,Control+Shiftfor an arrow, orTabfor an ellipse. - Press
R/G/B/O/Y/P/W/Kfor red, green, blue, orange, yellow, pink, white, or black; holdShiftwith a color for highlighter ink. - Press
Tfor typing mode,Shift+Tfor right-aligned typing, andUp/Downor the mouse wheel to adjust font size. - Use
Command+Zto undo andEto erase annotations.
Snip And OCR
Press the snip shortcut (Control+6) and drag a rectangle to copy that region of the screen to the clipboard; hold Shift (Control+Shift+6) to save it to a PNG file instead. Snip also works while zoomed, capturing the magnified view.
Snip dictation is off by default and can be enabled on the Snip tab in Settings. During a clipboard snip, press Space once while actively dragging to start listening. Releasing the mouse keeps the selection and status badge visible while transcription finishes; press Esc to cancel without replacing the clipboard. Extra or auto-repeated Space presses do not restart dictation.
On success, ZoomIt writes one multi-representation clipboard item. Its RTFD and HTML forms contain both the image and transcript, with PNG, TIFF, and plain-text fallbacks so each destination app can choose the format it supports. An empty transcript produces the same PNG/TIFF image-only payload as a normal snip. ZoomIt does not intercept paste or synthesize paste events, so this feature does not require Accessibility or Input Monitoring permission.
Dictation uses Apple's Speech and AVFoundation frameworks, prefers on-device recognition when the selected language supports it, and otherwise uses Apple's normal recognizer. It shares the configured recording microphone selection (falling back to the system default if the saved device is missing), but enabling microphone audio in recordings and enabling snip dictation are independent.
Press the OCR shortcut (Control+Option+6) and drag a rectangle to recognize the text inside it and copy that text to the clipboard. OCR uses Apple's on-device Vision text recognition, runs entirely on-device, and needs no extra permissions. Both shortcuts are configurable on the Snip tab in Settings.
Recording
Recording uses ScreenCaptureKit and AVAssetWriter. Static zoom and drawing overlays are captured even when ScreenCaptureKit omits ZoomIt's own windows; live zoom remains excluded from its own capture to avoid feedback. Webcam picture-in-picture stays fixed in the recorded viewport and is composited into overlay recordings instead of being zoomed into the source image.
When recording stops, ZoomItMac opens the built-in editor before the save panel so the clip can be trimmed, appended to another clip, faded, muted, and exported.
Panorama
Panorama capture records a selected scroll region while you scroll, then stitches the frames into one image. It filters repeated frames, handles vertical or horizontal scrolls, suppresses fixed headers and footers, shows stitch progress, and can be canceled with Esc.
Settings And Permissions
Settings are saved immediately to UserDefaults. The app includes permission checks for Screen Recording, Microphone, Speech Recognition, and Camera. Snip dictation requests only Microphone and Speech Recognition; it does not use Accessibility or Input Monitoring. Running from SwiftPM is supported for development; launch at login and production distribution are intended for the bundled app form.
Distributing To Testers
Testers should run the bundled app, not swift run. Build a release app bundle:
zsh Scripts/build-app.sh release
Local bundles default to version 1.0. Set ZOOMIT_VERSION to stamp a
specific dotted-numeric version into both CFBundleShortVersionString and
CFBundleVersion:
ZOOMIT_VERSION=1.2.0 zsh Scripts/build-app.sh release
defaults read "$PWD/.build/ZoomIt (Dev).app/Contents/Info" CFBundleShortVersionString
defaults read "$PWD/.build/ZoomIt (Dev).app/Contents/Info" CFBundleVersion
The official Azure DevOps build supplies ZOOMIT_VERSION from the version
entered when the pipeline is queued. Values must contain two or three numeric
components, such as 1.2 or 1.2.0; malformed values fail before compilation
or signing begins.
Build Variants
One source tree produces the standard unsandboxed application and the sandboxed product surface used for Mac App Store releases.
| Variant | Product surface |
|---|---|
| Homebrew | Unsandboxed, including DemoType |
| Mac App Store | App Sandbox; DemoType is compiled out |
ZOOMIT_DISTRIBUTION selects the channel and defaults to homebrew, preserving
the existing local build command. ZOOMIT_BUILD_NUMBER independently stamps a
numeric CFBundleVersion when a specific local value is needed.
# Existing contributor/Homebrew behavior
zsh Scripts/build-app.sh release
# Explicit Homebrew variant
ZOOMIT_DISTRIBUTION=homebrew ZOOMIT_BUILD_NUMBER=101 \
zsh Scripts/build-app.sh release
# Sandboxed local prototype (still uses the separate contributor identity)
ZOOMIT_DISTRIBUTION=appstore ZOOMIT_BUILD_NUMBER=101 \
zsh Scripts/build-app.sh release
The App Store variant uses security-scoped bookmarks for the selected break sound, break background, and automatic snip folder. Re-select a resource in Settings if macOS reports that its authorization can no longer be restored. Screen recording remains controlled by macOS privacy consent and has no app entitlement.
By default this produces .build/ZoomIt (Dev).app with the app icon, bundled resources, and an Info.plist declaring the microphone, Speech Recognition, and camera usage descriptions. release builds are Universal (Apple Silicon + Intel) by default; debug builds are native to the build machine for speed. Override the architectures with ZOOMIT_ARCHS (e.g. ZOOMIT_ARCHS=arm64). A Universal build routes through Xcode's build system, so it requires a full Xcode install — with only the Command Line Tools the script warns and falls back to a native build. The build summary prints the resulting architectures.
Create and install a local development DMG
Build the Universal development app, stage it with an Applications shortcut, and create a compressed disk image using macOS's built-in hdiutil:
zsh Scripts/build-app.sh release
STAGE="$(mktemp -d)"
ditto ".build/ZoomIt (Dev).app" "$STAGE/ZoomIt (Dev).app"
ln -s /Applications "$STAGE/Applications"
hdiutil create \
-volname "ZoomIt Dev" \
-srcfolder "$STAGE" \
-ov -format UDZO \
".build/ZoomIt-Dev.dmg"
rm -rf "$STAGE"
hdiutil verify ".build/ZoomIt-Dev.dmg"
open ".build/ZoomIt-Dev.dmg"
Drag ZoomIt (Dev) to the Applications shortcut in the mounted image, then launch the installed copy:
open "/Applications/ZoomIt (Dev).app"
A .dmg is a disk image, not an executable; use open path/to/file.dmg rather than invoking the path directly. Do not override a local ad-hoc build to use com.sysinternals.zoomitmac or the ZoomIt.app name. That identity is reserved for the officially Developer ID-signed release; an ad-hoc app using it conflicts with the official app's macOS privacy (TCC) grants even when System Settings shows Screen Recording as enabled.
Bundle identity: dev vs. official
Scripts/build-app.sh picks the bundle identity from the signing identity so a locally built copy never fights the officially distributed app over macOS privacy (TCC) grants, which are keyed by bundle id and code-signing requirement:
Contributor / ad-hoc build (default): app bundle
ZoomIt (Dev).app, bundle idcom.sysinternals.zoomitmac.dev, display name “ZoomIt (Dev)”, ad-hoc signed. Both the distinct file name and bundle id keep it separate from an installed officialZoomIt.app, so its Screen Recording grant is its own row in System Settings and the two never clobber each other.Official build: pass a real Developer ID identity and it keeps the canonical
com.sysinternals.zoomitmacid:ZOOMIT_SIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)" \ zsh Scripts/build-app.sh release
Override any field explicitly with ZOOMIT_SIGN_IDENTITY, ZOOMIT_BUNDLE_ID, and ZOOMIT_DISPLAY_NAME. Because a real signing identity has a stable, team-based designated requirement, the official app keeps its Screen Recording permission across updates; an ad-hoc build cannot share that grant since contributors don't have the certificate.
Entitlements (camera, microphone, and Speech Recognition)
build-app.sh signs both Homebrew and App Store variants with camera/audio-input access plus com.apple.developer.speech-recognition. These are required for the webcam, microphone capture, and Apple Speech transcription under their respective distribution constraints. Screen Recording is pure TCC and needs no entitlement. The entitlements are embedded even for ad-hoc builds so that when the official pipeline re-signs the bundle with ESRP (MacAppDeveloperSign), the existing entitlements are preserved. Verify on the first signed build with codesign -d --entitlements :- ZoomIt.app.
Signing options
Distributing widely (recommended): sign with a Developer ID Application certificate, notarize with Apple, and staple the ticket, then zip or wrap the app in a
.dmg:ZOOMIT_SIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)" \ zsh Scripts/build-app.sh release ditto -c -k --keepParent .build/ZoomIt.app ZoomIt.zip xcrun notarytool submit ZoomIt.zip --apple-id [email protected] \ --team-id TEAMID --password APP_SPECIFIC_PASSWORD --wait xcrun stapler staple .build/ZoomIt.appA notarized app opens with a normal double-click and keeps its Screen Recording permission across updates.
Quick internal testing (unsigned/ad-hoc): use the development identity and
ZoomIt-Dev.dmgprocedure above. If another Mac downloads the unnotarized DMG, Gatekeeper may block it. After copying the app to/Applications, testers can clear the quarantine flag:xattr -dr com.apple.quarantine "/Applications/ZoomIt (Dev).app" open "/Applications/ZoomIt (Dev).app"Note that rebuilding an ad-hoc/unsigned app can reset its Screen Recording permission, so testers may need to re-grant it after an update.
First run
- Move
ZoomIt (Dev).app(local testing) orZoomIt.app(official release) to/Applicationsand open it. It runs as a menu-bar item (no Dock icon). - macOS prompts for Screen Recording the first time a capture feature is used; enable the matching ZoomIt (Dev) or ZoomIt row in System Settings ▸ Privacy & Security ▸ Screen Recording, then relaunch that same app.
- Microphone and Speech Recognition are requested when snip dictation is enabled; Microphone and Camera are otherwise requested only when their recording options are enabled.
- Use the menu-bar icon or the default hotkeys above to drive the app, and the Settings dialog to customize shortcuts and behavior.
Clear stale Screen Recording permissions
macOS privacy permissions (TCC) are tied to both an app's bundle identifier and its code-signing requirement. If an ad-hoc build previously used the official com.sysinternals.zoomitmac identifier, System Settings can show ZoomIt as enabled while macOS rejects the currently installed Developer ID-signed app. Typical symptoms are:
Control+1repeatedly opens Screen Recording settings even though ZoomIt is enabled.- Closing the permission dialog and pressing
Control+1again does nothing. - A newly installed, correctly signed build still cannot capture the screen.
Reset only the Screen Recording record for the identity you are running. This removes the stale grant; it does not uninstall the app or clear ZoomIt settings.
For the officially signed /Applications/ZoomIt.app:
pkill -f "/Applications/ZoomIt.app/Contents/MacOS/ZoomIt" 2>/dev/null || true
tccutil reset ScreenCapture com.sysinternals.zoomitmac
LSREGISTER="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"
"$LSREGISTER" -f "/Applications/ZoomIt.app"
open "/Applications/ZoomIt.app"
For the local development /Applications/ZoomIt (Dev).app:
pkill -f "/Applications/ZoomIt (Dev).app/Contents/MacOS/ZoomIt" 2>/dev/null || true
tccutil reset ScreenCapture com.sysinternals.zoomitmac.dev
LSREGISTER="/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister"
"$LSREGISTER" -f "/Applications/ZoomIt (Dev).app"
open "/Applications/ZoomIt (Dev).app"
After relaunching:
- Press
Control+1once to request Screen Recording access. - Enable the matching ZoomIt or ZoomIt (Dev) row in System Settings.
- Use macOS's Quit & Reopen button, or quit and reopen that same app manually.
- Press
Control+1again.
Static zoom requires Screen Recording only. Microphone and Camera permissions are unrelated unless their optional recording features are enabled. If the problem immediately returns after the reset, verify that the installed app has the expected identity:
codesign -dv --verbose=2 "/Applications/ZoomIt.app" 2>&1 \
| grep -E "Identifier=|Authority=Developer ID Application|TeamIdentifier="
The official app should report identifier com.sysinternals.zoomitmac and a Developer ID authority. Never distribute or install an ad-hoc-signed app under that official identifier; local builds must remain ZoomIt (Dev).app with identifier com.sysinternals.zoomitmac.dev.
Explore related projects
codecrafters-io/build-your-own-x
Master programming by recreating your favorite technologies from scratch.
561,338 starspublic-apis/public-apis
A collective list of free APIs
497,586 starsmorluto/rea
Reverse engineer anything with agents, from app behavior down to native binaries.
446,628 starsopenclaw/openclaw
The AI that really does things. Any OS. Any Platform. The lobster way. 🦞
394,249 stars