ALTer app icon — the word ALTer on a blue-to-purple gradient

ALTer

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

ALTer in Split View: a floodlit sandstone rock formation under a night sky fills the viewer, a filmstrip of rated landscape thumbnails runs below it, and the Adjust panel on the right shows a live RGB histogram over the Exposure, Contrast, Saturation, Vibrance, Warmth, Tint, and Sharpen sliders. The tray under the photo offers Grid, Playground, Crop, and Retouch.

The library

Your photos never move.

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.

ALTer’s Browser view: a grid of landscape photos wearing star ratings, orange flags, and green ALT badges. The sidebar lists All Media (77), No ALT Text (12), Flagged, Videos, Animated, and Recently Added plus folders and an album. The inspector shows a photo titled Moulton Barn Sunset with its full caption and on-device suggested keywords like outdoor, sky, and barn.
A catalog, not a container

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.

Library format
.alterlib bundle · versioned SQLite catalog
Images
JPG · PNG · WebP · TIFF · HEIC · HEIF · GIF · BMP
Camera RAW
CR2 · CR3 · NEF · ARW · DNG · RAF · ORF · RW2 & more
Video
MOV · MP4 · M4V · AVI · MPG · MPEG
Originals modified
Never, except explicit Move to Trash
The sidebar source list: All Media with a count of 77, No ALT Text with 12, Flagged, Videos, Animated, and Recently Added under Library; Posts under Publish; two folders; and an album.
Getting media in

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.

Rate, flag, filter, search

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.

Selection
Click · ⌘-click · ⇧-click range · ⌘A · marquee drag
Search
⌘F · filename, title, caption, keywords, ALT text, creator
Views
Browser ⌘1 · Split ⌘2 · Viewer ⌘3
Thumbnails
110–260 px, live slider
The filter menu open over the photo grid: All checked, then Flagged, Videos, Animated, Has Location, No Location, Has ALT Text, Missing ALT Text, Adjusted, and Playground, with the Starred submenu expanded to show one-star-and-up through five-star thresholds.The browser bar with “canyon” typed into the search field and the grid narrowed to two canyon photographs; the status bar reads 2 shown.
Metadata that lands in the file

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.

Nine night landscapes selected in the grid, each outlined and badged ALT. The inspector reads “9 photos selected” above Generate ALT Text for 9 and Apply Snippet to 9, then an Apply to All Selected section with Creator, Copyright, and Keywords fields and a checked “Add to existing keywords (instead of replacing)” toggle.

Adjust

Seven sliders. No black boxes.

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.

Split View while editing: a weathered barn stands before the Teton range under a vivid purple and pink sunset. The Adjust panel on the right shows a live RGB histogram above the LIGHT, COLOR, and DETAIL groups, with Exposure, Contrast, Vibrance, and Warmth showing accent-coloured values where they have been moved. A note underneath reads “Originals are never changed — adjustments render into exports and galleries.”
Light, White Balance, Color, Detail

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.

Exposure
−2 … +2 EV
Contrast
0.5 … 1.5
Highlights
0 … 1 · recover blown detail
Shadows
−1 … +1 · crush or open
Warmth / Tint
−100 … +100 each
Saturation / Vibrance
0 … 2 · −1 … +1
Sharpen
0 … 1
The adjustments panel: a live RGB histogram above three groups — LIGHT with Exposure and Contrast, COLOR with Saturation, Vibrance, Warmth and Tint, DETAIL with Sharpen. Each slider sits over a gradient track showing what it does, and Exposure, Vibrance, Warmth and Sharpen display accent-colored values because they have been moved off neutral.
A histogram you can actually read

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.

Close-up of the RGB histogram: red, green and blue curves screen-blended over a faint luminance base, with distinct peaks in the shadows and a long tail of red running out into the highlights.
Crop, straighten, rotate

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.

Aspects
Freeform · Original · Square · 3:2 · 4:3 · 16:9
Straighten
±15° · cover-scaled, no blank corners
Rotate
90° steps · the crop travels with the pixels
Destructive
Never — Reset restores the full frame
Crop mode over a moonlit sandstone formation: a crop rectangle with round corner handles and a thirds grid, the area outside it dimmed. The tray below shows an Aspect menu set to Freeform, a Straighten slider reading plus 4.6 degrees, rotate-left and rotate-right buttons, Reset, and Done. The straightened frame has scaled to cover, so no blank corners appear.
Retouch

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.

Retouch mode over the sandstone formation: four accent-colored ring markers sit on the rock where spots have been placed. The tray reads “Click a spot to heal it” beside a spot-size slider, with Undo Spot, Clear All, and Done.
Brush it in

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.

