ClawSkills logoClawSkills

Send Me My Files - R2 upload with short lived signed urls

Upload files to Cloudflare R2, AWS S3, or any S3-compatible storage and generate secure presigned download links with configurable expiration.

Introduction

# Send Me My Files - R2 Upload with Short Lived Signed URLs

Upload files to Cloudflare R2 or any S3-compatible storage and generate presigned download links.

## Features

- Upload files to R2/S3 buckets - Generate presigned download URLs (configurable expiration) - Support for any S3-compatible storage (R2, AWS S3, MinIO, etc.) - Multiple bucket configurations - Automatic content-type detection

## Configuration

Create `~/.r2-upload.yml` (or set `R2_UPLOAD_CONFIG` env var):

```yaml # Default bucket (used when no bucket specified) default: my-bucket

# Bucket configurations buckets: my-bucket: endpoint: https://abc123.r2.cloudflarestorage.com access_key_id: your_access_key secret_access_key: your_secret_key bucket_name: my-bucket public_url: https://files.example.com # Optional: custom domain region: auto # For R2, use "auto" # Additional buckets personal: endpoint: https://xyz789.r2.cloudflarestorage.com access_key_id: ... secret_access_key: ... bucket_name: personal-files region: auto ```

### Cloudflare R2 Setup

1. Go to Cloudflare Dashboard → R2 2. Create a bucket 3. Go to R2 API Tokens: `https://dash.cloudflare.com/<ACCOUNT_ID>/r2/api-tokens` 4. Create a new API token - **Important:** Apply to specific bucket (select your bucket) - Permissions: Object Read & Write 5. Copy the Access Key ID and Secret Access Key 6. Use endpoint format: `https://<account_id>.r2.cloudflarestorage.com` 7. Set `region: auto`

### AWS S3 Setup

```yaml aws-bucket: endpoint: https://s3.us-east-1.amazonaws.com access_key_id: ... secret_access_key: ... bucket_name: my-aws-bucket region: us-east-1 ```

## Usage

### Upload a file

```bash r2-upload /path/to/file.pdf # Returns: https://files.example.com/abc123/file.pdf?signature=... ```

### Upload with custom path

```bash r2-upload /path/to/file.pdf --key uploads/2026/file.pdf ```

### Upload to specific bucket

```bash r2-upload /path/to/file.pdf --bucket personal ```

### Custom expiration (default: 5 minutes)

```bash r2-upload /path/to/file.pdf --expires 24h r2-upload /path/to/file.pdf --expires 1d r2-upload /path/to/file.pdf --expires 300 # seconds ```

### Public URL (no signature)

```bash r2-upload /path/to/file.pdf --public ```

## Tools

- `r2_upload` - Upload file and get presigned URL - `r2_list` - List recent uploads - `r2_delete` - Delete a file

## Environment Variables

- `R2_UPLOAD_CONFIG` - Path to config file (default: `~/.r2-upload.yml`) - `R2_DEFAULT_BUCKET` - Override default bucket - `R2_DEFAULT_EXPIRES` - Default expiration in seconds (default: 300 = 5 minutes)

## Notes

- Uploaded files are stored with their original filename unless `--key` is specified - Automatic UUID prefix added to prevent collisions (e.g., `abc123/file.pdf`) - Content-Type automatically detected from file extension - Presigned URLs expire after the configured duration

More Products