Skip to content
simmmmmPublic

About

Numa photo editor for iPhone, iPad, Mac and Linux. RAW, masks found on your device, culling that measures.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Latest commit

 

History

25 Commits

Folders and files

Repository files navigation

Numa

A RAW photo editor and library for Linux.
Add a folder, cull the shoot, develop the frames you keep, export them.
Your originals are never moved, copied or written to.

Numa is also coming to iPhone, iPad and Mac, as a separate app: numa.photo

Download · numa.photo · Features · Installing · Building · How it works · Feature index

Linux GTK 4 and libadwaita Rust Packages, Flatpak and AppImage GPL-3.0 or later

The library: justified rows, ratings, flags, suggested ratings from Analyse and a mark on edited photographs

Numa is a native GTK 4 and libadwaita application written in Rust. It was built around a Fujifilm workflow, but it opens and develops every RAW format its decoder reads: twenty-nine formats from 850 cameras, plus JPEG, PNG, HEIF, TIFF and WebP. Everything runs on your own computer, including the machine-learning models behind masks, faces and the AI tools.

The code was written with Claude (Anthropic); see How it was made.


Features

Library
Folders instead of imports. Justified rows, ratings, flags, albums, people, several libraries, import from a card.

Culling
A loupe for picking and rejecting from the keyboard, bursts, suggested ratings with a reason, and side-by-side compare.

Developing
Light, tone curve, white balance, HSL mixer, colour grading, black and white, camera profiles, looks and LUTs, wide-gamut output.

Masks
Gradients, brush and lasso, plus masks the photograph finds itself: sky, water, subject, the animal, anything you click on.

Detail and repair
Sharpening, noise reduction, AI denoise, AI sharpen, Super Resolution, heal, clone, Remove, dust, lens corrections.

Export
JPEG, PNG, 16-bit TIFF, AVIF, JPEG XL, DNG and HDR JPEG, with presets, watermarks, metadata control and batches.


Library

Folders, not imports. A library is a folder on disk. Numa scans it and leaves the files where they are. Each library keeps its catalog in a hidden .numa folder inside it: ratings, flags, edits, analysis and the names on faces. Move the folder to another drive or computer, add it there, and everything comes with it. A weekly backup of that catalog is kept in the same place. A library on a drive that is not connected stays in the list and opens from what Numa remembers: the thumbnails it already made, each marked as away. Stars and flags given meanwhile go into the library when the drive is back.

Rows at each photograph's own shape. Thumbnails are laid out in justified rows that fill the width, so portrait and landscape frames sit side by side without cropping. A popover sets the row size and the spacing. Thumbnails are made at the resolution the row needs on HiDPI screens, only what is near the screen is decoded, and the cache is kept to a budget, so a library of thousands scrolls without holding all of them in memory.

Rate, flag and filter from the keyboard. 0–5 rate, P picks, X rejects and U clears, in the library, the loupe and the editor alike. Filter by rating, flag, file type and the culling measures, and sort by date, name, rating, sharpness or suggested rating. A filter that narrows the grid shows in the accent colour, and it is remembered between sessions.

See what you have worked on. Photographs with adjustments carry a small pencil mark in the library and in the filmstrip. Opening a photograph does not count as editing it.

RAW and JPEG pairs. A camera set to write both leaves two files per frame. Both stay in the library as their own cards, and the file-type filter narrows the grid to the RAWs or to everything else.

Several libraries, and albums across them. Add, rename and remove libraries and switch between them from the header bar, or from the Libraries page, where each one is a stack of its best photographs. Albums are independent of folders and can hold photographs from any library.

The Libraries page: each library as a stack of its best photographs

Import from a card or a camera. Put in a card or plug in a camera and Numa offers to import it. Photographs a library already has are skipped, the rest are split into shoots by date, and each shoot is offered the library it belongs to, or a new folder beside the others, with a name pattern you choose.

Open with Numa. Numa can be the default application for RAW files, HEIF, JPEG, PNG, TIFF, WebP and BMP. A photograph opened from the file manager lands in the loupe, with the folder it came from in the grid behind it.

Deleting a photograph moves the file to the desktop's trash, and the dialog says first that its rating and edits go with it.

Culling

The loupe: one photograph large, the neighbours beside it, stars, pick, reject and Edit underneath

