Install
openclaw skills install @canvora/canvora-product-photo-visualsBuild Canvora visuals around the user's OWN photos — real product shots, team headshots, venue or event photos embedded into the design instead of generic stock imagery. Use when the user has photos to include, wants their actual product shown, or says the visuals must feature their real people or place.
openclaw skills install @canvora/canvora-product-photo-visualsThe difference between a generic AI visual and a usable one is usually whether the actual product is in it. Canvora can compose the user's real photos into a generated design — the layout, typography and brand styling are generated around the photo, not pasted on top of it.
Photo embedding runs through the MCP server (https://api.canvora.ai/mcp)
or the Canvora web app. The canvora CLI cannot send photos today — if the
user is CLI-only, say so and point them at the MCP connector or the dashboard.
Don't fake it with --url.
The flow, in MCP tools:
upload_photo({ data, filename }) → returns a CDN URL. Repeat per photo,
maximum 5.chat({ message }) — describe the visual, mentioning that the photos are
the subject.confirm_generation({ conversation_id, formats, embedding_photos: [urls], brand_id, ... }) — the photo URLs go here.get_generation({ generation_id }) to poll and collect outputs.Step 4 is a poll loop by design, so the CLI's shell-timeout consideration
doesn't apply here — but the same rule does: a generation that hasn't come back
yet is still running. Never fire a second confirm_generation for the same
job; that starts a second, separate generation. State the cost in the same message as
step 3 — 10 credits per single visual, 15 per carousel slide — announcing it
rather than asking permission. If you chose the slide count rather than the
user, confirm that number first.
instagram_post, ad_square, a carousel…
plus the brand kit).Works well
Struggles
--exact-style precision: if the pack copy or price must be legible and
correct, put it in the text content rather than relying on the photo.canvora skill still applies: sort by sortOrder,
refine with edit_image rather than regenerating.edit_image({ instruction: "show the full jar, don't crop the label" }) — cheap and design-preserving.