Ghost cover art desk: generate and set every post image

See every draft, scheduled and published post in one place, spot the ones missing a cover, and set an on-brand image in a couple of clicks.

App
Generate ImageGhostSlackMarketingOperationsContent Generation
PromptCreate

Build me a cover art desk for our Ghost publication. My editor opens this app before every send to make sure nothing goes out without a good cover image. It has two main views, Cover Desk and Cover Library, plus a settings panel that holds our house style.

Cover Desk is the landing view. A handler loads every post using Ghost Browse Posts (Admin API), paginating through all pages (Ghost caps limit at 100, so follow meta.pagination.next until it is null) so drafts, scheduled and published posts all come back. Group the results into three sections: Scheduled, Draft, Published. Order them so whatever goes out next sits at the very top: scheduled posts first, sorted by published_at ascending so the soonest send leads, then drafts sorted by updated_at descending, then published posts sorted by published_at descending. Each row shows a small thumbnail of the current feature image, the post title, its status, and the relevant date. Any post with no feature_image gets a loud, high-contrast No cover badge, and each section header shows a count of how many posts in that group are missing one. Put a global gap count at the top of the page so the editor sees the number the second the app opens.

Selecting a post opens a detail pane. On the left, show the post title and its excerpt, along with status, publish date and current cover if there is one. On the right, generate three cover directions using Generate an Image at a 16:9 aspect ratio, all three in one go. Each direction should take a visibly different angle (for example one abstract or graphic, one typographic, one photographic or illustrative), and each prompt should combine the saved house style with the post title and excerpt so the images actually relate to the piece. Show the three as large side-by-side previews with a Regenerate control on each one and a free-text box where the editor can add a tweak like "warmer palette" or "no people" and re-run just that direction. Also offer an optional 1:1 variant of the chosen direction for social sharing, since Ghost feature images are landscape but social cards are square.

Approving a direction runs the write sequence, and there are two rules here that matter more than anything else in the app. First, upload the chosen image to Ghost with Upload Image (Admin API) and keep the returned image URL. Second, and this is the critical part, immediately before writing, re-read the post with Read Post (Admin API) to fetch its current updated_at value. Ghost's Update Post (Admin API) uses optimistic locking and requires the post's current updated_at, so a value cached from the earlier list load will be stale and the write will fail or, worse, clobber someone else's edit. The handler must be a strict re-read then write sequence every single time, never a write from list data, and the handler description should say so explicitly. Then call Update Post (Admin API) with the uploaded image URL as feature_image, an alt text as feature_image_alt, and the freshly read updated_at. If Ghost returns a conflict, re-read once and retry, and if it fails again surface a plain message telling the editor the post changed underneath them.

The second rule: the update payload must never include the newsletter option. Ghost sends a post by email to the whole list when newsletter is passed on publish, and an editor fixing a cover image must never be able to email subscribers by accident. Do not add it as a toggle, do not include it conditionally, just leave it out of every update this app makes. Note this constraint in the handler description too so nobody adds it later.

Cover Library is the second view. It shows every existing feature image across the whole archive as a dense grid of large tiles, newest first, with the post title and publish date under each. The point is to see style drift at a glance, so give the editor a contact-sheet mode with the captions hidden and tiles packed tight, and let them group by year or by month so eras of the site are visually adjacent. Let an editor mark any tile as Needs restyle, persist that mark, and surface the marked posts as a queue on the Cover Desk so they can be reworked through the same three-directions flow. Show a count of published posts that have no cover at all in this view too.

Put a Backfill the archive button on the Cover Desk. It starts a background agent that works through the whole gap list without the editor babysitting it. The agent browses published posts with no feature image using Browse Posts (Admin API), paginating through everything, and then for each post: generates one cover at 16:9 from the saved house style plus that post's title and excerpt using Generate an Image, uploads it with Upload Image (Admin API), re-reads the post with Read Post (Admin API) to get its current updated_at, and sets feature_image and feature_image_alt with Update Post (Admin API), again never passing newsletter. It should pace itself to stay inside Ghost's rate limits, and if several posts in a row fail it should stop and report rather than grind through errors.

The agent writes a run log back into the app so the results are visible in the UI, not buried somewhere. Add a Backfill runs panel that lists each run with its start time, status, how many posts were processed, and a per-post line saying what happened (cover set, skipped, failed and why, plus the resulting image). While a run is in progress the panel should show live progress and the post currently being worked on, and the Cover Desk gap counts should reflect the new state once the run finishes.