The loupe. Space shows the selected photograph large, with its neighbours on either side. Left and Right step through the shoot, Up picks and Down rejects and both go on to the next frame, and Backspace takes the last mark back and returns to that frame. Enter opens the editor. Delete does nothing while the loupe is open, so a cull is never one slip away from losing a file; a reject never removes anything.

Analyse runs over a whole library in the background, with a progress count and a Stop button, and measures each frame:

  • Sharpness, as Laplacian energy on a standardised version of the frame, so a contrasty photograph does not score as sharper than a soft one. A soft frame shot more than five stops slower than 1/focal length says soft · slow shutter.
  • Blown highlights, counted on the raw's own values where there is a raw, because the camera's JPEG goes white well before the sensor does.
  • Empty frames: a lens cap, a flash into the dark, a frame gone white, as nearly black, nearly white or nearly blank.
  • Faces, found with YuNet, and how sharp each face is. A crisp background behind a soft face is a reject even when the frame as a whole measures sharp. Closed eyes are asked about (eyes closed?), never decided.
  • Bursts, grouped by a perceptual hash and by time, with the sharpest frame of each burst marked as the best of it. The same scene shot again minutes or days later is recognised as well.

From these Numa suggests a rating from 0 to 5, shown beside each photograph with a short note (such as best of burst, soft or soft face) and available as a sort. The suggestion comes from explicit rules rather than a trained aesthetic model, and it never overwrites a rating you gave. Every mark given in the loupe is kept in the library's catalog with its time.

Compare two to four selected photographs side by side with C, zoomed and panned together, and rate or reject them from there. The keys act on the photograph under the pointer.

Compare: two photographs side by side with their ratings

People

Numa recognises faces across all of your libraries with SFace, aligned on YuNet's landmarks.

  • Name a face once. Every other photograph with a similar face offers that name as a guess. Enter confirms it, typing corrects it. Only the names you confirm are stored; the likeness does the rest, so a name given today also finds last year's photographs.
  • Name faces in bulk. The People dialog groups faces that are probably the same person ("In 38 photographs — who is this?") so a whole group gets a name at once. Strangers who keep turning up can be set aside, renaming a person renames them everywhere, and giving two people the same name merges them.
  • Browse by person. Everyone with a name is listed in the library picker under the libraries. Picking a person shows every photograph they appear in, across all libraries, and the rating, flag and sort filters still apply.

Developing

The editor: one bar at the top, the Light panel with adjusted sliders highlighted, the histogram and the filmstrip

Everything is non-destructive. Edits are stored as a list of operations and parameters, and the original file is only ever read. Preview and export run the same code on the same edit stack; the preview just uses fewer pixels.

Light. Exposure, contrast, highlights, shadows, whites and blacks. Auto sets exposure and the black and white points and leaves the matters of taste alone. It is a button, never a default.

Tone curve. A point curve over the photograph's own histogram, on the composite channel and on red, green and blue separately. The curve is a monotonic cubic, so a steep section never folds back on itself, and it is applied with interpolation so it does not introduce banding in skies and shadows.

White balance. Temperature in Kelvin and tint, applied in the camera's own colour space before the colour matrix, which is where it is physically correct. Or pick a neutral in the photograph.

Colour. Vibrance and saturation. An eight-colour HSL mixer with a pipette: click the sky in the photograph and the mixer selects whichever colour the sky actually is. Black & white is a switch, as in Lightroom, and turns the mixer into the black-and-white mix: how light each colour's grey comes out.

The Colour panel: white balance, vibrance and the eight-colour mixer Colour grading on the colour wheel: warm highlights and cooler shadows
White balance, vibrance and the HSL mixer. Colour grading per tonal range, with blending and balance.

Colour grading with separate tints for shadows, midtones, highlights and the whole frame, plus blending and balance. A grade also tones a black and white conversion.

Effects. Clarity, texture and dehaze; a vignette with amount, midpoint, roundness and feather; and grain with amount, size and roughness.

Local tone mapping. HDR compression, clarity and texture use the same edge-aware guided filter at different scales: clarity works at the size of a cheek or a cloud, texture at the weave of a fabric or the bark of a tree. Negative texture softens skin without softening eyes. Negative clarity spreads light like a diffusion filter rather than blurring.

Camera profiles. Numa reads DNG camera profiles (.dcp): forward matrices, hue/saturation maps and look tables, matched on the camera model written inside the profile rather than on its filename. Automatic takes Numa's own profile where there is one (Fujifilm X-T5, X-T4 and X-S10, Canon EOS R5, Nikon D850, Sony A7R III), then RawTherapee's or Adobe's, then the camera's own matrix; Preferences sets which of these Automatic means for the whole library. The Looks tab, on top, offers every other profile installed for your camera, and a profile is only ever used on the camera it was made for.

