# Caption and tidy the photo albums your automations fill

> Work down the uncaptioned backlog a few minutes at a time with an album grid, inline captions, and an agent that drafts descriptions you approve.

- Workflow type: app
- Services: Google Photos, Google Sheets
- Categories: Personal Productivity, Operations
- Published: 2026-08-24

## What it does

- Opens on a grid of your albums, each tile badged with how many photos still have no description, so you can see at a glance where the backlog actually is.
- Click any album for a contact sheet where you type captions straight onto the thumbnails, rename the album, swap in a better cover shot, and move stray photos into the album they belong in.
- Hit Auto-caption this album and a background agent reads every uncaptioned photo, writes a short factual description, proposes a cleaner album title, picks the strongest cover, and adds date-based section headers. Everything lands in a review queue for you to approve, edit, or reject before a single word is saved back to Google Photos.
- Export a flat sheet of filename, date, caption, and album to Google Sheets, one row per photo, so the archive stays readable outside Photos.
- Works over the photos and albums your automations saved into Google Photos through this platform. It is the cleanup layer for everything your intake flows push in.

## What you'll need

- A Google account with Google Photos connected.
- Photos already sitting in Google Photos that your automations saved there through this platform. This is the tidy-up layer for that media, not a tool for reorganizing your whole personal photo library.
- A Google Sheets connection and a spreadsheet to write to, if you want the caption export.

## Prompt

Build me a photo curation workspace over the Google Photos albums my intake automations keep filling up. The problem is metadata debt: media lands in albums, nobody ever writes a description or fixes the album title, and the archive turns into an unsearchable pile. This app is the curation layer on top of that media. Keep the uncaptioned backlog front and center in the layout, because the whole point is working it down a few minutes at a time.

Home view: an album grid. Load albums with List Albums (paginate through nextPageToken). Each tile shows the album cover thumbnail, the title, the total item count, and a prominent badge with how many items in that album still have no description. Compute that badge by running Search Media Items scoped to the album id and counting items whose description field is empty, and cache the counts per album in app storage so the grid loads fast, with a refresh action that recomputes them. Sort the grid so the albums with the biggest uncaptioned counts come first, and put a running total of uncaptioned items across all albums at the top of the page as the backlog number.

Album detail view: clicking a tile opens a contact sheet for that album, fetched with Search Media Items filtered to the album id. Show each item as a thumbnail with its filename and capture date underneath, and a caption field directly under the image that I can type into inline. Saving a caption calls Update Media Item with the new description. Default the contact sheet to a filter of only items missing a description, with a toggle to show everything. At the top of the view give me an editable album title and a Set as cover action on any thumbnail; both write through Update Album (title and cover media item id). Also let me fix misfiled photos: multi-select thumbnails and move them to another album, which calls Remove Media Items from Album on the current album and Add Media Items to Album on the destination, and support dragging a selection onto an album in a sidebar list of albums to do the same thing.

Embedded background agent: an Auto-caption this album button on the album detail view. It kicks off a background agent that pulls every item in the album via Search Media Items, looks at each uncaptioned photo, and produces four kinds of proposal. One, a short factual description per photo, one or two sentences, describing only what is actually visible plus context from the filename and capture date. No invented names, no flowery language, no guessing at people or places it cannot see. Two, a cleaner album title proposal with a one-line reason. Three, the strongest cover shot from the album, again with a reason. Four, a set of date-based section headers, for example grouping a multi-day album into one header per day or per month, expressed as text enrichments positioned in the album.

Critical design rule: the agent proposes, the human approves. The agent must never write to Google Photos directly. Everything it produces is staged into app storage as proposals with a status of pending, approved, rejected, or applied, keyed by album id and media item id, so the queue survives closing the tab and coming back later. The review queue is the primary surface of the app: show pending proposals as a stack of cards with the thumbnail, the current value, and the proposed value side by side, and give me Approve, Edit then approve, and Reject on each, plus Approve all for an album once the batch looks right. Only approval triggers the write, and each proposal type maps to its own call: photo descriptions go through Update Media Item, the title and cover go through Update Album, and each section header goes through Add Enrichment to Album as a text enrichment with an album position. Show progress while writes are applied and mark each proposal applied when its call succeeds, surfacing any failures in the queue rather than silently dropping them.

Export captions action: a button that writes the archive out to Google Sheets using Append Values, one flat row per media item with filename, capture date, caption, and album title, so the archive is readable and searchable outside Photos. Let me choose the target spreadsheet and tab, write a header row when the sheet is empty, and export either the current album or everything. Use USER_ENTERED so dates land as dates.

Two API constraints you must respect. First, this Google Photos integration is app-created-data-only. It can only read and edit media and albums created through this platform's Google credential, not my whole personal Google Photos library, and Update Media Item only edits descriptions of app-created items. Build and describe the app as the curation layer over photos that intake automations pushed into Photos, and never present it as a way to organize an existing personal library. If an album or item comes back forbidden or not found, show a clear inline message saying it was not created through this connection instead of a raw error. Second, baseUrl thumbnail links expire, so never persist image URLs in app storage. Refetch media items right before rendering any grid, and append sizing parameters to baseUrl when rendering, for example a small square size for contact sheet thumbnails and a larger one for the expanded view.

Handle pagination everywhere (List Albums and Search Media Items both page), and apply writes to Google Photos serially per album with backoff on rate limit responses rather than firing a whole approved batch in parallel.

## How to customize

- Change the caption style the agent writes: how long, how plain, and whether it sticks strictly to what is visible in the frame.
- Choose how albums get grouped: by day, by month, or by event, and what the section headers say.
- Point the export at a different spreadsheet or tab and add extra columns such as camera or capture time.

## FAQ

### Can this organize my entire Google Photos library?

No. It works with the photos and albums that were saved into Google Photos through this platform's connection. Anything you uploaded from your phone or another app stays private to those apps and will not appear here. Think of it as the cleanup workspace for media your automations put into Photos.

### Does the agent write captions straight into Google Photos?

No, and that is the point. Every caption, title change, cover pick, and section header the agent produces is staged in the app first. Nothing reaches Google Photos until you approve it. Descriptions are hard to audit once written, so the app keeps you as the last step.

### Can I edit what the agent suggested instead of accepting it?

Yes. Every staged item in the review queue can be edited inline before you approve it, or rejected outright. You can also approve a whole album at once when the batch looks good.

### Do I need Google Sheets to use this?

No. Sheets is only used for the Export captions action, which writes one row per photo with filename, date, caption, and album. Skip the connection and the rest of the workspace still works.

### How does it know which photos still need work?

Every album tile shows a count of the items in it that have no description yet. That count is what the review queue works down, so a few minutes in the app visibly shrinks the backlog.

Use this prompt in General Input: https://www.generalinput.com/prompts/caption-and-tidy-the-photo-albums-your-automations-fill