The pro Media Editor for the Mac.
Your photos and videos stay exactly where they live. ALTer references them, never absorbs them, and gives you everything on top — adjustments with a live histogram, a full-resolution loupe, brushed edits and before/after compare, a real timeline editor, live web capture, descriptions for photos and video, accessible galleries you host yourself, and Bluesky posting where every image carries its ALT text automatically.
Download ALTer Read about the beta
macOS 13 or later · Apple Silicon & Intel · everything bundled, nothing to install
The library
ALTer references your originals exactly where they already live — on the internal drive, the big external, the NAS. It builds a catalog around them and leaves the files alone. Nothing is absorbed, nothing is duplicated, nothing is rewritten behind your back.
A library is a single .alterlib bundle holding a SQLite catalog of absolute paths. Move ALTer to another Mac and point it back at your drives and everything reconnects. There is no proprietary vault to escape from later.
The one and only operation that touches an original is Move File to Trash, and it asks first. Remove from Library just un-indexes. If a drive comes back on a different mount point, Locate / Relink Folder rewrites the path prefix for every photo underneath it in one pass.
Import files or whole folders with ⌘I, drag them onto the window, or pull straight from your Photos library with ⇧⌘I. Folder imports recurse and skip hidden files. Everything you just brought in arrives selected, and the grid scrolls to reveal it.
The Photos import runs through the system picker, so ALTer never asks for blanket access to your Photos library. You choose the photos, ALTer asks where to put them, and from that moment they are referenced like anything else.
Originals parked in iCloud come down automatically. ALTer detects a dataless placeholder and materializes it before it builds a thumbnail, describes it, exports it, or renders it into a gallery — you never get a mystery failure on an evicted file.
Stars ⌥⌘0–⌥⌘5, flags ⌘', applied across a whole selection. Ratings and flags live in the catalog, so a fast pass over a shoot never rewrites a single file.
Filter the grid to Starred at any threshold, Flagged, Videos, Animated, Adjusted, Has Location or No Location — and, because this is ALTer, Has ALT Text and Missing ALT Text. That last one is the whole workflow in a single click.
And search. ⌘F jumps to the search field, and it reads everything a person might remember about a photo: filename, title, caption, keywords, ALT text, creator. Type two words and both must match. Search composes with the filters — Missing ALT Text plus a search term is exactly the triage view you want.
Sort by Name, Date Imported, File Date, or Rating, ascending or descending. Your choice persists, along with window size, column widths, filmstrip height, and thumbnail size.

