Skip to content

Releases

PhotoScribe v1.8.2

Choose a tag to compare

@repomonkey repomonkey released this 14 Oct 01:26

Fixes a stall when writing metadata to a large batch, and a crash when PhotoScribe was closed during a write. If you write more than a hundred or so files at a time, particularly on Windows, this one is worth having.

Fixed

  • Writing metadata to a large batch no longer stalls, and PhotoScribe no longer crashes when closed during a write. Reported from Windows with a crash dump, on a batch of about 140 files. ExifTool sends its warnings down a separate channel that PhotoScribe wasn't reading. That channel holds only 4KB on Windows, so after enough warnings ExifTool stopped and waited for room that never came, and the write sat part-way through for good. Closing the window at that point shut the app down around the stuck write, which Windows reported as a crash. The warnings are now read as they arrive, so the write runs to the end. On a Mac the same stall needed about 280 files with warnings; a test batch that stopped at file 275 of 320 now writes all 320.
  • Closing the window while work is in progress is now safe. If metadata is still being written, PhotoScribe asks before quitting, then stops cleanly after the current file. Previously only a running Generate was waited for, so quitting during a write, a model download or a Write posts could crash on the way out.
  • A write that fails part-way is reported as failed. If ExifTool stopped unexpectedly, the remaining files were counted as written. They are now listed as errors.

Changed

  • ExifTool's warnings appear in the Log. A file that was written with a warning, such as a keyword longer than the 64 characters IPTC allows, now says so beside its entry.

PhotoScribe v1.8.1

Choose a tag to compare

@repomonkey repomonkey released this 06 Oct 00:46

Look up now finds places OpenStreetMap only knows part of. A location like "Shoalhaven River Estuary, Shoalhaven Heads" came back "not found" because OpenStreetMap has no feature by that full name. When the full text doesn't match, Look up drops the leading parts one at a time and uses the first that does (here, Shoalhaven Heads), and the status line says which part it used. It never settles for a match as broad as a state or country.

PhotoScribe v1.8.0

Choose a tag to compare

@repomonkey repomonkey released this 06 Oct 00:27

GPS coordinates for photos from cameras that don't record them, either for a whole shoot or per photo from a track recorded on your phone.

Added

  • Coordinates for a whole batch. A new GPS row in Batch Context takes latitude and longitude, typed or pasted from a map pin. Or press Look up to find them for the place in Location using OpenStreetMap. The first lookup asks permission, since the place name is sent to an outside service; after that, lookups happen on their own a moment after you finish typing. Locations PhotoScribe fills in from folder names are never looked up automatically.
  • Per-photo positions from a GPX track. Record a track on your phone while you shoot (Strava, Gaia GPS, myTracks and Geotag Photos Pro all export GPX), then press Load GPX…. Each photo's capture time is matched to the track and the status line shows how many matched. If you travelled without changing the camera's time zone, set Camera clock to the zone it was on.
  • Photos matched to a track also get a place name in their caption and keywords when Look up location from GPS coordinates is ticked.

Coordinates are written when you press Write Metadata to Files, into the photo or its XMP sidecar. A photo that already has GPS keeps its own. The README has the details under Adding GPS to photos from cameras without it.

PhotoScribe v1.7.0

Choose a tag to compare

@repomonkey repomonkey released this 28 Sep 00:57

Captions for different destinations, ready-to-paste social posts, and much better advice on which model to run.

Added

  • Captions for different destinations. A new Outputs card chooses what the caption written into the photo is for. Catalogue is the existing factual style and stays the default. Stock writes literal titles, 25 to 45 keywords ordered most important first, no brand names or subjective praise, and uses the editorial caption format when a photo shows identifiable people or brands. Flickr writes a gallery-style description and tags, since Flickr reads them from the file on upload.
  • Ready-to-paste posts for Instagram, Facebook, Threads / Bluesky and Mastodon, plus alt text. Tick the ones you want, then press Write posts on a photo in Results to write them for that photo, without touching its title, caption or keywords. Most photos in a batch never get posted, so this keeps Generate fast; tick Write posts for every photo during Generate if you want them for the whole batch. Each post has a copy button and a character count that turns red past that platform's limit. Posts are never written into the photo: those platforms strip embedded metadata on upload, and hashtags don't belong in a catalogue.
  • An option to write posts in the first person, as the photographer sharing their own photo, limited to reactions to the photo itself. Read posts before you use them, as you would anything a model writes.
  • Copy buttons on Title, Caption and Keywords in Results.
  • A warning when generation is crawling. Below 8 tokens a second, the log explains that the model is almost certainly too big for the memory available.

