Moving assets between apps
The person says: “Use the hero photo from the Figma frame on the home page.”
Files cross apps as signed links: the other app hands out a short-lived address, the site fetches the bytes itself, and only the address passes through the conversation. Never paste a file’s contents into a tool call.
The loop
Section titled “The loop”Empress:site_status— the site, and an open change set to put the page change in (Empress:changeset_createif there is none).- The other app hands out a download link (a design tool’s export, a drive’s download link).
Empress:media_ingest—items: [{ target, sourceUrl, filename, alt, optimize: "hero", bind: { collection, id, field }, provenance: { app, ref }, requestKey }], withchangeset. The site fetches the file itself; the answer says where it landed, its size and dimensions, its media id, and that the field holds it as a draft.Empress:site_preview—target: "draft"at three widths.Empress:changeset_promote— the person’s yes puts every bind live at once.
A file you hold yourself (no link): leave out sourceUrl. The answer is one upload link per site; PUT the file to each, once, within ten minutes (curl -T hero.png "<link>"). Each answer is the stored file.
The other direction: Empress:site_call with tool: "empress.site_asset_export" (media ids, or a collection) answers signed download links another app can fetch. A file already on the site goes into a field with tool: "empress.media_bind".
Judgment
Section titled “Judgment”- A link that expires is fine: use it at once, never store it.
- An image is a reference. Bind the media item the upload returned; a hand-built image value without its storage key breaks the site’s own image.
- Many sites are one call:
target: "all"(or a list of slugs) on the item; the answer names any site it could not reach. ArequestKeyper item makes a retry land nothing twice. - Optimize an image for its use (
hero,card,logo): a 2.7 MB hero is a slow phone page.