Image review
The image review plugin shows a round of images an agent generated, such as illustrations, product shots or icons, and asks for a verdict on each. You look at every image closely, choose the one to take forward, and mark the parts to change on the image itself. The agent gets each mark in coordinates an image-editing or inpainting step can use.
When to use it
Section titled “When to use it”- Illustrations and spot art, where you choose one direction from several.
- Product shots and marketing images, where details need fixing before they ship.
- Icon sets and app artwork, checked on light and dark backgrounds.
Install
Section titled “Install”The plugin comes with the app. Install it in Settings › Plugins, or from the command line:
pinrail plugins install imageWhat you see
Section titled “What you see”- The round’s notes from the agent, across the top, in view while you work.
- A list of the images, each with its size, format and verdict. A review of a single image shows the image alone.
- Each image large on a stage, to zoom with the scroll wheel or = and -, and to pan by dragging with the space bar held. Fit and 1:1 return to the whole image and to its own pixels.
- A backdrop behind transparent pixels: a checkerboard, light or dark. The agent picks the first one, and G switches.
- The agent’s reasoning, the prompt it used, and how the image was made, such as the model and the seed.
- Favourite, Keep or Drop for each image, and a note on it if you add one. There is at most one favourite. A review of a single image offers only Keep and Drop.
- Regions to change. Drag a box over part of an image, or click a spot, and say what should change there.
- The previous round. When the agent sends a new round, C switches to the same image from the round before, with the regions you marked on it.
Press ? for the keys.
To see it before any agent asks with it, send its sample: pinrail submit image --sample, or Send a sample in its details in Settings › Plugins.
Asking from your agent
Section titled “Asking from your agent”## Before using generated images
When you generate images for me to choose from, submit them to Pinrail withthe `image` plugin and wait for my decision:
1. Write the payload: a `notes` line on what this round is, and one entry per image with a stable `id`, a `name`, its `file`, and your `reasoning`.2. Run: `pinrail submit image --title "<what the images are for>" --data images.json --attach <each file> --wait`3. Take the `favorite` forward. Keep the `keep` images as alternatives, and drop the rest.4. Apply each region's `note` to the area it marks, and each image's `note` to the image as a whole, then submit the next round with `--revises <id>`, keeping each image's `id`.5. If the command exits 5, stop and use none of the images.What the agent sends
Section titled “What the agent sends”{ "notes": "Round 1 of the empty inbox illustration: four directions.", "subject": { "name": "Tern empty-inbox illustration", "use": "320 px wide, light and dark" }, "backdrop": "checker", "images": [ { "id": "A", "name": "Paper plane", "file": { "$attachment": "paper-plane.png" }, "reasoning": "Mail as something that **flies off and is done**.", "prompt": "Flat vector spot illustration, a paper plane looping over hills", "details": { "model": "flux-1.1-pro", "seed": 48211 } } ]}- Each image is a file sent with
--attachand named infile: PNG, JPEG, WebP or SVG, up to 25 MB each and 16 in a round. notesandreasoningare markdown.detailsare short facts, shown as chips.backdropis the first backdrop behind transparent pixels:checker,lightordark.favoritesays whether the person can mark one image as their favourite. The default istruewhen the review has more than one image, andfalsewhen it has only one. Set it tofalsewhen each image only needs to be kept or dropped.
What comes back
Section titled “What comes back”{ "decisions": [ { "id": "A", "action": "favorite", "note": "Keep the palette exactly as it is", "size": { "width": 960, "height": 720 }, "regions": [ { "shape": "box", "x": 0.9083, "y": 0.4111, "width": 0.0917, "height": 0.1389, "px": { "x": 872, "y": 296, "width": 88, "height": 100 }, "note": "Remove this cloud: it is cut off by the edge" } ] }, { "id": "B", "action": "keep" }, { "id": "C", "action": "drop", "note": "Too dark for the light theme" } ], "undecided": ["D"]}| Field | What the agent does with it |
|---|---|
decisions | Takes the favorite forward, keeps the keep images as alternatives, and sets the drop images aside. A note applies to the image as a whole. |
regions | Changes each marked area as its note says. x, y, width and height are fractions of the image from its top left, and px is the same area in the image’s pixels. A box can serve as an inpainting mask. A point marks a spot. |
undecided | Images you gave no verdict. An image with regions and no verdict counts as kept. |
Reference
Section titled “Reference”The plugin’s manifest, and the schemas a payload and a decision are checked against, read from the plugin’s own files.
name | image |
|---|---|
version | 1.0.0 |
title | Image review |
description | A round of generated images or illustrations, sent as PNG, JPEG, WebP or SVG files, each large on a stage to zoom and pan. Pick a favourite, keep or drop the rest, and box or pin a spot on an image to ask for a change there. |
use_when | You generated candidate images or illustrations (a spot illustration, a hero, a product shot, an icon set) and need a person to pick one, shortlist or drop the rest, and mark the areas to fix, remove or redraw, in coordinates an image-editing or inpainting step can act on. |
attachments | .png .jpg .jpeg .webp .svg image/png image/jpeg image/webp image/svg+xml · up to 25 MB each, 16 a review |
shortcuts |
|
{ "name": "image", "version": "1.0.0", "title": "Image review", "description": "A round of generated images or illustrations, sent as PNG, JPEG, WebP or SVG files, each large on a stage to zoom and pan. Pick a favourite, keep or drop the rest, and box or pin a spot on an image to ask for a change there.", "use_when": "You generated candidate images or illustrations (a spot illustration, a hero, a product shot, an icon set) and need a person to pick one, shortlist or drop the rest, and mark the areas to fix, remove or redraw, in coordinates an image-editing or inpainting step can act on.", "attachments": { "accept": [ ".png", ".jpg", ".jpeg", ".webp", ".svg", "image/png", "image/jpeg", "image/webp", "image/svg+xml" ], "max_size": 26214400, "max_count": 16 }, "shortcuts": [ { "keys": "j", "does": "Next image" }, { "keys": "k", "does": "Previous image" }, { "keys": "p", "does": "Pin a comment at the centre of the view", "group": "Regions" }, { "keys": "b", "does": "Box what is in view (zoom in first)", "group": "Regions" }, { "keys": "=", "does": "Zoom in", "group": "Stage" }, { "keys": "-", "does": "Zoom out", "group": "Stage" }, { "keys": "0", "does": "Fit the image", "group": "Stage" }, { "keys": "1", "does": "Actual pixels", "group": "Stage" }, { "keys": "arrowleft", "does": "Pan; the other arrows likewise", "group": "Stage" }, { "keys": "h", "does": "Drag to pan rather than to mark", "group": "Stage" }, { "keys": "g", "does": "Next backdrop: checker, light, dark", "group": "Stage" }, { "keys": "c", "does": "Compare with the previous round", "group": "Stage" }, { "keys": "f", "does": "Make this image the favourite", "group": "Verdicts" }, { "keys": "s", "does": "Keep this image on the shortlist", "group": "Verdicts" }, { "keys": "x", "does": "Drop this image", "group": "Verdicts" } ]}- notesstring
Markdown: what this round is, and what to look at.
at most 10000 chars
subjectobjectrequired
- namestringrequired
What the images are of, e.g. Tern empty-inbox illustration.
1–120 chars
- usestring
Where the image will be seen, e.g. 320 px wide in the empty inbox, light and dark.
at most 200 chars
- favoriteboolean
Whether the person can mark one image as their favourite. The default is true when the review has more than one image, and false when it has only one. Set it to false when each image only needs to be kept or dropped.
- backdropenum
What shows through transparent pixels at first. Default checker; the reviewer can switch.
"checker""light""dark" imagesobject[]required
1–16 items
- idstringrequired
1–40 chars
- namestringrequired
1–80 chars
- filefilerequired
The image as a file sent with --attach: PNG, JPEG, WebP or SVG. An SVG is shown as a picture; its scripts and links never run.
- reasoningstring
Markdown: the idea behind this one, and what to look for.
at most 4000 chars
- promptstring
The prompt it was made from, shown as it is.
at most 8000 chars
- detailsobject
Short facts about how it was made, shown as chips: model, seed, steps, style.
- altstring
What the image shows, for a screen reader.
at most 300 chars
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Image review request", "type": "object", "additionalProperties": false, "required": [ "subject", "images" ], "$defs": { "attachment": { "type": "object", "additionalProperties": false, "required": [ "$attachment" ], "properties": { "$attachment": { "type": "string", "minLength": 1, "maxLength": 120 } }, "description": "A file sent beside the payload with --attach, by its name." } }, "properties": { "notes": { "type": "string", "maxLength": 10000, "description": "Markdown: what this round is, and what to look at." }, "subject": { "type": "object", "additionalProperties": false, "required": [ "name" ], "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 120, "description": "What the images are of, e.g. Tern empty-inbox illustration." }, "use": { "type": "string", "maxLength": 200, "description": "Where the image will be seen, e.g. 320 px wide in the empty inbox, light and dark." } } }, "favorite": { "type": "boolean", "description": "Whether the person can mark one image as their favourite. The default is true when the review has more than one image, and false when it has only one. Set it to false when each image only needs to be kept or dropped." }, "backdrop": { "enum": [ "checker", "light", "dark" ], "description": "What shows through transparent pixels at first. Default checker; the reviewer can switch." }, "images": { "type": "array", "minItems": 1, "maxItems": 16, "items": { "type": "object", "additionalProperties": false, "required": [ "id", "name", "file" ], "properties": { "id": { "type": "string", "minLength": 1, "maxLength": 40 }, "name": { "type": "string", "minLength": 1, "maxLength": 80 }, "file": { "$ref": "#/$defs/attachment", "description": "The image as a file sent with --attach: PNG, JPEG, WebP or SVG. An SVG is shown as a picture; its scripts and links never run." }, "reasoning": { "type": "string", "maxLength": 4000, "description": "Markdown: the idea behind this one, and what to look for." }, "prompt": { "type": "string", "maxLength": 8000, "description": "The prompt it was made from, shown as it is." }, "details": { "type": "object", "maxProperties": 12, "additionalProperties": { "type": [ "string", "number", "boolean" ] }, "description": "Short facts about how it was made, shown as chips: model, seed, steps, style." }, "alt": { "type": "string", "maxLength": 300, "description": "What the image shows, for a screen reader." } } } } }}decisionsobject[]required
A verdict per image the reviewer decided. At most one favourite.
- idstringrequired
- actionenumrequired
favorite: the one to take forward. keep: still on the shortlist. drop: set it aside.
"favorite""keep""drop" - notestring
What to change in the image as a whole, or why it was dropped.
at most 4000 chars
sizeobject
The image's size in pixels (an SVG's in viewBox units): what the regions' px are measured in.
- widthnumberrequired
- heightnumberrequired
regionsregion[]
Changes asked for on parts of the image, each on a box or a point.
- shapeenumrequired
box: an area to change. point: a spot to change.
"box""point" - xnumberrequired
The box's left edge, or the point, as a fraction of the image's width from its left.
0–1
- ynumberrequired
The box's top edge, or the point, as a fraction of the image's height from its top.
0–1
- widthnumber
The box's width, as a fraction of the image's width.
0–1
- heightnumber
The box's height, as a fraction of the image's height.
0–1
pxobjectrequired
The same region in the image's own pixels, origin top left. For an SVG, in the units of its viewBox.
- xnumberrequired
- ynumberrequired
- widthnumber
at least 0
- heightnumber
at least 0
- notestringrequired
What to change there.
1–2000 chars
- undecidedstring[]required
Images left without a verdict.
{ "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Image review decision", "type": "object", "additionalProperties": false, "required": [ "decisions", "undecided" ], "$defs": { "unit": { "type": "number", "minimum": 0, "maximum": 1 }, "region": { "type": "object", "additionalProperties": false, "required": [ "shape", "x", "y", "px", "note" ], "properties": { "shape": { "enum": [ "box", "point" ], "description": "box: an area to change. point: a spot to change." }, "x": { "$ref": "#/$defs/unit", "description": "The box's left edge, or the point, as a fraction of the image's width from its left." }, "y": { "$ref": "#/$defs/unit", "description": "The box's top edge, or the point, as a fraction of the image's height from its top." }, "width": { "$ref": "#/$defs/unit", "description": "The box's width, as a fraction of the image's width." }, "height": { "$ref": "#/$defs/unit", "description": "The box's height, as a fraction of the image's height." }, "px": { "type": "object", "additionalProperties": false, "required": [ "x", "y" ], "description": "The same region in the image's own pixels, origin top left. For an SVG, in the units of its viewBox.", "properties": { "x": { "type": "number" }, "y": { "type": "number" }, "width": { "type": "number", "minimum": 0 }, "height": { "type": "number", "minimum": 0 } } }, "note": { "type": "string", "minLength": 1, "maxLength": 2000, "description": "What to change there." } }, "if": { "properties": { "shape": { "const": "box" } } }, "then": { "required": [ "width", "height" ], "properties": { "px": { "required": [ "width", "height" ] } } }, "else": { "properties": { "width": false, "height": false, "px": { "properties": { "width": false, "height": false } } } } } }, "properties": { "decisions": { "type": "array", "description": "A verdict per image the reviewer decided. At most one favourite.", "items": { "type": "object", "additionalProperties": false, "required": [ "id", "action" ], "dependentRequired": { "regions": [ "size" ] }, "properties": { "id": { "type": "string" }, "action": { "enum": [ "favorite", "keep", "drop" ], "description": "favorite: the one to take forward. keep: still on the shortlist. drop: set it aside." }, "note": { "type": "string", "maxLength": 4000, "description": "What to change in the image as a whole, or why it was dropped." }, "size": { "type": "object", "additionalProperties": false, "required": [ "width", "height" ], "description": "The image's size in pixels (an SVG's in viewBox units): what the regions' px are measured in.", "properties": { "width": { "type": "number", "exclusiveMinimum": 0 }, "height": { "type": "number", "exclusiveMinimum": 0 } } }, "regions": { "type": "array", "description": "Changes asked for on parts of the image, each on a box or a point.", "items": { "$ref": "#/$defs/region" } } } } }, "undecided": { "type": "array", "items": { "type": "string" }, "description": "Images left without a verdict." } }}