Skip to content
Back to skills

Upload File

ASecurity

Upload a local file, screenshot, or piped output to the i.mia.cx R2 bucket and get back a public URL. Use when the user asks to upload, host, or share a file, wants a link to an image, screenshot, log, diff, or report, or when a result is easier to hand over as a URL than as inline text. Also covers listing and deleting previously uploaded objects, and configuring ShareX or ishare clients.

  • 3 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 29, 2026
ai-agentsbashgit

Works with

  • cli

Security analysis

A100/100

Pro scans all 5 files and shows the line behind each finding

Scanned September 29, 2026

npx -y skills add mia-cx/skills --skill upload-file --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Upload File?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Upload File
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/mia-cx-upload-file/badge)](https://www.skillsdirectory.com/skills/mia-cx-upload-file)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: upload-file
description: >-
  Upload a local file, screenshot, or piped output to the i.mia.cx R2 bucket and
  get back a public URL. Use when the user asks to upload, host, or share a file,
  wants a link to an image, screenshot, log, diff, or report, or when a result is
  easier to hand over as a URL than as inline text. Also covers listing and
  deleting previously uploaded objects, and configuring ShareX or ishare clients.
disable-model-invocation: true
---

# File Upload

`scripts/upload.sh` wraps the [Cherry/ShareX-R2-Cloudflare-Workers](https://github.com/Cherry/ShareX-R2-Cloudflare-Workers) worker deployed at `https://i.mia.cx`. It prints the public URL on stdout and nothing else, so it composes directly into other commands.

## Commands

```bash
upload.sh screenshot.png                  # → https://i.mia.cx/file/2026/08/screenshot-a1b2c3.png
upload.sh report.pdf --name q3-report.pdf # exact key, no random suffix (overwrites on repeat)
git diff | upload.sh - --name fix.diff    # stdin; --name supplies the extension
upload.sh out.log --json                  # full worker response, incl. deleteUrl
upload.sh --list                          # R2 listing as JSON
upload.sh --delete 2026/08/screenshot-a1b2c3.png
```

Uploads land under `YYYY/MM/`, and the worker serves them from `/file/<key>`. A delete key is the bare `YYYY/MM/name` — no `/file/` prefix — so take it from `--list` or by stripping `/file/` off a returned URL. Setting `CUSTOM_PUBLIC_BUCKET_DOMAIN` on the worker would drop the prefix and serve from the bucket domain directly.

## Usage notes

- Default naming is `<slugified-basename>-<6 hex>.<ext>`, so uploading the same file twice yields two distinct URLs. Reach for `--name` only when a stable, guessable URL is the point.
- Content type comes from `file --mime-type`, and the worker stores it on the object, so browsers render uploads correctly even when the key has no extension.
- Prefer piping over temp files when the content is generated: `pnpm test 2>&1 | upload.sh - --name test-failures.txt`.
- `--json` exposes `deleteUrl`, which embeds the auth key in a query string. Never paste that into a PR, issue, or chat message — delete via `--delete` instead.
- Exit codes: 1 worker error, 64 bad usage, 66 missing file, 78 missing config.

## Config

Config lives at `~/.config/i-upload/config` — deliberately outside this repo, which is public. Installing on a new host is a copy and a paste:

```sh
mkdir -p ~/.config/i-upload
cp config.example ~/.config/i-upload/config && chmod 600 ~/.config/i-upload/config
$EDITOR ~/.config/i-upload/config   # set UPLOAD_KEY to the worker's AUTH_KEY
```

`config.example` documents every variable. Env vars of the same name win over the file. Needs `jq` (`brew install jq` on macOS); `curl` and `file` ship with the OS.

On a 401 the key is out of sync with the worker's `AUTH_KEY` secret. Never commit the key — the skill's `.gitignore` blocks a stray `config` here, but the real answer is that it belongs in `~/.config`.

## Desktop clients

See `references/clients.md` for the ShareX `.sxcu` and ishare `.iscu` uploader definitions pointing at the same worker.

Files in this skill

  • .gitignore170 B
  • SKILL.md3.1 KB
  • config.example903 B
  • references/clients.md1.6 KB
  • scripts/upload.sh3.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.