Blog Image
Use this skill to generate one blog thumbnail per run using the pixr CLI (npm package pixr-cli, version 0.3.0 or newer).
pixr works with several providers (Gemini, OpenAI-compatible, OpenRouter, fal) and has no built-in model. The provider, model, and API key come from the user's own pixr config. Never pick or change them yourself.
If the user did not provide a topic, ask for one before proceeding.
Inputs to infer
TOPIC: the subject of the blog post the image is for (e.g. "vector databases", "building a notes app in Rust")- Optional:
--save-topath override (default:~/blog-images/) - Optional:
--prefixfor the output filename
Prerequisite check
Before generating, run these checks in order:
1. Confirm pixr is available:
pixr --help
If this fails, run:
npm install -g pixr-cli
Then verify again. If still failing, stop and report.
2. Confirm the API key and model are configured:
source ~/.zshrc && pixr config --json
Read hasApiKey, provider, and model from the output.
hasApiKeymust betrue. pixr readsPIXR_API_KEY(the olderNANO_IMAGE_API_KEYalso works), or the variable named byapiKeyEnvin the user's pixr config. These are defined in~/.zshrc.modelmust not benull. pixr has no default model.
CRITICAL NON-NEGOTIABLE: never ask the user to add or set the API key manually. It is already in ~/.zshrc. Always source it before concluding the key is missing.
If hasApiKey is still false after sourcing, report the exact output and stop.
If model is null, list the models for the user's provider and ask the user which one to use. Do not choose one yourself:
source ~/.zshrc && pixr models --no-interactive
Save the model they pick with pixr model <name>, then run the config check again.
Workflow
- Confirm the topic with the user or infer it from the blog name they provided.
- Create
~/blog-images/if it does not exist. - Run the generation command using this exact structure (source
~/.zshrcin the same shell first):
pixr generate -w 1600 -f webp --save-to ~/blog-images --no-stdin \
"1920x1080 thumbnail on topic \"{TOPIC}\" dont just use text use proper vectors resarch on web and make and all, add more vectors then just text (less text more vectors images and all)"
Replace {TOPIC} with the actual topic. Keep the rest of the prompt exactly as written.
Do not paraphrase, shorten, or reword the prompt text. It is battle-tested.
- Confirm the output file was written to
~/blog-images/. pixr printssaved image: <absolute path>; note that exact path. Warnings are printed aswarning: ...; report them but they do not fail the run. - Update the blog-meta JSON with the image path.
- Look for a matching JSON file in
~/blog-meta/whoseblog_pathvalue corresponds to the same blog. - If found, set
thumbnail_pathto the exact absolute path of the generated image file. - Write the updated JSON back to the same file. Do not change any other field.
- If no matching JSON file is found, note it in the completion report but do not fail the run.
- Look for a matching JSON file in
- Report the full output file path.
Quality bar
- CRITICAL NON-NEGOTIABLE: always use
-w 1600 -f webp. Never change these flags. - CRITICAL NON-NEGOTIABLE: always use
--save-to ~/blog-imagesunless the user explicitly provides a different path. - CRITICAL NON-NEGOTIABLE: never modify the prompt text. Use it verbatim with only
{TOPIC}substituted. - CRITICAL NON-NEGOTIABLE: do not skip the prerequisite check. If
pixris missing, install it first. - CRITICAL NON-NEGOTIABLE: never choose a provider or model for the user. Use their pixr config; if no model is set, ask them.
- CRITICAL NON-NEGOTIABLE: after a successful generation, always attempt to update the matching
~/blog-meta/*.jsonwiththumbnail_path. Never skip this step.
Completion report
At the end, report:
- Topic used
- Full
pixrcommand run - Output file path
- Whether the file exists at that path after generation
- Which
~/blog-meta/*.jsonfile was updated (or that no match was found)
