Milkglass
Film emulation and real grain
Only for Mac
Free · In‑App Purchases
For when you want that softer film look. A little glow, some shadow grain, less digital highlights. Free to try for 7 days, and nothing leaves your Mac.
Milkglass is a photo editor for Mac built around film color and texture.
Open a RAW or JPEG, choose a film stock, and adjust the result. Change the white balance, bring up the shadows, or work the curves. Use as much or as little of the look as you want.
Grain and glow respond to the light and tones in your photo. Save a file to share or prepare a print.
Free to try for 7 days, then unlock it in the app. No subscription, no account, no cloud. Your photos and your edits stay on your Mac, and nothing is collected.
Every stock is a real film. Most are built from manufacturer datasheets, so the color, the grain and the curve come from measurements rather than a guess.
Milkglass is its own app, not a plugin. There is no Lightroom or Resolve that has to be running alongside it.
Edits are non destructive. Your original file is never changed.
Opens RAW, JPEG, HEIF, TIFF, PNG and WebP. Needs macOS 14 or later.
more Pick a film and it develops onto your photo, shadows first and highlights last, like a print coming up in the tray.
The Print page shows the whole sheet: the paper, your photo where the file puts it, and the border or margins around it. A borderless file for the lab is that sheet too, so the lab prints what you saw.
A new look: the Mac's own typeface, names right under the toolbar icons, panels that fit more on screen, and a start window that opens on your last photo.
Convert to black and white is gone. Pick a black and white film and use HSL Luminance as your filters: Blue down for darker skies, Green up for brighter leaves. Search ⌘K for black and white, mono or grayscale to find the films.
1.2.33 2d ago
Star the films you keep reaching for. The star at the top of the Film page shows just those, so your usual stocks are one click away.
A crop now ends on whole pixels and a downsized export no longer thins out at its border, so a file no longer picks up a dark or pale line along its edges, the top edge of a print included. A file sized for paper comes out at exactly the size you asked for, fully opaque, and resizing or sharpening for paper no longer sprinkles black specks through dark leaves or clips bright edges, wherever the crop sits.
A 16 bit TIFF or PNG exported at 4096 pixels no longer comes out with half the picture replaced by a copy of the other half, and 8 bit TIFFs, PNGs and the TIFF you save for a print lab no longer carry an empty alpha channel, which some labs turn away. On a TIFF or JPEG, Temperature now reads as a shift from the file as it came in, 0 being the file itself, instead of a Kelvin number the file never had.
Print saves a Lab JPEG now, the file most print labs take: sRGB at full quality, sized to the paper with its resolution tagged, and 250 is on the Resolution menu for labs that print at it. Turning on a border changes nothing about the file but the border. A bright point on dark film no longer leaves a black speck beside it, and halation holds back on a flat, foggy frame the way it should.
1.2.32 4d ago
The panels speak one language now. Every setting reads label on the left and value on the right, every switch is a switch, Crop keeps rotate, flip, aspect and grid in named menus, and the dials for a vignette you have not turned on step back until you do.
Crop, the level line and keystone end on the photo. Done, Apply and Cancel sit in a bar right under the picture, where your hands are. Opening Crop from Output slides it in over the page and keeps the Output tab lit, and Done slides you back. The photo pulls back from the bar and the pills while you crop, so every handle stays in reach.
Zoom's menu picks a zoom level, and the Grain test strip shows the same patch of the photo under all five settings, so you compare grain and not scenery. Fewer words to guess at, too: Keep held or Keep live on the Film page, Export on the export button, Vertical and Horizontal on the keystone bar.
Bright skies keep their clouds. Gold 200 no longer flattens the top of a bright frame into one pale sheet, and when you brighten a photo, film rolls the highlights off toward white where a plain LUT would blow them. Superia 400 has its highlight shoulder back, and a Fujifilm RAF exported with no film comes out fully opaque.
1.2.31 Sep 25
The keystone tool lands its correction in one pass now, wherever you drew the two lines. It used to deliver a fraction of the fix that shrank the closer together the lines were.
A pair of lines drawn by hand no longer leaves a tilt of a hundredth of a degree behind.
1.2.30 Sep 22
The panels now live in a column beside your photo. Film, Adjust and Output are its three pages, and one click puts the column away to see the photo on its own.
Test strips. Right click Exposure, Contrast, Grain or Amount, or ask ⌘K for one, and a band across your photo shows five settings side by side. Drag it over what matters and click the one you like. The Grain strip shows each segment at full size when the photo is zoomed out, so you can see the grain you are choosing.
A film's own grain no longer counts as an edit. Reset in Effects puts grain back where the film set it instead of switching it off.
Typing right after ⌘K always goes into the search, undo inside the search leaves your photo alone, labels across the panels share one size, and Help is easier to read.
1.2.29 Sep 22
Masking is gone. It picked regions with a depth model that could not tell a tree from the sky behind it, and it was more than half the app's download. Milkglass is a finisher: the film look, the grain, the halation, the print. Not a region editor.
Black and white films render saturated colour properly. Deep reds and blues were coming out too dark.
Photos open closer to how Apple shows them, so your starting point matches what you saw before you opened it.
The app is about 34 MB now, down from 82 MB.
1.2.28 Sep 20
On macOS 27 the menus for format, color space, print size, DPI and crop stopped marking the option you had picked, so every row looked the same. The checkmark is back.
1.2.27 Sep 18
Ektachrome E100 now reacts to long exposures the way Kodak's sheet describes. Past ten seconds it picks up the slight red shift you would normally filter out, where before nothing happened until well past two minutes.
Pushing Delta 3200 adds the contrast Ilford's own development charts show. It had been pushing with about half the punch of HP5, which is backwards for the film made to be pushed.
1.2.26 Sep 17
New Tools menu. Every panel is in it by name with its key, and View now has Clipping Warnings, False Color and Before / After. Hide everything with Tab, pick a panel, and it all comes back with that panel open.
The canvas says what you're looking at. One pill names soft proof, the gamut warning, clipping warnings and false color, and the compare pill labels each side as held or live.
Crop shows Original, the shape your photo starts in, next to Free, and R steps through the ratios in the order you see them. The flip buttons stay highlighted while a flip is on.
Smaller stuff. Output and Print setup stack with your other panels instead of always sitting on top, White Balance is spelled out in the toolbar, clicking a tool's name opens it, Looks tiles lose their coloured family tags, a picker you changed reads brighter than one you left alone, a failed profile import shows a red note that stays until you deal with it and reads in full however long the file name is, Reset in Print setup puts the resolution back to Auto, a panel too tall for a small window scrolls instead of hiding its bottom controls, and the command palette says how many looks it found and what Return is about to do.
1.2.25 Sep 17
Portra, Ektar, Gold, Ultra Max, the Vision3 stocks, Superia, 400H and 160NS now take their colour from their own datasheets instead of a borrowed film model. Greens stop drifting yellow or blue, and warm tones calm down toward what real scans of those films show.
Highlights roll off on each film's own published curve. Bright skies no longer turn pink on 400H or Color Negative 800.
Velvia, E100 and Kodachrome follow their own datasheet tone. Velvia's midtones were far too bright and now sit where a correctly exposed slide puts them, and Kodachrome's greens drift less toward yellow.
Zoomed out to fit, fine detail like small lettering stays crisp instead of fading into grey.
1.2.24 Sep 15
New Remjet removed switch on the Kodak Vision3 stocks. Cine film carries a black backing that soaks up light before it can bounce back up through the emulsion, and labs scrub it off to run the stock in C41. Without it, bright lights bleed a warm red glow. Flip the switch on 50D, 200T, 250D or 500T and that glow lands on top of the stock's own, strongest at night where the neon is, with just a little extra warmth on big sunlit surfaces in daylight. It comes from how light bounces around inside the film base and from each stock's published curves, not from dialling it in by eye.
The glow around bright lights and the edge sharpening now scale with the size of your sensor, the way grain already does. A crop sensor gets enlarged more to fill the same print, so the film look grows with it, and on medium format it shrinks. Photos you already edited on those cameras will look different when you open them again, and a few full frame files with unusual lens info can shift a little too.
Long exposures now follow the datasheets on HP5, FP4, the Delta stocks and Phoenix 200. Past a second the Ilford stocks were mostly coming out too dark, and Phoenix barely darkened at all. Phoenix 200 also rolls off its highlights on HARMAN's own curve now.
Fixes. Pale skies and white walls stopped glowing into the dark edges next to them, the thin line that could run along the frame edge is gone, masks no longer fade out where they meet the edge of the photo, the Looks thumbnails match your camera's sensor, Clarity holds steady at the edge of the view when you zoom in or drag a slider, and small lights keep their full glow on screen, in high resolution exports and in night shots.
1.2.23 Sep 13
Soft proof shows the print. With a paper profile picked, the canvas draws your photo through that profile, the space around it turns the paper's white, and orange stripes mark the colours the paper cannot print. The gamut check in Output gives a number for the whole print, and it all keeps up with the sliders, so dragging with a proof on feels the same as without.
The command palette takes numbers. Type grain 40, shadows 25 or portra 400 60 and press return. A plus or minus on its own is exposure in stops, and a number with a k after it is a color temperature.
Panels open where you can see them. A panel that would have run off the bottom of the window now sits where it fits, or on the other side when its own side is full, and it never opens underneath the Output panel. Reset Panel Positions is in the View menu as well as the command palette.
The Output panel is shorter. Paper size, resolution, border and the printer profile moved to their own Print setup panel, one click from the paper row, so the print console fits beside your adjustments on a laptop screen.
1.2.22 Sep 11
Bigger picture. The photo now uses the space the window title bar was wasting, so you see about nine percent more of your frame at the same window size.
Exports and prints match the screen. Phone photos no longer come out far grainier than you saw, cropped exports land at the size you asked for, and exports with masks keep their masks.
Undo is fixed all round. Undo after redo works, arrow key nudges and double click resets can be undone, and Reset in Looks clears the whole stock.
Picking None keeps the photo's white balance, plus smaller fixes: Pick Neutral reads the right pixel on a cropped photo, the histogram stops counting the cropped away area as black, and Reset Panel Positions lives in the command palette.
1.2.21 Sep 10
New Film MTF switch in the Detail panel. Film can only resolve so much detail, and until now Milkglass never took any away. Turn it on and each stock softens the finest detail by exactly as much as its own published curve says it should. Off by default.
Export to PNG. It sits beside JPEG and TIFF in the Output panel, lossless, for when you want a file with no compression artifacts.
Phoenix 200 stopped turning skies pink. Its red halation now stays on the bright edges where the film actually puts it.
Vision3 500T no longer washes bright scenes in an orange veil. Its halation now matches the rest of the Vision3 family, which is what an intact remjet layer does.
Gold 200 is rebuilt from Kodak's own datasheet. Skies are blue instead of turquoise, whites keep the light, and the whole stock is quieter and more honest than the version it replaces.
Gold 200, Metropolis and Phoenix keep the light in the whites. A sunlit white wall used to come out dead neutral on those three when every other stock let the light through.
Auto Tone stopped lifting the shadows on every photo. It was adding the same lift to everything, which flattened the toe of whatever film you had picked. Now it only reaches in when the shadows are actually crushed.
Auto Tone and Auto White Balance no longer freeze the window while they think.
1.2.20 Sep 4
Panels open where you can see them. Opening Tone and then White Balance no longer buries the first one under the second.
The toolbar shows which tools you have touched. Anything you have edited sits brighter than the tools you have not opened.
Looks moved to the front of the toolbar. It is the choice everything else builds on, so it goes first.
New Help menu. Every keyboard shortcut in one place, and a quick start for getting your photos in cleanly.
The film you picked now shows up in Edits. It used to list the grain and never name the stock.
The scanner presets are gone. Frontier and Noritsu were never tuned against real scans and pushed the image the opposite way from the machines they were named after.
1.2.19 Sep 2
Grain is truer per film. How much grain lands in the red, green and blue records is now measured off real scans of each stock instead of borrowed from a similar one.
Ektar 100 grains a little coarser, which is what its datasheet says it should do.
Kodachrome 64, Provia 100F and the Vision3 stocks got their own grain measurements too.
1.2.18 Sep 1
Grain colour is measured from real scans now, one set of numbers per film. Every colour stock was putting the least grain in the blue layer when film puts the most there.
Portra 800 is grainier than Portra 160 again. It had been rendering the other way round.
How grain changes from shadows to highlights follows each film's own measurements instead of a shared shape that most stocks did not fit.
Red grain was running hot on Vision3 250D, 500T and 200T.
Delta 100 and Delta 400 grain strength was a guess. It is now anchored to T Max, which Kodak publishes.
1.2.17 Aug 30
Grain colour is measured from real scans now, one set of numbers per film. Every colour stock was putting the least grain in the blue layer when film puts the most there.
Portra 800 is grainier than Portra 160 again. It had been rendering the other way round.
How grain changes from shadows to highlights follows each film's own measurements instead of a shared shape that most stocks did not fit.
Red grain was running hot on Vision3 250D, 500T and 200T.
Delta 100 and Delta 400 grain strength was a guess. It is now anchored to T Max, which Kodak publishes.
1.2.16 Aug 29
Buttons on the Print tab and in the film picker look like buttons now. They used to be plain amber text that read like a link.
Print warnings have their own colour. A crop that does not fit the paper, or a resolution that will print soft, no longer share the amber that means you changed something.
1.2.15 Aug 25
Pro 400H, Ektar 100 and Superia 400 were rendering harder than those films actually are. Their tone curves had been set by eye instead of measured against the published data. 400H moves the most, and it should. It is one of the softest colour films ever made and it was coming out as one of the punchiest.
The negative stocks reach real black and real white now. Highlights used to top out at a flat grey no matter how bright the scene, because the render stopped at the negative and never printed it. Portra, Ektar, the Vision3 stocks and every black and white film all open up. Slides were never affected.
Grain got rebuilt from scratch. It used to break up into countable specks once you zoomed past about 12 megapixels, and on the finer colour stocks there was barely anything there at all. Now it reads as grain at any size.
Every stock got its grain resized against published clump measurements, so a coarse film looks coarse and a fine one looks fine.
Grain sits where the film puts it now, holding through the shadows and falling away in the highlights, measured stock by stock.
Tri X, HP5, Delta 3200 and FP4 came in for the biggest change. Look at them at 100 percent.
Grain also renders a lot faster than it did.
1.2.14 Aug 25
Your exports remember what made them now. Open one in Preview and it tells you the film stock, the push, and what camera shot it. Type a stock name into Finder and everything you shot on it comes up. Your location stays out of it.
Move a photo or rename it and your edits follow. They used to quietly disappear.
Export settings stay where you put them instead of resetting to JPEG on every photo.
Drop a few photos on the window at once and they all open now, not just the first one.
1.2.13 Aug 21
Blown highlights on the color negative stocks now hold their color instead of clipping to flat white. Sunsets and tungsten bulbs keep their warmth the way the film does.
Lomography Color Negative 800 gets its pink highlight push back.
Fixed a tiny crop drift when switching aspect ratios.
1.2.12 Aug 20
Blacks and Whites stay where they belong now. They open the shadows or lift the highlights without washing across the middle of the frame.
A few stocks were sharpening off a misread datasheet. Provia, Pro 400H and Delta 3200 come out crisper. Pro 160NS and Superia come out softer, closer to how the film actually looks.
1.2.11 Aug 18
Blacks and Whites move the way they say now. Turning Blacks up used to darken the shadows it was supposed to open, and pulling Whites down muddied the whole photo instead of just recovering the bright parts.
Temperature and tint inside a mask work on RAW files. They ran backwards before, so warming a mask cooled it.
Pushing a stock warms the highlights instead of the shadows.
The vignette stays with the photo while you drag a slider zoomed in.
1.2.10 Aug 16
Panels snap into line now. Drag one near the edge of the canvas or another panel and it settles into place. Hold option while dragging to put it anywhere.
The vignette sticks to your photo instead of the window, so it stays put when you zoom and pan.
A handful of small fixes to masks, exports, and the toolbar.
1.2.9 Aug 11
Pick a film and it develops onto your photo, shadows first and highlights last, like a print coming up in the tray.
The Print page shows the whole sheet: the paper, your photo where the file puts it, and the border or margins around it. A borderless file for the lab is that sheet too, so the lab prints what you saw.
A new look: the Mac's own typeface, names right under the toolbar icons, panels that fit more on screen, and a start window that opens on your last photo.
Convert to black and white is gone. Pick a black and white film and use HSL Luminance as your filters: Blue down for darker skies, Green up for brighter leaves. Search ⌘K for black and white, mono or grayscale to find the films.
more Version 1.2.33 2d ago
Data Not Collected The developer does not collect any data from this app.