The base render. A RAW is developed with a tone curve fitted against the camera's own JPEGs, and exposure is matched per image to the camera's rendering, so the untouched starting point already looks like a finished photograph rather than a flat scan. Where all three channels hit the sensor's ceiling, white balance leaves them white instead of tinting them magenta.

Colour spaces. Export in sRGB, Display P3, Adobe RGB or ProPhoto RGB, with the matching ICC profile embedded. A wide-gamut export is rendered in its own space, so colours the sensor saw beyond sRGB reach the file. On screen, photographs are converted to your display's own colour profile, so a wide-gamut screen does not oversaturate them.

A tone curve drawn over the photograph's histogram

Looks and presets. The Looks tab has the camera profile on top, then Presets and LUTs. Twelve looks are built in, each with a Strength slider once it is chosen. Save an edit, or part of one, as a preset of your own, and apply it to the open photograph or a whole selection. Every preset is shown as a thumbnail of the photograph you are working on, and resting on one previews it on the canvas. Lightroom Classic .lrtemplate, Lightroom .xmp and Capture One .costyle and .costylepack presets can be imported; tone, presence, the HSL mixer, colour grading, curves, white balance, detail, vignette and grain are translated. LUTs in .cube and .3dl are applied with an Amount.

As Shot, under the profile, is the photograph as the camera made it: every raw carries the camera's own JPEG of the same moment, with its film simulation, picture style or creative look and the recipe it was shot with, and Numa fits a small colour transform from its own rendering to that JPEG, per photograph. It has a Strength, your own edits go in before it, and where the JPEG clipped the highlights the raw's detail stays. Pasted or in a preset, it follows each photograph's own JPEG.

The built-in looks and Numa's own camera profiles are the photographer's own work: they come with the released Flatpak and AppImage, and a build from this source has neither.

The Looks tab: the camera profile Automatic · Numa EOS R5 on top, the Cool Fade look at two thirds strength, and the presets as thumbnails of the photograph

Detail

Sharpening, noise reduction, AI sharpen and AI denoise, at 100 %

Sharpening is an unsharp mask on log luminance, applied as a gain so edges do not grow colour fringes. It has amount, radius and masking, where masking keeps sharpening off flat areas and noise. It is on by default at a moderate 25, because every demosaic softens a little.

Noise reduction has separate luminance and colour controls. Luminance noise is smoothed with an edge-preserving guided filter, and Detail decides where grain ends and structure begins. Colour noise reduction takes hue from a heavily smoothed copy and brightness from the original. It is on by default, because colour speckle is never wanted. On X-Trans files the colour the demosaic invents is taken out before any of this.

AI denoise runs SCUNet over the whole photograph once, in the background, and keeps the answer, so a slider never waits on it. With the optional GPU download it runs in half precision on the graphics card: about two minutes for a 40 MP frame, five on the processor.

AI sharpen undoes the blur of a hand that moved, with Restormer, run once like AI denoise and on the denoised frame when both are on.

Super Resolution exports a photograph at twice its size each way with RealPLKSR, the faithful upscaler darktable uses: detail rather than blur, and no invented texture.

Moiré removes false colour from fine repeating patterns such as fabric and roof tiles. Defringe removes the purple and green rims that fast lenses leave on high-contrast edges.

Lens and geometry

Lens corrections. Vignetting, distortion and lateral chromatic aberration are corrected in a single resampling pass. Fujifilm cameras write their lens corrections into each RAF, and Numa uses those first. Everything else is corrected from the LensFun database, by Numa's own code.

Crop and straighten with handles, aspect ratio presets and a rule-of-thirds overlay. Quarter turns, mirroring and EXIF orientation are handled.

Perspective. Vertical, horizontal and aspect corrections, or Auto, which finds the photograph's own lines and puts converging verticals back upright. Guided lets you draw the lines that should be straight.

Crop at 5:4 with the rule-of-thirds overlay, straighten and perspective

Masks

Every mask carries everything the photograph has that belongs to a region: Light and its curves, the colour mixer and black and white, point colours, colour grading, Effects with grain, and all of Detail. A local edit is the same edit as a global one, applied through a shape. Masks are kept in a list that can be reordered by dragging, and each can be inverted, feathered, and have its edge moved in or out. A mask survives a crop, a straighten or a quarter turn with the clicks and strokes that shaped it.