Six fields — ALT text, Title, Caption, Keywords, Creator, Copyright — written to the standards that actually get read. ALT text goes to XMP-iptcCore:AltTextAccessibility. Title writes both XMP-dc:Title and IPTC:ObjectName. Caption writes XMP-dc:Description and IPTC:Caption-Abstract. UTF-8 throughout.
Edits cache to the catalog the instant you make them and write to disk 2.5 seconds after you stop typing. Prefer to control it yourself? Switch to manual in Settings and ⌘S flushes every pending change library-wide. An orange dot on a cell means "not written yet."
Select many photos and set Creator, Copyright, or Keywords across all of them at once — with an add to existing keywords toggle so a batch pass builds up instead of flattening what is already there.
Adjust
Every adjustment is a recipe stored beside the photo, never baked into it. The grid, the filmstrip, the viewer, and the histogram all repaint live as you drag. Your original file is byte-for-byte untouched at the end of it.
Exposure, Contrast, Highlights, and Shadows under LIGHT. Warmth and Tint stand on their own under WHITE BALANCE. Saturation and Vibrance under COLOR. Sharpen under DETAIL. Each slider runs over a gradient track that shows you what it does — Warmth fades blue through white to amber, Tint green through white to magenta.
Highlights pulls blown skies back down; Shadows lifts what is buried or crushes it further. Every row carries a monospaced signed value that turns accent-colored the moment it leaves neutral, so you can see at a glance what you touched. Double-click any value to snap it back.
Sixty-four bins per channel, red green and blue screen-blended over a faint luminance base. Counts are square-rooted so a single blown spike does not flatten everything else into a flat line — the shape of your midtones stays legible.
It reads the adjusted image, not the original, and recomputes on every slider move.
Hit Crop in the viewer and the frame becomes the control: drag anywhere to draw a crop, pull the corners to resize it, drag inside to move it, all over a thirds grid. Lock it to an aspect — Original, Square, 3:2, 4:3, 16:9 — or leave it freeform.
Straighten runs to ±15° and scales the frame to cover as it turns, so a leveled horizon never buys you blank corners. Rotate in 90° steps, and the crop turns with the pixels — frame something in portrait, rotate the shot, and your framing is still on the subject.
It is all recipe, like everything else. The crop shows up in exports, galleries, and Bluesky renditions; the original file keeps every pixel you cropped away, and one Reset gets them back.
Click a blemish to drop a spot. ALTer picks a clean source beside it, flipping away from the nearer edge of the frame, and blends the patch through a soft-edged circular mask. Size the spot from a hair to a broad patch, undo the last one, or clear them all.
Spots are part of the recipe like everything else. They render into exports, galleries, and Bluesky renditions, and they come off again whenever you want.
Not every adjustment belongs to the whole frame. Hit Brush and paint an adjustment exactly where it is wanted — dodge a face, cool a sky, sharpen just the eyes. The Adjust panel turns orange and its sliders now shape only where you brushed.
Size and feather the brush, hold to paint or switch to Erase to carve the mask back out. A photo can carry several brushes at once, each with its own recipe — one warming the foreground, another draining the color from a billboard — and every one stays editable forever. It is all recipe: the mask and its adjustments render into exports and galleries, and the original keeps every pixel.
Press L and a magnifier floats over the photo showing its full-resolution pixels — the real ones, with your recipe applied — without ever leaving the fitted view. It is how you check critical focus and judge grain without zooming the whole image in and out.
Scroll to zoom it from 50% right up to 800%. Size the glass to taste, and let it float offset on a handle — a stem running back to a crosshair on the exact point being examined — or sit it dead-centered on the cursor. It remembers how you left it, shot to shot and launch to launch.
The Neutral eyedropper solves your white balance in one click. Point it at anything that ought to be a neutral gray — a concrete wall, a white shirt in shade — and ALTer sets Warmth and Tint so that spot reads truly neutral, computed against the real color engine rather than guessed. Regret the pick? ⌘Z puts it right back.
Press M and the viewer splits: your untouched original on one side, the edited version on the other, each clearly badged. Drag a slider, brush, or neutralize and the edited half updates live while the original never lies — the honest test of whether an edit is earning its keep.
Flip the split between side-by-side and stacked with a tap, whichever suits the frame — panoramas stacked, portraits abreast. Step through a whole shoot two-up without leaving the comparison.
⌥⌘A analyzes the photo and moves the same seven sliders. Nothing hidden, nothing you cannot then take back over. Watch the values change and disagree with any of them.
It is deliberately conservative. It pushes exposure toward a balanced midtone but caps itself at ±1.25 EV. It only touches contrast when the image is genuinely flat, and it only adds vibrance when there is muted color to recover — which means a true black-and-white comes out untouched, and so does a photo you already graded.
Run it across a whole selection from the Media menu when a shoot needs a fast baseline.
The timeline editor
Cut clips from any number of videos into one sequence. Layer text, images, other videos, and audio over the top. Keyframe anything, ease it properly, and grade it — all against a preview that is assembled by the exact same code that writes the final file.
Add clips from files or straight from your library selection. They land on the sequence track with generated filmstrips so you can see what you are cutting.
Split at the playhead. Drag either edge to trim, clamped to the source's real length so you cannot pull past the end of the footage. Drag a clip's body to reorder. Delete a segment and the gap closes. Multiple source videos live happily in one sequence, and re-adding the base clip to duplicate a moment is perfectly legal.
Animated GIFs are clips too. Open one in Animate and it lands on the timeline as real footage — its own frame timing intact — ready to cut, caption, and export like any video. The original GIF is never touched.
Zoom from fit to 24× with ⌥-scroll anywhere over the timeline, centered on the playhead. A plain scroll pans sideways. During a drag the scale freezes, so trimming one clip never yanks the ruler out from under your cursor.