Paint / Erase
Toggle in the tray
Size · Feather
Both continuous
Brushes per photo
As many as you like — each its own look
Destructive
Never — strokes live in the recipe
The Loupe

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.

Toggle
L · or the Loupe button
Zoom
50% … 800% · scroll or menu
Handle
Offset on a stem, or centered
Shows
Full-res, recipe applied
Neutralize with a click

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.

Before and after, side by side

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.

Toggle
M · or the Compare button
Layout
Side by side or stacked
Live
The edited half tracks every change
Auto-Enhance, with its work shown

⌥⌘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.

Copy adjustments
⇧⌘C
Paste to selection
⇧⌘V
Auto-Enhance
⌥⌘A · single or batch
The same night photograph of a lake below a mountain, side by side. On the left, before Auto-Enhance: flat and hazy. On the right, after: brighter with deeper blacks and more defined clouds. Auto-Enhance moved only Exposure and Contrast, leaving every colour slider at zero.

The timeline editor

A real cutting room.

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.

The Animate editor: a night timelapse of a fishing boat under moving clouds fills the canvas, with a styled caption reading “Night watch” selected, showing corner scale handles and a rotation knob. Below, the timeline shows a ruler with a red playhead, the clip’s filmstrip track, and a purple text-layer bar carrying a yellow keyframe diamond. The inspector on the right holds the text style, transform, and animation controls.
The sequence

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.

Play / pause
Space
Step one frame
← / →
Step ten frames
⇧← / ⇧→
Nudge selected bar
, / . · ⇧, / ⇧.
Undo / redo
⌘Z / ⇧⌘Z · 60 levels
Close-up of the timeline tracks: a ruler with per-second ticks and a red playhead, the clip’s filmstrip showing the boat repeating across the track, and beneath it a purple text-layer bar labelled “Night watch” carrying a yellow keyframe diamond.Close-up of an audio track on the timeline: a green bar filled with a real mirrored-peak waveform drawn from the source file, the red playhead crossing it, with the purple caption bar and its yellow keyframe diamonds directly above.
Four kinds of layer

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.

The Animate inspector: a TEXT panel with the caption “Night watch”, a Helvetica Bold font picker, size slider, colour well, and toggles for Outline, Drop shadow, and ALL CAPS. Below it a TRANSFORM panel marked with a yellow Auto-key badge carries X, Y, Scale, Rotate, and Opacity sliders plus layer order buttons, and an ANIMATION panel offers Add at Playhead and Clear.A picture-in-picture video layer playing over the base clip: a second video of a rusted car in a moonlit field sits inside a selection box with corner handles and a rotation knob, composited over the night boat footage, with the caption “Visit Twilightscapes.com” below it.
Direct manipulation on the canvas

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.

Typing a caption directly on the canvas: over the moonlit fishing boat, the fully styled words “Night watch” sit inside a selection box with corner handles and a rotation knob, while a floating dark input chip just below shows the same text being edited live.
Keyframes and easing

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.

Close-up of a caption layer bar carrying four yellow keyframe diamonds spread along its length, marking the points where its position, scale, rotation, or opacity change.
Grade in the tray

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.

The grade tray open where the timeline normally sits: it reads “Grading clip 1 — overrides the whole-edit grade” beside a Whole Edit button, with the same LIGHT and Exposure controls used on photos, over the captioned boat footage.
Track a face

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.

Scenes

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.

What comes out

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

The web is an input device.

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.

The Web Layer sheet: a URL field reading alttext.org with a Load button, below it a live web view showing the real ALTtext site — its navigation, wordmark, and “Drop an image. Get accessible ALT text.” Beneath are Add Snapshot, a duration slider, and Record & Add, with a note that what you capture is your responsibility.
Snapshot or record

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.

Snapshot
PNG · full backing-scale resolution
Recording
H.264 .mov · 15 fps · 3–30 seconds
A recorded web page now living on the timeline as an ordinary video layer: its bar is named twilightscapes.com and carries a filmstrip of the captured page scrolling, sitting above the caption and audio tracks. The inspector shows the usual VIDEO LAYER controls — width, volume, clip in — and full Transform sliders.

AI descriptions

One click describes photos and video.

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.

Nine night landscapes in the grid after a batch run, every one now carrying a green ALT badge. The inspector reads “9 photos selected” above Generate ALT Text for 9, and the status bar confirms “Saved metadata into 9 files.”
Photos

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.

The inspector just after generating: the title reads “Moonlit Desert Spire” and the caption describes a wide-angle night desert landscape — a star-packed sky shading from dark blue to purple, a bright full moon lighting a tall slender rock formation, and a warm reddish glow on the sand. Below sit the ALT TEXT section, on-device keyword suggestions, creator, copyright, and EXIF size.
Video, described properly

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.