Draw them: linear and radial gradients, a brush and a lasso. The brush and lasso add to or subtract from any mask, so a sky mask that caught the roofline can be cleaned up by painting it out.

Let the photograph find them:

  • Found in this photograph. Subject, Background, Sky, Water, Mountains, Greenery, Buildings, Ground and more, from EfficientViT-Seg trained on ADE20K. Only the masks for things actually in the frame are offered, and resting on one outlines it and says how much of the photograph it covers.
  • Subject is what the photograph is about, whatever it is, found by BiRefNet: heads, hats and feet are not cut through. Person and Animal fall back to a matting model when the semantic model finds nothing, and the chip names the animal ("Bird", "Dog") when an image classifier is confident.
  • Click to select. Click any object and SlimSAM cuts it out along the photograph's own edges, including things no segmentation model has a word for, such as a kite.
  • Subtract what was found. A person, an animal, the sky or anything else the model finds can be cut back out of any mask: a gradient over the sky with the person on the horizon left as they were.
  • Refine. Edge traces a real edge with BiRefNet; Hair follows hair and fur with ViTMatte.
  • By colour or brightness. Colour range and luminance range masks select every pixel of a colour or between two brightnesses, anywhere in the frame.

A mask can be shown as a coloured wash, an outline, or both.

Found in a mountain lake: Subject, Background, Water, Sky, Mountains, Ground and Greenery The subject mask on a kingfisher, with its own exposure and shadows and the mask bar underneath
Masks found in the photograph, only for what is in it. A subject mask with its own exposure, refined from the mask bar.

Retouching

Heal replaces a spot with texture from elsewhere while keeping the surrounding tone, solved as a Poisson blend. Clone copies it as is. The source and destination are both drawn on the photograph, so it is always clear which is which. Remove takes out what is under a circle and fills it from around it with LaMa, which continues a wall, a fence or a horizon through the hole. Remove people finds the passers-by behind the subject and removes them the same way. Find dust heals the specks a dirty sensor leaves in skies and walls, and Pet eye puts out the glow of a flash in an animal's eye.

Face retouching appears only when a face has been found: automatic spot removal, skin smoothing, evenness, red-eye and teeth whitening.

Export

The export dialog: format, colour space, quality, size, HDR, metadata, watermark, file name and folder

  • JPEG, PNG, 16-bit TIFF, AVIF, JPEG XL or DNG, with the quality you choose and the ICC profile of the colour space you export in. JPEG XL uses the libjxl on your computer. A DNG is the raw itself, with the edit as a preview and as Camera Raw settings Lightroom reads.
  • HDR: a JPEG with a gain map, which HDR screens show with the highlights as bright as the scene had them and everything else shows as the ordinary photograph.
  • Presets for export settings, a watermark in a corner of your choice, and a file name template.
  • Full size, or a long edge from 4096 down to 1080 pixels, resized with Lanczos and never enlarged. Output sharpening restores the edge that downscaling takes off.
  • The camera's own EXIF, carried over, with the GPS position removed if you ask. IPTC in XMP: creator, copyright, rating, and the people and albums a photograph is in as keywords.
  • Batch export of a selection from the library, with the same settings as the editor. Masks are recomputed before export, so they apply the same way they did on screen.
  • Never overwriting. Files go to an edited folder inside the library, or to a folder you choose.

Working in the editor

  • One bar. The header holds Undo, Redo, Before and Export; everything else is in the main menu, with the photograph's sections at the top and their keys beside them.
  • Saving is automatic, two seconds after the last change, and when you step to another photograph, leave the editor or quit.
  • Undo and redo cover every adjustment, geometry and mask, with a history list that names each step. Snapshots keep named versions of an edit to go back to.
  • Before and after: hold Space to see the as-shot rendering.
  • Reference: keep one developed frame beside the one you are working on and match a set to it, or show the camera's own JPEG there instead.
  • A live histogram, waveform or RGB parade, chosen with a right click on the graph, with clipped shadows and highlights shown on the photograph.
  • Copy and paste settings between photographs, with a checklist of what to paste: white balance, tone, colour, tone curve, detail and crop. Paste onto a single photograph or a whole selection.
  • A filmstrip to move between frames without returning to the library.
  • Zoom from fit to 1:1 and beyond. Above 1:1 pixels are drawn as pixels. When you zoom past what the preview resolution can show, the visible region is rendered from the full-resolution file.
  • Adjusted sliders are highlighted, so you can see at a glance what was changed on a photograph. Double-click or right-click a slider to reset it, and hold Shift with the arrow keys to move it ten steps at a time.
  • Info shows camera, lens, exposure, Fujifilm film mode and dimensions, for JPEG and HEIF files too; a photograph that records no camera says so.
  • HDR merge combines a bracket into one high-dynamic-range image. A bracket shot by hand is lined up first.
  • Keyboard shortcuts are listed under Ctrl+/.

