daymade/download-gemini-images
Download, export, save, or package images from a Google Gemini conversation/chat/app page, especially uploaded images or generated image previews visible in a Gemini thread. Use when the task needs logged-in Chrome/Gemini state, opening Gemini image lightboxes, downloading the larger displayed image files, renaming them in order, and producing a ZIP archive.
npx skills add https://github.com/daymade/claude-code-skills --skill download-gemini-images
Download Gemini conversation images from the user's logged-in Chrome session. Prefer the lightbox image over thumbnail/page-preview assets because Gemini often exposes a larger blob: image only after the user opens a preview.
scripts/download_gemini_images.mjs from a node_repl JS call after browser is available.scripts/package_images.sh.Resolve the script path relative to this skill directory, then import it in the same Node REPL session used for Chrome automation:
var { downloadGeminiImagesFromChrome } = await import("/absolute/path/to/download-gemini-images/scripts/download_gemini_images.mjs");
var result = await downloadGeminiImagesFromChrome({
browser,
tabUrlIncludes: "gemini.google.com/app",
expectedCount: 20,
outputDir: `${nodeRepl.homeDir}/Downloads/gemini_conversation_images_${new Date().toISOString().slice(0, 10).replaceAll("-", "")}`
});
nodeRepl.write(JSON.stringify(result, null, 2));
Set expectedCount only when the user gave a specific count. Omit it to download every visible Show the uploaded image in a lightbox button.
After the main script returns outputDir, run:
/absolute/path/to/download-gemini-images/scripts/package_images.sh "$outputDir" "$HOME/Downloads/gemini_conversation_images.zip"
The packaging script creates the ZIP, runs zip -T, and verifies that the archive contains the same ordered image files as the directory.
If lightbox automation fails but the page is visibly loaded, use the tab pageAssets capability:
var pageAssets = await tab.capabilities.get("pageAssets");
var inventory = await pageAssets.list();
var uploaded = inventory.assets.filter(a => a.kind === "image" && a.url.includes("lh3.googleusercontent.com/gg/"));
var bundle = await pageAssets.bundle({ inventoryId: inventory.id, assetIds: uploaded.map(a => a.id) });
nodeRepl.write(JSON.stringify(bundle, null, 2));
This usually captures 512px preview JPEGs, not the larger lightbox files. Tell the user when this fallback is used.
image_01.jpg, image_02.jpg, etc.Take daymade/download-gemini-images from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.