Text — any bundled font, sized as a fraction of the frame so it scales with the output, with fill color, classic meme outline, drop shadow, and ALL CAPS toggles.
Image — from a file or straight from the photos you have selected in the library, which is how a photo becomes a sticker.
Video — picture-in-picture, with its own volume and a clip in control that sets where playback starts inside the source.
Audio — MP3, WAV, M4A, each track with its own volume. The base clip keeps its own Original Sound dial; drop it to zero to replace the soundtrack entirely.

Drag a layer to move it. Corner circles scale radially — pull away to grow, push toward the center to shrink, and it stays correct from any corner at any rotation. A knob above the selection rotates it.
Double-click a text layer and type in place. A dark input chip appears below in the layer's own font while the fully styled text above updates on every keystroke. Return commits, ⌥Return makes a new line.
Drag a layer off the edge and it renders at 45% with a dashed border and tells you the truth: off canvas — visible here, not in renders.
Position, scale, rotation, and opacity, keyed at any point on the timeline. Diamonds sit on the layer's bar, grow and turn orange at the playhead, jump the playhead when tapped, and drag to retime. Hover one for a summary of everything it holds.
Four curves per segment — Linear, Ease In, Ease Out, Ease In-Out — and the preview evaluates the same curve the exporter renders. What you scrub is what you get.
Auto-key means the controls never go dead. Adjust a keyframed layer and ALTer writes or updates the keyframe at the playhead; adjust an un-keyframed one and it edits the base pose. Scrub-and-tweak updates the existing diamond instead of stacking new ones on top of it.
Not ready for keyframes yet? One-click motion presets — Ticker ◀, Ticker ▶, Rise ▲ — plus a fade in/out toggle. They step aside the moment you place a diamond, because from then on the diamonds own the motion.
Hit the palette and the timeline swaps for a grading bench carrying the same controls you use on photos — the same sliders, the same gradient tracks, the same feel.
Select a clip and you grade that clip. Select nothing and you grade the whole edit. A per-clip grade overrides the global one, so you can match a shot that was lit differently without unpicking the look you set for everything else.
Put a sticker on someone at the playhead and press Track Face. One pass over the footage writes keyframes that follow the face nearest that layer — the starting position is the seed, so it locks onto the right person instead of hopping between everyone in frame.
The offset scales with the face, so a sticker stays anchored as your subject walks toward the camera or away from it.
Save a whole stack of layers by name and drop it onto anything. Scenes append rather than replace, so they stack, and they rescale their own timing to the length of whatever you apply them to — a lower-third built over thirty seconds still sweeps cleanly across a six-second clip.
Cuts and trims never travel with a scene. It carries the look, not your edit.
Video bases export to .mov at highest quality, at the source's own frame rate. Stills can be saved as PNG or JPEG, exported as video, or dropped straight back into your library as a new photo.
Sequence clips, per-clip grades, and video layers all render through the same custom compositor that drives the preview. Text and image overlays ride a Core Animation layer tree with real keyframe animations and matched timing functions. Audio becomes a proper mix with per-track parameters. Preview and export are not two implementations that agree most of the time — they are one.
Web layers
Load any page live inside ALTer and capture it — as a still, or as a recording. What comes back is ordinary media. From that point it keyframes, eases, grades, trims, and exports like anything else you shot.
Add Snapshot captures the page as it stands and adds it as an image layer.
Record & Add records the live page — animations running, video playing — for three to thirty seconds and adds it as a video layer starting at the playhead.
Either way the layer names itself after the site, so your timeline reads in plain language instead of web-4f2a91.png.
AI descriptions
ALT text, a title, and a caption — written by the ALTtext engine and embedded into the file where every screen reader, CMS, and social platform will find them. Video gets described from motion and from what is actually said in it.
Press ⌘G. ALTer sends a downscaled rendition — description needs detail, not a 60-megapixel upload — and fills three fields from one request.
ALT text is always written. Title fills only if it is empty. Caption fills if it is empty or if it still matches what ALTer generated last time. Regenerate as often as you like: machine-written text updates, and anything you typed yourself is never overwritten.
Describing a video from a single frame is guesswork. ALTer samples frames evenly across the clip and, at the same time, transcribes the speech entirely on your Mac. Both go to the engine together, so the description reports what happens and what is said.
No audio ever leaves your machine for transcription. On macOS 26 ALTer uses Apple's on-device speech analyzer, downloading the model once on first run. On earlier systems it uses on-device recognition where the hardware supports it.
If transcription fails, ALTer says so — described from frames only — speech transcription failed — instead of quietly handing you a thinner description and letting you assume it heard everything.
That same on-device transcript writes .vtt and .srt sidecars next to your video, cued into lines that read comfortably on screen. Upload the video anywhere that accepts subtitles and the file is already sitting beside it.
⌥⌘K suggests keywords using Apple's Vision framework, entirely on your Mac and entirely free. Click any suggestion to add it, or add them all. Suggestions already in your keyword list are filtered out.
Select a hundred photos, or filter to Missing ALT Text and select nothing at all, and ⌘G runs the lot. Per-cell status overlays show queued, generating, and failed. A rate limit stops the run cleanly and resets what was queued rather than hammering away at it.
Publish
Accessible web galleries to your own hosting. Bluesky posts where every image carries its ALT text automatically. Your Apple TV, subscribed to your own gallery. Nothing here holds your audience on someone else's platform.
One command builds a complete, self-contained site: an accessible HTML page, full-size renditions with your metadata stamped in, thumbnails, and a manifest. No tracking, no analytics, no framework, no CDN. A folder you could host anywhere or hand to a client on a drive.
The page is genuinely accessible, not accessible-shaped. Every image carries its ALT text. Captions sit in real figcaptions. The lightbox is a proper ARIA dialog with Escape and arrow-key navigation that moves focus in on open and returns it to where you were on close. It adapts to light and dark. And with JavaScript disabled the links still work.
Before it builds, ALTer counts what is missing and tells you: either an orange warning that some photos have no ALT text yet, or a green all-clear. You never publish an inaccessible gallery by accident.


