Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
{
"name": "pixelvault",
"description": "Upload, manage, and serve images via PixelVault β€” agent-first image hosting for developers and AI coding agents.",
"version": "1.1.0",
"version": "1.2.0",
"author": {
"name": "PixelVault",
"email": "hello@pixelvault.dev"
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "pixelvault",
"description": "Upload, manage, and serve images via PixelVault β€” agent-first image hosting for developers and AI coding agents.",
"version": "1.1.0",
"version": "1.2.0",
"author": {
"name": "PixelVault",
"email": "hello@pixelvault.dev"
Expand Down
25 changes: 24 additions & 1 deletion skills/pixelvault-upload/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,13 @@ pixelvault upload <file> --folder <folder>

# Multiple files (shell glob)
pixelvault upload *.png --folder screenshots

# Private β€” returns a signed URL only holders of the link can open
pixelvault upload mockup.png --private
pixelvault upload mockup.png --private --expires 7d
```

4. **Report** β€” The CLI prints one CDN URL per line to stdout. Report these URLs back to the user. Each URL is permanent and globally cached.
4. **Report** β€” The CLI prints one CDN URL per line to stdout. Report these URLs back to the user. A public URL is permanent and globally cached; a `--private` URL is a signed link that expires (default 7 days).

## Output Contract

Expand All @@ -58,6 +62,7 @@ pixelvault upload *.png --folder screenshots
| `command not found: pixelvault` | Tell user to `npm install -g pixelvault-cli` |
| `No API key configured` | Tell user to run `/pixelvault-setup` or set `PIXELVAULT_API_KEY` |
| `401 Unauthorized` | API key is invalid β€” tell user to run `pixelvault login` |
| `402 ... private images` | Free plan's private-image limit reached β€” tell user to delete some or upgrade |
| `413 Payload Too Large` | File exceeds plan limit (5 MB free, 50 MB paid) |
| `415 Unsupported Media Type` | File is not a supported image format |

Expand All @@ -74,8 +79,26 @@ pixelvault upload diagram.svg --json

# Bulk upload
pixelvault upload ./assets/*.png --folder assets

# Private mockup, link valid for 24 hours
pixelvault upload mockup.png --private --expires 24h
# β†’ https://img.pixelvault.dev/proj_abc/cp/i/img_xyz.png?token=…&expires=…
```

## Private uploads

Use `--private` when the image shouldn't be publicly guessable β€” an internal
mockup, a CI screenshot, anything you only want to share via the link itself.
The returned URL is a **signed** URL: it works for anyone who has the full link
and stops working when it expires.

- `--private` alone β†’ default lifetime (7 days).
- `--private --expires <duration>` β†’ custom lifetime. Accepts `30m`, `12h`,
`7d`, or a number of seconds. Min 60s, max 30d.
- Requires a **secret** API key (the default from `pixelvault login` / setup);
publishable keys can't create private uploads.
- `--expires` only applies together with `--private`.

## Transform the result

Every returned URL supports on-the-fly transforms β€” just append query params (no
Expand Down