SpinWin

A macOS menubar utility that visually rotates a selected window by any angle

(90° increments, arbitrary angles, or a continuous spin).

SpinWin flipping a terminal window upside down

How it works (and why)

macOS has no public API to rotate another app's window. Real rotation

would require private SkyLight calls (CGSSetWindowTransform) with System

Integrity Protection disabled — not worth it.

Instead, SpinWin fakes it:

Hide the selected window off-screen via the Accessibility API. It keeps

rendering there, so it can still be captured.

Capture its contents continuously with ScreenCaptureKit

(SCStream + desktopIndependentWindow filter) — this grabs only that

window's buffer, so the overlay never mirrors itself.

Draw the frames in a transparent, borderless overlay window placed where

the original was, rotated with a CALayer transform.

Because it's a layer transform, any angle works — the overlay is sized to the

rotated content's bounding box so nothing clips, and a diagonal-sized square is

used while spinning.

Usage

The easiest way to get SpinWin is the latest release

— the download is signed with a Developer ID and notarized by Apple, so it

launches without Gatekeeper warnings. Or build it yourself:

latest release

For quick iteration during development:

Left-click the menubar icon to start: choose a rotation in the bottom

options bar (a preset angle, a spin speed + direction, or free rotation), then

click the window you want. Drag the overlay to reposition it; drag its handle

to rotate freely. Press Esc on the overlay to stop and restore the window.

Right-click (or Control-click) the icon for the menu: active rotations

(with per-window angle/spin controls), Stop all, and Quit.

Permissions

Screen Recording — to capture the window contents.

Accessibility — to move the source window off-screen and restore it.

Current limitations

The overlay is a live picture, not interactive. You can drag and rotate

it, but clicks and keystrokes are not sent to the real window underneath.

Mission Control / Exposé leak. The hidden window is parked off-screen but

still a real window, so Exposé shows it unrotated. There is no public API

to exclude another app's window from Mission Control, and minimizing it would

stop the capture.

Some apps throttle rendering of off-screen windows, which can slow the feed.

A window that resizes itself while rotated keeps its original footprint.

You can't drag-resize the hidden window, but an app can still resize it on its

own (a video player adapting to a new track, a terminal responding to an escape

sequence). The capture is letterboxed into the original size until you stop and

rotate it again.

Layout