Skip to content
marrasenPublic

About

Cull and develop your RAW shoots, fast. A desktop photo editor built for photographers who shoot a lot.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

marraw

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 full-bleed aerial photo of a harbor village with a church, a pick/reject bar below it, and a filmstrip deck along the bottom with a group header and gap divider

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.


Install

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 .deb package.

  • 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.app
    

    Then 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.


What makes it different

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: a dark grid of aerial photos under a header reading 10:10 – 10:19, 52 frames, with a +2 min gap before badge on the right

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.

A command palette floating over a dimmed Develop window, prompting Jump to any mode, control, or action, listing Go to Library, Go to Cull, Go to Develop, Contact sheet, Export, Copy image to clipboard, Add folder to library, Settings

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 dialog open on the Remote tab: a Connections section with an Add connection button, and a Host this library section with an Allow remote connections toggle switched on, a name field for what other computers see, and an Accept new connection requests toggle

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.


The workspace

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: an aerial village photo on a darkroom canvas, a floating quick-dial strip beneath it, and a right-hand panel with an RGB histogram over crop, tone, presence and white-balance sliders

Develop mode. The panel is pinned open; the quick-dials under the canvas are the controls you chose to keep at hand.

Editing tools

  • 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, and 1–9/0 setting 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.

Develop mode with the Local tab open: a red tint hugging the cockpit frame of an aerial photo, and a Depth mask row with a two-thumb depth-range slider in the panel

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.

Develop mode with the heal brush active: a painted region over an aerial village, connected by a dashed line to its source region, with brush size and feather controls in the panel

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.

Export

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.

Supported files

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


What marraw does not do (yet)

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 xattr command to clear — see Install. Multi-window (several windows, one library) does work — including a second-display window: Ctrl+N pops 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.

What marraw won't do (probably)

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.

Where your data lives

  • 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.json next to each RAW, unless you turn sidecars off.

Your RAW files are never modified or moved.


Contributing

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.


License

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.

About

Cull and develop your RAW shoots, fast. A desktop photo editor built for photographers who shoot a lot.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages