JPEG, PNG or WebP. Everything runs locally in your browser — your photo is never uploaded anywhere.
Note: true sensor-RAW files (CR2, NEF, ARW…) are out of v1 scope — the browser can't decode them. Export a TIFF/JPEG from your RAW converter first.
Adjust
About Looks Lab
A Lightroom-style parametric photo tool. Every look is a parameter recipe — white balance, tone curves, HSL, B&W mixer, split tone, basic tone, clarity, dehaze, grain, vignette — rendered live on a canvas from your source pixels. Nothing is a black box: each preset card has a Recipe view listing its exact parameters.
Processing order (fixed): white balance → per-channel curves → master curve → HSL → B&W mix → split tone → basic tone → clarity → dehaze → grain → vignette, clamped after each stage.
Scope, honestly stated:
True sensor-RAW decode (CR2/NEF/ARW) is out of v1 scope — browsers can't decode RAW. Develop to TIFF/JPEG first.
All rendering is client-side; no servers, no uploads, no cost.
Exports are deterministic: same photo + same parameters → byte-identical file (grain is seeded from the parameter set). Each export is logged to the Render log (JSONL, Darkroom-style).
Phase 2 (not in v1): AI restyle lanes. This build is parametric math only — no generative models.
Preset looks are original interpretations inspired by reference works and traditions. No preset claims authorship by, affiliation with, or endorsement from any photographer or rights holder.
Import from Google Photos
Pick photos in Google's own picker — Looks Lab downloads only what you select. Your Google sign-in token lives in this tab's memory only; nothing is uploaded anywhere, and your photos never touch a server.
One-time setup needed (about 5 minutes).
This copy of Looks Lab has no Google OAuth client ID yet, so the picker can't run. Full steps are in docs/google-photos-setup.md — the short version:
Create a project at console.cloud.google.com and enable the Google Photos Picker API.
On the OAuth consent screen, add the scope …/auth/photospicker.mediaitems.readonly (it's non-sensitive — no Google verification needed for personal use).
Create an OAuth client ID → Web application and add your Authorized JavaScript origins (e.g. http://localhost:8000 and wherever you host this file).
Copy the client ID and paste it into this file where it says GOOGLE_CLIENT_ID = "PASTE_YOUR_GOOGLE_OAUTH_CLIENT_ID_HERE" (in src/ui.js, then run node build.mjs — or search the built file for the same placeholder).
Important: Google sign-in cannot run from file:// — Google requires an authorized http(s) origin. Serve this file over localhost (e.g. python3 -m http.server 8000) or host it somewhere, and register that exact origin in step 3. This is a Google rule, not ours — everything else in Looks Lab works fine from file://.
Heads up: you're on file:// — Google will refuse sign-in. Serve over http://localhost:8000 (and register it as an authorized origin) and try again.