Weekly
Find Ghost post images missing alt text
Once a week I get a list of posts with images that lack alt text or are too large.
- Runs
- Weekly
- Apps
- Ghost
- AI
- Not needed
- Access
- Admin API key (read)
Send this to your assistant
Create a ClickRuntime automation: every Monday at 9am, check my published Ghost posts for images without alt text or over 500 KB and email me the posts and image links.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
Images are where a Ghost publication quietly loses search traffic. A writer drops in a 4 MB phone photo, forgets the alt text and publishes, and months later the post loads slowly on mobile and gets no image search visibility. Across two hundred posts, nobody can say how many have the problem, because checking means opening every post in the editor and inspecting each picture.
Once a week, published posts are listed with their HTML, every image tag is parsed, and each one is checked for a missing alt attribute and for a very large file size. The posts that need attention are collected into a single email with links, so the fix list is ready to work through in one sitting.
Editors of content sites, SEO freelancers who look after a client's Ghost blog and solo writers with a long archive will find it most useful.
What you get out of it
Accessibility gaps get found and fixed
Missing alt text means screen reader users hear nothing for an image. A weekly list of offending posts turns that from a vague intention into a short task someone can finish before the next newsletter.
Page speed improves where it counts
Oversized images are a common reason a post feels slow on mobile. Naming the heavy ones lets you replace them with compressed versions, which helps visitors stay and helps the page pass speed checks.
The archive is audited without opening a single post
Checking images by hand across hundreds of articles is not realistic, so problems pile up unseen. An automated pass covers every published post and keeps covering new ones as they appear.
New posts are caught within a week
A writer who forgets alt text on Monday has the post flagged by the next report, so bad habits are corrected while the article is still getting its first and most valuable traffic.
An easy checklist for freelancers and editors
The email links straight to each affected post, which makes it simple to hand the list to a junior editor or include it as evidence of work in a monthly client report.
How it works
What happens, step by step
Once a week, ClickRuntime gets every published post from your Ghost site.
It finds each image in each post and checks whether it has alt text.
It also checks each image's file size and flags anything over about 500 KB.
If anything needs fixing, you get one email listing the post title, the problem and the image link.
Before it runs live
- Connect Ghost
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Add an AI step, for example to summarize, sort or draft a reply
- Add another app, for example also send it to Slack
- Combine it with other Ghost steps into one automation
Under the hood
The code that runs this automation
import re, time, jwt
from clickruntime import on_trigger, credentials, notify, http
SITE = "https://blog.example.com"
def ghost_token():
key_id, secret = credentials.secret("GHOST_ADMIN_API_KEY").split(":")
now = int(time.time())
return jwt.encode({"iat": now, "exp": now + 300, "aud": "/admin/"}, bytes.fromhex(secret),
algorithm="HS256", headers={"kid": key_id})
@on_trigger
def run(event):
posts = http.get(f"{SITE}/ghost/api/admin/posts/", headers={"Authorization": f"Ghost {ghost_token()}"},
params={"formats": "html", "filter": "status:published", "limit": "all"}).json()["posts"]
issues = []
for post in posts:
for tag in re.findall(r"<img[^>]*>", post.get("html") or ""):
src = re.search(r'src="([^"]+)"', tag).group(1)
size = int(http.head(src).headers.get("content-length", 0))
if 'alt=""' in tag or "alt=" not in tag:
issues.append(f"{post['title']}: missing alt text {src}")
if size > 500_000:
issues.append(f"{post['title']}: {size // 1024} KB {src}")
if issues:
notify.email_me(f"Ghost image audit: {len(issues)} issues", "\n".join(issues))
return {"posts": len(posts), "issues": len(issues)}FAQ
Common questions
What counts as an oversized image?
Does it also check the feature image of each post?
Will it change anything in my posts?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Get told about every new Ghost member
When someone signs up on my Ghost site, their email and plan appear in Slack.
See how it worksTurn your notes into a Ghost draft
Rough notes I send to a link come back as a titled draft post waiting in Ghost.
See how it worksKnow the moment your website goes down
Your team hears in Slack when the site stops responding or slows down, and again when it's back.
See how it worksKeep exploring
Set up “Find Ghost post images missing alt text” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.