A native Swift 6 macOS screen recorder that turns actionable clicks and keyboard activity into smooth, automatic camera moves. It records a full-resolution source first, so the 1.8× zoom is applied during export without losing pre-event context.
Download the latest build from GitHub Releases.
- Apple Silicon Mac running macOS 15 or later
- Apple Command Line Tools with Swift 6 (
swift --version) - No Xcode project and no third-party packages are required
The app is assembled by Swift Package Manager and ad-hoc signed locally with a stable identifier-based designated requirement (not notarized with an Apple Developer ID). This keeps macOS privacy permissions attached across future local updates even when the executable changes. ffmpeg is used only by the optional media acceptance procedure, never by the app.
swift test
./build-app.shThe packaging script performs a release swift build, then creates:
dist/AutoZoom Recorder.appdist/AutoZoom-Recorder.zip
Launch the assembled app with:
open "dist/AutoZoom Recorder.app"Because the app is not notarized with an Apple Developer ID, Gatekeeper may require Control-clicking the app, choosing Open, and confirming once. Permission decisions belong to the assembled app identity; launching the raw .build executable can create a separate permission entry.
- Open the app and grant Screen Recording access.
- Grant Accessibility access so the global event listener can operate.
- Grant Input Monitoring access so click and keyboard timing can be detected. macOS may require the app to be reopened after either change.
- Choose a display and destination folder.
- Leave System audio enabled if desktop audio should be included. Enable Microphone only when narration is wanted; macOS will ask separately.
- Click Start Recording. While recording, the app shows whether interaction capture is active and the live number of click/key-down events detected. Interact normally, then return and click Stop & Export.
- Wait while the source is post-processed. The final H.264 MP4 is revealed in Finder automatically.
The app window is excluded from the captured display stream. The pointer remains visible in the recording.
- Every interaction stores only its relative time, whether it was a mouse or keyboard event, and the pointer position normalized to the selected display.
- Mouse clicks create zoom only when macOS identifies the click target as an actionable control (for example a button, link, input, menu item, switch, tab, slider, or element exposing a press action). Blank/descriptive areas, clicks outside the selected display, and AutoZoom Recorder's own controls are ignored.
- Accepted mouse clicks add a short blue pulse in the exported video so viewers can see exactly where the click occurred.
- Keyboard characters, key codes, modifiers, clipboard data, and typed text are never stored.
- Click target labels, page text, URLs, element contents, and browsing content are never stored; only temporary Accessibility role/action metadata is used to decide whether a click is actionable.
- A zoom starts 0.90 seconds before an interaction and reaches 1.8× at the interaction.
- Mouse events focus the click location. Keyboard events focus the pointer location at that instant.
- Mouse clicks stay responsive: their zoom-out begins at the click unless another interaction has joined the active segment.
- Keyboard input is modeled as a session. Zoom stays at 1.8× for 2.0 seconds after the most recent key-down; another key-down inside that idle grace extends the same session. Only after 2.0 seconds without keyboard input does zoom-out begin.
- A mouse click inside an active keyboard session refocuses the camera but does not reset the keyboard idle timer. Otherwise, interactions up to 1.10 seconds apart merge into one continuous segment.
- Push-in, focus movement, and pull-out use a quintic cinematic easing curve with zero velocity and acceleration at each endpoint. The view returns to 1× over 1.20 seconds.
- Edge-aware cropping keeps the frame inside the source display at all times.
- With no captured interactions, the recording is still exported and preserved at 1× for the whole video. After saving, the app explicitly warns that no click or keyboard events were detected and therefore no zoom was applied; it directs the user to re-enable Input Monitoring or Accessibility and quit/relaunch before the next recording.
- Recording startup succeeds only after the newly created listen-only event tap reports that it is enabled. If macOS creates but leaves it disabled, the just-started source capture is stopped and removed, and the app clearly reports the permission/relaunch recovery steps.
- During recording, the footer reports Interaction capture active and a live event count. If recovery cannot restore the tap, it reports Interaction capture interrupted with the count retained so the failure is visible before export.
- macOS can disable an event tap after a timeout or user-input transition. AutoZoom Recorder detects both
tapDisabledByTimeoutandtapDisabledByUserInput, immediately asks macOS to re-enable the tap, and verifies whether it recovered. - Tap-disabled notifications are macOS lifecycle signals, not user actions: they never increment the count and never create zoom events.
- The live state contains only the total count and whether monitoring/tap health is active. Keyboard identity, characters, key codes, modifiers, clipboard data, and typed text are never captured or stored.
ScreenCaptureKit requests full-resolution capture at up to 60 fps and writes the display to a temporary H.264 MP4. AVFoundation and Core Image render the zoom timeline while deriving frame timing from the source track: exact fractional rates such as 29.97 and 59.94 fps are preserved, rates above 60 fps are capped at 60, and integer rounding is never used. Available audio tracks are carried through export. A successful export deletes its temporary source. If export fails, the error dialog reports the preserved source path for recovery.
The permission card refreshes whenever the app becomes active. v1.1.1 changed the local signing identity from the old build-hash identity to a stable app identifier. Because macOS cannot migrate those old grants automatically, v1.1.1 needs one final reauthorization. v1.1.2 preserves the exact same identifier-only designated requirement, and future builds should not ask again merely because the version changed. If a button opens System Settings:
- enable Privacy & Security → Screen & System Audio Recording for AutoZoom Recorder;
- enable Privacy & Security → Accessibility for the event listener;
- enable Privacy & Security → Input Monitoring for click and keyboard timing;
- enable Privacy & Security → Microphone only when microphone capture is selected;
- quit and reopen the app when macOS marks a change as requiring relaunch.
The record button remains disabled until all three required permissions are independently available. Permission status and event-tap runtime health are deliberately separate: after startup the app verifies the actual listen-only event tap, and if the tap is rejected or remains disabled it stops the just-started source cleanly and explains which permissions to revisit and that the app must be quit and relaunched.
AutoZoomExportTool invokes the same exporter as the GUI with deterministic mouse and keyboard points. With ffmpeg installed, the acceptance script generates a static asymmetric 1280×720 source at 60000/1001 fps with a 48 kHz AAC tone, performs the real export, verifies every decoded frame timestamp and both streams, measures moving versus held frame differences, and extracts representative transition frames:
./Scripts/media-acceptance.shArtifacts, including exported-probe.txt, video-frame-pts.txt, per-frame difference metrics, named transition PNGs, and transition-contact-sheet.png, are written to .acceptance/v1.1.0/ by default.
- Whole-display recording only; there is no window/region picker or timeline editor.
- Display selection and audio options cannot change during a recording.
- Zoom scale, lead/release timing, keyboard idle grace, and merge gap are fixed product values.
- No webcam overlay, annotations, livestreaming, cloud sync, accounts, or collaboration.
- The build is ad-hoc signed for local use but is not notarized or packaged for the Mac App Store.
- Protected video surfaces may appear blank by macOS design. System audio availability is also subject to the source app and macOS privacy policy.