skills/dicklesworthstone/giil/SKILL.md
Get Image [from] Internet Link - Zero-setup CLI for downloading full-resolution images from iCloud, Dropbox, Google Photos, and Google Drive share links. Four-tier capture strategy, browser automation, HEIC conversion, album support. Node.js/Playwright.
npx skillsauth add aiskillstore/marketplace giilInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A zero-setup CLI that downloads full-resolution images from cloud photo shares. The missing link between your iPhone screenshots and remote AI coding sessions.
The primary use case: Remote AI-Assisted Debugging
You're SSH'd into a remote server running Claude Code, Codex, or another AI assistant. You need to debug a UI issue on your iPhone, but how do you get that screenshot to your remote terminal?
Without giil:
Download image locally → SCP to server → Tell AI the path
Email yourself → Download on server → Hope it works
Set up complex file sync between devices
With giil:
giil "https://share.icloud.com/photos/0a1Abc_xYz..." --json
# {"path": "/tmp/icloud_20240115_143022.jpg", "width": 1170, ...}
One command. AI sees it instantly. No file transfers, no context switching.
iPhone Screenshot → iCloud Sync → Photos.app Share Link → Paste to SSH → giil Downloads → AI Analyzes
| Problem | Why It's Hard | How giil Solves It | |---------|---------------|-------------------| | JavaScript-heavy SPAs | Standard curl/wget can't execute JS | Headless Chromium via Playwright | | Dynamic image loading | Images load asynchronously from CDN | Network interception captures CDN responses | | No direct download links | URLs are session-specific and expire | Clicks Download button or intercepts live requests | | Copy/paste loses quality | Manual screenshots compress images | Captures original resolution from source | | HEIC format on Apple | Many tools can't process HEIC/HEIF | Platform-aware conversion (sips/heif-convert) |
# Install
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/giil/main/install.sh?v=3.0.0" | bash
# Download single image
giil "https://share.icloud.com/photos/02cD9okNHvVd-uuDnPCH3ZEEA"
# JSON output (best for AI workflows)
giil "https://share.icloud.com/photos/..." --json
# Download entire album
giil "https://share.icloud.com/photos/..." --all --output ~/album
Note: First run downloads Playwright Chromium (~200MB, cached in ~/.cache/giil/).
| Platform | URL Patterns | Method | Browser Required |
|----------|--------------|--------|------------------|
| iCloud | share.icloud.com/photos/*, icloud.com/photos/#* | 4-tier capture strategy | Yes |
| Dropbox | dropbox.com/s/*, dropbox.com/scl/fi/* | Direct curl (raw=1) | No |
| Google Photos | photos.app.goo.gl/*, photos.google.com/share/* | URL extraction + =s0 modifier | Yes |
| Google Drive | drive.google.com/file/d/*, drive.google.com/open?id=* | Multi-tier with auth detection | Yes |
Dropbox Fast Path: Direct curl download with no browser overhead—typically 1-2 seconds.
Google Photos Full-Res: Automatically appends =s0 to CDN URLs for maximum resolution.
giil implements a fallback strategy to maximize reliability:
cvws.icloud-content.com, etc.)giil <url> [options]
| Flag | Default | Description |
|------|---------|-------------|
| --output DIR | . | Output directory |
| --preserve | off | Keep original bytes (skip MozJPEG compression) |
| --convert FMT | — | Convert to: jpeg, png, webp |
| --quality N | 85 | JPEG quality 1-100 |
| --base64 | off | Output base64 to stdout (no file saved) |
| --json | off | Output JSON metadata |
| --all | off | Download all photos from album |
| --timeout N | 60 | Page load timeout in seconds |
| --debug | off | Save debug artifacts on failure |
| --verbose | off | Show detailed progress |
| --trace | off | Enable Playwright tracing for deep debugging |
| --print-url | off | Output resolved CDN URL (don't download) |
| --debug-dir DIR | . | Directory for debug artifacts |
| --update | off | Force reinstall dependencies |
giil "https://share.icloud.com/photos/XXX"
# stdout: /current/dir/icloud_20240115_143245.jpg
Scripting:
IMAGE_PATH=$(giil "..." --output ~/Downloads 2>/dev/null)
giil "https://share.icloud.com/photos/XXX" --json
Success:
{
"ok": true,
"schema_version": "1",
"platform": "icloud",
"path": "/absolute/path/to/icloud_20240115_143245.jpg",
"datetime": "2024-01-15T14:32:45.000Z",
"sourceUrl": "https://cvws.icloud-content.com/...",
"method": "network",
"size": 245678,
"width": 4032,
"height": 3024
}
Error:
{
"ok": false,
"schema_version": "1",
"platform": "icloud",
"error": {
"code": "AUTH_REQUIRED",
"message": "Login required - link is not publicly shared",
"remediation": "The file is not publicly shared. The owner must enable public access."
}
}
| Field | Description |
|-------|-------------|
| method | Capture strategy: download, network, element-screenshot, viewport-screenshot, direct |
| error.code | Error code (see Exit Codes) |
| error.remediation | Suggested fix |
# Decode to file
giil "..." --base64 | base64 -d > image.jpg
# Create data URI
echo "data:image/jpeg;base64,$(giil '...' --base64)" > uri.txt
# Pipe to API
giil "..." --base64 | curl -X POST -d @- https://api.example.com/upload
giil "https://share.icloud.com/photos/XXX" --print-url
# stdout: https://cvws.icloud-content.com/B/...
Useful for external downloaders, caching, or debugging.
Download entire shared albums with --all:
giil "https://share.icloud.com/photos/XXX" --all --output ~/album
_001, _002, etc. for ordering# Default
/path/to/album/icloud_20240115_143245_001.jpg
/path/to/album/icloud_20240115_143246_002.jpg
# With --json
{"path": "...001.jpg", "method": "download", "width": 4032, ...}
{"path": "...002.jpg", "method": "network", "width": 3024, ...}
Priority order for filename generation:
DateTimeOriginal (when photo was taken)CreateDateDateTimeDigitizedModifyDate| Platform | Tool | Notes |
|----------|------|-------|
| macOS | sips | Built-in, always available |
| Linux | heif-convert | Requires libheif-examples package |
# Install HEIC support on Linux
sudo apt-get install libheif-examples # Debian/Ubuntu
sudo dnf install libheif-tools # Fedora
By default, giil compresses with MozJPEG for optimal size/quality:
--quality)--preserve to keep original bytesicloud_YYYYMMDD_HHMMSS[_NNN][_counter].jpg
│ │ │
│ │ └── Collision counter (if file exists)
│ └── Album index (--all mode only)
└── Date/time from EXIF or capture time
giil validates downloads through three stages:
Validates HTTP Content-Type matches expected image types.
Verifies binary signature regardless of server claims:
| Format | Magic Bytes |
|--------|-------------|
| JPEG | FF D8 FF |
| PNG | 89 50 4E 47 |
| GIF | 47 49 46 38 |
| WebP | RIFF container with WEBP |
| HEIC/HEIF | ISO base media file (ftyp box) |
Rejects HTML content that indicates an error page instead of an image.
| Code | Name | Description |
|------|------|-------------|
| 0 | Success | Image captured and saved/output |
| 1 | Capture Failure | All capture strategies failed |
| 2 | Usage Error | Invalid arguments or missing URL |
| 3 | Dependency Error | Node.js, Playwright, or Chromium issue |
| 10 | Network Error | Timeout, DNS failure, unreachable host |
| 11 | Auth Required | Login redirect, password required, not publicly shared |
| 12 | Not Found | Expired link, deleted file, 404 |
| 13 | Unsupported Type | Video, Google Doc, or non-image content |
| 20 | Internal Error | Bug in giil (please report!) |
Scripting:
giil "https://share.icloud.com/photos/XXX" 2>/dev/null
case $? in
0) echo "Success!" ;;
10) echo "Network issue - retry later" ;;
11) echo "Link not public - ask owner to share" ;;
12) echo "Link expired" ;;
*) echo "Failed with code $?" ;;
esac
| Variable | Description | Default |
|----------|-------------|---------|
| XDG_CACHE_HOME | Base cache directory | ~/.cache |
| GIIL_HOME | giil runtime directory | $XDG_CACHE_HOME/giil |
| PLAYWRIGHT_BROWSERS_PATH | Custom Chromium cache | $GIIL_HOME/ms-playwright |
| GIIL_NO_GUM | Disable gum styling | unset |
| GIIL_CHECK_UPDATES | Enable update checking | unset |
| Variable | Description | Default |
|----------|-------------|---------|
| DEST | Custom install directory | ~/.local/bin |
| GIIL_SYSTEM | Install to /usr/local/bin | unset |
| GIIL_VERIFY | Verify SHA256 checksum | unset |
| GIIL_VERSION | Install specific version | latest |
| Path | Purpose |
|------|---------|
| ~/.local/bin/giil | Main script |
| ~/.cache/giil/ | Runtime directory |
| ~/.cache/giil/node_modules/ | Playwright, Sharp, exifr |
| ~/.cache/giil/extractor.mjs | Generated Node.js script |
| ~/.cache/giil/ms-playwright/ | Chromium browser cache |
--debug)| File | Contents |
|------|----------|
| giil_debug_<timestamp>.png | Full-page screenshot |
| giil_debug_<timestamp>.html | Page DOM content |
| Phase | First Run | Subsequent | |-------|-----------|------------| | Chromium download | 30-60s | Skipped (cached) | | Browser launch | 2-3s | 2-3s | | Page load | 3-10s | 3-10s | | Image capture | 1-5s | 1-5s | | Total | 40-80s | 5-15s |
Dropbox: 1-2 seconds (direct curl, no browser).
The link isn't publicly shared. Owner must enable public access in their cloud settings.
Increase timeout: giil "..." --timeout 120
Run with --debug to see page state. Report issue with debug artifacts.
sudo apt-get install libheif-examples # Debian/Ubuntu
sudo dnf install libheif-tools # Fedora
giil "..." --update
# Or manually:
cd ~/.cache/giil && npx playwright install --with-deps chromium
# Verbose output
giil "..." --verbose
# Debug artifacts on failure
giil "..." --debug
# Playwright trace (generates trace.zip)
giil "..." --trace
npx playwright show-trace ~/.cache/giil/trace.zip
# One-liner (recommended)
curl -fsSL "https://raw.githubusercontent.com/Dicklesworthstone/giil/main/install.sh?v=3.0.0" | bash
# Verified installation
GIIL_VERIFY=1 curl -fsSL .../install.sh | bash
# System-wide
GIIL_SYSTEM=1 curl -fsSL .../install.sh | bash
# Manual
curl -fsSL https://raw.githubusercontent.com/Dicklesworthstone/giil/main/giil -o ~/.local/bin/giil
chmod +x ~/.local/bin/giil
rm ~/.local/bin/giil
rm -rf ~/.cache/giil
rm -rf ~/.cache/ms-playwright # If no other Playwright tools
| Tool | Integration | |------|-------------| | Claude Code | Download screenshots for visual debugging via SSH | | NTM | Share images between multi-agent sessions | | Agent Mail | Attach downloaded images to agent messages | | CASS | Search sessions that used giil for image context |
development
Apple Human Interface Guidelines for content display components. Use this skill when the user asks about charts component, collection view, image view, web view, color well, image well, activity view, lockup, data visualization, content display, displaying images, rendering web content, color pickers, or presenting collections of items in Apple apps. Also use when the user says how should I display charts, what's the best way to show images, should I use a web view, how do I build a grid of items, what component shows media, or how do I present a share sheet. Cross-references: hig-foundations for color/typography/accessibility, hig-patterns for data visualization patterns, hig-components-layout for structural containers, hig-platforms for platform-specific component behavior.
tools
Automate HelpDesk tasks via Rube MCP (Composio): list tickets, manage views, use canned responses, and configure custom fields. Always search tools first for current schemas.
testing
Expert Haskell engineer specializing in advanced type systems, pure functional design, and high-reliability software. Use PROACTIVELY for type-level programming, concurrency, and architecture guidance.
tools
GraphQL gives clients exactly the data they need - no more, no less. One endpoint, typed schema, introspection. But the flexibility that makes it powerful also makes it dangerous. Without proper controls, clients can craft queries that bring down your server. This skill covers schema design, resolvers, DataLoader for N+1 prevention, federation for microservices, and client integration with Apollo/urql. Key insight: GraphQL is a contract. The schema is the API documentation. Design it carefully.