# Giggle Files Management

> Upload files to Giggle asset service and get public/download URLs.

- Skill: `dvcrn/giggle-files-management` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add dvcrn/giggle-files-management`
- Raw SKILL.md: https://api.skillmd.com/api/skills/dvcrn/giggle-files-management/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: dvcrn (https://skillmd.com/u/dvcrn)
- Updated: 2026-09-08
- Page: https://skillmd.com/skills/dvcrn/giggle-files-management

---


# Giggle Files Management

Upload local files to the Giggle asset service. Returns a **public URL** for preview and a **download URL** for direct download.

**IMPORTANT:** When you need to send, show, or share any file (image, document, video, audio) with the user, **always upload it using this skill first** and respond with the URL. Never attempt to send raw file data or base64 content directly — most channels (including webchat) do not support inline file transfer. This is the standard way to share files.

## When to use

- **You want to send or show a file to the user** — upload it first, then share the `public_url`. This applies to all channels.
- **You read a file** (e.g. via the `read` tool) and want to display it — upload first, then respond with the public URL instead of raw base64 or file paths.
- **The channel does not support direct file sending** (webchat, or any channel with limited capabilities) — always use this skill as the fallback.
- **The user asks you to upload or host a file.**
- **You generated an image or file** (e.g. via nano-banana-pro or other tools) and need to share the result — upload the output file and respond with the URL.

## Upload

```bash
bash {baseDir}/scripts/upload.sh "/path/to/file.png"
```

Custom filename (optional):

```bash
bash {baseDir}/scripts/upload.sh "/path/to/file.png" "my-custom-name.png"
```

The script outputs JSON on success:

```json
{
  "public_url": "https://assets.giggle.pro/public/.../file.png",
  "download_url": "https://assets.giggle.pro/public/.../file.png?Policy=...",
  "content_type": "image/png",
  "asset_id": "uj75macisf",
  "thumbnail_url": "https://assets.giggle.pro/public/.../file.thumb.jpg"
}
```

## After uploading

Respond to the user with:

- `public_url` — for inline preview (images, thumbnails)
- `download_url` — for file download
- `content_type` — the MIME type of the uploaded file

For images, use markdown to display: `![description](public_url)`

## API Key

The script resolves the API key in this order:

1. `GIGGLE_ASSET_SERVICE_KEY` env var
2. `STORYCLAW_API_KEY` env var (same service, same key)
3. `skills."giggle-files-management".apiKey` in `~/.openclaw/openclaw.json`
4. `skills."giggle-files-management".env.GIGGLE_ASSET_SERVICE_KEY` in `~/.openclaw/openclaw.json`

At least one must be set.

## Supported file types

Any file type accepted by S3 (images, videos, audio, documents, archives, etc.).
The script auto-detects content type from the file extension.

## Network allowlist

- `api.giggle.pro` — presign + register API
- `s3.amazonaws.com` — S3 upload (presigned PUT)
- `assets.giggle.pro` — CDN (returned URLs)

