Orshot Blog Images: featured images, OG images and in-article images for every post
Give this skill a blog post (a draft, a file or a URL). It returns a cover image and 3 to 6 images that sit inside the article, all on the user's brand, as PNG files ready to drop into the post.
Image models draw pictures; they cannot be trusted with words, numbers, logos or a layout that matches the last 40 posts. Blog images are mostly words, numbers and logos. So this skill designs templates once and renders them per post with Orshot: the text is real text, the logos are real logos, and post 41 looks like post 1.
- No API key over the hosted MCP server or the Orshot WordPress plugin. Both sign in with OAuth.
- The credit cost comes first. Say it before rendering more than 10 pages.
- Nothing goes live without a yes. Ask before publishing a post or setting a cover on a live one.
This skill or another?
| The job | Use |
|---|---|
| Featured image, OG image or in-article images for a post or page | This skill |
| Turn the post into Instagram, LinkedIn or TikTok slides | orshot-carousel |
| A thumbnail for the video version of the post | orshot-youtube-thumbnail |
| Ads in every size from the post | orshot-ad-creative |
| A one-off illustration or photo | An image model |
Example prompts
- "Make a featured image for this post: https://blog.fernleafcoffee.com/cold-brew-ratio"
- "Every time we publish on our Ghost blog, set an OG image with the post title. Build it in n8n."
- "Our WordPress site has 140 posts with no featured image. Make covers for all of them in our brand colors, and show me five before you do the rest."
- "The Tallyhop docs run on Next.js. Give every page its own OG image in the same style as the blog."
- "This post compares three payroll tools. Make the cover and an in-article image for the comparison table."
- "We changed our brand color to green. Re-render every cover and keep the file names."
What you get per post
| Output | Size | How |
|---|---|---|
| Cover (featured image, OG image) | 1200x630 PNG | One page of the user's Blog Cover System template, rendered with the post's title |
| In-article images | 1200x960 PNG, 3 to 6 | One template per post, one page per image, built from the layouts in references/blueprints/ |
| Social sizes of the cover (optional) | wide sizes such as twitter-post; a page of its own for a Pinterest pin, a square or a story |
extraSizes for wide sizes, a designed page for tall or square ones |
| Alt text and file names | text | Written by you from the image content |
Setup
- Connect the Orshot MCP server at
https://mcp.orshot.com/full(OAuth in the browser, no key). Setup per client: https://orshot.com/docs/integrations/mcp-server.md. Headless or scheduled jobs use REST withORSHOT_API_KEY(example below). Theorshotskill covers both. - Get the brand:
orshot_get_brand_kit. If it is empty and the user has a website,orshot_scan_brand_websitewith their URL, then use the colors, fonts and logo it finds. Ask before importing anything into their brand kit. orshot_plan_designwith the brief,job: "blog cover image for <the post>", the size andon_brand: true, once per template set: it returns the plan (palette, fonts, type scale) and a layout. Readorshot_get_design_spectopictemplate-jsononce per session; it is the template JSON reference, also at https://orshot.com/docs/definitions/template-json.md. Load theorshot-designskill for design craft beyond the style guide here.
Step 1. Read the post and plan the images
- Find the keyword: the 1 to 3 words a reader searched for. It goes in the colored chip on the cover.
- Pick the cover style (all six are in one template, see Step 3):
| Page | Style | Best for |
|---|---|---|
| 1 | Prompt card: title in a card over a photo, 4 logo tiles around it | roundups, comparisons, "best X" (default) |
| 2 | Product window: title card over a product screenshot | tutorials, feature posts |
| 3 | Flow: your stack's logos, an arrow, your product, the outputs | integrations, how it works |
| 4 | Output collage: title left, three real outputs fanned right | examples, galleries, templates |
| 5 | Code and result: code card next to the output it made | developer posts, API guides |
| 6 | Prompt chips: a typed prompt with highlighted words, app icons around it | AI and agent posts |
- Plan the in-article images: one right after paragraph 1 or 2 that answers the post's question at a glance, then one per main section. Skip a section when an image would only repeat its heading. Each one must show something real (see the style guide).
Pick a layout per image from references/blueprints/:
| Blueprint | Shows |
|---|---|
article-hero-stat |
the answer: two stat cards plus the real output |
article-compare-rows |
a table as cards: label, value A, value B |
article-picker-grid |
"pick X by Y": 6 numbered cards with a logo each |
article-step-cards |
3 numbered steps with time or effort |
article-before-after-flow |
two pipelines, before and after, as chips with logos |
article-request-result |
code on the left, the output it produced on the right |
article-side-by-side |
the same thing in two formats or two options |
references/blueprints.md lists every blueprint's dynamic fields.
Step 2. Fit the blueprints to the brand
The blueprints use one accent family. Swap it for the brand's primary color everywhere it appears:
| Blueprint value | Role | Replace with |
|---|---|---|
#2B42D4, #2B3FC4, #4C63F6 |
accent (headline line 2, buttons, chips) | brand primary |
#E6EAFE, #EBEEFB, #D9DFF7, #E4E7F2, #E3E7F8 |
accent tint (chip backgrounds, card borders) | brand primary at about 12% on white |
#F3F5FE, #F4F6FF, #ECF0FE, #E9EDFF, #E2E7FE, #D5DCFD, #C3CDFB, #9DA8F5 |
the product window's mesh gradient | the brand tint, lighter to darker in the same order |
rgba(76,99,246,...), rgba(43,66,212,...), rgba(233,237,255,0) and the other transparent blues |
glow | brand primary, same alpha |
#FCE4EE |
prompt chip highlight | a second, lighter brand tint |
{{LOGO_URL}} |
the user's logo | brand kit logo direct_url; no logo file, hide the layer with .opacity: "0" |
{{PRODUCT_IMAGE_URL}} |
a real product screenshot or output | a brand kit image, a screenshot, an Orshot render, or the post's own photo. A logo tile covers its top-left corner, so crop to the part that matters. When it is one of the post's in-article images, make those first |
stock://unsplash/photo/uae3DujB2lw |
cover background photo | keep, or orshot_search_stock_media for another: a stock:// ref works inside the template, while a render-time modification needs the URL from orshot_use_stock_media |
Keep the inks (#141414, #4A4A48, #6B6A66) and the warm greys. Fonts: Fraunces for headlines and Inter for body work for most brands; swap to the brand kit fonts if the brand has a display font. Logos of other tools: https://cdn.simpleicons.org/<name>/<hex> or the favicon URL https://t3.gstatic.com/faviconV2?client=SOCIAL&type=FAVICON&fallback_opts=TYPE,SIZE,URL&url=https://<domain>&size=256.
Step 3. The cover: one template, made once, rendered per post
orshot_list_studio_templateswith searchBlog Cover System. Found it? Skip to 3. One system per brand or blog: a workspace with two blogs getsBlog Cover System (<brand>)for each.- Create it once:
orshot_create_template_designnamedBlog Cover System,pages_data= the sixcover-*.jsonblueprints in the order of the table above, brand swaps from Step 2 applied,includeThumbnails: true. Look at the six thumbnails. Fix real problems with oneorshot_update_template_designcall. - Render one page per post. REST body below; over MCP,
orshot_render_templatetakes the samemodificationswithformat,scale,includePagesandextraSizesas top-level arguments.
{
"templateId": 123,
"modifications": {
"page1@overline": "<span style=\"background-color:#E6EAFE;border-radius:999px;padding:6px 14px\">Guides</span>",
"page1@title_line_1": "How to Send <span style=\"background-color:#E6EAFE;border-radius:12px;padding:0px 12px;font-family:Fraunces;font-style:italic;font-weight:800;color:#2B3FC4\">Invoices</span>",
"page1@title_line_2": "Automatically from Stripe",
"page1@logo_1": "https://cdn.simpleicons.org/stripe/635BFF",
"page1@logo_2": "https://cdn.simpleicons.org/gmail/EA4335",
"page1@logo_3": "https://cdn.simpleicons.org/googlesheets/34A853",
"page1@logo_4": "https://cdn.simpleicons.org/zapier/FF4F00"
},
"response": { "type": "url", "format": "png", "scale": 2, "includePages": [1] }
}
Title rules: line 1 holds the keyword chip, line 2 finishes the promise. 8 words or fewer in total. Fewer logos? Hide a slot with "page1@logo_4.opacity": "0" and "page1@tile_4.opacity": "0".
Want the cover for social too? For a wide size, add it to extraSizes (inside response over REST, a top-level argument over MCP). Smart Resize keeps the layout and scales it, so a tall pin, a square or a story leaves the cover small in empty space: add a page designed for that size to the template instead (full-bleed photo, large title). Presets and the response shape: https://orshot.com/docs/api-reference/render-from-studio-template.md#smart-resize.
Photo-led posts (recipes, travel, roundups of places): use the Product window or Prompt card with the post's photo, hide the tool tiles with .opacity: "0", and move the crop with <image layer>.objectPosition, such as "50% 85%".
Step 4. In-article images: one template per post
- Write the copy for each planned image first: a two-line headline (line 2 is the takeaway, in the accent italic), the cards' text, and a footer line with the source and the month. 60 words or fewer per image.
- Build the pages: start from each chosen blueprint, replace every text and image with the post's real content, keep the positions, and apply the Step 2 swaps. Delete cards you do not need and re-space the rest so no card is half empty. Rules in
references/style-guide.md. orshot_create_template_designnamedBlog: <post slug> images, all pages in one call,includeThumbnails: true.- Look at every thumbnail. Check: nothing overlaps, nothing wraps badly, no text under 14px, at least one real visual per image. Fix with one
orshot_update_template_design(page_operations) call.
Step 5. Render and save
orshot_render_template, PNG,scale: 2. Over MCP, one call renders every page; the result has one URL per page.- Look at each render before saving it. Re-render rather than ship an overlap.
- Save next to the post:
<images dir>/<post-slug>/<name>.png(in-article) and<images dir>/<post-slug>.png(cover). Use the blog's own folder (public/blog/in Next.js, the media library in WordPress,content/images/in Ghost). - Optional, smaller files:
cwebp -q 85 in.png -o out.webpfor in-article images; covers stay PNG for social previews (resize to 1600 wide and compress to about 250 KB). - Write alt text that names what the image shows: "Three cards comparing Stripe, Paddle and Lemon Squeezy fees at 1,000 sales a month".
- Put the cover in the post's frontmatter (
image,cover,featured_imageorog:image, whatever the blog uses) and each in-article image right after the paragraph it belongs to.
Automate it: one cover per new post
The cover template has dynamic fields, so any job can render it. Pick the road by where the blog lives. Each docs path opens as https://orshot.com/docs/<path>.md.
| Blog runs on | Road | Docs |
|---|---|---|
| WordPress | The Orshot WordPress plugin. The user installs it, connects it under Settings > Orshot (OAuth), turns on Auto Featured Image, picks a page of the Blog Cover System and maps Post Title to the cover's text field. It renders when a post is published or updated, adds the file to the Media Library and sets it as the featured image. Its Open Graph option writes the og:image tag. |
integrations/wordpress |
| Webflow | An Orshot Workflow from the preset "Give every Webflow CMS item its own Open Graph image". It writes each render onto the item's Image field. Bind the collection's Open Graph image to that field once in Webflow. | integrations/webflow |
| Ghost, or WordPress through n8n, Make or Zapier | Render over REST (below), upload the file to the CMS, then set the cover. | the CMS's own API docs |
| Next.js, Astro, Lovable or any site you deploy | A dynamic image URL in the og:image tag (section below). No render step at publish. |
integrations/dynamic-urls |
| MDX in a repo | A GitHub Action on new MDX files renders the cover and saves it next to the post. | this page |
The REST road, from a CMS webhook, n8n, Make or Zapier:
curl -s -X POST https://api.orshot.com/v1/studio/render \
-H "Authorization: Bearer $ORSHOT_API_KEY" -H "Content-Type: application/json" \
-d '{
"templateId": 123,
"modifications": {
"page1@title_line_1": "How to Send <span style=\"...\">Invoices</span>",
"page1@title_line_2": "Automatically from Stripe"
},
"response": { "type": "url", "format": "png", "includePages": [1] }
}'
The response holds the image URL. Credits per render: https://orshot.com/docs/definitions/credits-usage.md. Then:
- Upload before you set the cover. WordPress takes a media id, not a URL, for the featured image: upload the PNG to the Media Library (
POST /wp-json/wp/v2/media), then set the post'sfeatured_mediato the id it returns. Ghost's n8n node does not take an external image URL as the feature image: upload the PNG with Ghost's Admin API image upload, then setfeature_imageto the URL Ghost returns. - One render per post. Fire only when the post has no featured image yet, so a hand-made cover is never replaced. Write the URL or media id back to the post right away, so a retried webhook does not render twice. The pattern: "Run once per item" in the
orshotskill'sreferences/recurring-automation.md. - Review before it goes live. For a fully automated blog, set the cover while the post is still a draft and send the user the image URL. Publish only after a yes.
Backfill: covers for old posts
- List the posts that have no featured image (the WordPress or Ghost API, the Webflow collection, or MDX files with no cover field). Tell the user the count and what the run costs in credits.
- Render the first 3 to 5, show them, and wait for a yes.
- Render the rest:
orshot_batch_render_templateover MCP, or one REST call per post. Batch options: the Rendering section of https://orshot.com/docs/integrations/mcp-server.md. - Upload and set each cover as in the REST road above. Never replace an existing featured image without asking.
On Webflow, the preset "Backfill Open Graph images across a Webflow collection" does this in one workflow.
An OG image per page with a dynamic URL
For Next.js, Astro or Lovable sites that want one OG image per page or per route, without a render step at publish:
orshot_create_dynamic_urlwith the cover template'stemplateId. It returns a signed URL that renders on request. Every render it makes spends credits, so set a cache window and a render cap when you create it.- Set the page's
og:image(andtwitter:image) to that URL with the page title as a URL-encoded query parameter. In Next.js that isgenerateMetadata; in Astro, the layout's<head>. - The Blog Cover System has six pages: add
page=<n>and prefix the keys withpage<n>@. Send plain title text; the keyword chip<span>belongs to the REST road. - Link previews read the HTML the server sends and do not run JavaScript. The tag must be in that HTML.
URL format, signing and limits: https://orshot.com/docs/integrations/dynamic-urls.md
Keep images current
When a number in the post changes, edit that page of the post's Blog: <slug> images template and re-render it to the same file name, so images never go stale.
When the brand changes, apply the new colors to the Blog Cover System once (the Step 2 swaps), say what re-rendering every cover costs, then re-render each one to the same file name.
Gotchas
- The keyword chip is a
<span style="background-color:...">inside the title's content, so it moves with the words. Standalone pills are a shape behind the text. - Card shadows on shapes use the
dropShadow*style keys, as the blueprints do. The renderer drawsboxShadow*only on image and video layers. - Title lines with
<span>tags are rich text, where\nis not converted. Use<br>there; plain text takes\n. Line-break and other field rules: https://orshot.com/docs/definitions/template-json.md. - Multi-page keys need the
pageN@prefix: gotcha 2 in theorshotskill. A bare style key (logo_4.opacity) applies to every page that has that layer. Details: https://orshot.com/docs/image-generation/multi-page-images.md. - Small layout fixes do not need a full update.
orshot_patch_template_elementswithlayer_operationsadds, edits, moves or deletes any layer byelement_id. Whole pages go throughorshot_update_template_designwithpage_operations. Ids come back in thepageMapof the create or update result. - Never put a credit line or watermark on the images.
- Do not create a new cover template per post. Reuse the one Blog Cover System template.
Safety
- Ask before importing a website into the brand kit, and before overwriting existing image files.
- Ask before publishing a post, or setting or replacing the featured image of a live post.
- Say how many credits a run costs before rendering more than 10 pages.
- Use only logos and screenshots the post is actually about.
Related skills: orshot (connection, REST, render options), orshot-design (design craft), orshot-carousel (turn the post into a carousel), orshot-social-media-scheduler (post the cover to LinkedIn and X).