Changed

  • Recommend Model now suggests Gemma 4, sized to leave real headroom. It previously named Gemma 3 and counted 70% of a Mac's memory as usable, ignoring Lightroom and everything else running. 12GB graphics cards now get the 12B rather than the 4B, and Macs are advised to use an MLX build in LM Studio.

Model choice matters more than any setting

A model that can read images isn't automatically a good fit. One that only just fits in memory gets read back from disk as it runs. Measured on a 32GB M2 Max with the same photos: Gemma 4 12B ran at 33 tokens a second, about 8 seconds a photo, while a 27B and a 26B-A4B crawled at 3 to 6, and didn't write noticeably better captions. If PhotoScribe is slow, it's almost certainly the model. Use Recommend Model. The README has the full table.

PhotoScribe v1.6.3

Choose a tag to compare

@repomonkey repomonkey released this 18 Aug 01:52

Each photo now uses its own capture date and time, instead of inheriting the first photo's.

Fixed

  • Each photo now uses its own capture date, not the first photo's. Loading two or more photos put the first one's date into the Date/Time field and applied it to every photo in the batch, so a folder spanning a morning and an evening had every frame labelled with the morning. The date is now read per photo when its metadata is generated, in the same way the location has been since 1.5.6. Anything typed into the Date/Time field still overrides it for the whole batch. Reported by a viewer on YouTube.
  • The time of day is now included and used. Only the date was passed to the model before. The capture time is what settles whether a photo is sunrise or sunset, which is difficult to judge from the image alone, so it is now supplied along with the date and the model is told to use it for the light rather than to name the date in the caption.
  • Auto-detected context no longer survives "Clear All". Anything PhotoScribe filled in for you is cleared along with the photos, so the next folder starts clean instead of inheriting the last one's date and location. Values you typed yourself are kept.
  • The capture date is read from XMP sidecars too, not just the file, matching how GPS and location have worked since 1.5.4.

PhotoScribe v1.6.2

Choose a tag to compare

@repomonkey repomonkey released this 19 Jul 22:56

Keywords now work in darktable, and PhotoScribe no longer repeats junk tags left behind by automatic taggers.

Added

  • Keywords now work in darktable. Keywords are additionally written to lr:hierarchicalSubject, which is where darktable looks — it ignores the dc:subject field PhotoScribe was using, so keywords never appeared there even though titles and captions did. Written on every path: embedded files, XMP sidecars, and batch writes. Reported by a viewer on YouTube.
  • Keywords already applied in darktable are now read back, so "append keywords" won't duplicate them and existing tags can inform the caption. Hierarchical tags are understood — Places|Australia|Gerroa is read as Gerroa.

Fixed

  • Auto-tagger junk no longer leaks into your keywords and captions. If a photo already carried tags, PhotoScribe told the model they were accurate and to keep them — reasonable for a few deliberate tags, but libraries that have been through an automatic tagger carry dozens of machine labels, and a beach in New South Wales was coming back tagged Caribbean, Loch, Lake district and Rectangle. How far those tags are trusted now depends on how many there are: a handful is treated as deliberate and used as before, so a species or place name from a specialist tagger still reaches the caption, while a large set is treated as unverified hints the model may draw on but must not copy wholesale. On a test photo carrying 45 automatic tags, the result went from 45 keywords including obvious nonsense to 13–15 accurate ones. Existing tags are still preserved in the file itself by "Append keywords to existing".

PhotoScribe v1.6.1

Choose a tag to compare

@repomonkey repomonkey released this 19 Jul 22:17

If you use a newer "reasoning" model such as Gemma 4, this release is worth taking — it fixes photos failing outright, and makes generation several times faster.

Fixed

  • "Couldn't read metadata" failures with reasoning models are fixed, and generation is much faster. Newer models (Gemma 4 and similar) run a hidden "thinking" pass before answering. That reasoning was consuming the entire response budget — measured at 840–1200 tokens for a single photo — so the model was cut off before it finished writing its JSON, and the leftover scratchpad got reported as an invalid response. Reasoning is now switched off explicitly, which took a test photo from failing twice in a row to succeeding first time, and cut a request from roughly 1,400 tokens to 140 (59s to 9s).
  • A photo that fails is now retried with a bigger budget rather than the same one that just ran out, and if a response really is cut short the log says so plainly instead of blaming the JSON.
  • Response length options raised to 2048 / 4096 / 8192 tokens, so models that ignore the no-thinking flag still have room to finish.
  • The place name reliably reaches the title and caption again, instead of only the keywords. The location was being framed defensively ("don't name a different place") rather than as an instruction, which a model without a reasoning pass tends not to act on — in testing the place name appeared in only 1 of 3 captions, and now appears in every one. It also now prefers the recognisable town or locality over a street address, so a Sublocation like "Geering Street 41" no longer ends up in the title.
  • No more duplicate XMP sidecars. If a sidecar already existed under the other naming convention (photo.xmp vs photo.cr2.xmp), PhotoScribe wrote a second one — so Lightroom kept reading its own file, never saw the new metadata, and any star rating or colour label in it was stranded. It now writes to whichever sidecar already exists.