Preferences

Three pages, with a search across all of them. General has the display profile, what Automatic means for camera profiles, opening photographs with Numa, and a daily check for new versions that is off until you turn it on; nothing about you or your photographs is sent. Add-ons lists the optional models with their size, licence and what they are for, to download one by one or all at once. Storage shows Numa's own folders and how much each takes, clears the thumbnail cache, and says what to delete to remove Numa again.


Cameras

Numa reads anything rawler reads: twenty-nine RAW formats from 850 cameras, plus JPEG, PNG, HEIF (.heic, .heif, .hif), TIFF and WebP. The list of supported RAW formats is taken from the decoder, so it grows when the decoder does. A JPEG, HEIF or PNG opens exactly as it is, in its own colour space, without the contrast and sharpening a RAW is given.

Fujifilm files get extra support: the Markesteijn X-Trans demosaic at full resolution, the film simulation the camera was set to, and the lens corrections stored in the RAF. Everything else goes through the same pipeline without them.

Tested end to end on Fujifilm RAF and Sony ARW files.


Installing

Numa comes in three forms for 64-bit Intel and AMD machines: a package for your distribution, a Flatpak and an AppImage. All three keep their libraries, presets and models in the same folders (see Where things live), so moving from one to another loses nothing.

A package for your distribution

The packages are built on the openSUSE Build Service. You add Numa's repository once, and from then on Numa updates with the rest of the system, in the terminal or in your software centre. Copy the lines for your distribution into a terminal.

Fedora 44

sudo dnf config-manager addrepo --from-repofile=https://download.opensuse.org/repositories/home:/Numa/Fedora_44/home:Numa.repo
sudo dnf install numa

dnf asks once whether to trust the repository's key; answer y.

openSUSE Tumbleweed

sudo zypper addrepo https://download.opensuse.org/repositories/home:/Numa/openSUSE_Tumbleweed/home:Numa.repo
sudo zypper refresh
sudo zypper install numa

zypper asks once whether to trust the repository's key; answer a (always).

Ubuntu 26.04

wget -qO- https://download.opensuse.org/repositories/home:/Numa/xUbuntu_26.04/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/numa.gpg
echo 'deb [signed-by=/etc/apt/keyrings/numa.gpg] https://download.opensuse.org/repositories/home:/Numa/xUbuntu_26.04/ /' | sudo tee /etc/apt/sources.list.d/numa.list
sudo apt update
sudo apt install numa

Debian Testing

wget -qO- https://download.opensuse.org/repositories/home:/Numa/Debian_Testing/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/numa.gpg
echo 'deb [signed-by=/etc/apt/keyrings/numa.gpg] https://download.opensuse.org/repositories/home:/Numa/Debian_Testing/ /' | sudo tee /etc/apt/sources.list.d/numa.list
sudo apt update
sudo apt install numa

Arch, CachyOS, EndeavourOS

printf '\n[home_Numa_Arch]\nServer = https://download.opensuse.org/repositories/home:/Numa/Arch/$arch\n' | sudo tee -a /etc/pacman.conf
curl -fsSL https://download.opensuse.org/repositories/home:/Numa/Arch/x86_64/home_Numa_Arch.key | sudo pacman-key --add -
sudo pacman-key --lsign-key 5ADD29F2614AC31A0BD16A75AACA2C3967ED9794
sudo pacman -Syu numa

The third line trusts the repository's signing key; the number is its fingerprint. After this, Numa is also in Octopi.

Debian 13, Ubuntu 24.04 and older releases have no package yet, because their Rust is too old to build Numa. Use the Flatpak or the AppImage.

Flatpak and AppImage

Both are on the Releases page.

Flatpak. Needs Flatpak with Flathub added; the GNOME 50 runtime is fetched the first time, about a gigabyte, and shared with other applications after that. A newer bundle installs over the old one the same way.

