Imperator Apps
← Home / Imperator Pong

Imperator Pong

Pong in a menu bar popover, with a CRT-filtered court, five colour skins, and square-wave sound synthesised at runtime.

LiveMIT Licensev1.0.0Updated 2026-08-02

README.md

// Overview

Pong that lives in the macOS menu bar. Click the icon and a popover drops down with a CRT-filtered court, and you play until someone reaches five.

A SwiftPM executable with no dependencies. LSUIElement is true, so there is no Dock icon and no menu — the status item is the entire interface. The game is a SpriteKit scene hosted inside SwiftUI through NSViewRepresentable, with mouse input captured by a local event monitor and forwarded to the scene.

// Install

Download the latest zip from the releases page, unzip, and move Imperator Pong.app to /Applications.

The app is signed with a self-signed certificate and is not notarized, so Gatekeeper blocks the first launch. Right-click the app and choose Open, or clear the quarantine flag:

xattr -dr com.apple.quarantine "/Applications/Imperator Pong.app"

Requires macOS 13 or later on Apple silicon. Built and tested on macOS 26 only; older versions are expected to work but have not been verified. Install at your own risk — provided as is, no warranty, under the MIT license.

// Permissions

None. The app asks for no Accessibility, Input Monitoring, Automation or privacy-gated grants, and declares no NSUsage keys.

The one system integration is Open at Login, the toggle in the popover footer. It calls SMAppService.mainApp.register(), which adds the app to Login Items in System Settings. macOS may show a notification the first time; turning the toggle off unregisters it.

// Use

Click the menu bar icon to open the popover. The game starts as soon as it is visible and pauses the moment it closes, so nothing runs in the background.

Move the mouse left and right over the court to drive the bottom paddle. The AI plays the top one. First to five points wins.

The header row holds the controls: five colour swatches switch the skin (Imperator Red, Arcade Green, Neon Blue, Electric Purple, Classic White), Reset restarts the match at 0-0, and the speaker toggles sound.

The ball speeds up on every paddle hit, from 280 to a ceiling of 550. Sound is generated at runtime as square waves — there are no audio files in the bundle.

The whole court runs through a CRT layer: scanlines, an RGB subpixel grid, flicker, a VHS tracking band, noise, and the occasional screen jitter.

// Build

make install

Builds release, bundles, codesigns, installs to /Applications and launches. make run and make clean are the other targets. Signing uses the self-signed Imperator Dev identity by default, overridable with CODESIGN_IDENTITY=-.

Because SwiftPM does not compile asset catalogs, the menu bar icon is drawn programmatically in AppDelegate.setupStatusItem() rather than shipped as an image.