PowerEmu

PowerPC, now with the power back.

Mac OS X Tiger on an Apple silicon Mac, with the graphics card actually switched on.

  • Emulated ATI Radeon 9000
  • 3D rendered through Metal
  • Quartz Extreme and OpenGL
  • Classic, for Mac OS 9 software

Take a look

Mac OS X Tiger running full screen under PowerEmu on a modern Mac
Fresh from the grove
Alpha Apple silicon · Tested on Tiger

PowerEmu

PowerPC, now with the power back.

PowerEmu runs Mac OS X Tiger on an Apple silicon Mac. Finder, Dock, Aqua, Classic — the whole system, the way it shipped in 2005, in a window on your current machine.

The interesting part is the graphics. Most emulators hand the guest a fake framebuffer and make Mac OS X draw every pixel in software, which is why windows crawl and games won’t launch. PowerEmu emulates an ATI Radeon 9000 and routes its 3D through Metal on your real GPU. Tiger’s own ATI drivers load, Quartz Extreme switches on, and OpenGL works. Warcraft III runs at around 30 fps, all settings high, at 1680×1050.

Around the emulator there’s a proper Mac app: a library of VMs, shared folders, clipboard sync both ways, and a mail proxy and web accelerator so the old system can still sign into Gmail and load pages. Built on QEMU, GPL, free.

What it can do
  • 3D that actually runs. Games, screen savers and OpenGL apps go through your Mac’s GPU instead of being drawn by the CPU one pixel at a time.
  • Quartz Extreme switches on. Tiger sees a real graphics card, so the compositor turns on and the window effects come with it.
  • Warcraft III at around 30 fps. All settings high, at 1680×1050, on an emulated PowerPC Mac.
  • Clipboard both directions. Copy in Tiger, paste in macOS, and the other way around.
  • Shared folders. A folder on your Mac shows up as a mounted volume in the guest, so moving files is drag and drop.
  • Real full screen. Display modes shaped like your actual panel, including the notch strip, rather than a menu of 1998 resolutions.
  • The clock stays right. A small guest agent keeps Tiger’s time in step with the host instead of drifting off by hours.
  • Mail signs in again. A built-in proxy does the modern TLS that iCloud and Gmail now insist on, so Tiger’s own Mail app can connect with an app password.
  • A web accelerator. Your modern Mac does the TLS handshakes and re-encodes the heavy images, so the old system gets pages it can cope with.
  • Classic works. Mac OS 9 runs inside Tiger inside the emulator, which means pre-OS X software runs too. Yes, it’s turtles.
  • A shelf full of Macs. Keep as many VMs as you like, each with its own disks and settings, and pass through CDs, DVDs, disc images and USB devices.
  • An overlay that tells you the truth. Frame rate, draw calls and VRAM, plus what the host is doing — so a slow moment reads as “something else took the CPU” rather than as a mystery.
Why it’s faster than the alternatives

PowerEmu is built on QEMU, which already knows how to pretend to be a Power Mac. On its own, though, it stops a long way short of usable. Here’s what changed.

Plain QEMUPowerEmu
A dumb framebuffer. Mac OS X draws every window itself, on the CPU. An emulated Radeon 9000 that Tiger’s own ATI drivers bind to, unmodified.
No 3D at all, so games and screen savers either crawl or refuse to launch. 3D commands go to Metal on your real GPU. Warcraft III runs around 30 fps on high.
Quartz Extreme stays off, because Tiger looks for a real card and doesn’t find one. It finds one. The compositor turns on and windows move like they should.
The pointer smears trails across OpenGL windows. The host draws the cursor, so it stays clean.
A short list of old resolutions, none of them the shape of a modern display. Modes that match your panel, plus true full screen including the notch.
Audio crackles and cuts out constantly. Paced in real time, which fixed the dropouts. Some distortion is still being chased.
Plug in a USB device at the wrong moment and the whole thing wedges. The USB controller drops missed frames instead of livelocking. It keeps going.
Click another window and macOS quietly parks it on the efficiency cores. It tells macOS it’s busy, so it keeps running at full tilt in the background.
Stock settings that suit PowerPC code badly, so everything is slower than it needs to be. Retuned emulation internals. One guest benchmark went from 9–11 seconds to about 2.
No link to the host: no clipboard, no shared folders, no clock sync. All three, plus a real Shut Down instead of yanking the virtual power cable.
A second Dock icon and no way to manage more than one machine. One app, one icon, and a library of VMs with their own disks and settings.
Technical details