flatpak install --user Numa-*-x86_64.flatpak
flatpak run com.tijmen.Numa

To have photographs open in Numa, choose it under Open With in the file manager and switch on Always use for this file type.

AppImage. A single file, Numa-<version>-x86_64.AppImage, for glibc 2.39 or newer: Ubuntu 24.04 and later, Debian 13 and later, Fedora 40 and later, and current rolling releases such as Arch.

A downloaded file is not executable, and until it is, double-clicking it does nothing. In GNOME Files, open Properties on the file and turn on Executable as Program; or in a terminal:

chmod +x Numa-*-x86_64.AppImage
./Numa-*-x86_64.AppImage

After that it starts with a double-click. Keep the file where it is, for example in ~/Applications; nothing is installed elsewhere.

The AppImage mounts itself with FUSE and needs the fusermount3 (or fusermount) program, which most desktop installations already have. It does not need libfuse2. If it does not start and running it from a terminal mentions fusermount or FUSE, install:

Distribution Package
Debian, Ubuntu sudo apt install fuse3
Fedora sudo dnf install fuse3
Arch sudo pacman -S fuse3

Where FUSE is not available at all, for example in a container, it can run without it; it then unpacks itself to a temporary folder on every start, which takes a few seconds longer:

./Numa-*-x86_64.AppImage --appimage-extract-and-run

Opening photographs with Numa. Once it is in the applications menu, Numa is offered under Open With for RAW files, HEIF, JPEG, PNG, TIFF, WebP and BMP. To make it the one that opens them, turn on Open photographs with Numa in Preferences — or, from a terminal, packaging/set-default.sh ~/Applications/Numa-*.AppImage. A photograph opened that way lands in the loupe, with the folder it came from in the grid behind it: the next frame is one arrow key away, and Enter opens the editor.

On first start Numa offers to add itself to the applications menu, and to download the additional files described below: the machine-learning models and RawTherapee's camera profiles. If the AppImage is moved or replaced by a newer one, the menu entry follows it the next time Numa starts from the new place. Preferences has a switch to remove the entry again.

Building from source

You need Rust 1.92 or newer, GTK 4.14 or newer, libadwaita 1.5 or newer, and pkg-config.

git clone git@github.com:simmmmm/Numa.git
cd Numa
./dev/run.sh

Some features use additional files that are downloaded separately: the machine-learning models for masks, click to select, subject edges, faces and animal names, and RawTherapee's camera profiles. Numa offers them on first start, and Preferences (Ctrl+,) downloads them, shows what is installed and opens the folders they live in. Every file is checked against its SHA-256 before it is used. Without them everything else works. From a source checkout, ./dev/fetch-models.sh fetches the models as well.

Where things live

Library catalog, history, snapshots, backups <your library>/.numa/
Grid thumbnails <your library>/.numa/thumbs/
Application settings, list of libraries, albums ~/.local/share/numa/catalog.db
Models ~/.local/share/numa/models/
Presets ~/.local/share/numa/presets/
Camera profiles you add ~/.local/share/numa/profiles/
Downloaded RawTherapee profiles ~/.local/share/numa/rawtherapee-dcpprofiles/
Larger thumbnails, AI denoise results ~/.cache/numa/
Exports <your library>/edited/ unless another folder is chosen

These are the usual locations, and the Flatpak uses them too, so it shares its libraries, presets and models with an AppImage or a build of your own. Preferences shows the actual folders. Deleting a thumbnail folder or the cache only means those files are made again.

Packages

The distribution packages are built from packaging/obs/ (see its README). There is a Flatpak manifest in packaging/flatpak/ and an AppImage build in packaging/appimage/, which builds inside a container so the result runs on older distributions:

./packaging/appimage/build.sh

Wanted: packagers. Apart from its own repository on the openSUSE Build Service, Numa is not in any distribution's repositories yet, nor on Flathub, the AUR or the Snap Store. If you would like to package it for one of them and keep it up to date, open an issue. Questions about the build get answered, and anything in the code that gets in a packager's way gets fixed.

One thing to know for Flathub: it does not accept a manifest that was written or assisted by AI. Everything in this repository was, including packaging/flatpak/, so a Flathub manifest has to be written by a person from the start.


How it renders

