Releases: jessolmstead/greycard
Release list
v0.3.0
Quality of life improvements. A library root on a network share neither freezes
the window nor goes stale. Frames can be deleted from the disk with
confirmation. The scopes can be read for the chosen
mask alone, a slider's value can be typed, and White Balance has an
Auto. A folder of thousands of cached thumbnails opens at once. And
the fixes from the first day with 0.2.0 on a NAS root are here too.
Read the
guide for testers
for installing on each system, the hotkeys, and how to report a problem.
- The scopes can be restricted to the chosen mask: a Selection toggle
beside them, off at launch, so a skin mask shows the skin's cloud on
the vectorscope and a face its level on the waveform; the clipping
lamps follow it too while it is on (§189) - Delete from disk supported in all modes, with the Delete key.
The delete runs off the window's thread (§190, §196) - A folder of thousands whose thumbnails are all in the cache shows
its window at once and stays responsive while they come: the pool
delivers in batches, the rows on screen first, and rows far off keep
their picture until scrolled near; the 20,000-frame case filled in
1.6 s with the window drawing throughout, against 3 s of a blank
window (§191) - A view of the library roots that takes a while to read shows a bar with a
count of the sidecars read, in the grid and the loupe alike, after
the first 200 ms; a read that stops moving is given up on rather
than left hanging (§192) - A slider's value can be typed: click the number, Enter sets it
clamped to the range, Escape leaves it; the point curve's selected
point stays selected and takes a typed In and Out in 0–255 (§193) - The camera match sheet no longer grows past the window after a run
over many groups: its body scrolls and the buttons stay in reach - An Auto button beside Neutral in WHITE BALANCE: grey-world over the
frame in camera space, clipped and black pixels dropped and one pass
re-weighting toward what is already near grey, through the same
path as the Neutral picker, so the answer is the same whatever
white the frame was showing and a second press changes nothing;
frames with nothing neutral in them still fool it (§194) - A root's chip in the library row goes off when a folder is opened
over its view; before, the old chip stayed lit - A library root on a network share (NFS, SMB, sshfs and the like) is
no longer watched on Linux and macOS, where setting the watch up
froze the editor while every folder was registered and saw only this
machine's changes; it is passed over every 10 minutes instead
(network_poll_minutesin settings.json, 0 for never), and the
watcher on the other roots is set up off the window's thread, so
adding, removing or starting with a root never holds the window
(§188) - When Move rejects takes away the frame on screen, culling now shows
the nearest frame that is left, as the loupe already did; before, it
kept showing the moved frame with nothing selected - Opening the Settings sheet no longer freezes the window over a
large root: the count of sidecars that are out of place, and the move that
settles them, run off the window's thread, the sheet saying
"Counting..." and "Moving..." meanwhile - The Crop, Masks, and Retouch tabs no longer open blank after the
Develop tab was scrolled down: each tab starts at its top - The terminal no longer shows winit's Wayland event loop warning
about a re-registered source, which is harmless - The test build's dead-code lints on macOS and Windows, which turned
the tag's CI red, are gated
v0.2.0
The second release. The library arrived: folders added as roots and
indexed, browsed across roots with filter chips, imported from a card,
and read without freezing the window when a root is on a network
drive. Culling got its keys answered on the picture. A button fits
the camera's own look from its JPEGs. Masks gained a learned Sky.
And the editor now says when a newer release is out. Read the
guide for testers
for installing on each system, the keys, and how to report a problem.
- A library root on a network drive no longer freezes the editor while
it is walked: the list, the new frames' sidecars and their rows are
read off the window's thread, and a burst of passes is one read. A
root that stops answering shows as offline within 3 s and no longer
stops the list of the other roots; the indexer itself still waits on
it, so nothing new is indexed until it answers (§187, 2026-09-27). - The user guide says where a camera profile comes from (Adobe's
folders, RawTherapee's set, a chart shot) and that the embedded matrix
is what most people need (2026-09-27). - Check for a newer release at launch, at most once a day, and offer it
in the left pane; a switch and Check now in Settings, which now
scrolls on a short window (§186, 2026-09-27). - The Windows package and the Mac bundle have now been installed and run
by testers, which closes the 0.1.0 line that named them as the parts
not verified by running them (2026-09-27). - A library root can have a name of its own ("Archive" for a folder
called Photos), set from its chip's right-click menu and shown in
place of the folder's name; the folder is not renamed or moved. Escape
closes the name sheet and the preset sheet from their fields (§185,
2026-09-27). - The Develop, Crop, Masks and Retouch tab bar stays at the top of the
panel while the sections under it scroll (§184, 2026-09-27). - A half-copied ARW (and a CR3, once rawler stops panicking on one) is
refused with the half-copied message instead of opening as a picture
blank below the copied part (§182, 2026-09-27). - Culling shows the frame's stars, flag and label on the picture, on the
loupe and on each compare tile, and a word for each key pressed ("3
stars", "Rejected") and for each undo and redo that fades on its own
and is not wiped by the arrow; both with Tab on. A held culling key is
one press (§183, 2026-09-27). - Move on after a rating, flag or label: a switch in the CULLING
section, off by default, kept in the settings (§183, 2026-09-27). - Fit this camera's look: a button in the Look section surveys the
library or the open folder by body and picture style, develops
about forty frames a group, lays the camera's own JPEG over each
and fits the maker's rendering as a look, written to the look
directory under the body's and the style's name; a group under
twenty frames borrows the style from another body or is skipped,
and an existing table is never replaced without the switch; the
picker says where a look was fitted when the open frame is another
body, and picture style is a filter facet. The maker's style and
adaptive settings join the library index by a migration in place
(§180, §181,docs/camera-match.md, 2026-09-26). - A right-click menu on a frame in the strip, the grid or the
viewport: copy the settings of that frame, paste them onto the
selection through the sync sheet's section list, rating, flag and
label, reveal in the file manager, export; every item the code of
its key. Ctrl+C and Ctrl+V do the copy and paste from the keys, and
each pasted frame's history reads "Paste from FILE" (§171,
2026-09-25). - Thumbnails are made on a pool of threads of their own instead of one
at a time behind the develop: a cold folder of 35 fills the grid in
0.6 s instead of 3.6, and 300 in 4 s instead of 17, the first
picture no later; a file no picture can be made of marks its cell
"Unreadable", and a--grid --snapshotno longer waits forever on
it; a folder listing takes only regular files (§172, 2026-09-25). - Import from a card: Ctrl+Shift+I or Import... in the grid's header,
a card found under the mount points, a destination with folder and
name patterns ({date},{seq},{camera},{name}and the rest,
names safe on every file system), a preset laid on each frame as one
history step, and a backup copy; every file copied to a temporary,
hashed as read, synced, read back and renamed only when the hashes
agree, and never a write on the card; a frame already imported is
known by its size and its first and last 64 KiB, Verify compares
every byte;--import SRC --to DESTruns one headless (§173,
2026-09-25). - Roots: folders added to the library, kept in
roots.jsonbeside
the index; a pass over every root at launch and a watcher on them
while the editor runs, so a file copied into a root is in the grid
half a second later and a moved frame is found rather than flagged
missing; an all-roots view of every file under every root with the
filter bar over it, a root's chip narrowing to it, an unplugged
root shown offline and left alone; the filter remembered between
sessions; rejects moved to a rejects folder in each shoot's own
folder;--roots DIR,DIRand--all-roots(§174, 2026-09-25). - A Sky mask on the Masks tab: a learned prior (EoMT-S, MIT weights,
96 MB, fetched on first use) finds the sky, a gate refuses a frame
with none rather than paint one, SAM 2 draws the outline, and a
color-line matte at the frame's full resolution takes the edge
through hair and bare branches; clicks add or remove sky. Under a
second from click to mask on the GPU at 24 MP. On the 41-frame test
set, no false sky on the five frames without one and 31 of 36 skies
found; sky through a window, and sky behind dense blossom, are
refused or missed (§175, 2026-09-25). - Undo on a clone or heal spot takes it away in one step: the source
the develop chooses completes the step that placed it instead of
recording a second one, and sidecars 0.1.1 wrote heal themselves
(#7, §177, 2026-09-25). - The Tone curve switch is gone: the base curve always applies to a
raw, and the Light section switched off leaves the picture as it
opens; masks' tone sliders act whatever the picture's Light says
(#9, §177, 2026-09-25). - Removing a preset asks first, and Settings restores any default
preset that is missing without touching the user's own (#4, §177,
2026-09-25). - A linear gradient's end line turns and stretches it about its
center; Alt moves just that end, as before (#6, §177, 2026-09-25). - A frame turned from the Crop tab turns on screen at once instead of
a second or two later, and without a lens profile or defringe the
develop at the new turn takes a third of the time (#5, §177,
2026-09-25). - The Masks tab sets the chosen shape's controls in a card under the
shape list, marks the chosen row, labels Add / Subtract / Intersect
as the next shape's, and heads the look sections with the
adjustment's name, "ADJUSTMENT 1 · LIGHT" (#10, §177, 2026-09-25). - The left pane scrolls instead of growing the window: a long list of
snapshots no longer takes the window out of fullscreen on Windows,
and a list's bins sit clear of its scrollbar (#2, §177, 2026-09-26). - The left pane, the develop panel and the strip put away one at a
time: F7, F8 and F6, or the small arrow on each one's edge of the
viewport; Tab still puts all three away and brings them back, and
what was put away stays put away on the next launch (#3, §178,
2026-09-26). - A raw that rawler panics on, such as a CR3 still being copied, fails
to open with a reason instead of taking the frame, or on some paths
the editor, down with it; one whose end is zeros is called
half-copied (§179, 2026-09-26). - Ctrl+Z while culling takes back the session's ratings, flags and
labels, newest first, going to each frame it changes, and
Ctrl+Shift+Z makes them again; it no longer undoes a develop edit
or leaves culling (§179, 2026-09-26).
v0.1.2
- Fix JPEG, PNG and TIFF files opening brighter and more contrasty
than the file: they took the 0.8-stop baseline and the display
curve meant for a raw. A picture with nothing done to it now looks
as it does anywhere else (#1, §152, 2026-09-23). - Keep sidecars in a hidden
.greycardfolder inside the shoot's
folder instead of beside each raw, withsidecars_in_folderin the
settings or--sidecar-folderfor a run. Both places are read
whatever the setting says, and a frame's sidecar moves to the
chosen place the next time it is saved. Hidden by attribute on
Windows; XMPs stay beside the raw (§153, 2026-09-23). - A plain
cargo testno longer prints ERROR lines from the UI
crate's tests: the log module's test had installed a terminal sink
for the whole test binary (2026-09-23). app.slintsplit into one file a panel section underui/panel/,
the window keeping every property and callback so the Rust side is
untouched; 4,949 lines down to 1,687, verified by whole-window
captures against the previous build and a differential event fuzz,
no behavior change (§154, 2026-09-23).- Tab hides everything but the photo and brings it back;
--hide-panels
opens that way for a capture (§155, 2026-09-23). - The lens profiles are offered once, unasked, the first time a picture
opens with no lens database, with the reason; Not now is remembered
and the LENS section keeps its button (§155, 2026-09-23). - The PRESETS section moves to the left pane, under the navigator, out
of the develop panel's scroll; the presets and history lists give up
room when the pane is short of it (§155, 2026-09-23). - A Settings sheet (Ctrl+, or the Settings... button) for where sidecars
are written and whether XMPs are, with a "move the open frames'
sidecars" action that reports what it renamed and what stale copies it
removed;--sheet settingsand--sheet lensesfor captures (§155,
2026-09-23). - The release binaries are stripped: greycard-ui 112 MB to 84 MB on
Linux, no behavior change (§155, 2026-09-23). - Several frames at once in the strip and the grid: Ctrl+click adds
one, Shift+click a run, Shift+arrows extend, Escape collapses; the
rating, flag, label, reject and turn keys act on the whole set
(§156, 2026-09-23). - Sync settings: Ctrl+Shift+S or the Sync button lays the chosen
sections of the frame on screen over every other selected frame
through the preset path, one history step each; the camera profile
only onto the body it was made for, Noise bringing the learned
denoiser along, masks off by default; the preset and sync sheets in
two columns so they fit a 768 px screen (§156, 2026-09-23). - Export presets: the export sheet's choices kept by name, picked at
the top of the sheet, saved and deleted there, and--export-preset NAMEfor a headless export; a metadata choice of All, No edit or
None (§157, 2026-09-23). - A watermark on the export: text in the system's sans-serif or a PNG,
at one of nine positions with a margin, a size as a share of the long
edge and an opacity, so it lands the same at every export size;
never in the viewport; an empty or undrawable mark fails the export
rather than letting an unmarked picture out (§157, 2026-09-23). - Two range masks on the Masks tab: a Luminance window on the picture's
lightness (Oklab L, 100 the sensor's white, the ends open) and a
Color window on its hue and chroma in Oklab, each with fades, a
dropper that centers the hue on a click and a Skin preset; sampled
from the developed picture before the look, so a mask does not move
under its own edit; on the CPU and in the viewport shader alike
(§158, 2026-09-23). - A sidecar carrying a mask shape from a later build now loads with
that shape left out and a warning, instead of being refused whole;
builds before 0.1.2 still refuse a sidecar with a range mask (§158,
2026-09-23). - The Subject and Background masks run on the GPU where WebGPU is
available: a rewrite of the BiRefNet lite export, published by
greycard under its MIT license, that takes 0.16 s a mask against 2.9 s
on the CPU; fetched on first use, the original offered when it
cannot be had (§159, 2026-09-23). greycard models --fetch allcarries on past a model that fails and
reports the failures at the end (§159, 2026-09-23).- The library index,
greycard-library: a SQLite index of every raw
and picture's path, size, content hash, EXIF and sidecar meta,
incremental, finding a moved file by hash and leaving an unmounted
drive alone;greycard library index DIRandgreycard library list 'camera:R6' 'iso>=3200' 'rating>=3'with a filter language that
refuses what it cannot answer. Not yet wired into the editor (§160,
2026-09-24). - The probe reads the lens, focal length and date, and a JPEG or PNG's
EXIF from its head without decoding it (§160, 2026-09-24). - A save counter in the sidecar: when a frame has a sidecar both beside
it and under.greycard/, the one saved more times wins, and the
files' times decide only when a copy carries no count, so a copy tool
or a restore cannot make the next save drop an edit (§161,
2026-09-24). - A preset click lays the preset over every selected frame, one
history step each, the way a sync does; a camera profile in a preset
reaches only frames of the body it was made for, the open frame
included, and the status says which it left off (§162, 2026-09-24). - A preset applied in culling now writes the frame's sidecar; before,
the step lived only in memory until the next save (§162, 2026-09-24). - A thumbnail cache on disk, keyed by the file's content hash and its
time, so a folder reopened, moved or renamed shows its thumbnails at
once (the 35 sample files: 4 s to 0.01 s); 300 MB by default, with a
cap field and a Clear button in the Settings sheet's new THUMBNAILS
row; a thumbnail made while the file was still being copied is never
kept (§163, 2026-09-24). - The profiled denoiser's wavelet chain runs on planes a block at a
time: the 45 MP develop with the hybrid denoise at six threads goes
from about 26 s to 12.7 s, the 24 MP from 11.3 to 5.7, output within
a 16-bit step of before (§164, 2026-09-24). - Faster develop ops, output bit-identical: the lens correction 17
percent and its vignetting four times at four threads, the CFA gains
twice and the levels a quarter at one thread, the Gaussian blur, the
dehaze, and the RCD demosaic 11 percent from an inlining decision
pinned (§165, 2026-09-24). - Name a history step by what made it: "Preset: Faded film", "Preset
×3: Faded film" over a set, "Sync from 5M0A3021.CR3", "Snapshot:
Before the crop", where the rows read as the list of sections that
moved. The words are kept with the step in the sidecar, an older
build reads the file as before, and a--presetstep is now written
on quit (§166, 2026-09-24). - Export the frames selected, not only the one on screen: each under
its own edit, one at a time on the worker behind the develop, with
progress on the status line, a Stop, and a finished line that counts
what was skipped or failed. A set never writes over one of its own
sources.--export DIR --also ROWSdoes it from the command line
(§167, 2026-09-24). - The library index in the editor: the open folder is indexed on a
thread of its own and kept up to date as sidecars are saved, and
the grid's filter grows chips for camera, lens, ISO, focal length,
day and keyword with their counts, a text field that takes the
filter language (camera:R6 iso>=3200 rating>=3), and--filter
on the command line. The database isgreycard/library.sqlite
under the platform's data directory, or--library PATH(§168,
2026-09-24). - Fix a click with the color range, white balance or defringe
dropper zooming the view as well, and a drag with one panning it
(§169, 2026-09-24). - Drop the color mask's Skin button: a new color window starts at the
skin already, and the button only put the sliders back there (§169,
2026-09-24). - Offer the GPU Subject model where the store holds the original and
it is on record as falling back to the CPU on this card, with the
reason on the sheet; an offer accepted mid-session is used at once,
and one declined leaves the original working (§169, 2026-09-24).
v0.1.1
- Fix the macOS package failing at launch with "Library not loaded:
liblcms2.2.dylib" on any Mac without Homebrew's little-cms2. lcms2 is
now built into the app, and packaging refuses a Mac build that links
a library outside the system and the bundle (notes §151).
v0.1.0
The first test build of greycard, a raw editor for Linux, macOS and
Windows. It is a pre-release: some things are missing and some are
wrong, and the reason it is out is to hear about both. Read the
guide for testers
before you start; it covers installing on each system, the keys, and
how to report a problem.
What you can do with it
- Open a folder of raws and move through it in a filmstrip, a grid or
a single frame, with the camera's own JPEG shown at once and the
develop replacing it a moment later. - Cull from the camera's JPEG without developing anything: ratings,
picks and rejects, color labels, a filter over all of them, compare
two or four frames, and move the rejects into a folder of their own. - Develop: exposure and tone, a parametric and a point curve, a color
mixer, grading, black and white, texture, clarity and dehaze, grain
and vignette; white balance and camera profiles; lens corrections
from lensfun; demosaicing, highlight reconstruction, chromatic
aberration correction, deconvolution sharpening and two denoisers. - Mask with gradients, radial shapes and a brush, or let a learned
model find the subject or an object; heal, clone and fill. - Crop, straighten and correct perspective.
- Use presets, including Lightroom's, and 3D LUT looks.
- Export JPEG or TIFF in sRGB, Display P3 or Rec.2020, with the
profile and the EXIF embedded. - Keep every edit in a
.gcdfile beside its raw, and share ratings,
labels and keywords with Lightroom and darktable through XMP.
Known rough edges
- The default look and the Highlights, Whites and Shadows sliders are
close to Lightroom's but not there yet; that is the next release.
Tell us when a frame looks too dark, too flat or wrong in a way you
can name. - Fujifilm X-Trans bodies and Nikon's High Efficiency raws do not open.
- On Windows and macOS the display is taken as sRGB unless you choose
your monitor's ICC profile by hand. - On a Mac, a double-click in the Finder launches greycard without
opening the file. The app is not signed, so each system warns once
before it first opens; the guide says what to click. - The best denoisers take tens of seconds on a large frame.
Report a problem from the button at the foot of the left panel: it
fills in the version, your system and your GPU, and shows you the log
to attach.