LightPhotos and RapidRAW on the Mac
The same test as LightPhotos and LightCraft on the Mac, with another Rust app. RapidRAW is a GPU RAW editor built on Tauri. It decodes every RAW with rawler, the library that LightPhotos uses everywhere except the Mac.
The main difference: who decodes the pixels
Both apps are Rust programs that draw the photo with wgpu
on Metal, and both read your folders in place. LightPhotos draws its
whole window with its own GPU code. RapidRAW draws its panels with
React in a system web view and puts the photo in it from Rust.
LightPhotos: Apple decodes every JPEG, HEIC and RAW file. The decoders add 0 MB to the 17.6 MB app.
RapidRAW is a full editor. It has AI masks for the subject, sky and depth, AI denoise and inpainting, panorama, HDR and focus-stack merges, negative conversion, lens corrections and tethering. LightPhotos has a smaller job: you go through a folder fast, keep the good photos and make quick edits. Remember this for each number below.
| LightPhotos | RapidRAW | |
|---|---|---|
| RAW decoding on the Mac | CoreImage's CIRAWFilter, in 16-bit floats. ImageIO for thumbnails. | rawler (its own fork), plus colour noise reduction and sharpening. Apple RAW 9 is an option. |
| Window | Native, drawn with wgpu | Tauri: React in a WebKit view, photo drawn with wgpu |
| Your photos | Folders, read in place. Each folder keeps its own .lightphotos folder. | Folders, read in place. Each photo that you edit gets a .rrdata file beside it. |
| AI features | None | Masks, denoise, inpainting and tagging on ONNX Runtime. Models download on first use. |
| Platforms | Mac, Windows, Linux, browser | Mac, Windows, Linux, Android |
| License | MIT or Apache-2.0 | AGPL-3.0 |
Two kinds of sidecar
Neither app has a central catalog. You open a folder, and the app reads
the files where they are. The difference is where the edits go.
RapidRAW writes one small JSON file next to each photo that you edit,
such as DSC01831.ARW.rrdata, and it keeps its thumbnails in
~/Library/Caches. LightPhotos puts its ratings, edits and
thumbnails in one .lightphotos folder inside the folder.
In both apps, the edits move with the photos when you move the folder
in Finder.
How I measured
I built both apps from source with their own release scripts:
LightPhotos 0.1.31 with its new 16-bit float RAW decode (commit
55d74b9) and RapidRAW 1.6.5. I ran them on an M4 Mac mini
with 16 GB of memory and macOS 26.5. For each run, I copied the
same 18 RAW files to a new folder, so no cache had seen them. They
come from 13 cameras in 10 formats, from 5 to 45 megapixels. The
test opens a 14-megapixel Sony A7 IV file, then goes through
another A7 IV file, a Canon 5D Mark III CR2, two Canon
R5 Mark II CR3s, three DNGs (Adobe, iPhone ProRAW and Ricoh
GR III) and a Nikon Z f NEF. Each app started with a new home folder and default settings.
The window was 3840 × 2000 px on a 4K display.
The script is the same tools/desktop-bench as last time.
It starts the app, double-clicks the first photo and pushes the right
arrow eight times. It captures the window every 150 ms. It records
the first change, and the time when nothing changed for 3 s. Each
number is the median of five runs. One capture takes about
0.26 to 0.29 s, so no result can be less than about 0.4 s.
I had to make two changes for RapidRAW. First, RapidRAW opens on a welcome screen. The script clicks Continue Session as soon as that screen is still, and the time to the grid includes both parts. Second, RapidRAW's window is a web view, and macOS runs a web view in three separate WebKit processes. The memory number adds those three to the app.
The numbers
| LightPhotos | RapidRAW | |
|---|---|---|
| Download (.dmg) | 8.4 MB | 32.7 MB |
| App, installed | 17.6 MB | 84.7 MB |
| Launch to window | 0.35 s | 0.71 s |
| Launch to finished grid, 18 RAWs | 1.22 s | 4.91 s, with the welcome screen |
| Open the first photo: first change / screen settled | 0.58 / 1.05 s | 0.63 / 1.64 s |
| Next photo, each (median of 8): first change / screen settled | 0.45 / 0.45 s | 0.47 / 2.82 s |
| Memory afterwards | 2.2 GB | 6.1 GB |
The times agreed to within a few percent, with two exceptions. RapidRAW took 0.68 to 1.03 s to show its window. One LightPhotos grid took 1.43 s. Memory varied more: LightPhotos used 2.1 to 2.2 GB, and RapidRAW used 5.8 to 6.5 GB.
What the measurement sees
Next photo
LightPhotos prepared the next photo before the key press, so it shows at once. RapidRAW shows its 1280 px preview at once too, then decodes the full RAW. The window settles at 2.82 s.
- First visible change
- 0.45 s
- Whole screen settled
- 0.45 s
- First visible change
- 0.47 s
- Whole screen settled
- 2.82 s
Open first photo
Nothing prepared the first photo in either app. Both show a small preview first and then the developed RAW.
- First visible change
- 0.58 s
- Whole screen settled
- 1.05 s
- First visible change
- 0.63 s
- Whole screen settled
- 1.64 s
Replay runs in real time. Drag the slider to inspect a moment.
Why the next photo is slower in RapidRAW
When you push the arrow key, RapidRAW reacts at once. It shows the 1280 px thumbnail that it made for the grid. Then it reads the RAW file and decodes every pixel with rawler. It removes colour noise and sharpens, renders the photo on the GPU and draws the histogram. The window settles about 2.4 s after the first change. RapidRAW does not start this work until you arrive on the photo.
LightPhotos prepares the photos on each side of the current photo while you look at it. When you push the arrow key, the next photo is already developed. Select an app and push Next photo.
Photo 1 is open. Nothing prepared it, so the app develops it now.
Prefetch has a cost: CPU time and battery for photos that you possibly do not look at. RapidRAW's choice also makes sense for an editor. You often stay on one photo for minutes, and a full-size decode is what its masks and AI tools need anyway.
The first photo is closer. Nothing prepared it in either app. Both
show a small preview after about 0.6 s. LightPhotos then
develops the RAW at the window size with CIRAWFilter and
settles at 1.05 s. RapidRAW decodes the full RAW and settles at
1.64 s.
Each next photo takes RapidRAW longer than the first one did. Size explains part of that: the two 45-megapixel Canon R5 Mark II files took about 3.5 s. But the 12-megapixel iPhone file still took about 2.6 s, so I do not know the rest of the reason yet.
Why memory is three times higher
Both apps keep a RAW in floating point, with four numbers for each pixel. LightPhotos uses 16-bit half floats at the window size, up to 4096 px, and develops the full size only when you zoom in. RapidRAW uses 32-bit floats for the whole decoded RAW at full size, and it keeps the last five that it decoded.
RapidRAW: 32-bit floating-point RGBA at full size. 6000 × 4000 × 16 bytes ≈ 384 MB a photo, up to 1.9 GB for five.
With the full photo already decoded, RapidRAW can zoom to 100%, run an AI mask or recover a highlight without another decode. On my 16 GB Mac, 6.1 GB is a large part of the memory, and a camera with more megapixels needs more. One 45-megapixel R5 Mark II photo is about 716 MB in RapidRAW.
The app size has the same cause. RapidRAW's own program is 42 MB, and it includes ONNX Runtime (33 MB) for its AI tools and the lensfun lens database (5 MB). LightPhotos uses the decoders in macOS and has no AI models.
What each choice costs
- LightPhotos is fast through a shoot. It prepares the next photo and keeps only what the screen needs. The cost is that it develops photos that you possibly skip, and on the Mac it supports only the cameras that Apple supports.
- RapidRAW has the whole photo ready for editing. Its sliders, masks and AI tools work on full-size 32-bit pixels. The cost is memory, and a wait of about two seconds each time you move to a new photo.
- Both decode RAW in Rust off the Mac. LightPhotos uses rawler on Windows, Linux and the browser. RapidRAW uses its own rawler fork everywhere. Apple's engine is optional in RapidRAW, and the Mac app of LightPhotos does not include rawler, because of its LGPL license.
Wrapping up
These two apps show the same folder in two different ways. LightPhotos is built to go through a shoot. It is smaller, starts faster, fills its grid faster and has the next photo ready before you ask. RapidRAW is built to edit one photo deeply. It keeps the full RAW at full size in 32-bit floats and has far more tools to use on it. If you cull first and edit later, you can use both on the same folder. Neither app needs to import it.
The timing script and the raw results are in
tools/desktop-bench/. RapidRAW's decode path is in
src-tauri/src/image_loader.rs and
raw_processing.rs, at commit
259d625e.