RAW file
  └─ decode + demosaic ──────────> linear RGB, f32, scene-referred
       │
       ├─ colour stage      white balance in camera space, then the camera
       │                    matrix and its profile's tables   (cached)
       │
       ├─ geometry          lens corrections, quarter turns, crop,
       │                    straighten, perspective
       │
       └─ pixel stack
            heal and clone ──> face retouching
            noise reduction ──> sharpening
            exposure, contrast, the four tone regions, vibrance, saturation
            the colour mixer
            local tone mapping (HDR, clarity, texture)
            masks, each the same stack again, faded in
            colour grading
            the base tone curve ──> your tone curves ──> output space ──> 8-bit

Values stay scene-linear until the last step. In linear light exposure is a multiplication, downscaling averages correctly, and highlights above 1.0 are still there for highlight recovery to work with.

While you edit, Numa renders only the region on screen, at the resolution the screen can show. During a slider drag it draws a fast draft and sharpens the picture as soon as you let go.

docs/ENGINEERING.md explains the decisions and the measurements behind them: white balance in camera space, the tone curve fitted against camera JPEGs, DNG profiles, the demosaic, lens corrections, face recognition thresholds, and the bugs that were hardest to find.


Built on

Crate Used for
gtk4 + libadwaita The interface.
rawler RAW decoding, demosaic and colour matrices, in pure Rust with X-Trans support.
heic-rs HEIF and HEIC, in pure Rust.
zip Opening Capture One style packs.
rusqlite The catalogs. A rating writes one row, and a filter is a WHERE clause.
ort + ndarray ONNX Runtime for every model.
image + rayon Pixel work across all cores.
roxmltree Reading the LensFun lens database (CC BY-SA 3.0, the LensFun community), for lenses that do not describe themselves in the file. The corrections themselves are Numa's own code.
serde · serde_json · dirs · log · env_logger · byteorder · libc Supporting work.
Model Used for
EfficientViT-Seg-B2 (ADE20K) Semantic mask presets
SlimSAM-77 Click to select
BiRefNet The subject, and refined edges
ViTMatte-S Hair and fur in Refine edge
YuNet Face detection
open-closed-eye-0001 (OpenVINO) Asking about closed eyes in culling
SFace Face recognition
PP-ResNet50 (ImageNet) Naming the animal in a subject mask
SCUNet AI denoise
Restormer AI sharpen
RealPLKSR Super Resolution
LaMa Remove
YOLOX-s Finding people to remove

Roadmap

docs/FEATURES.md tracks every feature by ID and is the only place status is kept: currently 274 built, 13 partly built, 3 planned and 14 withdrawn, each withdrawal with its reason.

Still open. Numa's own camera profile for every camera, not only the 21 fitted so far · settling whether a developed frame is as sharp as Lightroom's · usage counts, sent only when you say so · HDR on an HDR screen.

The full list, generated from the status markers, is at the end of docs/FEATURES.md. How each number in it was reached is in docs/ENGINEERING.md — corrections welcome.


How it was made

Numa is written by Claude, an AI model by Anthropic, working from the photographer's feedback: comparisons with other raw developers and the camera's own JPEGs, and reports of what looked wrong. Decisions and measurements are recorded in docs/ENGINEERING.md, and there are nearly 700 automated tests, run on every push together with one camera file per make.


Licence

Copyright © 2026 Tijmen. GNU General Public License, version 3 or later. You may use, study, change and share Numa, also commercially. Whoever passes it on, changed or not, passes on the source under the same licence. This is Numa for Linux; Numa for iPhone, iPad and Mac is a separate app and is not open source.

The additional files each keep their own licence: the models are Apache-2.0 or MIT, and RawTherapee's camera profiles are GPL-3.0. Three optional models were trained on data licensed for non-commercial or research use only: ViTMatte-S (hair and fur in Refine edge), SFace (recognising people) and IS-Net (a fallback for Subject). They are not in Numa's packages but downloaded when asked for, Add-ons marks the first two for non-commercial use only, and their terms are in data/MODELS-LICENSES.txt. The licence texts are published with the downloads.

Acknowledgements

Photographs in the screenshots

The screenshots show sample RAW files from raw.pixls.us, which their photographers released there under CC0: seventy-two frames from seventy-one cameras, renamed for three demo libraries. Thank you to everyone who contributes to it; it is also how Numa is tested on cameras nobody here owns.

Not affiliated with or endorsed by Fujifilm.

About

Numa photo editor for iPhone, iPad, Mac and Linux. RAW, masks found on your device, culling that measures.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages