| name | vintage-plate |
| description | Turn a real photo or screenshot into a vintage natural-history plate, a 19th-century hand-coloured copperplate engraving on aged cream paper with fine hatching, thin low-saturation watercolour washes, the subject isolated on blank paper, and a small handwritten Latin-name caption with a plate number. Keeps only the main subject and strips everything else. Use whenever a user wants a photo turned into an antique engraving, an old book illustration, a botanical or zoological plate, a 'naturalist', 'museum plate' or 'specimen' look, a hand-drawn scientific illustration, or attaches a photo and says 'make it that old-plate style', including batches and illustrations for slides, websites or covers. Chinese triggers: 复古博物画、博物志图版、铜版画、手绘版画、油画风转绘. Works with the host's built-in image tool (Codex, ChatGPT, Doubao, Gemini) or through any OpenAI-compatible image API. |
Vintage Plate
Redraw a photo as a plate from a 19th-century natural-history book: cream aged paper scanned from an old volume, fine copperplate hatching, thin watercolour washes, the subject alone on blank paper, a handwritten Latin name in one corner. The core of the style is subtraction: keep the subject, drop everything else.
Style anchors live in assets/style-refs/ (four reference plates) and finished results in assets/examples/. When unsure whether a result looks right, compare against them first; the details are in references/style-guide.md.
Language
Reply in the language the user used in their first message of the conversation, and keep it for the whole session even if later messages contain English paths, prompts or script output. Prompts sent to the image model are always English. Plate captions: the Latin name stays Latin, the common name is written in the user's language.
How it gets invoked
- Claude Code / Open Design:
/vintage-plate process this photo, with the image dragged into the terminal (it becomes a path) or a path typed in. In Codex: $vintage-plate ....
- If the user only says "process this" or "make it that style", run the full default pipeline without asking: aspect follows the subject's shape, captions are on, one image per photo. Ask one plain-text multiple-choice question only when the photo has two or more equally plausible subjects.
- If the user pasted an image without a file path (common in Claude Code): look at it and write the brief first, then ask for the file (drag it into the terminal or give a path). The scripts need a file on disk.
Workflow
0. Confirm an image backend first (ten seconds; don't let the user wait until the end to discover nothing is configured)
- Host with a built-in image tool (Codex, ChatGPT, Doubao, Gemini): go to step 2A; no configuration needed.
- Other hosts: run
python3 "$SKILL/scripts/restyle.py" --doctor. If it passes, continue. If it fails, no image API is configured yet: run python3 "$SKILL/scripts/restyle.py" --open-env (creates a commented .env from .env.example and opens it in the system editor), then tell the user in plain text, in their language, no forms:
No image backend is configured yet. I created and opened the config file <absolute path>/.env; the comments explain each line:
- You have an OpenAI-compatible image API (302.AI, OpenAI, any relay): fill section A with the key, base URL and model name.
- You have your own image-generation command: fill the single line in section B.
- Neither: reply "3" and I will hand you a prompt for a web image tool; send the result back and I will add the paper texture and caption.
Save the file and reply "done".
When the user replies "done", run --doctor --ping; continue if it passes, otherwise translate the doctor output into plain language and say which line to fix. If the user pastes the key into the chat, write it into .env yourself (chmod 600) and remind them not to commit the file. "3" means the step-2A prompt template. Users who prefer a terminal Q&A can run --setup themselves (key input is hidden). The agent's own shell has no interactive terminal, so never try to run --setup on the user's behalf.
1. Look at the photo and write the Subject Brief
Actually look at the photo with Read; never guess from the filename. Then decide:
- Subject: what the user named > the largest, clearest nameable thing in the frame > people and animals before objects > objects before environment. Give animals and plants their common name and Latin binomial; the caption uses it.
- Keep: the features that make it this individual: markings, colours, pose and facing direction, breed or model details. The more specific, the less the model drifts to a generic version.
- Drop: background, clutter, bystanders, signs and text, modern devices (unless the device is the subject). When the photo is crowded, pick 1-3 items that form a specimen group and discard the rest; never try to draw the whole desk.
- Support: plates never float a subject. A bird gets a bare twig, a mammal a tuft of grass or a patch of ground, a plant its own stem and leaves, an object a faint ground line. People get a half-length portrait with no support.
- Aspect: follows the subject's shape, not the photo's. Standing birds, flower stems and people 3:4; animals in profile, vehicles and side-by-side object groups 4:3 or 1:1. When subject and photo orientation agree this simply equals the photo. A user-specified aspect wins.
- Caption: on by default; the small line of script is part of the look. Animals and plants: Latin name as the main caption, common name as the sub-caption (
--label "Parus major" --sublabel "Great tit", the common name in the user's language). Objects have no Latin name: use only --sublabel with a short name in the user's language (for example "White mugs and a pen holder"); never invent Latin. Add a plate number with --plate: sequential 1, 2, 3 in a batch, any small number for a single image. Omit captions only when the user explicitly asks for no text.
Write the brief in English; its fields are the script's arguments: subject / keep / drop / support / aspect / label. Examples are in references/prompt-recipe.md.
2. Generate: does the host have a built-in image tool?
2A. Host with a built-in image tool (Codex, ChatGPT, Doubao, Gemini, or an agent with an image-generation MCP): no API needed, skip restyle.py.
- Fill the brief into the script-free full template at the end of
references/prompt-recipe.md to get the complete prompt.
- Hand the photo to the host's image tool as the reference image and choose the aspect from the brief (3:4 / 4:3 / 1:1). If the tool accepts several reference images, also attach
assets/style-refs/ref-great-tit-cream.png and ref-stellers-jay-grey.png and add the "first image is the photo, the rest are style references" sentence as the template explains; with a single image leave it out.
- If the tool has a "high fidelity to the reference" switch, turn it on; it does the job of
input_fidelity=high.
- If the tool is text-to-image only and cannot use the photo, make
keep much more specific (markings, colours, pose, model) and tell the user that subject fidelity will drop.
2B. Local scripts + image API (Claude Code, Open Design and other hosts without built-in generation):
SKILL=<this skill's directory>
python3 "$SKILL/scripts/restyle.py" --image photo.jpg \
--subject "an adult great tit (Parus major) perched, body facing left, head turned right" \
--keep "black cap and throat, white cheeks, yellow breast with a black central stripe, olive back, blue-grey wings with one white bar" \
--drop "the tangle of bare twigs, the blue sky, the power line" \
--support "a single short bare twig under its feet" \
--aspect 3:4 --out outputs/great-tit-plate-raw.png
- The default backend is an OpenAI-compatible image-edit endpoint (
/v1/images/edits, input_fidelity=high keeps the subject's identity); two style reference plates are attached automatically.
- The script assembles the prompt from
references/prompt-recipe.md. On a real run the prompt is saved next to the output as .prompt.txt (--prompt-out changes the path); --dry-run --prompt-out p.txt only writes the prompt, costs nothing, and can be handed to another backend (see references/backends.md).
- Plants and flowers: add
--style-ref "$SKILL/assets/style-refs/ref-botanical-plate.png". If a reference plate seems to leak its own subject into the result, use --no-style-ref.
- One image takes about 1-3 minutes. Use
--quality medium for drafts and the default high for finals.
- If polling is interrupted, do not regenerate: the script prints a task id on submission, and
--resume <task_id> --image photo.jpg --out ... fetches the finished result at no extra cost.
3. Paper texture and caption (recommended)
Models often render the paper too white and clean, and any text they write is usually garbled. So captions are added afterwards (on by default, see step 1) and the paper grain comes from a script. Do this on every host that can run Python (Claude Code, Open Design, the Codex sandbox). Pure chat hosts (Doubao, the ChatGPT website) cannot run scripts: use the "let the model write the caption" sentence from the template instead, and if the lettering comes out wrong, generate once more and keep only the correct one.
python3 "$SKILL/scripts/paperize.py" outputs/great-tit-plate-raw.png outputs/great-tit-plate.png \
--label "Parus major" --sublabel "Great tit" --plate 3
Object example: --sublabel "White mugs and a pen holder" --plate 12. Without caption arguments it only adds grain, a slight desaturation and a soft vignette. --corner tl|tr|bl|br places the caption (default auto picks the emptiest corner). Fonts: the script picks the first handwriting-style font it finds on the system (macOS: Snell Roundhand and Kaiti / Songti; Windows: Monotype Corsiva or Segoe Script and KaiTi / SimSun; Linux: DejaVu Serif Italic and Noto Serif CJK), falling back to Pillow's built-in font when none is installed; a mixed line gets each script in its own font on a shared baseline. LXGW WenKai is preferred for Chinese if installed, and VINTAGE_PLATE_SCRIPT_FONT / VINTAGE_PLATE_CJK_FONT can point to any font file. If the caption looks plain, tell the user which font was used and how to install a nicer one. Naming: the model output is <subject>-plate-raw.png, the paperized result is <subject>-plate.png, and the latter is what the user receives. Both live in outputs/ under the current working directory (the script's default when --out is omitted), never inside the skill folder.
4. Quality check
python3 "$SKILL/scripts/inspect_style.py" outputs/great-tit-plate.png
The script measures whether the paper is cream, whether background crept back in, whether colours are too saturated, and whether there are solid black or white areas. "Subject coverage" counts inked pixels over the whole frame; the reference plates sit at 18-35% and anything from 10% to 65% is healthy. It is not the same quantity as the prompt's "55-70% of the frame height", so do not tune one against the other. Then look at the result again with Read and repair against this table:
| Symptom | Fix |
|---|
| Subject no longer looks like the original (species, breed, model changed) | Make keep more specific and add --extra "Keep the exact species and markings shown in the photo; do not idealise or replace it with a generic one." |
| Background or scenery came back | --extra "Absolutely no scenery, ground plane, sky or horizon; the subject sits on blank paper with only the stated support." |
| Looks like oil or digital painting, no engraved lines | --extra "Emphasise the engraved line work: fine parallel hatching and stipple must be visible in every shadow; colour is a thin wash over the lines, never opaque paint." |
| Paper too white or too clean | Run paperize first; if still not enough, --extra "The paper is distinctly cream, never white, with visible fibre grain and faint foxing." |
| Colours too vivid | --extra "Colours are faded and desaturated like a 150-year-old print." |
| Garbled text appears | The model is already told not to write; captions come only from paperize |
| Frame too full, subject touching the edges | --extra "Leave at least 15% blank paper on every side." |
| Subject too small (coverage under 10%, large empty paper) | --extra "Draw the subject larger, so that it spans about two thirds of the frame's height." |
At most two repair rounds, one change per round, re-check after each. On hosts that cannot run the scripts, compare by eye against the anti-patterns list in references/style-guide.md and the finished plates in assets/examples/; the standard is the same.
5. Deliver
Tell the user, in their language: the path of the finished plate (<subject>-plate.png), what you chose as the subject and what you dropped, and which backend was used. Process several photos one at a time and name each file after its own subject; never call everything output.png.
Configuration (first use)
python3 "$SKILL/scripts/restyle.py" --open-env
python3 "$SKILL/scripts/restyle.py" --doctor --ping
Three kinds of backend, details in references/backends.md:
- OpenAI-compatible image API (302.AI, OpenAI, any relay): the default path; key, base URL and model name.
- Your own image command or agent tool: an
IMG_GENERATOR_CMD template in .env; the script fills the placeholders and runs it.
- A web image tool:
--no-style-ref --dry-run --prompt-out prompt.txt produces the prompt for the user to generate manually; bring the image back for paperize and the quality check.
If no configuration can be found, never guess: show the user the --doctor output and .env.example.
Don'ts
- Writing the brief without looking at the photo, or applying a "filter" to the whole photo. If the background stays, it is not this style.
- Adding things the subject doesn't have: a second bird, garlands, decorative borders, gold, glow, gradients.
- Keeping the photo's depth of field, lens highlights and dramatic lighting.
- Letting the model write the caption itself when paperize is available.