Opendirectory blog-cover-generator
Use when the user asks to generate a blog cover image, thumbnail, or article header. Automatically uses modern typography, brand logos, and Google Search grounding to create beautiful 16:9 images with Gemini 3.1 Flash Image Preview.
git clone https://github.com/Varnan-Tech/opendirectory
T=$(mktemp -d) && git clone --depth=1 https://github.com/Varnan-Tech/opendirectory "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/blog-cover-image-cli/agent-skill/blog-cover-generator" ~/.claude/skills/varnan-tech-opendirectory-blog-cover-generator-9cb316 && rm -rf "$T"
skills/blog-cover-image-cli/agent-skill/blog-cover-generator/SKILL.mdBlog Cover Generator Skill
This skill provides AI agents with the ability to generate stunning, minimalist, technical blog cover images using the
blog-cover-image-cli. The CLI leverages Gemini 3.1 Flash Image Preview, automatically fetches brand logos from domains, uses local aesthetic reference images, and employs Google Search grounding to inject real-time context.
Setup & Configuration
Agent Pre-requisites: Before using this tool, verify it is installed. If
blog-cover-cli --help fails, install it globally:
npm install -g blog-cover-image-cli
If the user wants you to generate an image and you haven't set up the API key yet, you must first configure the CLI using a Gemini API Key. The CLI stores this securely via the
conf package.
# 1. Set your Gemini API Key (Required for image generation) npx -p blog-cover-image-cli blog-cover-cli config set-key <YOUR_GEMINI_API_KEY> # 2. Set your Brandfetch Client ID (Required to fetch high-res logos) npx -p blog-cover-image-cli blog-cover-cli config set-brandfetch-id <YOUR_BRANDFETCH_CLIENT_ID> # Check your keys (masked) npx -p blog-cover-image-cli blog-cover-cli config get-key npx -p blog-cover-image-cli blog-cover-cli config get-brandfetch-id
Usage: Generating an Image
When a user asks for a cover image (e.g., "Create a cover image for my blog about Vercel v0"), you should use the
generate command.
npx -p blog-cover-image-cli blog-cover-cli generate -t "The Title of the Blog Post" -l "example.com"
Arguments
: (Required) The title text to display on the cover image. Do not use excessively long titles (keep it under 3 lines of text visually).-t, --title <text>
: (Optional but recommended) The domain to fetch the brand logo from (e.g.,-l, --logo <domain>
,vercel.com
,google.com
). The CLI automatically converts WebP/SVG/AVIF to PNG for compatibility.cursor.com
: (Optional) The file path where the generated image will be saved. If omitted, the CLI automatically saves it to an-o, --output <path>
directory in the current working folder (e.g.,output/
)../output/vercel-cover.png
Examples
Example 1: Cursor
npx -p blog-cover-image-cli blog-cover-cli generate -t "Why Cursor is the Ultimate AI Code Editor" -l "cursor.com"
Example 2: Lovable
npx -p blog-cover-image-cli blog-cover-cli generate -t "Building Apps in Minutes with Lovable" -l "lovable.dev"
Example 3: Custom Output Path
npx -p blog-cover-image-cli blog-cover-cli generate -t "Mastering React in 2026" -l "reactjs.org" -o "./assets/react-cover.png"
How It Works Under the Hood
As an agent, you should know what the CLI is doing so you can inform the user:
- Logo Fetching: It fetches logos from
and processes them viaBrandfetch
.sharp - References: It loads curated reference images from its
directory to ensure the output is always a clean, minimalist white background with bold typography.examples/ - Grounding: It has
tools enabled, meaning if the title relates to a recent event, Gemini can look it up before generating the image.googleSearch - Text Enforcement: It forces Gemini to output the exact title string using typographic placement rules.
Edge Cases / Troubleshooting
- No API Key Error: If you see an API key error, run the
command.config set-key - Logo Fetch Warning: If the CLI says
, it will still generate the image but without the logo. You do not need to crash or stop.Warning: Could not fetch logo - Strict Modality Limits: Because it uses Gemini's experimental image models, generation may occasionally fail due to strict safety filters. If this happens, notify the user.