Add a share action for sign-off. On any proposed cover, Share to Slack uploads the image to the chosen channel with Slack Upload a File, then posts a message with Send a Message giving the post title, its scheduled or published date, whether it currently has a cover, and a short note that this is a proposed cover awaiting sign-off. Use Get Permalink to grab a link to that message and store it against the post so the app row shows a Shared, awaiting sign-off state with a link straight to the Slack thread. Sharing must never write anything to Ghost. Approval always happens back in the app.

Persist a few things. The house style is a saved block of text describing our palette, mood, typography treatment and any hard rules like no stock-photo faces, editable in a settings panel, and every single generation in the app and in the backfill agent uses it. Also save the default Slack channel for sign-off, an alt-text convention, the Needs restyle marks, and the generated candidates per post so reopening a post shows what was already produced instead of burning a fresh generation. Design it for a single editor working through a queue: fast keyboard-friendly navigation between posts, big image previews, and the gap count always visible.

What does this prompt do?

  • Lists every post from your publication grouped into drafts, scheduled and published, ordered so whatever goes out next sits at the top, with a loud flag on anything that has no cover image
  • Pick a post to see its title and excerpt beside three fresh cover directions drawn at widescreen size, then approve the one you want and it lands on the post along with its alt text
  • A cover library view shows every image already running across your archive so you can see style drift at a glance and spot the posts that look nothing like the rest of the site
  • A Backfill the archive button hands the whole gap list to a background helper that creates covers in your saved house style and writes a run log back into the app
  • Share any proposed cover to Slack for sign-off before it ever touches the site

What do I need to use this?

  • A Ghost publication you can administer, plus a custom integration key created in your Ghost settings
  • A Slack workspace and a channel for cover sign-off, if you want the share step
  • A short written description of your house style, for example the palette, mood and whether covers use type or photography
  • Nothing else to install: image generation is included

How can I customize it?

  • Rewrite the saved house style at any time, and every new cover follows it from that point on
  • Change how many directions you get per post, or add your own visual angles beyond the three defaults
  • Point the sign-off step at a different Slack channel, or turn it off if your editor approves alone
  • Decide which statuses count as a gap, for example flag drafts too or only worry about scheduled and published posts

FAQs

Will setting a cover image email my newsletter subscribers?
No. The app is built to never use the send-by-email option when it saves a post, so fixing a cover only changes what appears on your site. Your list stays untouched.
Does this work on drafts and scheduled posts, or only published ones?
All three. The desk pulls drafts, scheduled and published posts, and sorts them so the next thing going out is at the top of your screen.
What shape are the covers?
Widescreen, the same landscape shape Ghost uses for the hero image at the top of a post and in post cards, so they look right everywhere on the site.
What happens if someone else edits the same post while I am working?
The app re-reads the post immediately before it saves, so it will not stomp on a change a colleague made a minute earlier. If there is still a clash it tells you instead of overwriting.
Does it work with both Ghost Pro and a self-hosted site?
Yes. Anywhere you can create a custom integration in your Ghost settings will work the same way.
Can I fix the whole back catalogue at once?
That is what the Backfill the archive button is for. It works through published posts with no cover, makes one for each in your house style, sets it, and leaves a run log in the app so you can see exactly what it touched.

Related templates

Browse and shortlist creators without burning audit credits

Search creators for free, shortlist the best with your team, and spend an audit credit only when you decide someone is worth a closer look.

HypeAuditor
Airtable
Slack
App
Hiring funnel dashboard for every open Hireflix role

One screen showing invited, completed, and shortlisted counts for every open role, plus the stalled invites that have quietly gone nowhere.

Hireflix
Slack
App
Global operations exposure map for your sites and suppliers

Open one board each morning to see which of your facilities, suppliers and shipping lanes are sitting near trouble in the news right now.

GDELT
Airtable
Slack
App
Compare creators on post performance before you pay them

Pick creators from your saved list and see their best and worst Instagram posts side by side, so your brief is built on what actually lands.

HypeAuditor
Google Docs
Slack
App
Review every Hireflix video interview from one daily queue

One screen where your hiring team watches every unscored candidate, reads the transcript alongside each answer, and scores and shortlists on the spot.

Hireflix
Slack
App
Deal sourcing kanban board for your Harmonic saved searches

Drag every new company from your Harmonic saved searches through New, Tracking, Meeting and Passed, with a one click diligence brief on every card.

Harmonic
Airtable
Slack
App

Stop publishing posts with a blank cover.

Give your editor one screen that shows every gap in the schedule and fixes it before the send goes out.