Fast RAW photo culling and editing. Built for photographers who shoot a lot, keep a little, and want the boring part to be over quickly.
marraw is a desktop app: a Go daemon that talks to LibRaw does the pixel work, a React front-end does the rest, and Electron holds it together.
Cull mode. A 191-frame flight already sliced into 17 groups by shooting
gaps — note the +2 min gap divider in the deck; the full-bleed loupe keeps
your zoom and pan as you arrow through.
Status: early, but deep. marraw is usable daily, and the scope has grown fast — smart culling, AI-masked local editing, healing and content-aware fill, presets that carry the AI, and opening a library hosted on another machine are all in. The gaps that remain are real ones, though: read What marraw does not do (yet) and What marraw won't do (probably) before you invest time in it. Windows is the primary platform; the macOS and Linux builds are newer and less travelled — issue reports are very welcome.
Grab your platform's package from the latest release:
-
Windows —
marraw-Setup-<version>.exe. Not code-signed yet, so SmartScreen will warn you once — More info → Run anyway. -
Linux —
marraw-<version>-x86_64.AppImage(auto-updating) or the.debpackage. -
macOS —
marraw-<version>-arm64.dmg(Apple Silicon). Unsigned, so macOS refuses the first launch with "marraw is damaged and can't be opened". It isn't damaged — that is what Gatekeeper says about an unsigned bundle it has quarantined. After dragging the app to Applications, clear the quarantine flag in Terminal:xattr -dr com.apple.quarantine /Applications/marraw.appThen open it normally. Right-click → Open does not work for this error, and neither does allowing "Anywhere" in Privacy & Security. Auto-update is not available on macOS.
On Windows and Linux (AppImage) the app updates itself: it checks GitHub on launch, downloads new versions in the background, and installs them when you quit. Settings → Updates drives the same thing by hand — check, download with progress, and restart to install — and a waiting update parks a row at the foot of the library rail until you deal with it.
Requirements: Windows 10/11 64-bit, a recent x86-64 Linux distro, or an Apple Silicon Mac. No LibRaw DLLs, no runtime, no Python. One installer.
It is fast, and it stays fast at 1:1. Grid thumbnails come straight from the RAW's embedded JPEG — no decode, so a folder of 1,500 frames is browsable immediately. Every photo is cached as a pyramid of JPEG renditions (256 → 2048 px). Zoom past 2048 and marraw switches to full-resolution tiles, downloading and decoding only the crop you are actually looking at, over an upscaled underlay, while the next photo's tiles pre-render in the background. Comparing a burst at 100% doesn't stutter.
It knows a shoot is made of bursts, not files.
Point marraw at a folder and it reads the capture timestamps, then breaks the
grid wherever you stopped shooting for longer than a threshold you pick. Each
run of frames gets a header with its time range, its frame count, and — the
useful part — how long the dead time before it was: +42 min gap before.
A wedding, a match, a hike down a trail all arrive pre-segmented into the
moments you actually shot, without stacks to expand, albums to build, or a
single click. The Cull contact sheet (G) shows the same groups as sections,
so you can see a whole day's structure at once.
The contact sheet (G). Each section header carries its time range, its
frame count, and how long the dead time before it was.
The machine does the pixel-peeping first.
Within those groups, near-duplicate frames collapse into burst stacks with the
sharpest frame on top: an auto-judge weighs sharpness and subject focus, and
⇧P/⇧X pick or reject around a stack's best frame. Folder-wide analysis
scores every photo for sharpness and subject focus — a Soft filter sweeps
the out-of-focus rejects in one pass — and closed-eye detection badges the
blinks, with a Blinks filter that narrows the grid to just those frames.
All of it runs on your machine: the models download only after you say yes,
nothing leaves your computer, and Settings shows the downloaded weights and
lets you delete them. The point is to change how you shoot: fire away all night
at the concert, and let marraw do the first pass — collapse the bursts, judge
the best of each, sweep the soft frames and the blinks — before you have taken
your coat off. Hours of pixel-peeping become minutes of confirming.
Culling is keyboard-first, and the loupe remembers where you were.
Arrows navigate, 1–5 rate, P picks, X excludes, Enter goes deeper.
Zoom and pan position persist across arrow navigation, so stepping through a
burst series compares the same crop of every frame — which is the whole point
of pixel-peeping a burst.
RAWs don't look flat out of the box. LibRaw's default output is noticeably duller than your camera's JPEG, because manufacturer tone curves are proprietary and adaptive (Sony DRO, and friends). On a photo's first render marraw measures the camera's own embedded JPEG, calibrates a per-photo tone lift to match its mean luminance, and applies that consistently everywhere — previews, edits, exports. You start from something that looks like what you saw on the back of the camera.
Editing is non-destructive and responsive. Drag a slider and the backend re-processes the already-unpacked RAW handle at half size (~400 ms warm on 42 MP files); transient drags skip re-demosaicing entirely. Every photo carries its own undo/redo stack and a clickable history timeline.
It does not hold your photos hostage.
Edits, ratings and flags are written to a .marraw.json sidecar next to each
RAW (toggleable). Delete a photo and it goes to the Recycle Bin, not a void.
There is no catalog to import into and nothing to migrate out of.
Batch work is first-class.
Select ten frames and apply relative adjustments — "+0.5 EV on all of these"
— rather than stamping one absolute value over ten different exposures. Copy
and paste edit settings with Ctrl+C/Ctrl+V. Ctrl+U auto-tones — metering
the detected subject when one exists, not just the frame average — and
auto-crop frames that subject; Ctrl+1–9 apply your own saved creative
auto-presets, Ctrl+⇧+1–9 your saved presets by position, and any look can
be saved as a named preset and applied from the Presets tab (the photo keeps
its own crop).
Presets can carry the AI, not just the sliders. A preset saves whatever slice of the edit you choose — tone only, everything, or just your masks — and it can apply relative to each photo's calibrated baseline instead of stamping one absolute value across a mixed batch. The part that feels like cheating: a preset's Subject / Depth / Scene masks are recipes, not frozen shapes. They re-detect on every photo you drop the preset onto — one frame or a whole selection — so "warm the sky, lift the subject" becomes a one-key look across an entire shoot, each photo masked to its own subject and its own sky. Hover a preset to preview it on the loupe, and scrub the amount after it lands.
Ctrl+K jumps to anything — any mode, any panel, any single develop
control, any preset.
Your photos can stay on the machine that holds them.
The daemon that does the pixel work can listen on the network, so the laptop on
the couch can open a library that lives on the desktop in the other room —
without copying a hundred gigabytes of RAW around. Setting it up is a scan and
a click: the laptop finds machines on the local network and across a Tailscale
network, asks to connect, and someone at the desktop approves in a dialog. Each
approved machine gets a credential of its own, so a laptop can be revoked
without locking out everyone. Saved connections then live under Other
computers at the foot of the library rail, and clicking one opens that
library in its own window. A remote window routes everything through the
host: the directory picker, the preview cache, exports and watermark images all
read and write on the machine with the photos, not the one you are sitting at,
and a banner tells you the moment the connection drops. Turn on hosting in
Settings → Remote; --dev builds refuse to bind past loopback, and access
is gated on the credential, not on who can reach the port.
Settings → Remote on the machine that holds the photos. Flip the toggle, approve the laptop when it asks, and this library appears under Other computers in the laptop's library rail — one click opens it over the network, no files copied.
Hand a shoot to the people in it. Right-click a shoot → Share album…, tick what the link may do, and marraw gives you a URL to send. Whoever opens it gets a phone-shaped page — swipe through the shoot, pinch to zoom, tap to star and pick — and their picks land live in your library, on the same photos you are about to develop. No account, no app, no marraw at the other end. Three switches decide what the link is: rate and pick, show my edits (off serves the frames straight out of camera), and allow downloads (full-size JPEGs, one at a time or a selection as a zip). Links carry an expiry, and Settings → Remote → Shared albums withdraws one the instant you want it gone — wherever it has been forwarded to.
The link is served by your own machine over Tailscale Funnel, so nothing is uploaded anywhere and the tunnel comes down with the last link. A share is not a remote connection: it reaches exactly one folder, may call five of the daemon's methods, and can neither browse your disks nor delete a frame — enforced at the daemon, not in the page.
| Mode | For |
|---|---|
| Library | Virtualized grid, adjustable thumbnail size, time-gap grouping, multi-select, rating/flag badges. |
| Cull | Full-bleed cinema loupe, scrubber deck, pick/reject bar, burst stacks with best-frame auto-judge, sharpness/blink badges, contact sheet (G). |
| Develop | Darkroom canvas, pinnable panel, floating quick-dials you choose, crop and white-balance overlays. |
| Export | JPEG, lossless TIFF / PNG, or RAW + XMP handoff — batched across every core. |
Develop mode. The panel is pinned open; the quick-dials under the canvas are the controls you chose to keep at hand.
- Geometry — crop & straighten via an interactive overlay (±15°), 90° rotation and mirroring from the overlay toolbar.
- Lens corrections — marraw reads the camera and lens out of the RAW, matches a profile from a built-in database of ~1,500 calibrated lenses, and undoes what the lens did to the frame: barrel and pincushion distortion, lateral chromatic aberration, and corner vignetting. It happens automatically, before everything else, so the frame you start editing is already the one the camera's own JPEG shows. Each of the three corrections has its own amount — 100% is the profile's measurement — and the whole thing switches off in one click when a lens's own signature is the point.
- Retouch — spot removal (
Q): click a dust spot or blemish (drag to size it), or paint over any shape with the heal brush, and it fills from a source patch marraw picks for you — heal (source texture tone-matched to the surroundings) or clone (verbatim) — with a draggable source, per-spot feather, and1–9/0setting a selected spot's opacity. Fill mode instead inpaints the region with an on-device ML model (a one-time ~28 MB download, after asking). Visualize spots (A) flips to a high-contrast dust view with a sensitivity slider for hunting sensor spots. Spots are anchored to image content, so they survive recrops and re-straightens and render identically in previews, 1:1 tiles and exports. - Local adjustments — linear (graduated) filters, radial filters, a feathered brush with flow and eraser, a range mask that selects by luminance and hue (two-thumb tone window, hue centre/range, and an eyedropper to pick a colour off the photo), and AI masks: Subject, Depth (set by Focus distance and Focus depth) and Scene selections, with mask edges refined automatically at high zoom and a mask row's region tinted on hover. Each mask carries its own exposure, contrast, highlights/shadows, whites/blacks, temperature, tint and saturation, plus an Effects group: blur, bokeh (a hard-edged aperture disc that keeps defocused highlights bright), motion blur, zoom blur, glow, anamorphic light streaks, prism (radial colour fringing) and mosaic — and the defocus and prism grade with the mask's weight, so through a feather or a depth ramp they grow the way a real lens falls off. Two one-click recipes sit beside the mask types: Background detects the subject, inverts the mask and separates everything else with a bloom, streaks and a prism fringe; Tilt shift keeps a depth band sharp — centred on the subject when the subject model is on your machine — and defocuses the rest by distance, discs, bloom and fringe growing the further things sit from the band. A mask can also Remove what it covers — the region is synthesized away from its surround by the same on-device model content-aware fill uses, so masking a person and pressing Remove erases them; it is offered on brushed and AI (Subject / Scene / People) masks, whose region has an edge to work from. Masks are anchored to image content, so they survive recrops and re-straightens, and render identically in previews, 1:1 tiles and exports.
- Tone — exposure (±5 EV), preserve highlights, brightness, gamma, shadow slope, contrast, whites, blacks, shadows, highlights.
- Curve — a point tone curve on its own tab, with RGB / R / G / B channels: drag a point to move it, click the grid to add one, double-click to remove it. The RGB master shapes overall tone and the per-channel curves grade color on top of it, with the channels you are not editing drawn as guides. Monotone by construction, so no combination of points can invert tones.
- Presence — clarity, texture, dehaze.
- White balance — as shot / auto / Kelvin, temperature, tint, and an
eyedropper (
W). - Color — saturation, vibrance, split toning (shadow + highlight tint), an 8-band HSL color mixer (per-band hue / saturation / luminance), and a Black & white treatment that weighs each pixel's grey by the hue it came from through those same bands — the digital coloured filter, not a flat desaturation. Split toning tints the grey, so warm both ends and you have sepia; switching back to colour restores the photo exactly.
- Effects — creative vignette.
- Detail — sharpen, highlight recovery (clip/unclip/blend/rebuild), noise reduction, FBDD denoise, median passes, demosaic algorithm (VNG/PPG/AHD/DHT), manual chromatic-aberration correction.
An AI Depth mask on the Local tab. Focus distance and Focus depth set the kept near-to-far band — here the cockpit and wing — and hovering the mask row tints its region on the photo. The one-click Tilt shift button builds the inverse: everything outside the band, defocused by distance.
The heal brush. Paint over anything; the fill comes from a matching, movable source region — the overlay shows the painted area, its source, and the connector between them.
Every slider has a letter shortcut: press it, then +/- to adjust
(Shift for a big step), Esc to release. Press ? for the full list.
JPEG (quality 1–100), or lossless TIFF or PNG for when you want no
compression artifacts at all. All three render exactly what the loupe showed you —
crop, look, detail — with optional long-edge resize, sRGB / Adobe RGB /
ProPhoto with an embedded ICC profile, output sharpening tuned for screen,
matte or glossy paper, and an optional watermark — any stack of text and image
elements, sized relative to the export so it reads the same at full resolution
and at web sizes. Output files take a name template — {name}, {seq},
{date}, {time} — and you choose what metadata they carry: everything the
RAW knew (body, exposure triangle, lens, capture time, GPS), copyright only,
or nothing, with persisted artist/copyright credit fields and a one-switch
location strip. Runs in the background across all cores at full AHD demosaic
quality. A single photo can also go straight to the clipboard (Ctrl+⇧+C),
rendered exactly like an export, for pasting into a chat or a doc.
If you want to finish a photo in another editor, don't export an intermediate
— nothing marraw can render carries more information than the file your camera
already made. Instead, RAW + XMP export copies the original RAWs untouched
and writes Adobe-compatible .xmp sidecars next to them: rating, flag, and
your develop settings translated to Camera Raw's own tags (intent-level —
close, not pixel-identical), ready for Lightroom to pick up. It can also write
just the sidecars in place, next to the originals. That is the handoff's whole
scope, deliberately frozen: local adjustments, retouch, and FX will never
translate to another editor (see
What marraw won't do) — if a photo needs
them, finish it in marraw.
Sony .arw .sr2 .srf · Canon .cr2 .cr3 .crw · Nikon .nef .nrw ·
Fuji .raf · Olympus .orf · Panasonic .rw2 · Pentax .pef ·
Samsung .srw · Sigma .x3f · Hasselblad .3fr .fff · Phase One .iiq ·
Adobe/various .dng · plus .erf .mef .mos .mrw .rwl
Read this list before you install. These are absences, not bugs — real gaps that just haven't been built yet. If one of them is load-bearing for your work, marraw is not ready for you yet.
- ❌ No automatic defringe. Lens profiles correct distortion, vignetting and lateral CA (see above), but there is no purple-fringe remover for the axial CA that a profile cannot describe — only the manual CA sliders.
- ❌ No modern denoise. You get LibRaw's wavelet/FBDD/median, not ML-assisted luminance and color NR.
- ❌ No HDR editing or output, and no wide-gamut working space. The look math is sRGB-ish and highlights clip rather than grade.
- ❌ Not code-signed. Expect a SmartScreen warning on first install
(Windows), or a "damaged and can't be opened" refusal on macOS that needs
one
xattrcommand to clear — see Install. Multi-window (several windows, one library) does work — including a second-display window:Ctrl+Npops the focused photo out into a frameless viewer that follows your culling on the main screen, with a glass island for its few controls. Drag it to the monitor you point at the client, and it comes back there, open, next launch. So do light/dark themes, per-photo edit undo/redo, one-Ctrl+Z-per-stroke culling undo, and a cache with a configurable size cap.
marraw wants to be a fast, fun RAW editor for a folder of photos — not a digital asset manager, not a studio hub, not a print shop. These are not gaps waiting for their turn; they pull against what marraw is for:
- ❌ No XMP round-trip. Working sidecars are marraw's own
.marraw.json, and marraw never reads XMP. The RAW + XMP export (see above) is a one-way handoff, not sync, and its scope is frozen at rating, flag, and the global develop settings — local adjustments, retouch, and FX will never translate to another editor. - ❌ No photo search, keywords, or collections. You filter by rating, flag, and the culling signals (soft frames, blinks) within a folder. That's it — there is no catalog-wide index to build, maintain, or migrate.
- ❌ No keyword or IPTC metadata in exports. EXIF (camera, exposure, lens, GPS) and your copyright credit are written, but the library has no keywords to carry.
- ❌ No DCP camera profiles.
- ❌ No tethered capture, no soft-proofing.
- ❌ No panorama stitch or HDR bracket merge.
- Catalog — SQLite under
%APPDATA%\marraw(Windows),~/.config/marraw(Linux), or~/Library/Application Support/marraw(macOS). - Preview cache — same place, with a size cap you set in Settings.
- Your edits — in the catalog and in a
.marraw.jsonnext to each RAW, unless you turn sidecars off.
Your RAW files are never modified or moved.
Want to build this yourself or contribute? Everything is in DEVELOPER.md — architecture, setup, tests, packaging, and the release process.
Issues and pull requests are welcome, especially reports from the newer macOS and Linux builds and anything on the missing list above.
marraw is MIT licensed.
It statically links LibRaw, used here under its CDDL-1.0 option, and ships inside Electron (MIT). Full attribution and source-availability notices are in THIRD_PARTY_NOTICES.md.