Frames sampled
6 for clips ≤15 s · 8 for longer
Speech
On-device · never uploaded
Caption cues
≤42 characters · ≤5.5 seconds
Caption files, free

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.

Keywords, on-device

⌥⌘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.

The Keywords section of the inspector: an empty comma-separated field, then “Suggested (on-device)” with clickable chips reading plus outdoor, plus sky, and plus night sky, beside an Add All button.
Batches

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

Out into the world, described.

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.

The Publish Web Gallery sheet: title and description fields, JPEG format at 1600 px and 85% quality, and toggles for showing titles and captions, applying a watermark, creating a zip, and publishing to the web. At the bottom, a green check reads “Every photo has ALT text — fully accessible gallery.”
Web galleries

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.

Formats
JPEG · PNG · WebP
Sizes
1200 · 1600 · 2048 px · thumbs at 480
Watermark
Optional on full-size — thumbs stay clean
Also
Optional .zip
A published ALTer gallery in a browser, dark theme: the title “Night Landscapes” over “Long exposures from the desert Southwest”, then a responsive grid of night photographs. Under each thumbnail sits its title, its full description, and the photographer’s credit.The gallery lightbox open over the dimmed grid: a moonlit sandstone spire under a star-filled sky fills the frame, with previous and next arrows at the edges, a close button top right, and the photo’s title and full description printed beneath.The same publish sheet with the warning state instead: an orange caution line reading “2 photos have no ALT text yet — generate before publishing for a fully accessible gallery.”
Your hosting, one click

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.

On the television

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.

Bluesky, with ALT text attached

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.

Photos
Up to 4 per post · ALT attached automatically
Video
Native upload · up to 100 MB
Composer
Live 300-character counter
The posts dashboard

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.

X and YouTube

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

A photo library a blind user can drive.

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.

It reads the description back

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.

Every cell announces its state

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.

It tells you how to fix it

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 cutting room speaks too

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.

And it carries through to what you publish

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

The details you only notice when they are missing.

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.

The Export sheet: a preset menu with Save Preset, JPEG format at 85% quality, Original size, a naming preset showing the live example filename, and toggles for including edited metadata, copying camera EXIF, applying a watermark, and packaging as a zip archive. A line reads “Exports carry no camera EXIF or GPS — clean for the web.”
Export

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.

Watermark

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.

Snippets

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.

Location

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.

Fonts

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 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.

Download ALTer beta for Mac

Beta 0.9.16 · Free during the beta · macOS 13 or later · Apple Silicon & Intel · everything bundled, nothing to install

What's inside
  • A real library — referenced originals, folders, albums, ratings, flags, filters, fast sorting, and search across every metadata field. Videos are first-class citizens.
  • Pro editing — light, white balance, color, and detail with a live RGB histogram; a full-resolution Loupe; brushed adjustments you paint exactly where you want them; a white-balance eyedropper; crop, straighten, rotate, and click-to-heal retouch; before/after compare — all non-destructive recipes that never touch your files.
  • The timeline editor — cut clips from any number of videos into one sequence; layer styled text, images, other videos, and audio; keyframe with easing; type text right on the canvas. Animated GIFs join the timeline as clips. What you preview is exactly what exports.
  • Web layers — load any web page live inside ALTer and capture it as a layer: a snapshot for stills, or a timed recording that drops in as video you can trim, keyframe, and animate like anything else.
  • Grade & track — color-grade any clip or the whole edit right in the timeline tray, and one click writes keyframes that pin a sticker to a face as it moves through your footage.
  • AI descriptions — one click describes photos and videos: titles, captions, and embedded accessibility text, with video speech transcribed privately on your Mac and woven into the description.
  • Publish anywhere — accessible web galleries to your own GitHub Pages, Apple TV via the Twilightscapes app, Bluesky posts with scheduling and engagement stats, and a one-click hand-off to the X composer.
  • VoiceOver throughout — generated ALT text is read aloud, the grid announces which photos still need descriptions, and the timeline editor is labelled end to end.
Beta notes
  • It's a beta — keep backups like a pro. Your pixels are never modified: adjustments render into exports and galleries only. Metadata (ALT text, titles, captions, keywords) is written into your files — automatically by default, or only on Save Metadata to Files (⌘S) if you turn autosave off in Settings.
  • Found something broken or missing? Tell us with the form below — it comes straight to us.

Everything described. Nothing locked in.

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.

Download ALTer for Mac

Free during the beta · macOS 13 or later