AI-assisted automatic development of RAW photographs.
An AI decides what to change. A deterministic Rust engine does it. In the recipe-development path, the AI never touches a pixel.
Autoshop is a non-destructive photo developer for RAW and baked images. Its
main workflow turns an AI proposal into a small, inspectable EditRecipe, then
applies that recipe with the same local Rust renderer used by the desktop app,
CLI, and embedded web UI. Generative tools are separate, opt-in paths and are
labelled as such.
AI analyze develop. Sony α7R IVA .ARW, 61 MP: neutral engine conversion at left; AI-proposed crop, global tone, a radial cat lift, and a linear water hold at right. The model judge moved from 62 to 86; that score is automated review, not human aesthetic approval.
- Feature overview
- Install and quickstart
- User manual
- Showcase Part A — AI analysis and style transfer
- Showcase Part B — full-image generation to recipe inversion
- Supported formats
- Tech stack and algorithms
- Status and roadmap
- License and acknowledgements
- A shared, deterministic develop engine with exposure, white balance, curves, HSL, color grading, texture, clarity, dehaze, detail, crop, and lens-aware local adjustments.
- Linear, radial, brush, luminance-range, and color-range masks, plus local AI subject, sky, and point-prompted object selection.
- AI
analyzeandautoworkflows that propose editable recipes, validate them against image statistics, render them, and optionally run one bounded visual-review revision. - Lightroom/ACR sidecars in both directions, with conservative merge behavior for fields Autoshop does not model.
- Versions and variants for ordinary develops, generated targets, and reverse-fitted looks without rewriting the source photo.
- Desktop GUI, scriptable CLI, and a small local web UI, all using the same library.
The core develop path never invents scene content. Local SCUNet denoise, generative reimagine/retouch, and pixel heal are explicit opt-in exceptions; the UI distinguishes generated pixels from engine-rendered develops.
The v1.0.0 release provides both Windows front ends. Linux and macOS are built and tested in CI, but no prebuilt binaries are published for them yet.
| File | Size | SHA-256 |
|---|---|---|
autoshop.exe (CLI) |
31,180,152 bytes | 116a38410a810b1b27602c97daa4db614241b89fffbb80c6691a275fc7f168c0 |
autoshop-gui.exe (desktop app) |
40,810,704 bytes | 847f42c4b35c09ab5dd040fdf8e90f99d597c66624ef131ac02d93071bcb58ce |
Autoshop-Setup-1.0.0.exe (installer) |
19,768,387 bytes | 28c4acd37089e78bf02182cd8b20a214a63cababb1b02971209be3fdf33d4750 |
autoshop-1.0.0-windows-x64.zip (portable archive) |
27,131,443 bytes | 47389ed42f80798ead96980d69ce10f5063ece606e0f0d548482c58aef9f717e |
Download from the v1.0.0 release page:
- Installer (recommended): run
Autoshop-Setup-1.0.0.exe. It installs for the current user without administrator access, adds Start Menu shortcuts, offers optional desktop and userPATHtasks, and removes its own files on uninstall while keeping the develop store in%LOCALAPPDATA%\autoshop. - Portable archive: extract
autoshop-1.0.0-windows-x64.zipto a directory you can keep intact. Run either executable from that directory so it remains beside the bundledassets/andpython/sidecars.
Autoshop uses Rust edition 2024 and rustc/cargo 1.94.
cargo build --release
cargo build --release --features gui --bin autoshop-guiThe first command builds the CLI. The second builds the desktop app; GUI
dependencies stay behind the gui feature.
The Rust build covers the core application. Source builds that use the local AI tools also need Python packages:
-
SCUNet denoise (
python/denoise.py): install a suitabletorchbuild, then OpenCV, NumPy, einops, and requests. The CUDA setup used by the sidecar is:pip install torch --index-url https://download.pytorch.org/whl/cu128 pip install opencv-python numpy einops requests
-
BiRefNet subject masks:
pip install torchvision timm einopsusing atorchvisionbuild matched totorch. -
U²-Net subject fallback:
pip install rembg. -
OneFormer sky and SAM 2.1 object masks:
pip install transformers torch.
Weights download on first use and are not committed to the repository.
- Start
autoshop-gui. - Choose Open photo… or press
Ctrl+O, then select a supported photo. You can also drag a photo into the window or use Open folder… for the library view. - Move a Develop slider and compare it with the neutral conversion.
- Press
Ctrl+Shift+Eto open Export, choose a destination and format, then export a copy. The original remains untouched.
Decode a preview and metadata, then make a manual recipe render:
autoshop decode "photo.ARW" -o "preview.jpg"
autoshop apply "photo.ARW" "recipe.json" -o "developed.tif"
With the image/vision role configured, an end-to-end AI develop is:
autoshop auto "photo.ARW" --guidance "natural color; protect highlights" -o "developed.tif"
Use Open photo… (Ctrl+O), drag and drop, or Open folder…. The library
is read-only: Autoshop stores develop state separately and never rewrites the
source RAW. The viewer applies EXIF orientation before crop and mask geometry,
so every tool works in the displayed frame.
The neutral view is Autoshop's own conversion, not the camera JPEG. Use the before/after control while editing; histogram and clipping information are computed from the decoded image and also feed the AI verifier.
The Develop panel exposes white balance, exposure and tonal controls, RGB point
curves, HSL, color grading, texture, clarity, dehaze, noise reduction,
sharpening, vignette, crop, and lens-related settings. Changes render through
the same engine as autoshop apply; there is no hidden GUI-only look.
Press Save develop or Ctrl+S to persist the recipe and, for a RAW, its XMP
projection in the per-user develop store. A neighboring Lightroom/ACR .xmp,
when present, is read only as the merge base; Save does not overwrite it. A
baked image keeps an Autoshop recipe but does not receive a RAW XMP. To deliver
the stored projection where Lightroom reads it, choose Export .xmp beside the
photo; replacing an existing neighboring sidecar requires confirmation.
Open Local Masks, create a mask, then adjust the sliders inside that mask. Shapes can be combined with Add, Subtract, or Intersect and can carry luminance or color range restrictions.
- Linear gradient: choose + Linear gradient, then drag from the fully
affected side toward the unaffected side. Hold
Shiftto lock an axis. - Radial gradient: choose + Radial gradient, drag the ellipse, then position, rotate, and feather it.
- Brush: choose 🖌 Brush and paint. Use Erase to subtract,
[and]to change brush size, and Apply to bake the stroke into a bitmap alpha. - AI select subject: runs local BiRefNet, with a named U²-Net fallback when the preferred backend cannot run.
- AI select sky: runs local OneFormer ADE20K sky segmentation.
- Point-prompted object: imported object intent and ordered positive click gestures are re-derived locally with SAM 2.1.
AI mask rasters are cached with backend provenance. If a better backend becomes available, the cache key forces an honest re-derivation instead of presenting an older alpha as the new model's result.
A variant is one card for the same photo: ▣ Original, ✨ AI generated,
or ◭ Reverse-fit. Each card combines its own base pixels with one develop.
Ctrl+S saves every card in the strip together. Switching cards is navigation,
not an edit; reopening returns to the card that was active at the last save,
not the last card viewed.
A version is a numbered snapshot of one card's develop at one moment. + Save
as version writes v<N>.recipe.json, frozen v<N>.mask-*.png rasters, and
.version-meta.json provenance (from_kind/from_id, name, and user or
auto origin). Loading a version replaces the active card's canvas as one undo
step. auto versions are snapshots made by the backup gate before it replaces
a saved develop.
An AI-generated variant carries its look in pixels and has no editable XMP develop. Reverse-fit estimates an engine recipe from that look; copy the fitted develop to Original when you want an editable recipe and sidecar for the full-resolution source.
Open Export with the toolbar, Ctrl+Shift+E, or Ctrl+E. Choose JPEG, 8- or
16-bit PNG, or 8- or 16-bit TIFF; set JPEG quality, long-edge size, output
sharpening, and sRGB, Display P3, or Adobe RGB delivery color space. Resizing is
the last step, uses Lanczos3, preserves aspect ratio, and never enlarges a
smaller image.
CLI exports use q95 sRGB. --long-edge N is available on apply, auto, and
batch --render; 0 or omission means full resolution. It is deliberately an
export option rather than a recipe field, so one recipe can deliver both a
master and a web copy.
The following commands and flags match the v1.0.0 command definitions in
src/main.rs:
autoshop decode <src> [-o|--out FILE]
autoshop analyze <src> [-o|--out FILE] [--guidance TEXT] [--style 0..1] [--strength 0..1] [--deep]
autoshop apply <src> <recipe.json> (-o|--out) FILE [--long-edge N]
autoshop auto <src> [-o|--out FILE] [--guidance TEXT] [--style 0..1] [--strength 0..1] [--deep] [--denoise] [--denoise-strength 0..1] [--denoise-model NAME] [--long-edge N]
autoshop denoise <src> [-o|--out FILE] [--strength 0..1] [--model NAME]
autoshop batch <dir> [--render] [--limit N] [--include-baked] [--jobs N] [--long-edge N]
autoshop eval <dir> [--limit N] [--jobs N] [--fresh] [--state FILE]
autoshop style-index <dir>
autoshop reimagine <src> --prompt TEXT [--fidelity high|low] [--quality low|medium|high|auto] [--fidelity-retry] [-o|--out FILE]
autoshop match <src> <target> [--render] [--zoned] [--style-prompt] [--ai-judge] [--deep] [-o|--out FILE]
autoshop correspond <source> <target> [-o|--out FILE]
autoshop retouch <src> --mask FILE --prompt TEXT [--quality low|medium|high|auto] [--full-res] [-o|--out FILE]
autoshop heal <src> [--mask FILE] [--no-auto] [--full-res] [-o|--out FILE]
autoshop serve <dir> [-p|--port N]
autoshop recipe-schema
<src> is a RAW or baked image. For commands that save develop state, baked
sources get recipe JSON but no RAW XMP. batch skips baked photos unless
--include-baked is set, avoiding duplicate analysis and billing for RAW+JPEG
pairs.
auto is analyze plus render. batch analyzes RAWs by default, accepts
--include-baked, and defaults to three photos in flight; eval defaults to
serial work and resumes from its state file. --long-edge on batch requires
--render, and denoise-strength/model overrides require --denoise on
auto.
match itself is local inverse rendering and needs no key. Its optional
--ai-judge and --deep review paths do; --deep permits one guided retry.
heal can use a supplied mask offline, while its automatic detector uses the
vision role.
Autoshop reads and writes sidecar XMP for global settings, point curves, HSL, crop, and supported local corrections. Its writer merges owned fields into the existing document and preserves unmodeled content byte-for-byte instead of round-tripping the whole file through a general XML serializer.
In the desktop Save workflow, that merged XMP projection is written to the per-user develop store. A Lightroom sidecar beside the RAW is only a merge base and remains untouched. Export .xmp beside the photo is the separate, explicit action that copies the stored projection into the photo folder for Lightroom, with a second confirmation before replacement.
Linear and radial masks round-trip as editable geometry. Lightroom brush dab
streams are imported from the sibling MaskBrushTable, validated and Brotli
decoded, then rendered with Autoshop's measured brush model. Classic XMP does
not contain Lightroom's computed subject/sky/object alpha or arbitrary bitmap
alpha, so Autoshop preserves the selection intent and clearly re-derives the
mask with its own local model; generated image variants remain generated pixels
until reverse-fit produces an editable recipe.
Open Settings to configure the image/vision role and the analysis-verifier
role. The image role uses an OpenAI-compatible API for visual proposals and
generative images. The verifier defaults to the signed-in claude CLI over
OAuth, receives statistics and recipe data rather than image pixels, and can
instead use an API provider.
The same roles can be configured from the environment. OPENAI_API_KEY serves
the image/vision and generative role; AUTOSHOP_ANALYSIS_API_KEY is used only
when the verifier is set to API mode. Settings are saved in the per-user
autoshop.local.json; do not put real credentials in the repository.
There is an additional trust guard for ./autoshop.local.json in the current
working directory: it may select model/provider preferences, but it cannot
supply API credentials, endpoints, executable/script paths, or output
destinations. This allows a project to express harmless preferences without
turning an opened photo folder into a credential or path override.
- Analyze: choose Analyze in the AI panel or run
autoshop analyze. The vision advisor proposes bounded sliders and masks, a data-only verifier checks the proposal, and normal visual review may attempt one revision;--deeppermits additional bounded rounds. Accepted output remains a normal recipe and XMP. - Style match/read: build the style reference library from Lightroom
RAW+XMP pairs with the GUI or
style-index. The Style control retrieves similar prior edits as soft references; Strength independently controls how strongly the proposal is allowed to move. - Reimagine: enter a prompt in the AI panel or use
reimagine. This creates a generated, lower-resolution target. Under--fidelity high(the default, and the GUI's mode) the prompt is composed onto an unconditional faithfulness scaffold — the model is told to re-develop the same photograph, not repaint it — because theinput_fidelityrequest parameter is silently rejected by newer models (gpt-image-2). After generating, the structural divergence D against the sent input is measured (the same statistic the reverse-fit's mode selector uses) and disclosed;D ≥ 0.35warns that a reverse-fit of that result will fall back to atmosphere mode, and the opt-in--fidelity-retry(a GUI checkbox as well — off by default, it buys a second image) regenerates once and keeps the closer result. Use Reverse-fit ormatchto infer a deterministic recipe, then apply it to the original RAW at full resolution.
Local denoise and segmentation do not need an API key. Their Python sidecars resolve relative to the installed program tree, and downloaded weights are kept in the local cache rather than committed to the repository.
| Runs locally without an API key | Uses the configured vision/generative API role |
|---|---|
Deterministic render and manual develop, including apply |
Full vision-backed analyze / auto proposals and visual model review |
Local match inverse rendering |
match --style-prompt, --ai-judge, or --deep |
| XMP read/write, masks, curves, and GUI sliders | Generative reimagine / retouch |
| SCUNet denoise and local BiRefNet/U²-Net, OneFormer, and SAM masks | Automatic target detection in heal; a supplied mask works offline |
| Style indexing and retrieval |
Without the vision role, the advisor can fall back to its disclosed histogram
heuristic; that is not equivalent to the full vision-backed feature. The
data-only verifier defaults to the signed-in claude CLI over OAuth, so it does
not require an API key, although provider-backed operations may still consume a
subscription or incur charges.
Photos leave the machine only for AI operations the user requests through a
configured provider. The verifier receives recipe, EXIF, histogram, clipping,
and rationale data—not pixels—and Responses request bodies set store:false.
The local web UI binds to loopback only, checks Host/Origin and cross-site
requests, requires a fresh per-run session token for state changes, disables API
caching, and denies framing. By default, Autoshop keeps the source library read-only. If the configured Delivery folder is inside or above a photo’s folder, that delivery subtree is intentionally writable; Settings warns when this removes the folder’s protection. “Export .xmp beside the photo” is the separate, confirmed per-photo sidecar exception.
The hero cat pair is the first analyze example: a Sony α7R IVA 61 MP .ARW,
shown as straight conversion and AI develop. The AI chose the crop and a
restrained global develop plus radial and linear parametric masks; it did not
use an AI bitmap segmentation mask.
The three established pairs below remain because they show different decisions
and, importantly, two current failure modes. Each before is Autoshop's neutral
conversion of the same Sony α7R IVA .ARW; each after is an AI-proposed engine
render, not a generated image. The faint watermark is identical on both halves
of these three older pairs.
![]() Before: neutral engine conversion. |
![]() After: AI tone, white balance, crop, a linear sky hold, and a radial house lift. |
The proposal protected white brick while opening the porch and black wall. Its model judge moved from 84 to 86 after a bounded revision. Honest blemish: the linear sky mask leaves a faint lighter band near the top-left corner. These are model-judge scores recorded when the pair was produced (v0.33.0 showcase batch).
![]() Before: neutral engine conversion. |
![]() After: AI texture, clarity, dehaze, tonal changes, and two linear masks. |
The siding and shaded structure gain separation; the model judge moved from 78 to 84. These are model-judge scores recorded when the pair was produced (v0.33.0 showcase batch). This pair is deliberately kept as a counter-example: the sky is paler than the neutral base even though the local mask asks for more sky depth.
![]() Before: neutral engine conversion. |
![]() After: AI global contrast, restrained color, and green/aqua HSL reductions. |
Automated visual model review rejected the first acidic-green proposal at 63 and retained a revision scored 87. These are model-judge scores recorded when the pair was produced (v0.33.0 showcase batch). The landscape gains separation, but the sky is again paler and milkier than the neutral conversion; that known behavior is not captioned as an improvement.
These triptychs show three states of the same Sony α7R IVA 61 MP .ARW: straight
conversion, an AI develop with style influence disabled, and an AI develop that
read similar edits from the local style library. They demonstrate the style
retrieval path, not a pixel-copy or generative transfer.
Lake and boat. The style-read run referenced four similar edits from the indexed Lightroom library and was accepted. The style-off middle panel rendered under a Revise verdict and therefore has no saved recipe/XMP; it is retained only as a transparent comparison.
Sunset. The middle panel is an accepted style-off develop. The style-read proposal at right used retrieved references and rendered at full RAW resolution, but the model judge marked it Revise (85); its attempted revision scored 84 and was discarded, so no style-read recipe/XMP was saved.
Part B is a different workflow: generate a complete visual target, then fit an ordinary engine recipe to its look. The generated target can invent content; the fitted render cannot. The recovered recipe is editable and can be applied deterministically to the original full-resolution RAW.
Sunset, Sony α7R IVA 61 MP .ARW. Left: neutral engine conversion. Center: a 3520×2352 full-image target generated with a configured gpt-image-2. Right: the recovered recipe rendered by Autoshop on the original RAW at 9504×6336. The statistical look error moved from 0.060 to 0.042 at fit confidence 0.746691; this is a deterministic tonal/color approximation, not a pixel-aligned reconstruction of generated detail.
Stone viaduct, Sony α7R IVA 61 MP .ARW. Left: neutral engine conversion. Center: a 3520×2352 full-image target generated with the same configured gpt-image-2. Right: the recovered recipe rendered on the original RAW at 9504×6336. The statistical look error moved from 0.057 to 0.019 at fit confidence 0.678264; the fitted color-cast stage was rejected by the fit's own do-no-harm review, so the recovered recipe carries tone and saturation only.
Reverse-fit measures structural divergence first: same-content targets keep the full tone, saturation, and guarded-cast solve, while structurally changed targets use bounded Atmosphere mode for overall tone and colour. Zoned fits retain independently bounded sky/land adjustments behind a local-quality gate; they do not claim to reconstruct generated objects or detail.
This grid is also the nine-camera RAW zoo: one real CC0 file per format tile, each fully decoded and neutral-rendered rather than copied from an embedded preview. The corpus cannot ship in the repository, so the suite is environment-gated and a bare test run skips it; the release process reruns and records it explicitly. The last recorded release gate was 9/9.
Camera RAW — 24 extensions, one predicate app-wide (decode::is_raw):
arw, dng, raw, raf, nef, cr2, cr3, orf, rw2, pef, srw, 3fr,
fff, iiq, mef, mos, erf, kdc, dcr, dcs, crw, nrw, mrw, ari
Decoding is rawler 0.7.2, which carries 725 camera models. No embedded
preview: 12 of the 24 formats store none. They are orf, srw, nrw, mef,
mos, kdc, dcr, dcs, erf, iiq, crw, and ari; Autoshop shows its
own neutral rendition instead and says so.
Baked rasters — 8 extensions: jpg, jpeg, png, tif, tiff, bmp,
webp, gif. ICC profiles on baked imports are converted through qcms when
present.
Decode degradation and refusal behavior is explicit:
- An untagged 16-bit baked image is read as sRGB and flagged; that assumption is often wrong for an editor export even though it is usually right for an 8-bit JPEG.
- Monochrome and four-colour sensor arrays are refused before development; Autoshop does not reinterpret them as three-channel colour.
- Unknown make, unknown model, and no matching decoder are differentiated and point to the DNG conversion route; a recognized but corrupt file keeps its separate integrity error.
- A third-party RAW parser panic is contained as a named per-file error, so one malformed file does not terminate a batch run.
The canonical implementation page is Tech stack and algorithms. It gives the equations, parameter provenance, measured Lightroom/camera results, honesty markers, and source paths behind each summary below.
src/decode.rs uses rawler for RAW decode, 24 formats, with 725 bodies in
the release database. Bayer data takes rawler's demosaic path; X-Trans uses an
approximate 5×5 CFA-geometry plane fit that moved the measured X-S10 G/R
ratio from 1.5503 to 0.9476. orient_f32 applies EXIF orientation at the head
of the chain; no-preview RAWs receive a neutral develop, untagged 16-bit rasters
are disclosed as assumed sRGB, and mono/four-colour sensors are refused.
src/render.rs is a deterministic f32 pipeline with explicit linear-light
vignette/dehaze stages, a monotone Fritsch–Carlson tone LUT with
tone_knot_weights and Highlights inside the LUT, then RGB curves, HSL, colour
grade, clarity/Texture, saturation, NR, sharpening, and local edits. Negative
Texture is two measured parallel low-pass arms (A1=0.172443, A2=0.304888)
with a calibrated hyperbolic depth law; all 45 Lightroom period/depth anchors
land inside ±0.02.
src/recipe.rs, src/render.rs, and src/xmp.rs implement radial, linear,
brush, bitmap, luminance-range, and colour-range masks with ordered
Add/Subtract/Intersect composition. Radial feather is a measured 290×11
alpha(rho, feather) LUT with an analytic hard edge at zero; brush dabs use
(1-rho^m)^n, the measured kappa=0.1284 flow law, and screen accumulation.
Pixel-centre sampling and the pixel/aspect linear metric reduced the D1 error
from 874 px to 9.8 px; MaskBrushTable import validates MD5→.acr→Brotli.
src/segment.rs and python/segment.py run commit-pinned BiRefNet subject
selection with a named U²-Net fallback, OneFormer ADE20K sky selection through
the 150-class checked-in table, and SAM 2.1 object selection from ordered
positive gesture points over the gp1 IPC. Provenance-keyed caches include the
backend generation and exact prompt points, so a fallback alpha is re-derived
when the pinned backend becomes available; these are local re-creations, not
Adobe-computed mask pixels.
src/lensmeta.rs, src/lcp.rs, and src/render.rs combine Sony 0x7037's 16
native (i+1)/16 samples, a 2048-node/64-knot mask solve, and guarded Newton
inversion for rectilinear .lcp profiles while refusing fisheye-only entries.
Radials use exact-once m_lr^-1 ∘ T_engine transport and close 41/41 vectors to
≤1 px. Linear H2 keeps corrected-frame handles but is openly not pixel-closed:
ON RMS is 9.748/7.025/6.336 px and OFF is 12.449/9.943/4.979 px; brushes remain
in the raw frame.
src/xmp.rs uses scoped, typed XML traversal, including nested
Look, and conservatively merges owned edits while preserving unmodeled
fields. Ordinary Save writes the per-user develop store; beside-RAW export is
explicit. LR_MASK_FRAME_SCALE=1.0, LocalExposure2012=EV/4, local Hue is
degrees/180, the other measured local family is /100, global Sharpness is
1:1, and polarity comes from MaskInverted rather than Flipped.
src/advisor/ validates AI proposals into bounded recipes, keeps Responses at
store:false, gives the verifier data rather than pixels, and adopts a guided
revision only when it does not lower the score. src/style.rs retrieves
z-scored RAW+XMP exemplars with optional SigLIP 2 (W_EMB=2.0 retained after a
147-exemplar calibration). src/fit.rs performs luminance-CDF, exposure,
basis, tone, saturation, and cast inverse stages with a ≥45°/≥5% foreign-hue
veto; src/correspond.rs + python/correspond.py measure a DIFT (SD 2.1)
correspondence field between two renditions of one frame — 48×48 cells of
target coordinates whose confidence is cyclic consistency × flow smoothness
— on content-divergent pairs the reverse-fit consults it automatically
(local sidecar; its D gate decides) and full zone fits weight their pixel
pairs by the field's confidence and read shifted content at its
corresponded position, disclosed in the recipe rationale (correspond is
the standalone diagnostic door);
src/generative.rs negotiates gpt-image-2 reimagine sizes, and
src/retouch.rs supplies deterministic pixel heal.
Rust (rustc/cargo 1.94, edition 2024) · rawler (RAW decode, 24 formats / 725 bodies) ·
image, qcms, rayon, clap, serde, ureq, eframe/egui, and tiny_http back the
shared library, CLI, desktop GUI, and embedded loopback web UI. The server uses
a 32-byte token plus Host/Origin/no-store defenses; the GUI keeps variants,
versions, and a deleted-version registry; SCUNet success requires the typed
sidecar_wrote contract. A 1771 MB reference probe sets the 1800 MB per-photo
budget, while the 4 GiB RAW gate bounds admission. The build
workflow covers default and GUI feature sets on
Ubuntu and macOS. The current battery is 942 library (933 pass + 9 #[ignore]d forensic probes) / 15 CLI / 145 GUI / 2+2 contract tests; the
scripts/check_docs.py gate re-derives pinned release
claims. Model weights are not stored in this repository.
Release gates for v1.0.0 cover the CLI, desktop GUI, sidecar contracts, format fixtures, and deterministic renderer; the built artifacts' sizes and hashes are listed above. Prebuilt artifacts are Windows-only; CI checks source builds on Ubuntu and macOS, while interactive use there remains less exercised.
Current honesty markers include the approximate X-Trans path, locally
re-derived rather than Adobe-identical AI masks, measured-but-not-bit-exact
Lightroom rendering parity, and lossy generated reimagine targets. Older
recipes remain readable. v1.0.0 recipes can carry the new
LensProfile.mask_warp_center and LensProfile.linear_handle_warp frame facts;
older binaries cannot safely ignore those fields and therefore refuse recipes
that contain them.
Existing content that may rerender includes angled LINEAR masks on non-square frames, RADIAL/LINEAR masks with camera-metadata lens profiles, modern table-backed Lightroom brushes, and subtype-0 object masks with gesture points. RADIAL closes 41/41 measured vectors to ≤1 px; clean dilation is within 0.35 pp, R1 about 0.5 pp, with an open R2 excess of about 1.2 pp. LINEAR remains not pixel-closed: ON RMS 9.748/7.025/6.336 px and OFF RMS 12.449/9.943/4.979 px.
See docs/ROADMAP.md for planned work and docs/ARCHITECTURE.md for subsystem boundaries and dependency rationale.
Autoshop is MIT-licensed — see LICENSE.
The nine files behind the format grid come from the raw.pixls.us community sample repository under CC0 1.0 Public Domain. The recorded sample SHA-256 values were verified against that index before use.
| Format | Camera | MP | Sample |
|---|---|---|---|
| CR2 | Canon EOS 40D | 10.08 | RAW (3:2) |
| CR3 | Canon EOS R6 | 19.96 | 3:2 |
| NEF | Nikon D700 | 12.2 | 14bit compressed (Lossless) (3:2) |
| RAF | Fujifilm X-S10 | 26.7 | 14bit compressed (3:2) |
| ORF | Olympus E-M5 | 16.11 | 16bit (4:3) |
| RW2 | Panasonic DMC-GX85 | 15.9 | 4:3 |
| PEF | Pentax K-5 | 16.39 | 14bit (3:2) |
| DNG | Ricoh GR II | 16.27 | 12bit (3:2) |
| ARW | Sony ILCE-7M3 | 24.34 | 14bit compressed (3:2) |
The showcase photographs are the author's own Sony α7R IVA frames — © 2026 skymanbp, all rights reserved. They are included only to document Autoshop's output and are not covered by the software's MIT license. The three established before/after pairs retain their matching visible watermarks and embedded copyright metadata; the newer composed cat/style/reimagine JPEGs omit EXIF and do not add a watermark.
The GUI bundles subset Noto faces under the SIL Open Font License; license texts
are under assets/fonts/. Model weights are downloaded separately and remain
the property of their authors; none are redistributed in this repository.
| Model | Purpose | License |
|---|---|---|
| SCUNet | AI denoise | Apache-2.0 |
| BiRefNet | Subject segmentation | MIT |
| U²-Net | Subject fallback | Apache-2.0 |
| OneFormer ADE20K | Sky segmentation | MIT |
| SAM 2.1 | Point-prompted object masks | Apache-2.0 |
| SigLIP 2 | Optional style embeddings | Apache-2.0 |
The project acknowledges the rawler, image, qcms, rayon, clap, serde, ureq, egui/eframe, tiny_http, and local-model communities whose work makes these pipelines possible.


















