Skip to content

feat: Omacy engine, host app, and screensaver appex - #2

Merged
dedene merged 13 commits into
mainfrom
cursor/omacy-architecture-impl-ccd3
Aug 27, 2026
Merged

dedene merged 13 commits into
mainfrom
cursor/omacy-architecture-impl-ccd3

Conversation

@dedene

@dedene dedene commented Aug 27, 2026 •

Copy link
Copy Markdown
Owner

Implements architecture revision 7: vendored ttfx, C ABI session, Metal host + appex sources.

Proven

  • Engine: cargo test -p omacy-engine (37-effect ANSI oracle, conversion fixtures, session/FFI, thumbnails). Vendored ttfx tests green after fill_grid patches.
  • This Mac (Xcode 26.6): xcodebuild Release arm64 BUILD SUCCEEDED. Product is Omacy.app with nested OmacyScreensaver.appex (be.zenjoy.omacy.screensaver, com.apple.screensaver).

macOS compile CI

GitHub Actions macos.yml on macos-26 (unsigned; deployment target 15.0). PaperSaver 0.2.0 needs Swift 6.2.

Host / appex (idle unverified)

Aerial-style host + screensaver appex, App Group group.be.zenjoy.omacy, PaperSaver enable, Metal renderer, 60 Hz engine accumulator, canary fallback. loadView(forFrame:isPreview:) so each display and the Settings preview get the real frame.

Idle, System Settings listing, multi-display paint, and signed/notarized install are not claimed. Table: docs/macos-gates.md. Fail that gate: keep host preview, do not put the engine in the appex.

Pins

ttfx v0.3.2 7203e354498462064b7c0a89375051f65cf2ce99. Wordmark from Omarchy quattro. Font: Fairfax HD, SIL OFL.

Verify

cargo test -p omacy-engine
cargo test --manifest-path vendor/ttfx/Cargo.toml

On this Mac: open apps/Omacy/Omacy.xcodeproj, set a Development Team, copy to /Applications or stay in DerivedData (one location), register, idle.

Vendored ttfx v0.3.2 with GUI seams (fill_grid snapshot at frame emit,
advance, from_name). omacy-engine session/FFI matches docs/ffi.md.
Parity matrix (37 effects, two inputs, two canvases, 180 frames) is
green against the ANSI oracle. Conversion goldens, Fairfax HD (OFL),
and the Aerial-style host + appex sources land together.

Idle and System Settings listing remain a Mac gate.

Co-authored-by: Peter Dedene <dedene@users.noreply.github.com>
@dedene
dedene marked this pull request as ready for review August 27, 2026 16:27
cursoragent and others added 12 commits August 27, 2026 16:50
Atomic App Group writes with last-known-good, stop-before-start
lifecycle, Metal-to-CALayer canary fallback, occupancy constants,
atlas white-pixel UVs, dead-session recreate, and pending config on
save. Add FFI panic-invalidates-cells and max-grid budget tests.

Co-authored-by: Peter Dedene <dedene@users.noreply.github.com>
Replace the flat screensaver thumbnails with the asymmetric canary
fixture, add a host app icon catalog, reject SVG file/data image
hrefs, size the Metal drawable on attach, and cover wait-queued
pending config, begin_next geometry, re-entrant step, ESC art, and
the 37-effect pool in tests.

Co-authored-by: Peter Dedene <dedene@users.noreply.github.com>
ScreenSaverEngine can call loadView(forFrame:isPreview:). Using only
loadView() sized every display from NSScreen.main and left Settings
preview uncapped. Also warn when PlugInKit has both DerivedData and
/Applications registered.

Co-authored-by: Peter Dedene <dedene@users.noreply.github.com>
Linux cannot prove the Aerial-path targets link. Add a macos-15
xcodebuild of the Omacy scheme (ad-hoc sign), skip pluginkit on CI,
and put the screensaver source dir on the appex header search path.

Co-authored-by: Peter Dedene <dedene@users.noreply.github.com>
PaperSaver 0.2.0 needs Swift 6.2, which macos-15/Xcode 16 does not ship.
Keep MACOSX_DEPLOYMENT_TARGET at 15.0. Also put cargo back on PATH inside
Xcode script phases, and make OmacyRenderer an NSObject so the display-link
selectors compile.

Co-authored-by: Peter Dedene <dedene@users.noreply.github.com>
Xcode rejected two “Build Rust engine” script phases writing the same
output. The host already depends on OmacyScreensaver, so cargo runs there
once and both targets link the archive.

Co-authored-by: Peter Dedene <dedene@users.noreply.github.com>
NSView.displayLink returns a CADisplayLink, not an Optional. Log
omacy_status with String(describing:) instead of Int(), which the
imported C enum does not support.

Co-authored-by: Peter Dedene <dedene@users.noreply.github.com>
deinit cannot call OmacyRenderer.stop (MainActor). PreviewView is a
typealias, not a subclass of final OmacyHostView. Local xcodebuild
Release arm64 now produces Omacy.app with the nested screensaver appex.
Reuse the Zentty certificate repo and existing Zenjoy Developer ID
cert. Match now creates per-app Developer ID profiles so the App Group
entitlement can sign. Archive and notarize lanes are thin; no Sparkle.
Gym archives a universal Mac binary by default; the Rust
staticlib is arm64. Pin ARCHS and sign Release by hand so
archive and notarize match the Intel-out-of-scope pin.
CAMetalLayer was the view layer, so AppKit layout discarded
the drawable and presented black between ticks.
The ScreenSaver-Settings.extension URL no longer lands on
the Screen Saver sheet; Tahoe hosts it under Wallpaper.
@dedene
dedene merged commit 1b2e3eb into main Aug 27, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants