Back to home

$ Documentation

Everything you need to know about using uldl.sh from the terminal.

#Getting Started

uldl.sh is a text and file upload service optimized for terminal usage. Upload files via curl, get a shareable URL back. No browser required.

quickstart.sh
# Upload text from stdin
$echo "hello world" | curl -X POST https://uldl.sh/yourname -d @-
https://uldl.sh/yourname/abc123
# Download it back
$curl https://uldl.sh/yourname/abc123
hello world

#Uploading

There are three ways to upload content to uldl.sh. All methods POST to your username endpoint.

Method 1: Pipe from stdin

Pipe any command output directly to uldl.sh.

stdin.sh
$echo "hello world" | curl -X POST https://uldl.sh/yourname -d @-
https://uldl.sh/yourname/abc123
$cat script.py | curl -X POST https://uldl.sh/yourname -d @-
https://uldl.sh/yourname/def456

Method 2: Multipart file upload

Upload a file with its original filename preserved.

multipart.sh
$curl -X POST https://uldl.sh/yourname -F file=@document.md
https://uldl.sh/yourname/ghi789

Method 3: Raw body upload

Upload file contents directly as the request body.

raw.sh
$curl -X POST https://uldl.sh/yourname --data-binary @config.yaml
https://uldl.sh/yourname/jkl012

#Downloading

Access your blobs via GET request to the returned URL.

download.sh
# Download to stdout
$curl https://uldl.sh/yourname/abc123
# Save to file
$curl -o output.txt https://uldl.sh/yourname/abc123
# Follow filename from server
$curl -OJ https://uldl.sh/yourname/abc123

#Request Headers

Customize your uploads with these optional headers.

HeaderDescriptionExample
X-TitleSet blob title"My Config File"
X-DescriptionSet description"Production settings"
X-Visibilitypublic or private"private"
X-LanguageForce syntax highlighting"python"
X-CategorySet category"config"
X-TagsComma-separated tags"docker,config"
X-FilenameOverride filename (raw uploads)"script.sh"
headers.sh
$curl -X POST https://uldl.sh/yourname \ -H "X-Title: Production Config" \ -H "X-Description: Server configuration" \ -H "X-Visibility: private" \ -H "X-Tags: config,production" \ -F file=@config.yaml
https://uldl.sh/yourname/mno345

#Visibility & Privacy

Blobs are private by default. Public blobs can be accessed by anyone with the URL. Private blobs require your authentication key.

visibility.sh
# Upload as public
$curl -X POST https://uldl.sh/yourname -H "X-Visibility: public" -d @-
# Access private blob with key
$curl "https://uldl.sh/yourname/abc123?key=$ULDL_KEY"

#Authentication

Your access key is a unique 12-character token generated when you sign up. Find it in your dashboard by clicking the curl command button. Use it to access private blobs and delete blobs.

auth.sh
# Set as environment variable
$export ULDL_KEY="xHnSfR01YZb9"
# Use for private access
$curl "https://uldl.sh/yourname/private-blob?key=$ULDL_KEY"

#Versioning

Every blob maintains a version history. When you update a blob through the dashboard, a new version is created. The latest version is always served by default.

Version history can be viewed and managed from your dashboard.

#Deleting Blobs

Delete blobs via DELETE request with your authentication key.

delete.sh
$curl -X DELETE "https://uldl.sh/yourname/abc123?key=$ULDL_KEY"
Deleted

This removes the blob and all its versions. The storage space is immediately freed.

#Response Headers

uldl.sh returns useful metadata in response headers.

HeaderDescription
X-Blob-IdUnique blob identifier
X-SlugURL slug
X-Storage-UsedCurrent storage usage (bytes)
X-Storage-RemainingRemaining quota (bytes)
X-Storage-FreedBytes freed on delete
X-Blob-TitleBlob title (on download)
headers-response.sh
$curl -I https://uldl.sh/yourname/abc123
HTTP/2 200
content-type: text/plain
x-blob-id: blob_123...
x-blob-title: My Config

#Error Handling

uldl.sh uses standard HTTP status codes.

StatusMessageCause
400No file providedMultipart request missing file
400Empty fileZero-byte upload
401UnauthorizedMissing/invalid key for private blob
404User not foundInvalid username
404Not foundInvalid slug
413File too largeExceeds 4.5MB limit
507Storage quota exceededUser quota full
check-status.sh
$curl -w "%{http_code}" -o /dev/null -s https://uldl.sh/yourname/abc123
200

#Limits & Quotas

Current service limits:

4.5MB
max file size
250MB
free storage
Unlimited
uploads per day

#Real-World Examples

Common use cases and shell integrations.

Share error logs

logs.sh
$tail -100 /var/log/app.log | curl -X POST https://uldl.sh/yourname \ -H "X-Title: App Error Log" \ -H "X-Tags: logs,error" \ -d @-

Share command output

kubectl.sh
$kubectl get pods | curl -X POST https://uldl.sh/yourname -d @-

Share git diff

git.sh
$git diff | curl -X POST https://uldl.sh/yourname \ -H "X-Title: Feature Branch Diff" \ -H "X-Language: diff" \ -d @-

Shell alias

alias.sh
# Add to ~/.bashrc or ~/.zshrc
$alias share='curl -X POST https://uldl.sh/yourname -d @-'
# Then use it
$echo "quick note" | share
https://uldl.sh/yourname/xyz789

Private environment template

env.sh
$curl -X POST https://uldl.sh/yourname \ -H "X-Visibility: private" \ -H "X-Title: Env Template" \ -F file=@.env.example