Introduction
albedo develops RAW photos in the browser and edits them in layers. It keeps a catalog, culls, develops on the GPU, masks with local AI, removes distractions, denoises, composites and retouches in 16 or 32 bits, and exports JPEG, PNG, 16-bit TIFF, DNG, PSD or the original with an XMP sidecar.
Everything happens on your machine: the photos, the catalog and the AI models stay in the browser’s private storage, and nothing is uploaded. Installed as an app, albedo works offline and opens files from the desktop.
What it needs
- A Chromium-based browser (Chrome, Edge, Brave, Arc) for WebGPU and file handling. Firefox and Safari run Library and Develop on the WebGL2 path; Compose needs WebGPU (Safari 26 and Firefox 141 have it).
- A GPU. Any integrated GPU develops; the AI tools are fastest on a discrete one.
- Disk space: the catalog stores a copy of every original you import.
Where things are
| Library | the catalog: a grid, filters, collections, metadata |
| Develop | one photo: every adjustment, masks, Remove, export |
| Compose | layers: retouching, compositing, type, PSD in and out, RAW smart objects |
Getting started
Open albedo
Open the app. To install it, use the browser’s install button in the address bar (Chromium) or Add to Dock (Safari). The installed app opens RAW, JPEG, PNG, TIFF and XMP files from the file manager’s Open with menu.
Import
Drop files on the window, or press O. albedo reads the RAW formats LibRaw supports (CR2, CR3, NEF, ARW, RAF, ORF, RW2, PEF, DNG and many more), plus JPEG and PNG. Files dropped together keep their order.
- An
.xmpsidecar named like a photo (IMG_1.xmporIMG_1.CR2.xmp) applies its Lightroom edit to that photo. - Any other
.xmpbecomes a preset. - A
.dcpfile becomes a camera profile.
Thumbnails come from the preview the camera embedded, so a large import is browsable at once.
Edit
Double-click a photo, or press D. Every slider can be dragged anywhere on its row; Alt drags finely, Shift coarsely, a double-click resets it, and a click on the value types one. Each change is one undo step (⌘Z).
Edits are saved as you go. The original is never changed.
Export
Press ⌘E. See Export.
Library and culling
Flags, ratings, labels
| key | |
|---|---|
P X U | pick, reject, unflag |
0–5 | rating |
6–9 | red, yellow, green, blue label |
⌫ | delete the selection (after a confirmation) |
The filter bar narrows the grid by flag, rating and label; ⌘F searches file names, camera, lens, title, caption and keywords.
Cull, compare, survey
- Cull (
⇧C) shows one photo full screen. A flag or rating key stamps it and moves to the next photo that has no decision yet. The next three photos are prepared in advance. - Compare (
C) shows the selected photo beside a candidate. - Survey (
N) lays out the selection side by side.
Collections
- Albums hold any photos you add to them.
- Smart collections save a filter and update themselves.
- The date tree groups photos by year and month of capture.
- Keywords, a title and a caption live in the metadata panel and are searchable.
Many photos
The grid only draws what is on screen, and the catalog’s queries use indexes that match its sorts. A catalog of 10,000 photos filters in about 15 ms; numbers are in the benchmarks.
Develop
The right panel holds the adjustments, top to bottom.
| section | |
|---|---|
| Profile | the look: AgX, Linear or a camera profile (Profiles and lenses) |
| Tone | exposure, contrast, highlights, shadows, whites, blacks; Auto |
| WB | temperature and tint, relative to the camera; Auto and an eyedropper |
| Curve | a point curve; the target tool adjusts it by dragging on the image |
| Color | vibrance and saturation |
| B&W | black and white with a mix per hue (V) |
| Mixer | hue, saturation and luminance for eight hue bands |
| Grading | three-way colour wheels |
| Effects | clarity, texture, dehaze, vignette, grain |
| Lens | the lens profile and manual distortion, CA and defringe; HL toggles highlight reconstruction |
| Detail | AI Denoise, sharpening, noise reduction |
| Remove & Heal | removal and spot healing (Remove and heal) |
| Versions | virtual copies of the edit |
Looking at the result
\toggles before and after; a split view compares them side by side.Jshows clipped highlights and shadows.Ztoggles 100% and fit; drag to pan, or use the navigator.- The histogram follows every change.
Crop and straighten
R opens the crop. Drag the corners, rotate outside the frame or with the straighten slider, and set keystone correction. The crop zooms in just enough that no empty corner shows.
Presets, copy and paste
The left rail holds built-in looks and your presets; hovering one previews it, a click applies it. ⌘C copies chosen modules of the edit, ⌘V pastes them onto the selection. Presets can be exported as albedo files or for Lightroom.
History, snapshots and versions
Every change is one undo step. Snapshots save the current edit under a name; versions keep alternative edits of the same photo.
Profiles and lenses
Looks
A RAW starts with the AgX look: a filmic tone curve that rolls highlights off toward white instead of clipping each channel, after a half stop of baseline exposure. Baseline and Look Sat. adjust it. Linear clamps instead, the way a JPEG is shown.
Camera profiles
Drop .dcp files (Adobe’s, RawTherapee’s, or any profile following the DNG specification) on the window. The Profile section then offers the ones made for the photo’s camera under Camera profile…. A profile replaces the colour matrix, applies its hue and saturation tables, and its tone curve replaces the look’s.
Lens corrections
When a RAW opens, albedo looks its lens up in the lensfun database and corrects distortion, lateral chromatic aberration and vignetting. The Lens section names the lens it found; Profile Dist. and Profile Vign. scale the corrections, and the PROFILE switch turns them off. Fisheye lenses are not corrected.
Highlights
Clipped highlights are rebuilt from the channels that did not clip, so a blown sky turns white instead of magenta. The HL switch in the Lens section turns this off.
Masks
M opens masking. A mask limits exposure, temperature, contrast, highlights, shadows, saturation and clarity to part of the photo. Up to eight masks are active at once.
| tool | key | |
|---|---|---|
| Linear | L | a graduated filter: drag from where it starts to where it is full |
| Radial | ⇧M | an ellipse: drag its size, then move, rotate and feather it |
| Brush | K | paint; [ and ] change the size, Alt erases |
| Subject | the main subject, found by a local AI model | |
| Sky | the sky | |
| Background | everything but the subject | |
| Object | B | click an object, or drag a box around it |
The red wash shows the selected mask; O keeps it visible. Touching an adjustment hides it.
Refine edge softens an AI mask’s edge. Range narrows any mask to a band of brightness, or to colours near one you pick.
Brush and AI masks share four slots between them.
The AI models run on your machine, on the GPU when the browser has WebGPU. The first use of each loads it; after that a mask takes well under a second.
Remove and heal
Remove
Press Q, then paint over what should go: a person, a sign, a wire, dust. When you let go, a local inpainting model fills the area from its surroundings. A click without dragging removes the object under the pointer.
[ and ] (or the scroll wheel) change the brush size.
Each removal is listed in the Remove & Heal section and can be restored with its ×; undo works as for any other change. The original file is never altered.
Heal and clone
Press H, then drag from the blemish to a clean area: the blemish is replaced by that area, matched in brightness (heal) or copied as is (clone). Drag either circle to move it, scroll to resize, ⌫ deletes the selected spot.
AI Denoise
AI Denoise in the Detail section removes noise with a neural network that works on the RAW data itself, before demosaicing, the way the sensor recorded it. It keeps fine detail that ordinary noise reduction smooths away.
Moving the slider above 0 starts it; a 45-megapixel photo takes a few seconds on a discrete GPU, and the progress shows under the slider. The slider then sets how much of the denoised image is used, without running the model again.
It works on Bayer sensors. X-Trans and other sensors keep the regular noise reduction, which AI Denoise replaces while it is on.
Exports wait for a denoise that is still running.
Compose
Compose (E) is albedo’s layered editor, for the work that comes after Develop: retouching, compositing, exposure blending and type. It runs on the GPU and keeps every layer at 8, 16 or 32 bits per channel. Nothing leaves your machine, and nothing is metered.
Starting a document
- From Develop,
⌘⇧E(or Edit in Compose under Export) opens the photo as a smart object carrying its edit.- The RAW stays inside, so you can change its development at any time.
- It opens instantly: Compose uses the image Develop already has on the GPU.
- From the Library, the start screen offers to open the selected photo as a smart object.
- A new document takes a size, a depth (8, 16 or 32-bit) and a background.
- Opening a file works for JPEG, PNG and TIFF (including Photoshop’s layered TIFF and multi-page TIFF), PSD and
.albedofiles. You can also drop one onto Compose. - Dropping an image onto an open document places it as a new layer.
Documents save themselves into the browser’s storage as you work (⌘S saves at once). The start screen lists them.
Image › Mode changes a document’s depth at any time: 8 bits, 16 bits (half float) or 32 bits (float, in linear light, like Photoshop’s 32-bit mode).
Layers
The Layers panel shows the stack, top first.
- Blend mode sits above the stack. All of Photoshop’s 27 modes are there, and groups add Pass Through.
- Opacity and Fill. Drag the label to scrub, or type a value. Number keys set opacity:
1is 10% and0is 100%. - Reorder by dragging a row. Drop onto the middle of a group to move a layer into it.
- Clip a layer to the one below with
⌥-click between them, or⌥⌘G. - Hide with the eye; double-click a name to rename it.
- The buttons along the bottom add a style, a mask, an adjustment, a group or a layer, and delete.
| layer | what it holds |
|---|---|
| Pixel | paint, retouching, placed images |
| Smart object | a photo and its Develop edit, re-developed whenever the edit changes |
| Adjustment | Develop (every Develop control), Curves, Levels, Brightness/Contrast, Exposure, Hue/Saturation, Channel Mixer, Photo Filter, Gradient Map, Invert, Posterize, Threshold |
| Fill | a solid colour or a linear or radial gradient |
| Type | text, shaped and laid out live |
| Shape | rectangle, ellipse, polygon or star, line |
| Group | layers that blend together (Pass Through) or as one (any other mode) |
Masks. Every layer and group can have a mask: white shows the layer, black hides it. Add one with the mask button; ⌥-click it to start from Hide All. With a selection active, the new mask starts from that selection. Paint on the mask with the brush by switching the brush to Mask, or press \. The Mask section of Properties sets density and inverts. Refine edge fits the mask’s edge to the image, and Select loads the mask as a selection.
Blend If. Properties holds Photoshop’s Blend If for any layer. Fade a layer by its own brightness, or by the brightness of what is below. This is a luminosity mask that never goes stale: it follows the layers under it as they change.
Layer styles (the fx button) add a drop shadow, a stroke (outside, centre or inside) and an outer glow.
Smart objects and Develop
Select a smart object and choose Edit in Develop in Properties.
- Develop opens the photo with that layer’s edit and shows a Back to Compose bar.
- Every change re-develops the layer in the document.
- Nothing is exported or saved in between.
- The catalog’s own edit of the photo is left alone. The smart object keeps its own copy, so the same photo can sit in a document twice with two different developments.
A Develop adjustment layer shows Develop’s own panels in Properties: Tone, WB, Curve, Color, B&W, Mixer, Grading, Effects, Detail. They apply to everything below the layer, through its mask and blend mode, and can be changed at any time. Use it to grade a whole composite, or to clip a white balance correction to one layer.
Selections
| tool | key | |
|---|---|---|
| Marquee | M | rectangle; ⇧M for the ellipse |
| Lasso | L | freehand; ⇧L for the polygon lasso (click points, ⏎ closes) |
| Magic wand | W | by colour, contiguous or not, from the layer or all layers |
| AI select | ⇧W | Select subject, Select sky, or click or drag a box around an object |
How a selection combines with the existing one:
⇧adds to the selection;⌥subtracts from it;⇧⌥intersects with it;- the mode buttons in the options bar do the same.
The Select menu holds All (⌘A), Deselect (⌘D), Reselect, Inverse (⇧⌘I), Color Range, and the modifiers: expand, contract, feather, smooth, border.
Refine edge fits a selection’s edge to the image with a guided filter. It is made for hair and fur: the soft band along the edge follows the strands, and the rest stays crisp. AI select refines its result this way by default.
Retouching
| tool | key | |
|---|---|---|
| Spot healing | J | paint over a blemish, a wire or a sensor spot: the local model fills it from around it, on a new layer |
| Healing brush | ⇧J | ⌥-click a source, then paint: texture from the source, tone and colour from the destination |
| Clone stamp | S | ⌥-click a source, then paint |
| Dodge and burn | O | lighten or darken shadows, midtones or highlights; New D&B layer makes a neutral Soft Light layer to work on instead |
| Smudge | R | smear paint, as with a finger |
Clone and heal sample the current layer, the current layer and those below it, or all layers. Use Current & below on an empty layer to keep your retouching apart from the photo. Aligned keeps the offset from one stroke to the next.
Content-aware fill (Edit menu) fills the selection from its surroundings, on a new layer. It uses MI-GAN, a 28 MB model that runs on your GPU in a fraction of a second. There are no credits and no content filter. It continues what is around the hole and does not invent new things; Resource limits explains why there is no prompted generative fill.
Frequency separation (Filter menu) splits the active layer into a Low frequency layer (colour and tone) and a High frequency layer (texture, in Linear Light), grouped. Together they recombine to the original exactly in 16 and 32-bit documents. Retouch tone on Low with a soft brush or the healing brush, and texture on High with the clone stamp.
Painting
The brush (B) and eraser (E) have:
- size
[], hardness⇧[⇧], opacity (the number keys) and flow; - spacing and smoothing;
- pen pressure, which can control size, opacity or flow.
Opacity caps a stroke and flow builds up within it, as in Photoshop. A stroke stays inside the active selection.
Gradient (G) drags out a gradient fill layer from the foreground colour to transparent. On a gradient fill layer, the drag moves its gradient instead.
X swaps the foreground and background colours, D resets them to white and black, and the eyedropper (I) picks a colour from the image.
Transform and liquify
Free transform (⌘T) has three modes:
- Free. Drag inside to move, outside to rotate, and a handle to scale. It keeps the proportions unless you hold
⇧. - Distort. Drag the four corners, for perspective.
- Warp. Drag the points of a 4×4 grid.
⏎ applies and Esc cancels. Transforms never resample the layer: scale it down and back up and it is as sharp as before. The pixels are re-rendered only when you paint on a transformed layer.
Liquify (Q) pushes, bloats, puckers, twirls, smooths and reconstructs the active layer. It works on pixel layers, smart objects and type. It stays editable: Reconstruct paints the original back, and Restore all removes the liquify entirely.
Crop (C) drags a new frame; ⏎ applies it. Layers keep the pixels outside the frame.
Type
Click with the type tool (T) to type, or drag a box for text that wraps. Click a type layer to edit it.
- Shaping. Type is shaped by HarfBuzz, the engine browsers and Photoshop use. Arabic and other complex scripts join correctly with no setting to change. Lines that mix right-to-left and left-to-right text follow the Unicode bidirectional rules.
- Fonts. IBM Plex Sans and IBM Plex Sans Arabic are built in. Add any TTF, OTF or WOFF file, or, in Chrome and Edge, use your installed fonts. A run that the chosen font cannot show falls back to a font that can.
- Settings in Properties: size, weight, tracking, leading, box width, colour, alignment, direction, and the font’s own kerning and ligatures.
Shapes (U) draw rectangles (with rounded corners), ellipses, polygons and stars, and lines. Each has a fill and a stroke, and stays editable.
Export
Export (in the status bar, or the Image menu):
| format | |
|---|---|
| JPEG, PNG | flattened (JPEG on white); JPEG also at 2048 or 4096 px on the long edge |
| TIFF | flattened, 16 bits per channel |
| PSD | layers, groups, masks, blend modes, opacity, fill, clipping and Blend If. Develop adjustments, smart objects, type and styles are rendered into pixels with their mode, opacity, mask and clipping kept |
| PSD with albedo data | the same, plus the whole albedo document inside: albedo reopens it with everything editable, and Photoshop ignores the extra data |
| albedo document | everything, editable, with the smart objects’ originals inside |
When albedo opens a PSD, it reads its pixel layers, groups, masks, modes, clipping, Blend If and the common adjustment layers. Anything it cannot keep live arrives as the pixels Photoshop saved.
Speed
Compose draws at the resolution of your screen, not the document’s: on the reference machine a 50-layer, 24 MP document redraws in about 7 ms. While you paint or drag a slider, everything below that layer is drawn once and reused. Panning and zooming show the last drawing again, moved or scaled, and draw afresh once you stop. Measured times are in Benchmarks.
Export
⌘E exports the photo in Develop, or the selection in the Library.
| format | |
|---|---|
| JPEG | quality 60–100 |
| PNG | 8 bits per channel |
| TIFF | 16 bits per channel, sRGB, compressed |
| DNG | the RAW data, with the edit inside as XMP |
| Original | the file as imported, untouched, with an XMP sidecar |
For JPEG, PNG and TIFF: a long edge to resize to, output sharpening, and for JPEG and PNG a text watermark. JPEG keeps the camera’s EXIF.
XMP sidecar writes the edit next to each file in a form Lightroom, Camera Raw and darktable read.
The filename pattern takes {name}, {seq}, {date} and {rating}. Several photos, or a format with a sidecar, go into one folder you choose.
Export settings can be saved as presets.
Lightroom and other programs
Bringing edits in
Drop a Lightroom or Camera Raw .xmp sidecar with its photo, and the edit applies: exposure and tone, white balance, the tone curve, HSL, B&W, colour grading, clarity, texture, dehaze, vignette, grain, crop and angle, perspective, sharpening, noise reduction and lens settings. A line after the import names anything that could not be carried over.
Lightroom presets (.xmp) dropped on their own become presets in albedo.
Taking edits out
- Export Original to get the untouched file with an XMP sidecar, or tick XMP sidecar for any format.
- Export DNG to get a raw file Lightroom opens with the edit already applied.
- In the preset rail, a preset’s menu has Export for Lightroom….
Masks, removals, heal spots and the look are albedo’s own; they travel inside the sidecar in albedo’s namespace, so albedo reads its own files back exactly while other programs read what they understand.
Camera profiles
Adobe’s camera profiles (.dcp) work in albedo; see Profiles and lenses.
Storage, backups and offline use
Where your photos are
albedo keeps everything in the browser’s private storage for its site: a copy of every original, thumbnails and previews, edits, masks and a SQLite catalog. Nothing is uploaded. The browser is asked to keep this storage even when the disk fills up.
Each browser, and each site address, has its own catalog. One tab at a time can use it.
Backups
Back up catalog… at the bottom of the Library’s left panel writes one archive with every original, edit, preset and mask. Restore backup… reads it into an empty catalog, in this browser or another.
Offline
Once albedo has loaded, it works without a network: the app and its data are cached. The AI models are cached the first time each one is used.
Hosting your own copy
albedo is a static site. Build it and serve the dist/ folder from any web server, at a domain root or under a path:
git clone https://github.com/ZahakJ/albedo.git && cd albedo
npm install
npm run setup-models # the AI models, checked by SHA-256
npm run build
npx serve dist # or any static server
The server needs no special headers. It should serve .wasm as application/wasm and answer requests in parallel.
Without setup-models everything but the AI tools works. The models and their licenses are listed in MODELS.md.
Keyboard
⌘ is Ctrl on Linux and Windows. ? shows this list in the app, and ⌘K finds any command by name.
Everywhere
| key | |
|---|---|
G D E | Library, Develop, Compose |
O | open files |
← → | previous, next photo |
⌘Z ⇧⌘Z | undo, redo |
⌘C ⌘V | copy, paste settings |
⌘E | export |
⌘K | command palette |
I | info overlay |
L | lights out |
Library
| key | |
|---|---|
P X U | pick, reject, unflag |
0–5 | rating |
6–9 | colour label |
⌫ | delete |
+ − | thumbnail size |
C N ⇧C | compare, survey, cull |
⌘F | search |
⌥\ | clear filters |
Develop
| key | |
|---|---|
\ | before and after |
J | clipping |
Z | 100% or fit |
V | black and white |
R | crop (O cycles the grid) |
M | masking: L linear, ⇧M radial, K brush, B object, O keep the wash |
Q | remove |
H | heal and clone |
[ ] | brush size |
⇧⌘R | reset to the original |
⌘⇧E | edit in Compose |
Compose
Photoshop’s keys.
| key | |
|---|---|
V | move (⌘T free transform) |
M L W | marquee, lasso, magic wand (⇧ cycles: ellipse, polygon, AI select) |
C | crop |
B E R | brush, eraser, smudge |
S J O | clone stamp, spot healing (⇧J healing brush), dodge and burn |
G T U Q | gradient, type, shape, liquify |
I H Z | eyedropper, hand, zoom; Space pans |
[ ] | brush size (⇧[ ⇧] hardness) |
1–0 | opacity, 10% to 100% |
X D | swap colours, default colours |
\ | paint on the mask or the pixels |
⌘0 ⌘1 ⌘+ ⌘− | fit, 100%, zoom in, zoom out |
⌘J ⌘G ⇧⌘G | duplicate, group, ungroup |
⌥⌘G | clipping mask |
⌘E ⇧⌘E ⌥⇧⌘E | merge down, merge visible, stamp visible |
⌘A ⌘D ⇧⌘D ⇧⌘I | select all, deselect, reselect, inverse |
⌘M ⌘L ⌘U ⌘I | curves, levels, hue/saturation, invert (as adjustment layers) |
⌥⌫ ⌘⌫ ⌫ | fill with foreground, fill with background, clear |
⌘Z ⇧⌘Z | undo, redo |
⌘S | save |