Point ALTer at a GitHub repository and a fine-grained token and publishing deploys straight to GitHub Pages — blob, tree, commit, ref, with per-file progress. Bring a custom domain or use the default address. A local copy always stays in Pictures → ALTer Web Galleries.
It is your repository, your domain, your audience. ALTer is not in the middle of it.
A published gallery can subscribe itself to your Apple TV through the Twilightscapes app. Shoot in the afternoon, publish before dinner, and it is on the big screen in the living room — described, captioned, and yours.
Sign in with an app password — held in your Keychain — and post up to four photos, each one uploaded with its ALT text already attached. Not a reminder to add it. Attached. Your adjustments and any animation you built are baked into what goes out.
Video posts natively, with alt text and the correct aspect ratio. If you edited it in the timeline, ALTer renders your cut first and posts that — not the raw file. And a still photo you animated posts as real video.
Schedule for later and ALTer renders the media into an outbox at scheduling time, so firing needs nothing but a network connection. It wakes in short slices so sleep cannot make it overshoot, and anything that came due while the app was closed posts on the next launch.
Already signed in on Twilightscapes? You are signed in here.
Everything you posted, searchable, filtered by posted, failed, photos, or video, sorted by newest, oldest, most liked, or most engagement. Look at it as a list, a grid, a gallery, or a calendar.
Likes, reposts, and replies come back from Bluesky and turn into charts: Engagement over time, and Best Times — which hour of the day your work actually lands.
Neither platform offers the posting access ALTer would need, so ALTer does the honest thing: it renders your creation, copies your text to the clipboard, reveals the file in Finder, and opens the composer with your text already filled in. Drag the file in and post.
For YouTube, any caption sidecars you generated are revealed alongside the video, ready for the Subtitles panel.
Accessibility
ALT text is not a checkbox at the end of this app. It is the reason the app exists — and that runs in both directions. ALTer helps sighted people describe their photos, and it lets people who cannot see their photos find out what is in them.
Generate a description for one photo and VoiceOver speaks it aloud. Not "generation complete" — the actual text. Select an undescribed photo, press ⌘G, and hear what is in your own picture.
Run a batch and it speaks the tally instead, because a hundred descriptions read verbatim is not help. Failures are spoken too, rather than failing silently into a status bar nobody can see.
A grid cell is one element, not a pile of unlabelled images. It announces itself as a photo or a video, by name, and then tells you what it is: has ALT text or no ALT text yet, its rating, whether it is flagged, whether it has been adjusted, whether it has unsaved edits.
Which means you can navigate straight to the photos that still need describing, entirely by voice.
Open a photo with no description and the viewer reads: no ALT text yet — press Command G to generate a description. The app does not just report the problem, it says the words that solve it.
The rating control is a single adjustable element — "3 of 5 stars" — that VoiceOver raises and lowers by swipe, instead of five anonymous star images. The histogram identifies itself. The viewer runs fully from the keyboard.
The timeline editor is labelled end to end. Every clip announces its place in the cut and the slice of source it plays. Every layer bar says what it is — text with its words, image and video by name, audio tracks — and where it sits in time. Keyframe diamonds read out everything they hold: time, scale, rotation, opacity, easing.
The playhead is one adjustable element — VoiceOver steps it through the edit a second at a time. And every Transform slider, grade slider, and volume control speaks its name and its value as you change it.
The galleries you build are keyboard-navigable and screen-reader-correct. The Bluesky posts you send carry ALT text on images and on video. The metadata you write lands in the standard fields other software actually reads.
Accessibility that stops at your own screen is not accessibility. It has to survive the export.
The rest of it
Export presets that remember everything. Watermarks that know better than to stamp a thumbnail. Reusable text with tokens. A real map. Fonts that never touch your system.
JPEG, PNG, or WebP. Original size or 2048, 1600, 1200, or a number you type. Name files with patterns — {name}, {seq}, {date}, {title} — with a live preview of the filename you are about to get, and save the whole configuration as a preset you can recall.
By default, exports carry no camera EXIF and no GPS. Renditions are encoded fresh from pixels, so your home address does not ride along with a photo of your kitchen. Turn camera EXIF back on if you want it; strip GPS separately if you want the settings but not the location.
Package a job as a .zip with a manifest.csv listing every filename against its title, ALT text, caption, keywords, creator, and copyright — the handoff a publisher or a client actually wants.
Set it once in Settings: your PNG, one of nine positions, size as a share of the photo's width, and opacity. Then switch it on per job.
It never touches your originals, and it never lands on gallery thumbnails — a watermark at 480 pixels is just clutter.
Reusable text for any metadata field, with tokens that fill themselves in per photo: {name}, {date}, {title}. A copyright line becomes © 2026 Your Name across a whole shoot in one command. Applied to keywords, snippets append rather than replace.
The Info tab shows the shot data — camera, lens, exposure, aperture, ISO, focal length, capture date, dimensions — as selectable text, with a live mini-map when there are coordinates.
Click the map for a real Mapkit editor: zoom, satellite and hybrid, place search, click anywhere to drop a pin. Save the spots you shoot at often by name and reuse them. Apply to one photo or to everything you have selected — or strip location entirely.
Eleven open-license families ship inside ALTer — display, text, handmade, and classic — registered to the app only. Nothing is installed into your system font book, and nothing you already have is disturbed.
The beta
ALTer is in free public beta. Everything on this page is in the build you can download right now — including the parts that are normally paid, which are unlocked for everyone while the beta runs.
Beta 0.9.16 · Free during the beta · macOS 13 or later · Apple Silicon & Intel · everything bundled, nothing to install
Your originals stay yours, in place, in their own folders. Your galleries publish to your own domain. Your library is a catalog you can walk away from. ALTer earns its place by being useful, not by holding your work hostage.
Free during the beta · macOS 13 or later