Graphics

  • An emulated ATI Radeon 9000 (RV280/R200) — ppc-mac-gpu, with an MMIO register set, a PM4 command processor and ring buffer, a 2D engine (fills, blits, host data, clipping) and AGP/GART address translation. Mac OS X’s own ATI kexts bind to it unmodified.
  • A Metal renderer for the R200 3D pipeline. Draw packets go straight to Metal: hardware T&L (model-view-projection, lighting, spot lights and attenuation, texture matrices, fog), viewport and scissor, R200 texture combiners, alpha test, blending done in-shader through framebuffer fetch, plane masks, depth and stencil. Textures in ARGB8888, RGBA/ABGR8888, RGB565, ARGB1555, ARGB4444, I8, AI88, DXT1/3/5 and YUV 4:2:2, resident in VRAM or fetched over AGP. It renders into VRAM through linear Metal texture views — no shadow copies.
  • Quartz Extreme. The uni-north host bridge gets an AGP capability and a working GART, so Apple’s AppleMacRiscAGP drives the bus, the Radeon driver builds its AGP GART and reports AccelCaps = 1, and WindowServer switches on the OpenGL compositor.
  • A hardware cursor. A patched QEMU VGA NDRV reports cursor support and hands the image and position to the GPU model, which draws it on the host — fixing the stale save-under that left cursor-shaped notches over OpenGL windows.
  • Host-shaped display modes. The device’s EDID (Established Timings III) and the patched NDRV’s mode table add 1440×932, 1280×828, 1152×746 and 1680×1088, plus below-the-notch variants. Full-panel fullscreen covers the whole display including the notch strip.
  • 64, 128 or 256 MB of VRAM, behind a 1 GB uni-north PCI window.

Sound, input and stability

  • Screamer audio pulls DMA at the sample rate from a 1 ms virtual-clock timer into a 186 ms ring; the position register advances with it and a 40 ms jitter buffer fronts the host backend. A four-second 1 kHz capture went from 10–20 dropouts to zero.
  • Seamless pointer via a USB tablet taking absolute positions; captured mode remains for games.
  • OHCI bounds transfer descriptors per endpoint per frame and drops missed frames rather than replaying them, which used to livelock the emulator under host load.

Speed

  • Host scheduling. An NSActivityUserInitiated | LatencyCritical assertion plus QOS_CLASS_USER_INTERACTIVE on the TCG vCPU threads stops App Nap exiling the emulator to the efficiency cores. A guest benchmark loop dropped from 9–11 s to 3.4 s on that change alone.
  • TCG: a raised softmmu TLB floor (1024 entries) and a 64K-entry TB jump cache retired by a generation counter, so a flush stays O(1) — a game covers 100k+ translation blocks and every PowerPC blr is an indirect branch.
  • target/ppc: lmw/stmw expanded inline instead of a helper that probe_accesses the range, and a host-FPU fast path for A-form arithmetic when FPSCR is RN with no enables and no NaNs.
  • GPU batching: conflicting batches ordered on the GPU with shared events rather than waitUntilCompleted on the vCPU thread, hybrid fences, an AGP/GART page-to-host-pointer cache, and draw vertices bump-allocated from a recycled 8 MB buffer.
  • Net result: benchmark loop 9–11 s → 1.95 s. Warcraft III went from 4–5 fps to around 30 fps on all-high settings at 1680×1050.

