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.

It is not an image generator.

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.


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 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.

  1. Exact values, not approximations. Approximate colours fail the token gate, so we need the hexes your brand book actually specifies.
  2. Families and their size bands. Which faces are permitted, and what sizes a headline, a kicker and a caption are allowed to take.
  3. The file as you ship it. We scale it and do nothing else: no recolouring, no redrawing, no reconstruction from a screenshot.
  4. Where you actually publish. Each one becomes a placement with its own size. Anything not on the list gets asked about instead of guessed.
  5. 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?

The fastest check is your own next article.

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.