Platform · agent
The cover on every article, without a designer in the queue.
Content stops at the image. The draft is ready, the schema is right, and the article waits three days for a cover — or ships with a stock photo that looks like nothing else on the site. Visual Asset Studio removes that wait by composing the asset from your design pack and then checking the rendered pixels before anything reaches a publisher.
Nothing here samples a picture from a model. We build it from a versioned pack of tokens, type scale and safe areas. A cover we make today and one we make in three months read as the same brand.
RUN packet
- Brief
- Draft
- Schema
- Gates
Live, version 0.3.26
16 publishing placements · 10 gates run on the rendered file · alt text mandatory on every asset.
The problem
Consistency is a volume problem.
One cover is easy. A designer makes it, it looks good, everyone is happy. The difficulty starts at thirty a month across five surfaces, when the same article needs a different crop for the site, for LinkedIn, for Medium and for a link preview, and each of those has a different aspect ratio that clips a different part of the headline.
At that volume a queue forms. The usual escape is a generic template that gets reused until the site looks like a slide deck, or an image model that produces something plausible and slightly different every time. Both of those trade brand consistency for throughput, and both are visible to a reader within about four articles.
We use this on ourselves, which is the only demo we can vouch for. In June 2026 we backfilled every post on this site: 146 published articles now carry 143 distinct covers, and the three repeats come from identical-title deduplication, not from a shared default. In the same month we re-attached 9 of 9 covers on the Russian side of the site server-side, with no hand-rendered image anywhere in the batch. None of it went through a designer's queue.
The closed loop
Six steps, and the fifth one is allowed to fail.
01 · Classify
Which surface is this for
The placement is a required input, not a default. We ask which surface it is instead of guessing, because a LinkedIn Article cover and a LinkedIn post image are different shapes and neither substitutes for the other.
02 · Preflight
Brand pack, owner, tokens
We load and version-pin the design pack, resolve the brand owner, and run the copy going onto the image through the tenant's editorial policy before anything renders.
03 · Render
From a pack, not a prompt
We compose the image server-side from design tokens and the pack's type scale. No image model invents a layout, which is why two covers a month apart still read as the same brand.
04 · Verify
Ten gates on the rendered pixels
We inspect the rendered file instead of assuming it: contrast, whether the headline fits its box, whether the computed font is the pack font, the safe-area crop for each platform, alt text, and provenance.
05 · Re-render
Up to three attempts
A failed gate triggers a re-render. We hold the visual-diff baseline at 0.002, so a change that should be invisible has to actually be invisible.
06 · Hand off
Verified, or an honest stop
A passing asset goes to the publisher with its verification report attached. One that cannot pass returns an operator handoff instead of a lower-quality image, because a wrong-brand cover is worse than a late one.
Placements
One article, a separate asset per surface.
The placement is a required input. A request that does not name one gets a question back, because no single shape works everywhere.
| Surface | Preset | Size |
|---|---|---|
| humanswith.ai OG | humanswith_site_og | 2400×1260 |
| gregshevchenko.com OG | greg_site_og | 1200×630 |
| LinkedIn Article cover | linkedin_article_cover | 1920×1080 |
| LinkedIn native post | linkedin_post_image | 1200×900 |
| LinkedIn link preview | linkedin_link_preview | 1200×627 |
| LinkedIn Featured card | linkedin_profile_card | 1200×900 |
| Medium | medium_cover | 1500×750 |
| X | x_cover | 1600×900 |
| dev.to | devto_cover | 1000×420 |
| vc.ru | vcru_cover | 1200×900 |
| Habr | habr_cover | 1200×630 |
reddit_cover | 1200×628 | |
| Telegram | telegram_post | 1280×720 |
| Dzen | dzen_cover | 1100×616 |
| In-article table as an image | article_table_png | 1600×auto |
| Client brand pack | per-tenant presets | per pack |
Three of those rows are LinkedIn alone, and that is the clearest case for why substitution is refused: an Article cover is 16:9, a native post image is 4:3, and a link preview is 1.91:1. Using one file for all three crops the headline differently in each, so the studio treats "LinkedIn" without a placement as an incomplete request.
Verification
Ten checks on the file, not on the intention.
The difference between a render and a verified asset is that the second one has been inspected after the fact. We run these ten gates on the rendered pixels, and all of them have to pass before we call the asset done:
- token_only: every colour and size traces to a design token, so nothing is hand-picked.
- font_load and font_style_computed: the pack font actually loaded and is what the browser computed, not a silent system fallback.
- text_fit: the headline fits its box rather than being clipped at the edge.
- safe_area_crop: the composition survives the platform's own crop.
- contrast: the text is legible against what ended up behind it.
- alt_text: present and descriptive, or the asset does not pass.
- asset_provenance and correct_brand_owner: the asset is attributed and carries the right brand, which matters when one studio serves several tenants.
- no_duplicated_cta_domain: the call to action is not printed twice in different words.
A failure re-renders, up to three attempts, against a visual-diff baseline with a tolerance of 0.002. What does not happen is a quiet downgrade: an asset that cannot pass comes back as an operator handoff, because a wrong-brand cover is worse than a late one.
Honestly
What it does not do.
It is not a design department. No photography, no product shots, no video, no campaign creative. Those need a person with taste and a brief, and nothing here replaces that. What it replaces is the repetitive half: the cover on every article, the per-surface crop, the table that has to survive as an image.
It needs a brand pack first. Tokens, type scale, logo rules and canvases have to exist before anything can be composed from them. Setting that up is a one-off piece of work with a designer, and after it the flow runs without one.
Refusals are part of the design. An asset that cannot pass its gates is handed back rather than shipped, which means the studio occasionally returns nothing. That is the correct behaviour for a system whose job is consistency, and it is worth knowing before you build a publishing schedule around it.
Why this works
Where teams go wrong.
We have watched three escapes from the cover queue, and all three fail for the same reason: they optimise one asset at a time while the problem is the set.
The reused template. One good layout gets applied to everything. It holds for about four articles, then the archive page shows four identical rectangles and readers stop seeing the covers at all.
The image model. Fast, and different every time. Different is exactly what a brand cannot afford across thirty assets a month, and the output also has no idea what 1.91:1 means.
The designer as a bottleneck. The best output and the worst throughput. It also spends a senior person on crops when their value is in the campaign work nothing here replaces.
What changes with a verified pipeline is not the quality of any single cover. It is that the fortieth one still matches the first, and that a broken one gets caught before publication instead of after.
Setup
What we need before the first render.
A one-off piece of work with your designer. After it, the flow runs without one.
- Exact values, not approximations. Approximate colours fail the token gate, so we need the hexes your brand book actually specifies.
- Families and their size bands. Which faces are permitted, and what sizes a headline, a kicker and a caption are allowed to take.
- The file as you ship it. We scale it and do nothing else: no recolouring, no redrawing, no reconstruction from a screenshot.
- Where you actually publish. Each one becomes a placement with its own size. Anything not on the list gets asked about instead of guessed.
- Alt text and editorial rules. Copy that ends up on an image is policy-bearing text, so it passes the same gate as body copy.
Questions teams ask
About the design agent, answered directly.
Is this a prompt-to-image generator?
No, and that is the point. The image is composed from a versioned design pack — tokens, type scale, safe areas — rather than sampled from a model. A generator gives you a different interpretation every time; this gives you the same brand every time, which is what a cover on every article actually needs.
What happens if the copy does not fit?
The text_fit gate catches it on the rendered pixels and the studio re-renders, up to three attempts. If it still cannot fit, you get an operator handoff rather than a cover with a clipped headline. The same applies to contrast and to the platform safe-area crop.
Why does it refuse to make a "generic" cover?
Because there is no such thing. A LinkedIn Article cover is 1920×1080, a LinkedIn native post image is 1200×900, and a link preview is 1200×627. One image used for all three is cropped wrong in at least two places, so the placement is a required input and a missing one produces a question, not a default.
Does every image come with alt text?
Yes, and it is gated. An asset without alt text does not pass verification. For a table rendered as an image the alt text carries the actual columns and rows, because that image is the only way an answer engine can read the table.
Can it use our brand rather than yours?
Yes. A client brand pack declares the palette, the permitted type families and size bands, the canvases, and the logo rules, and the gates then bind to that pack instead of ours. The logo is used as the client ships it; scaling is the only transformation allowed.
What does it not do?
It does not do photography, product shots, video, or one-off illustration work. It is the steady flow — the cover on every article, the table that has to survive as an image, the per-surface crop of the same asset. Campaign creative is still a designer's job and we say so rather than overselling.
Want to see it on your brand?
Thirty minutes to look at what your covers cost you today in time rather than money, and whether the steady flow is actually your bottleneck — it often is not, and we would rather say so.