The app and the guest

  • SwiftUI app driving QEMU over QMP. VMs are .poweremu packages; importing disks and ROMs uses APFS clones. The guest screen is drawn inside the app through a poweremu-display object over a Unix socket with shared memory and damage rectangles, so QEMU isn’t a second Dock icon.
  • PowerEmu Tools — a guest agent for 10.4+ PPC, installed per user with no administrator password: clipboard both ways, shutdown and restart through loginwindow (kAEShutDown/kAERestart), and an optional root clock daemon that steps errors over 1 s and slews smaller ones with adjtime.
  • Shared folders over a WebDAV server implementing enough of RFC 4918 for Tiger’s webdavfs, on a per-VM Unix socket so no TCP port is opened.
  • Service Hub: a mail proxy (the guest authenticates locally; PowerEmu does implicit TLS or STARTTLS to iCloud, Gmail, Yahoo or Fastmail with an app password) and a Web Accelerator on 10.0.2.100:7780 doing TLS 1.3 and HTTP/2, WebP/AVIF/HEIC transcoding, image downscaling and 204s for trackers.
  • Built on QEMU 10.0.2 as patched by UTM. GPL-2.0-or-later.

Alpha, and still moving. Tiger is tested; Leopard isn’t yet — if you try it, tell me how it went. Free and GPL, always.

Alpha 0.3.1 · Mac OS X 10.4 and 10.5

The Garden

The Macintosh Garden, as an app store on your old Mac.

The Macintosh Garden has spent years archiving old Mac software — thousands of apps and games that would otherwise be gone. The Garden puts that whole collection into a store-shaped app that runs natively on the old Mac itself. No modern machine in the loop.

Browse, read what people said about it, press Get. It downloads the file, checks the MD5, unpacks whatever 1997 archive format it’s wrapped in, finds the actual application in the pile and puts it in your Applications folder. Multi-floppy sets get reassembled. Before you download anything, a badge tells you whether it’ll run on the Mac you’re sitting at — native, Classic, Rosetta, or not a chance.

Getting a 2005 Mac onto a 2026 website is its own small adventure: Tiger’s TLS stops at 1.0 and can’t complete a handshake any more, so The Garden brings its own. MIT licensed, free.

What it can do
  • The whole archive, browsable. Featured, Apps, Games, Categories and Search, all of it laid out like a store rather than a directory listing.
  • A compatibility badge on every download. Runs natively, needs Classic, needs Rosetta, or won’t run on this Mac — before you spend the bandwidth.
  • You choose the file. Get is a pull-down: it offers the sensible one, and the menu lists every download with its size and what it would run on.
  • Ratings and reviews. Pulled from what people have actually written on the site over the years.
  • Get does the whole job. Download, MD5 check, unpack, install. Disk images, StuffIt, BinHex, MacBinary, Compact Pro, zip, installer packages — they all get handled.
  • It picks out the right app. Old downloads are a heap of files; The Garden works out which one is the program and skips the updaters, installers and read-mes.
  • Floppy sets get reassembled. Software that shipped on five disks gets mounted and stitched back together instead of leaving you to it.
  • A library with real icons. Everything you’ve installed, in one list, ready to open, drag to the Dock, or throw out.
  • Updates get noticed. It spots newer versions and installs them, with the progress staying put in the Updates tab until the new copy is really in place.
  • Tell me when it breaks. There’s a report window in the app — a topic, what happened, optionally a picture of the window — and it shows you exactly what it’s about to send.
  • It works offline. Pages you’ve already visited stay readable when the network doesn’t cooperate.
  • It’s polite to the server. It fetches the pages you open and nothing else. No crawling, no scraping the whole site.
What you need to run it
Mac
Any PowerPC G3 or later, or any Intel Mac. One universal binary covers both
System
Mac OS X 10.4 Tiger or 10.5 Leopard
Memory
256 MB is fine. It was built with small machines in mind
Storage
Whatever your installs need, plus a little for cached pages
Internet
Any connection. Modern TLS is bundled in, so there’s nothing to configure and no helper Mac required
Plays well with
Mac OS 9 for the oldest titles, and PowerEmu if you’d rather do all this on a modern Mac
Version
0.3.1, alpha
Price
Free. MIT licensed
Technical details

