See More Details

JgDo

A native macOS menu bar utility for keyboard-driven window management, clipboard history, saved workspaces, and live system monitoring.

2025 – 2026
macOS 14+

Overview

JgDo is a menu bar app that replaces the handful of separate utilities most macOS users end up installing — a window snapper, a clipboard manager, a system monitor, an app switcher — with one process that shares state between them. It runs as an accessory app: no Dock icon, everything reachable from a status item or a global hotkey.

The architecture is MVVM plus a services layer. Views are SwiftUI; window and panel plumbing is AppKit, because the parts of macOS that this app exists to touch — the Accessibility API, CGEvent taps, borderless key-accepting panels — have no SwiftUI equivalent. SwiftData backs clipboard history, saved workspaces, and usage events.

It ships as a real product rather than a repo: a signed arm64 DMG with Sparkle auto-updates, release notes, and a marketing site. Accessibility permission is requested on first launch for window control; screen recording is optional and only needed for window thumbnails.

Highlights

  • Ten snap layouts — halves, quadrants, thirds, maximize, center — driven by global hotkeys, with configurable edge gaps between snapped windows.
  • ⌘-drag snapping with a ghost preview overlay showing where a window will land, plus adjacent resize that moves neighboring windows in lockstep.
  • An ⌥Space app switcher with search and arrow navigation; pressing return snaps the selected app side-by-side with the current one.
  • Clipboard history (⌥V) for text, images and files, with search, pinning, and paste-in-place into the frontmost app.
  • Workspaces that capture a whole window arrangement and restore it in one click, persisted with SwiftData.
  • A menu bar dashboard with per-core CPU, memory, disk, network throughput, battery, and brightness/volume sliders.

Design Notes

01

NSStatusItem over MenuBarExtra

SwiftUI's MenuBarExtra has no programmatic toggle, which makes it unusable for an app whose primary entry point is a global hotkey. The status item and popover are built in AppKit instead, so ⌥Space can open the panel the same way a click does.

02

Panels that take keystrokes without stealing focus

The switcher and clipboard HUDs are NSPanel subclasses overriding canBecomeKey, so their search fields receive typing while the app underneath stays active — you never lose the window you were about to act on. Navigation keys are intercepted with a local event monitor in the AppDelegate so SwiftUI text fields don't beep on arrow and return keys.

03

Two coordinate systems, converted in one place

The Accessibility API reports window frames in CG coordinates (top-left origin) while NSScreen uses AppKit's bottom-left origin. Every window move crosses that boundary, so the conversion lives in one shared helper on WindowManagerService rather than being re-derived at each call site — the class of bug that otherwise only appears on a second monitor.

04

Sampling that stops when nobody is looking

A menu bar app that polls CPU, memory, disk and network continuously is a background battery drain for a dashboard nobody has open. Sampling starts when the popover opens and stops when it closes, so the idle cost of having JgDo installed is close to nothing.

05

A consolidation pass with a written audit

At around 120 Swift files the codebase was read end to end and audited for genuine duplication rather than style nits. The finding was that the command palette, switcher, and hotkey paths already bottomed out in the same two services, with one canonical layout enum, shortcut table, settings layer and logging façade — so the follow-up was deliberately kept small and surgical instead of a rewrite.

Screens

JgDo menu bar overview panel
The status popover: quick actions plus live CPU, memory, battery and network
JgDo system monitoring panel
System detail with per-core CPU and brightness/volume controls
JgDo workspace management panel
Saved workspaces — capture a window arrangement and restore it later