So what does an exit ramp mean exactly? And what does that have to do with expired 10.4 patents?
I'm not trying to be purposely obtuse, I'm asking specifics, and you're responding with vague comments.
What exactly are you looking for? You mentioned the patents, you mentioned darwin, you said there's millions of intel macs in the wild. Please be specific
maflynn — ok, specifics, because I think we’re talking past each other.
When I say “exit ramp”, I’m
not talking about “porting Tiger” or freezing myself onto a 20‑year‑old OS. I’m talking about building the macOS
application runtime + GUI stack that Intel macOS apps expect (Cocoa/AppKit + CoreFoundation + Quartz/CoreGraphics/CoreAnimation + the WindowServer/compositor semantics) *
on top of a modern nix kernel (FreeBSD first, and potentially Linux too).
In plain English: the same idea as
WINE/Proton for Windows apps, except this is for
Intel macOS apps, and the host OS is
FreeBSD (or Linux). The goal is to run native *nix GUI apps (Qt/GTK)
side‑by‑side with native Mac apps in the same desktop session.
1) What “exit ramp” means (concretely)
It means:
- I can keep using the Intel Mac applications I already depend on even after Apple drops amd64 and stops shipping security updates for my hardware/OS line.
- I can move the “real OS” under my feet to something sane and maintainable long-term (FreeBSD: ZFS, jails, ports, predictable upgrades, etc.) without giving up the apps that are locked to Aqua/Cocoa.
- I can run those Mac apps as first-class desktop windows alongside Qt/GTK apps, not inside a full-screen VM.
So “exit ramp” is
a bridge off Apple’s platform lock-in while keeping the workflows alive.
2) What this has to do with “expired 10.4 patents”
The “patents” point was never “we can copy Tiger.” We obviously can’t copy Apple’s source code or trade dress and pretend it’s ours.
The patents angle is just: a lot of the core concepts behind Aqua/Quartz/Cocoa are not new inventions from last year—many are decades old—so patent landmines are less of a blocker than people assume. The
real blockers are:
- engineering effort (huge),
- behavior compatibility (harder than “UI looks similar”),
- and not copying Apple’s copyrighted implementation.
So:
clean-room behavior, not copied code. Patents are a footnote compared to the engineering.
3) What you actually have to build to run “arbitrary Intel Mac apps” on FreeBSD
To run arbitrary Intel macOS GUI apps, you need to supply
three big layers:
- Binary + syscall personality (so the program can start and make OS calls)
- Framework/runtime layer (so it finds the libraries it was linked against)
- GUI + compositor integration (so windows render and receive events)
If any one of those is missing, you only run a tiny subset of apps.
Below is what that looks like in concrete components.
A) The “Darwin personality” on FreeBSD (kernel + loader layer)
A1) Mach‑O executable loading (required day one)
macOS binaries are
Mach‑O. FreeBSD natively expects ELF. So you implement one of:
- Kernel loader: add a imgact_macho loader similar to FreeBSD’s existing “personalities” (think compat layers) so execve() recognizes Mach‑O, maps segments, sets up stack/TLS, and transfers control to the dynamic linker.
- Userland loader: register Mach‑O via binmiscctl (or equivalent) and dispatch Mach‑O execution to a userland “macho-runner” that emulates the exec loader and then hands off to dyld.
For a serious compatibility layer, the kernel loader route is cleaner and faster.
A2) dyld / dynamic linking (required day one)
Mac apps assume
dyld, not ld.so. You need to provide:
- dyld (or a dyld-compatible loader) that understands:
- frameworks (/System/Library/Frameworks/...)
- @rpath, @executable_path, @loader_path
- fat/universal binaries (pick x86_64 slice)
- symbol resolution rules exactly like macOS expects
A3) Syscall + Mach IPC compatibility (“Darwinulator” concept)
Even “simple” macOS userland expects a bunch of Darwin/Mach behaviors. You can do this in two ways:
Option 1: Implement Darwin/Mach compatibility directly on the FreeBSD kernel
Like FreeBSD’s Linux binary compatibility conceptually: map foreign syscalls to native kernel primitives, implement missing semantics, and provide the expected process/thread/memory behavior. (FreeBSD already proves this model works at scale with Linux binaries.)
Option 2: Hybrid kernel module / server approach
Keep the FreeBSD kernel mostly untouched and implement Mach-ish services in a privileged server + a small kernel module for the handful of things you can’t fake efficiently (message passing, some vm calls, etc.). You’re essentially recreating “just enough Mach” for userland.
In practice you’d implement at minimum:
- process/thread primitives expected by libSystem + libpthread
- kqueue/event semantics that macOS libs rely on (FreeBSD already has kqueue, which helps)
- mmap/vm_* behaviors Mac runtimes assume
- Mach messaging primitives (mach_msg style IPC) or a compatible abstraction
- signals/exception behavior close enough for crash handlers, debuggers, etc.
B) The macOS userland runtime on top of that (libraries/frameworks)
This is the “WINE part” of the project.
B1) Core runtime libraries (required before anything GUI works)
You need equivalents of:
- libSystem (the umbrella of libc + pthread + syscall stubs)
- Objective‑C runtime (libobjc) and associated ABI behavior
- libdispatch (Grand Central Dispatch) because modern code assumes it
- CoreFoundation (CFRunLoop, CFType, bundles, localization, property lists)
Until those exist, most apps don’t even reach main() meaningfully.
B2) Cocoa/AppKit (the real “Aqua app” API surface)
Most Intel Mac GUI apps are Cocoa. They need:
- Foundation (strings, collections, file APIs, KVO, notifications, bundles)
- AppKit (NSApplication event loop, NSWindow, NSView, menus, controls, text system)
- nib/storyboard loading behaviors
- pasteboard, drag/drop, services
This is the big one. You can’t fake Aqua by theming GTK. Apps don’t call “Aqua”; they call
AppKit.
A pragmatic path here:
- Use an existing Cocoa reimplementation as a bootstrap (even if incomplete), then iteratively improve behavioral compatibility until real apps run.
- Compatibility work is less about “drawing rounded buttons” and more about subtle things like responder chain, runloop modes, text layout quirks, event coalescing, timers, etc.
B3) Quartz/CoreGraphics/CoreText + image codecs
GUI apps need:
- CoreGraphics drawing model (paths, compositing modes, PDF rendering)
- CoreText font shaping/rendering
- ImageIO codecs (PNG/JPEG/TIFF/etc), color management (at least minimally)
You can implement these on top of existing *nix primitives (FreeType, fontconfig, Cairo-like 2D pipelines, etc.), but the public API must behave like Apple’s.
B4) CoreAnimation + compositing model
Modern AppKit apps assume CoreAnimation. So you need:
- CALayer tree management
- compositing, transforms, opacity, backing stores
- vsync timing model good enough for UI smoothness
- accelerated path via OpenGL/Vulkan (or at minimum a software fallback)
This is where “Quartz Compositor” style behavior comes in.
C) The GUI integration that makes this an “exit ramp” instead of a VM
This is the part you’re specifically asking about:
run Mac GUI apps and Qt/GTK apps concurrently.
C1) WindowServer equivalent as a translation target, not necessarily a clone
macOS has a WindowServer/compositor model. On FreeBSD you don’t need to literally replicate the entire internal architecture, but you do need a component that:
- owns top-level windows
- routes input events (mouse/keyboard/IME)
- manages z-order, focus, spaces/virtual desktops if you want them
- composes surfaces efficiently
Best approach in 2026: treat your Aqua layer as a
Wayland client (or X11 client) so Mac windows are just “normal windows” on the host compositor.
Concretely:
- Each NSWindow maps to a host surface/window
- Drawing output (CoreGraphics/CoreAnimation) renders into buffers
- Those buffers are presented to Wayland/X11 as window contents
- Host WM handles stacking, multi-monitor, etc.
That’s how you get “Mac app windows mixed with GTK/Qt windows” without hacks.
C2) Desktop-level integration (so it feels unified)
To be a real exit ramp, you also build:
- clipboard sharing between Mac apps and *nix apps
- drag-and-drop bridging (files + text)
- shared file dialogs or a “native” file picker mapping
- notifications mapping (NSUserNotification → host notification system)
- global menu bar support optionally (or just per-window menus)
This is the difference between “it runs” and “it’s usable daily”.
C3) Audio/video/input
To run real desktop apps you implement:
- CoreAudio → host audio stack
- HID/input events → host input
- basic video decode paths for common formats (or map to ffmpeg pipeline)
D) Compatibility strategy: how you get from “hello world” to “arbitrary apps”
To get to “run essentially any arbitrary Intel Mac app” you don’t start with Photoshop. You do it in phases:
Phase 1 — CLI Darwin environment
- Mach‑O loader + dyld + libSystem-ish stubs
- enough syscalls to run basic command line macOS binaries
Phase 2 — Foundation + Objective‑C runtime
- get non-GUI Cocoa tools running
- implement bundles, plist, localization
Phase 3 — Basic AppKit GUI
- one window, basic controls, event loop
- rendering via a simple 2D backend
Phase 4 — Quartz/CoreText/CoreAnimation
- real text system
- layer-backed views
- basic compositing
Phase 5 — “Desktop integration”
- clipboard, drag-drop, file open
- packaging of .app bundles (LaunchServices-like behavior)
Phase 6 — The hard cases
- GPU-heavy apps, private frameworks, modern security expectations, etc.
And here’s the key: for the “hard cases,” you can still have a
safety valve…
E) The practical safety valve: VM-based seamless mode (optional, but realistic)
If your requirement is truly “
any arbitrary Intel Mac app,” the only approach with near‑100% compatibility is: run real macOS in a VM and integrate its windows into the host desktop (seamless/unity mode style).
That can still be an “exit ramp” because:
- the host OS is FreeBSD
- the VM is just an application provider
- Mac apps show up as windows next to GTK/Qt apps
So the compatibility layer can be a spectrum:
- Native compatibility for a large and growing set of apps
- VM fallback for the apps that depend on proprietary/private frameworks or very exact modern behaviors
That gives you the practical outcome you care about (run the apps) while the compatibility layer matures.
F) “Possibly also Linux kernel”
That’s feasible if you architect it cleanly:
- Keep the framework/runtime layer portable (mostly userland code).
- Keep the kernel personality layer thin and OS-specific:
- FreeBSD backend (Darwinulator style)
- Linux backend (either native implementation or reuse the existing Darwin-on-Linux approach)
There’s already a proof-of-concept direction in the Linux world with “Darwin runtime on Linux” projects (Darling).
And on the BSD side there are explicitly macOS-inspired FreeBSD projects pursuing compatibility goals (ravynOS).
So this isn’t “I had a shower thought.” It’s a known class of problem with known approaches—it’s just a lot of work.
4) So, what exactly am I looking for?
I’m looking for the feasibility (and ideally community interest) in building a
FreeBSD-hosted Aqua/Cocoa/Quartz compatibility stack that:
- boots and runs Mach‑O Intel macOS apps,
- displays them as normal windows under a *nix compositor,
- allows them to coexist with Qt/GTK apps,
- and provides a path off Apple’s unsupported Intel future.
That is the “exit ramp.”
If your objection is “that’s massive effort,” sure—it is. But now we’re at least discussing the
actual technical project, not “porting Tiger.”