Distributing classic Mac applications from PowerPC Mac to Apple Silicon, bringing retro Mac experiences to modern systems. Why throw away a Mac that still works? True sustainability is using what we have.
A lightweight Quick Look substitute that runs natively on Mac OS X 10.4 Tiger. Quick Look itself only arrived in Leopard (10.5), so Tiger never had it. This brings back the Leopard-style gesture — select a file in the Finder, press Space, and a preview window appears — on a real Tiger machine. The aim is to see what a file is when the name doesn't tell you: it covers images, PDF, plain text, and even Office documents (see the table below), using nothing but tools Tiger already ships. Still an early release (v0.4), with more being added.
open -a TigerQuickLook.app /path/to/file).
The goal is identifying a file you can't place by name, not faithful rendering — if the text inside comes through, that's enough.
| Images | JPG / PNG / PDF / TIFF / GIF / BMP — drawn directly via ImageIO / Quartz. PDF shows page 1 only. |
|---|---|
| Text | TXT / MD / CSV / JSON / XML and many source types — first 64 KB, shown raw in a monospace window. Extension-less files are previewed too if the content looks like text. |
| Legacy Office | DOC (Word 2004 etc.) / RTF / HTML — run through Tiger's own textutil -convert txt. |
| Modern Office | DOCX / PPTX / XLSX / ODT / ODS / ODP — unzip -p the body XML, then strip tags. |
Not covered: RAW, faithful layout, every page/sheet of a multi-page document. No extra libraries — the only external dependencies are Tiger's bundled textutil and unzip.
Bring the Finder to the front, select one file, and press Space. Press Space again
(or Esc in the window) to close it. While a preview is open, ← / → / ↑ / ↓
move to the previous/next file in the same folder, in name order — files it can't display are
skipped over, and a beep marks the end of the run. It's the same feel as Leopard's Quick Look, so you
can flip between images without pressing Space again. When the app is
running as a resident agent, a "QL" item appears at the right end of the menu bar
— quit it from there (or killall TigerQuickLook in Terminal). When something other
than the Finder is frontmost, Space behaves normally and is not intercepted.
TigerQuickLook.dmg (from the button above) and drag TigerQuickLook.app into your Applications folder.TigerQuickLook.app with Finder double-click, open TigerQuickLook.app, or a Login Item. Do not run the executable by path (.../MacOS/TigerQuickLook) — that skips LaunchServices, so the menu bar item, the Finder queries, and the preview window all go dead (only the event tap keeps working, which makes it easy to misdiagnose).TigerQuickLook.app to System Preferences → Accounts → Login Items.| Verified | iBook G4 (PowerBook6,5) / Mac OS X 10.4.11 (Tiger) |
|---|---|
| Requirement | PowerPC Mac, Mac OS X 10.4 (Tiger) |
A personal hobby project provided with no warranty. MIT licensed. Full source, license, and development notes are in the GitHub repository.
The whole app is a single src/main.m, built with a plain gcc invocation from
build.sh — xcodebuild is broken on this machine (DevToolsSupport.framework
is missing), so the .app bundle is assembled by hand in a shell script.
The target is a 2005 iBook G4 (1.2 GHz, 1.25 GB RAM). Images are shrink-decoded from the start
via CGImageSourceCreateThumbnailAtIndex with kCGImageSourceThumbnailMaxPixelSize,
never decoded at full resolution. PDFs use CGPDFDocumentCreateWithURL and draw only page 1
with CGContextDrawPDFPage (PDFKit doesn't exist on Tiger) — because pages are parsed
lazily, even a 250-page PDF opens instantly; only the complexity of page 1 matters, not the file size.
TXT reads just the first 64 KB via NSFileHandle into a read-only NSTextView.
No prefetch, no cache, the window is disposable. A 5.4 MB PDF with a 2550×3300 scanned image on
page 1 opens after a brief pause with slightly sluggish drag-resize — judged good enough that an
offscreen bitmap cache wasn't worth adding.
The hard part. A Services-menu approach doesn't work: Tiger's Finder doesn't put the selected file on the
Services pasteboard, so the item is always greyed out (fixed in 10.5). A modified shortcut like
⌘Y would be easy with Carbon's RegisterEventHotKey and needs no system
setting, but "the key is too far away." That leaves CGEventTap as the only way to
conditionally intercept an unmodified single key — and on Tiger a CGEventTap can't be
created at all unless "Enable access for assistive devices" is on. That requirement is unavoidable, so
it's called out loudly in the docs as a one-time setup step.
v0.2 grew the format list from four to a couple of dozen, and the rule was: no new dependencies. A
small classifier dispatches by extension (with a content sniff, so an extension-less file that's really
text still previews). Images just gain the rest of what ImageIO already reads (TIFF/GIF/BMP). Legacy
.doc, .rtf and .html are piped through /usr/bin/textutil,
which Tiger ships — Japanese survives the round trip. The modern Office formats are zip archives,
so /usr/bin/unzip -p pulls out the body part (word/document.xml,
ppt/slides/slide*.xml, xl/sharedStrings.xml, content.xml) and the
tags get stripped in code. It's identification-grade, not layout, which is exactly the goal.
[event characters] directly (like Terminal) receive the full-width character. The fix: never leave the tap enabled all the time. A 0.3 s NSTimer poll enables CGEventTapEnable only while the Finder is frontmost or a preview is showing (Tiger has no NSWorkspaceDidActivateApplicationNotification — that's 10.6+). The side effect is the ~0.3 s dead window after switching to the Finder.
.../MacOS/TigerQuickLook directly skips LaunchServices, so LSUIElement never applies and the status-bar item, the NSAppleScript calls to the Finder, and the preview window are all unresponsive. Only the low-level CGEventTap still fires, which makes it easy to chase the wrong bug. Always start it via open, a double-click, or a Login Item.
CGFloat doesn't exist (it came with the 64-bit move in Leopard) — use plain float. A CGPDFPageRef does not keep its parent CGPDFDocumentRef alive: retain only the page, release the document, and the next access to the page hits freed memory and crashes with EXC_BAD_ACCESS — hold the document and re-fetch the page with CGPDFDocumentGetPage each time. And @"..." literals with non-ASCII bytes get mangled by GCC 4.0, so every user-visible string goes through [NSString stringWithUTF8String:].
.icns files render as a blank white icon on Tiger. Today's iconutil produces PNG-based icon types (ic07/ic08/…, 256–1024 px) that Tiger's Finder can't parse. Tiger only reads the classic types (is32/il32/ih32/it32 plus 8-bit masks, 16–128 px, uncompressed or PackBits). libicns' png2icns produces a correct one: png2icns out.icns 16.png 32.png 48.png 128.png.
scp-ing the changed file to the iBook, and running build.sh over ssh — but screencapture run from an SSH session produces nothing (the process has no WindowServer connection), so every UI check has to happen standing in front of the iBook's own screen.
Full source code is on GitHub.