Note on star ratings

PhotoScribe does not remove star ratings or colour labels — verified for both embedded files and existing sidecars. If ratings disappear after Read Metadata from File, it is because Lightroom replaces the catalogue's values with the file's, and the rating was only ever in the catalogue. Use Metadata → Save Metadata to File before running PhotoScribe and the rating will be in the sidecar, where it is then preserved.

PhotoScribe v1.6.0

Choose a tag to compare

@repomonkey repomonkey released this 10 Jul 02:26

A visual overhaul. Nothing about how PhotoScribe works has changed — same fields, same options, same buttons doing the same things.

Changed

  • Redesigned interface. The window is reorganised into distinct cards — Model, Prompt, Batch Context, Options — each with a hairline border, rounded corners and its own section label, instead of one continuous scroll. The palette is warmer and far less saturated: the accent is now reserved for the things that actually mean something (the active tab, section labels, ticked checkboxes, and the Generate button), so nothing else competes for your eye.
  • Clearer controls. Buttons share one height and radius and are ranked by weight: Generate is solid accent, Write Metadata is a muted teal, Export/Import are bordered ghost buttons. Checkboxes are a filled accent square when ticked and a plain outline when not. Tabs get a pill-shaped active state, and the backend connection status is now a pill badge in the header.
  • The prompt box is taller, so the default prompt reads in full without scrolling.

Fixed

  • A stray white strip could appear at the right-hand edge of the settings panel, and the scrollbar rendered light against the dark theme.

PhotoScribe v1.5.6

Choose a tag to compare

@repomonkey repomonkey released this 10 Jul 01:18

The location lookup had several compounding faults. This release fixes all of them.

Fixed

  • The location option no longer switches itself off between sessions. "Look up location from photo GPS / metadata" was never saved, so it silently reset to unticked on every launch — while the one-time consent was remembered, making it look as though the option should still be on. It now persists, as do "Use folder context" and the EXIF-date fallback.
  • Location now takes effect when you enable it, and on Regenerate. It used to be resolved once, when photos were loaded. Ticking the option afterwards, or re-running Regenerate, did nothing — you had to clear and reload the folder. The location is now resolved per photo when the metadata is generated.
  • Each photo gets its own location. Previously one location was sampled from the first few files and applied to the whole batch, so a folder spanning several places tagged them all identically — and a geotagged photo further down the list was never even looked at. Anything typed into the Location field still overrides everything, for every photo.
  • Rural and coastal places are named properly. The geocoder ignored OpenStreetMap's locality and neighbourhood fields, so a beach at Gerroa, NSW came back as the useless "New South Wales, Australia". It now reads them, giving "Gerroa, New South Wales, Australia".
  • The lookup says what it found. It logs the location resolved for each photo, and says so once when a photo has no GPS or place name at all, instead of failing silently.

Changed

  • Geocoding results are cached and rate-limited. Coordinates are rounded (~11m) and cached, so a folder shot in one place makes a single request, and requests are held to one per second in line with OpenStreetMap Nominatim's usage policy.

Note: the Location field no longer auto-fills when photos are loaded. That is deliberate — filling it pinned the whole batch to a single place. Each photo's location now goes straight into its own prompt, and is shown in the log.

PhotoScribe v1.5.5

Choose a tag to compare

@repomonkey repomonkey released this 09 Jul 23:24

Fixed

  • "Look up location from GPS" now actually runs on its own. The location lookup was only executed when Use folder context was also enabled — with folder context off, enabling the GPS/location option did nothing at all (no network request, no location filled). Each source now runs on its own checkbox independently: folder-name detection, the EXIF-date fallback, and the location lookup no longer depend on one another. Reported on GitHub (#18) — thanks to @garypdev, whose Wireshark capture (no outbound request) pinpointed it.

Changed

  • Location lookup renamed and clarified. The option is now "Look up location from photo GPS / metadata": it fills the Location field from the place name your cataloguer (e.g. Lightroom) already resolved — City/State/Country, from the file or its .xmp sidecar, with no network request — and only reverse-geocodes the GPS coordinates via OpenStreetMap when there's no such place name. The tooltip and consent dialog now describe this.