blog

Why hypershot is written in C++ and Qt

C++23 keeps the capture path fast and the process small on both operating systems; Qt 6.11 and QML build one overlay UI that behaves identically on macOS and Windows.

2026-08-21architecture · c-plus-plus · qt · behind-the-scenes

A screenshot tool has two jobs that fight each other. It has to touch the operating system at its deepest layer — the screen-capture APIs, the global hotkey table, the permission database — and it has to wear a beautiful face, the overlay you frame shots in.

Most toolkits make you pick. Web frameworks own the face and borrow the deep layer. Desktop frameworks own one layer or the other and port the rest. hypershot is built on Qt 6.11 and C++23, and that combination is the reason the same product feels native on both your machines.

The deep layer is where C++ earns its keep

Screen capture is a systems problem, and both operating systems expose it as a systems API. On macOS, frames stream through ScreenCaptureKit into CoreVideo pixel buffers. On Windows, they arrive as D3D11 textures through Windows.Graphics.Capture. Neither of those APIs speaks your language politely. They want direct memory access, reference counting, and a thread that never sleeps.

C++ gives hypershot all three without a middleman. The capture thread holds the latest texture or pixel buffer and never copies it unless something needs full-resolution pixels. The live preview reads a downscaled version — about 2MB of pixels instead of ~33MB — so the reticle you watch stays smooth even on a 4K display. A managed runtime with a garbage collector has to stop the world somewhere; a frame budget of ~100ms at 10fps has no room for that.

One engine, two faces

The capture engine, the editor model, the annotation math, the export pipeline — all of it is plain C++ that compiles once for each platform and never checks which one it is. The platform code is the only part that knows the difference, and it hides behind four small interfaces: the capture engine, the hotkey manager, the permission manager, and the text detector.

The UI is the other half of the story, and that’s where Qt’s QML language does the work. Every window you see — the capture overlay, the editor, the frame scrubber, the permissions window, the pinned-image controls — is a QML component. One set of components drives both operating systems, so the overlay’s motion, the animation on your annotations, the way the reticle settles on a window: identical on macOS and Windows, by construction, not by coincidence.

QML is the right tool for this specific kind of UI: a few windows, mostly transparent, mostly GPU-composited, and always on top. The reticle’s live preview composites on the GPU, and when macOS would make the CPU fight the GPU for time, we convert frames on the CPU on purpose. The UI thread never blocks on a frame.

The dependencies are few, and they do real work

Everything hypershot ships is doing a job, not padding the binary.

No web engine. No bundled runtime. No framework that ships a virtual machine to draw a button.

C++23: the modern part is doing work, not signaling

The codebase compiles as C++23, and the standard shows up in the hot paths rather than in the style. The frame buffer moves ownership from the capture thread to the editor with a single swap — no deep copy of a dozen full-resolution frames when you lift the reticle. Atomics carry the capture parameters between threads without a lock. A capture mode that is a dispatch code rather than a stored state (frozen region capture normalizes to plain region) keeps the model honest instead of growing a mode list that never shrinks.

That’s the whole pitch. C++ keeps the deep layer fast, Qt keeps the face consistent, and the four platform interfaces keep the two operating systems from leaking into each other.

One engine. One face. Your shortcuts and your annotations carry over when you switch machines.

Download for macOS or Download for Windows — run it once on each and the rest of this post is a non-issue.

Stay in the loop

New posts, product drops, and the occasional weird thing. One click to confirm, unsubscribe whenever.