Reaching the site at all

  • Bundled TLS. Every transfer runs through a statically linked libcurl 8 and OpenSSL 3. Tiger and Leopard’s own TLS stops at 1.0 and can no longer negotiate with the site, so the system stack is bypassed entirely.
  • One thread, one curl multi handle. A thread per request costs too much on a 256 MB G3; a single handle reuses connections, DNS answers and TLS sessions.
  • Persistent page cache with per-request TTLs (item pages 3 days, listings 6 h, the feed 1 h), revalidated with If-None-Match and If-Modified-Since, with offline fallback.
  • PowerEmu Web Accelerator client. Inside a virtual Mac it is found at 10.0.2.100:7780; on a real Mac over Bonjour with a pairing code. Pages and images go through it; downloads, form posts and the search token always go direct, so a file’s MD5 and the session are never in doubt. A Tiger G3 item page: 0.95 s direct, 0.20 s through PowerEmu — the difference is the TLS handshake. Absent, nothing changes.
  • A custom NSURLProtocol puts the system WebKit on the same stack, so a WebView can reach the site on Tiger and shares the app’s cookies.

Store, install and library

  • Featured (New & Noteworthy from rss.xml), Apps and Games A–Z, Categories and Search. Item pages carry screenshots, the rating, reviews parsed from the site’s comments, and rows of More by author and Related.
  • Compatibility badges computed per download against the host: native, Rosetta, Classic, or unsupported.
  • Install pipeline: MD5 verification, disk images via hdiutil, archives through the bundled XADMaster (StuffIt, BinHex, MacBinary, Compact Pro, zip and the rest), applications to /Applications, Mac OS 9 software to Applications (Mac OS 9), packages handed to Installer. Multi-floppy sets, including headerless raw images via CRawDiskImage, are mounted and copied out.
  • Launchable selection prefers the binary whose name matches the title and skips updaters, installers, read-mes and launchers; existing library entries are re-checked at launch.
  • Updates compare version numbers when both file names carry one and upload dates when neither does. The Dock icon is drawn by hand for progress and the badge, since Tiger has no NSDockTile.

Build

  • Universal ppc + i386, deployment target 10.4, built with Apple gcc-4.0 against the 10.4u SDK — Xcode 2.5 on Tiger or 3.1 on Leopard. PowerPC is -mcpu=G3 -mtune=G4; Intel is -march=prescott.
  • MIT licensed. XADMaster and UniversalDetector are the unmodified Universal builds from The Unarchiver 3.11.1, under the LGPL-2.1.

Version 0.3.1, and rough in spots. Not affiliated with the Macintosh Garden — just a fan with a compiler.

Alpha 0.2 · Mac OS X 10.4 and 10.5

Captain Polliwog

A web browser for PowerPC Macs that can still load the web.

Your old Mac came with a browser, and at some point it stopped working. Two separate things broke: sites started using encryption these Macs were never taught, and pages started using web features their browser had never heard of. Captain Polliwog replaces both halves.

It brings its own modern TLS, and it runs WebKit 604 — the engine from Safari 11, 2018 — rebuilt from source for PowerPC. It also ships a JavaScript JIT for PowerPC, which has never existed before; JavaScriptCore simply never had a PowerPC backend until now. Apple.com renders. Wikipedia renders. On a PowerBook.

For a number: Speedometer 3.1 on a PowerBook G4 scores 0.345, against PowerFox 26.4’s 0.189, and it wins 18 of the 20 suites. It’s early, but it’s a real browser. MPL, free.

What it’s like to use
  • One row of chrome. Buttons, address bar and window controls share a single line, the way a Mac browser does now — on a 1024×768 screen every pixel counts.
  • Tabs that give memory back. Background tabs let their pages go when RAM gets tight and reload when you return to them, which is the difference between ten tabs and a beachball.
  • Video, handed to a real player. A green button appears over a video you point at; press it and the video opens in VLC or MPlayer, which can actually decode it. Nothing plays until you ask, and the copy in the page pauses when the other one starts.
  • Bookmarks with folders. And it’ll import whatever Safari already has.
  • Resumable downloads. Stop one, come back tomorrow, carry on from where it stopped.
  • AutoFill. Passwords, addresses and cards, stored in your Mac’s own keychain.
  • Private browsing. Nothing written down, nothing cached, cookies gone when you close the window.
  • Reader. The article, minus everything stacked around it.
  • A lightweight view on request. Some sites are simply kinder to a G4 in their mobile form, so you can ask for it.
  • The everyday stuff. Find on page, printing, saving, and reopening the tab you closed by accident.
