beta
gooi.io
/ agents

File sharing for agents & CLI

One script. Your agent encrypts files locally and uploads them via curl. The server never sees the content.

AES-256-GCM · Zero-knowledge · No account needed

Quick start

Bash CLI bash + curl + openssl + python3 or node

$ curl -sO https://agents.gooi.io/gooi && chmod +x gooi
$ ./gooi photo.jpg
▸ Uploaden: photo.jpg (2 MiB, 1 chunk(s))
▸ Crypto backend: node
▸   Chunk 1/1
✓ Upload voltooid

  https://gooi.io/d/xR9kLm3pQw7n#base64urlkey
# Auto-detects python3+cryptography or node.js.

Python SDK python3 + cryptography

$ curl -sO https://agents.gooi.io/gooi-sdk.py
$ python3 gooi-sdk.py --file photo.jpg

# Or as a module:
>>> from gooi_sdk import upload
>>> result = upload("photo.jpg")
>>> print(result["url"])

Node.js SDK node 16+

$ curl -sO https://agents.gooi.io/gooi-sdk.mjs
$ node gooi-sdk.mjs --file photo.jpg

// Or as a module:
import { upload } from './gooi-sdk.mjs';
const result = await upload({ file: 'photo.jpg' });
1

Encrypt

File is encrypted on your machine with AES-256-GCM before anything is sent.

2

Upload

Encrypted data is uploaded to gooi.io in 64 MiB chunks via curl.

3

Share

You get a link. The decryption key is in the #fragment — it never reaches the server.

For AI assistants & agents

Point your agent to this page. Even simple models can follow these instructions.

HOW TO SHARE A FILE VIA GOOI.IO
================================

You are an agent that needs to share a file with a user.
gooi.io lets you upload an encrypted file and get a shareable link.
The file is encrypted on your machine — the server cannot read it.

Pick the option that fits your environment:

OPTION A — Bash CLI (recommended for shell agents, CI/CD, servers):

    curl -sO https://agents.gooi.io/gooi && chmod +x gooi
    ./gooi /path/to/file.ext

    Requires: bash, curl, openssl, and one of:
      - python3 + cryptography (pip install cryptography), OR
      - node.js (v16+)

    The CLI auto-detects which crypto backend is available.

    Example output:
      ▸ Uploaden: report.pdf (2 MiB, 1 chunk(s), sha256:a1b2c3d4...)
      ▸ Crypto backend: node
      ▸   Chunk 1/1
      ✓ Upload voltooid
        https://gooi.io/d/xR9kLm3pQw7n#base64urlkey

OPTION B — Python SDK (for ChatGPT, code interpreters, Python agents):

    curl -sO https://agents.gooi.io/gooi-sdk.py
    python3 gooi-sdk.py --file /path/to/file.ext

    Or as a module (e.g. in a code interpreter sandbox):
        from gooi_sdk import upload
        result = upload("/path/to/file.ext")
        print(result["url"])

    Requires: python3 + cryptography (pip install cryptography)

OPTION C — Node.js SDK:

    curl -sO https://agents.gooi.io/gooi-sdk.mjs
    node gooi-sdk.mjs --file /path/to/file.ext

    Or as a module:
        import { upload } from './gooi-sdk.mjs';
        const result = await upload({ file: '/path/to/file.ext' });

    Requires: node.js 16+

THE RESULT — a shareable URL:

    https://gooi.io/d/abc123#base64urlkey

    Share this URL with the user. Anyone with the link can
    download and decrypt the file in their browser. No account needed.

NOTES:
- Max file size: 5 GB (up to 100 GB with a VIG API key)
- Files expire after 24 hours (up to 30 days with VIG)
- For files >5 GiB, pass --api-key or set GOOI_API_KEY.
  In non-interactive use (pipes, cron, --json) the CLI exits cleanly
  with exit code 3 instead of prompting.
- The #fragment (after #) is the decryption key — it never goes to the server
- All three options produce identical encryption, compatible with the browser

Requirements

Pick whichever fits your environment. Each option is self-contained.

🐍
Python SDKpython3 + cryptography
Bash CLIbash + curl + openssl + python3/node
Node.js SDKnode 16 or newer

How encryption works

The gooi script produces files in the GOOI binary format v1, identical to what the browser client generates. Files encrypted by the script are fully compatible with the browser-based decryption at gooi.io.

GOOI Binary Format v1 — 24-byte header + encrypted chunks

Bytes  0-3    Magic "GOOI"
Byte   4      Version: 0x01
Byte   5      Chunk size exponent: 26 (= 64 MiB)
Bytes  6-11   Base IV (6 random bytes)
Bytes  12-19  Original file size (uint64 big-endian)
Bytes  20-23  Chunk count (uint32 big-endian)
Bytes  24+    Encrypted chunks: [ciphertext + 16-byte GCM tag]

IV per chunk = baseIV(6B) + chunkIndex(4B BE) + 0x0000(2B) = 12 bytes
Key          = random 256-bit AES key, placed in URL #fragment