Labsco
raullenchai logo

vnsh

β˜… 166

from raullenchai

Ephemeral encrypted file sharing for AI. Client-side AES-256 encryption, 24h auto-vaporization.

πŸ”₯πŸ”₯πŸ”₯βœ“ VerifiedFreeAdvanced setup

vnsh logo

vnsh

The Ephemeral Dropbox for AI

Website β€’ Quick Start β€’ How It Works β€’ Self-Hosting β€’ API


What is vnsh?

vnsh demo

Stop pasting walls of text into Claude. Pipe your logs, diffs, and images into a secure, host-blind URL. The server sees nothing. The data vaporizes in 24 hours.

# Pipe anything to vnsh, get a secure link
git diff | vn
# https://vnsh.dev/v/aBcDeFgHiJkL#R_sI4DHZ_6jNq6yqt2ORRDe9QZ5xQB6hIRLWHVFa8v8

Handles any context your AI needs:

  • πŸ–ΌοΈ Screenshots β€” UI bugs, error dialogs, terminal output
  • πŸ“œ Logs β€” 5000+ lines of server errors (too long for copy-paste)
  • πŸ”„ Git Diffs β€” Complex PR reviews, multi-file changes
  • πŸ“¦ Binaries β€” PDFs, CSVs, config files, database dumps
  • πŸ”§ Debug Context β€” Stack traces, environment dumps, crash reports

Philosophy

"Built for the ephemeral nature of AI workflows. Once your session is done, the data should be too."

Unlike Dropbox or pastebins, vnsh implements a Host-Blind Architecture with automatic vaporization:

LayerWhat Happens
EncryptionAES-256-CBC encryption happens entirely on your device
TransportDecryption keys travel only in the URL fragment (#secret) β€” never sent to servers
StorageServer stores encrypted binary blobs β€” host-blind, no access to contents
VaporizationData vaporizes after 24 hours. No history. No leaks.

How It Works

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              YOUR DEVICE                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Data   │───▢│ AES-256-CBC  │───▢│  Encrypted Blob + URL Fragment  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚  Encryption  β”‚    β”‚  https://vnsh.dev/v/id#k=...    β”‚  β”‚
β”‚                 β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                           β”‚
                           Only encrypted blob sent to server
                           (key stays in URL fragment, never transmitted)
                                           β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                           VNSH SERVER (BLIND)                             β”‚
β”‚                                                                           β”‚
β”‚   Receives: [encrypted binary blob]                                       β”‚
β”‚   Stores:   [encrypted binary blob]                                       β”‚
β”‚   Knows:    upload time, size, expiry                                     β”‚
β”‚   Cannot:   decrypt, identify content type, read keys                     β”‚
β”‚                                                                           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

URL Structure (v2 β€” compact format)

https://vnsh.dev/v/aBcDeFgHiJkL#R_sI4DHZ_6jNq6yqt2ORRDe9QZ5xQB6hIRLWHVFa8v8jYCFqgQIbsRJrtJze_nL5
                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                  12-char ID     64-char base64url secret (key+iv, never sent to server)

The v2 format reduces URL length by ~40% (from ~160 to ~95 characters). Legacy v1 URLs (#k=...&iv=...) are still fully supported.

Self-Hosting

vnsh runs on Cloudflare Workers with R2 storage. Deploy your own instance:

Prerequisites

Deploy

# Clone the repository
git clone https://github.com/raullenchai/vnsh.git
cd vnsh/worker

# Install dependencies
npm install

# Create R2 bucket
wrangler r2 bucket create vnsh-store

# Deploy
wrangler deploy

Configuration

Edit wrangler.toml to customize:

name = "vnsh"

[[r2_buckets]]
binding = "VNSH_STORE"
bucket_name = "vnsh-store"  # Your R2 bucket name

[[kv_namespaces]]
binding = "VNSH_META"
id = "your-kv-namespace-id"  # Create with: wrangler kv namespace create VNSH_META

API Reference

POST /api/drop

Upload an encrypted blob.

curl -X POST https://vnsh.dev/api/drop \
  -H "Content-Type: application/octet-stream" \
  --data-binary @encrypted.bin

Query Parameters:

ParameterTypeDescription
ttlnumberTime-to-live in hours (1-168, default: 24)
pricenumberPayment required to access (x402 protocol)

Response:

{
  "id": "a1b2c3d4-5678-90ab-cdef-1234567890ab",
  "expires": "2025-01-25T00:00:00.000Z"
}

GET /api/blob/:id

Download an encrypted blob.

curl https://vnsh.dev/api/blob/a1b2c3d4-5678-90ab-cdef-1234567890ab

Response Codes:

CodeDescription
200Success β€” returns encrypted blob
402Payment required
404Not found
410Expired

GET /v/:id

Web viewer (serves HTML directly to preserve URL fragment with encryption keys).

GET /i

CLI installation script.

GET /pipe

Zero-install pipe upload script. Returns a shell script that encrypts stdin and uploads it.

cat file.log | bash <(curl -sL vnsh.dev/pipe)

Query Parameters:

ParameterTypeDescription
ttlnumberTime-to-live in hours (1-168, default: 24)

GET /claude

Claude Code MCP integration installer script.

Security Model

What vnsh Protects Against

βœ… Server Compromise β€” Even with full server access, attackers cannot decrypt blobs βœ… Database Leaks β€” Stored data is indistinguishable from random noise βœ… Traffic Analysis β€” No content-type information stored βœ… Subpoenas β€” Server operator cannot produce plaintext (doesn't have keys)

What vnsh Does NOT Protect Against

❌ URL Sharing β€” Anyone with the full URL (including #fragment) can decrypt ❌ Client Compromise β€” Malware on your device can intercept before encryption ❌ MITM on Upload Page β€” An attacker serving malicious JavaScript could intercept

Recommendations

  • Use vnsh over HTTPS only
  • Don't share full URLs in public channels (Slack, Discord, Twitter)
  • For maximum security, self-host the worker

Project Structure

vnsh/
β”œβ”€β”€ worker/          # Cloudflare Worker (storage API + web viewer)
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   └── index.ts # Main worker code
β”‚   └── test/
β”‚       └── api.test.ts
β”œβ”€β”€ mcp/             # MCP Server (Claude Code integration)
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ index.ts # MCP tool handlers
β”‚   β”‚   └── crypto.ts # Encryption utilities
β”‚   └── package.json
β”œβ”€β”€ extension/       # Chrome Extension (AI debug sharing)
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ lib/     # Shared crypto, API, storage
β”‚   β”‚   β”œβ”€β”€ background/ # Service worker
β”‚   β”‚   β”œβ”€β”€ content/    # Link detector + tooltip
β”‚   β”‚   └── popup/      # Extension popup UI
β”‚   └── tests/
β”œβ”€β”€ cli/
β”‚   β”œβ”€β”€ vn           # Bash CLI script
β”‚   β”œβ”€β”€ npm/         # NPM package (vnsh)
β”‚   β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”‚   β”œβ”€β”€ cli.ts
β”‚   β”‚   β”‚   └── crypto.ts
β”‚   β”‚   └── package.json
β”‚   └── install.sh   # Shell installer
β”œβ”€β”€ homebrew-tap/    # Homebrew formula
β”‚   └── Formula/
β”‚       └── vnsh.rb
└── docs/            # Documentation

Packages

PackageDescriptionInstall
vnshCLI toolnpx vnsh or npm i -g vnsh
vnsh-mcpMCP server for Claudenpx vnsh-mcp
vnsh extensionChrome ExtensionChrome Web Store
upload-to-vnshGitHub Action for CI/CDuses: raullenchai/upload-to-vnsh@v1
homebrew-vnshHomebrew tapbrew install raullenchai/vnsh/vnsh

Development

# Clone
git clone https://github.com/raullenchai/vnsh.git
cd vnsh

# Install dependencies
npm install
cd worker && npm install
cd ../mcp && npm install

# Run tests
npm test                          # Worker + MCP tests
cd extension && npm test          # Extension tests (48 tests, 93%+ coverage)
cd extension && npm run test:cov  # Extension tests with coverage

# Start local worker
cd worker && npm run dev

# Build MCP server
cd mcp && npm run build

# Build extension
cd extension && npm install && npm run build
# Load extension/dist/ as unpacked in chrome://extensions/