What you need to run it
Mac
Any PowerPC G3 or later, or any Intel Mac. One universal binary covers both
System
Mac OS X 10.4 Tiger or 10.5 Leopard
Memory
256 MB will run it — current Wikipedia loads on a 500 MHz G3 in about 53 MB. A gigabyte makes a real difference once you open a few tabs
Storage
Room for the app and its page cache
Internet
Any connection. TLS is built in, so there’s nothing to set up
For video
VLC or MPlayer, if you want to hand videos off to something that can decode them
Plays well with
PowerEmu, if you’d rather browse from a virtual Mac
Version
0.2, early alpha
Price
Free. MPL 2.0
Technical details

Networking

  • Its own TLS. Every request goes through a bundled OpenSSL 3.5, libcurl 8.22 and zlib. The system stack stops at TLS 1.0 and cannot reach most sites any more.
  • Plain HTTP goes the same way. Tiger and Leopard try a site’s IPv6 address first and wait about fifteen seconds for it to fail on networks without IPv6; libcurl tries both at once.
  • One thread through a single curl multi handle, browser-level connection limits, and a disk cache that lets a repeat visit skip the network entirely.
  • PowerEmu Web Accelerator client, for when it runs inside a virtual Mac.
  • Current Wikipedia and DuckDuckGo load on a 500 MHz PowerBook G3 with 256 MB of RAM, in about 53 MB of memory.

The engine

  • WebKit 604.5.7 — Safari 11, 2018 — built from source for PowerPC. Cross-compiled on an Apple silicon Mac in a Linux VM with a PowerPC toolchain (about 40 minutes from clean) and packaged as frameworks the browser loads, following Leopard WebKit’s structure. Built through WebKit’s CMake Mac port rather than the Xcode projects Apple used.
  • It has to be a fork. Upstream WebKit removed big-endian support on 1 August 2026 (commit 232cebab), so no future WebKit will ever compile for a PowerPC Mac. This one is frozen on a branch with fixes carried back by hand.

Speed

  • A PowerPC baseline JIT for JavaScriptCore — something it has never had. An offlineasm PowerPC backend runs the LLInt as native code, with a new assembler and macro assembler for the JIT, and the big-endian work that goes with it: EncodedJSValue returned tag-first from C but payload-first from JS, tag-first JSValue arguments, call frame payloads at +4, and byte-reversed loads for typed arrays. 1.5–3.5× the interpreter on micro-benchmarks.
  • Layout that doesn’t redo itself. RenderLayer::updateLayerPositions used to walk every layer in the page after every layout. Each RenderElement now carries a four-bit generation number in spare bitfield room, marked up the ancestor chain by anything that moved and expiring on its own as the view advances the generation; the walk skips subtrees that didn’t change. Checked pixel for pixel against a full re-render via CGWindowListCreateImage. TodoMVC-Svelte-Complex-DOM: 3532 ms → 1277 ms.
  • Speedometer 3.1 on a PowerBook G4: 0.259 → 0.345, against PowerFox 26.4’s 0.189. Eighteen of twenty suites now beat PowerFox; the two left are Charts-chartjs (Core Graphics path rasterization) and TodoMVC-ES5 (relayout boundaries).

What it supports

  • Platform: flexbox and grid with gap, :has(), :focus-visible, unprefixed position: sticky, cascade layers, range media queries, :is()/:where(), logical properties, constructable style sheets; ES2017+ — classes and private members, async/await, generators and async generators, modules and import maps, BigInt; fetch, Web Timing, WebGL through ANGLE, WOFF2 via OTS, and full ICU with all 683 locales.
  • The browser’s own code is under the MPL 2.0.

Version 0.2. Early, rough in places, and improving most weeks.

About

About

Cytrus Software is one person making small, honest software with a taste for the old ways — hand-built tools in the spirit of the early web. Quiet, durable, and a little bit strange.

No trackers, no newsletters, no upsells. Just software that does a thing and then gets out of the way.

If you want to say hello, you can reach me at adam.cipoletti@me.com.

Support

Support

All three of these are free and open source, and they’ll stay that way. There’s no paid tier, no licence key, and nothing here is counting you.

If one of them earned a spot on your Mac and you feel like buying me a coffee, the buttons are below. Any amount is lovely, and no amount is completely fine too — I’d be building this stuff either way.

Honestly, an email telling me you got something working is worth just as much.