Guía de uso

← Home

Inicio rápido

# enviar un archivo — contraseña generada automáticamente, imprime enlace + contraseña
$ ttl send secret.pdf
No password provided. Generate one? [Y/n]:
Generated password: aB3kL9mX
·✧★◉ Thank goodness, secret.pdf is in orbit (1.2 MB)
IMPORTANT! Save your password — required to download and decrypt the file.
Password: aB3kL9mX
https://ttl.space/aBcDeFgHiJ

# descargar — solicita la contraseña de forma interactiva
$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, secret.pdf landed safe and sound (1.2 MB)

El CLI se encarga del cifrado, la subida, la descarga y el descifrado. El servidor nunca ve tu contraseña ni tus datos en texto plano.

Instalación

Homebrew (macOS)

$ brew install tweenietomatoes/ttl/ttl

Scoop (Windows)

$ scoop bucket add ttl https://github.com/tweenietomatoes/scoop-ttl
$ scoop install ttl

Binario precompilado

# descargar para tu plataforma desde las versiones publicadas
$ curl -Lo ttl.tar.gz \
  https://github.com/tweenietomatoes/ttl/releases/latest/download/ttl_linux_amd64.tar.gz
$ tar xzf ttl.tar.gz && sudo mv ttl /usr/local/bin/

Go install

$ go install github.com/tweenietomatoes/ttl/cmd/ttl@latest

Desde el código fuente

$ git clone https://github.com/tweenietomatoes/ttl
$ cd ttl && go build -o ttl ./cmd/ttl/
$ sudo mv ttl /usr/local/bin/

Verificar

$ ttl version
ttl v1.3.0

Envío de archivos

Envío básico

# generar contraseña automáticamente, TTL predeterminado de 7d
$ ttl send report.xlsx

Cuando no se proporciona contraseña en una terminal, el CLI pregunta:

No password provided. Generate one? [Y/n]:

Pulsa Enter o escribe y para generar automáticamente.

Contraseña personalizada

$ ttl send -p mySecretPass -t 1h document.pdf

Destruir tras lectura

# el archivo se elimina permanentemente después de la primera descarga
$ ttl send -b photo.jpg

TTL personalizado

$ ttl send -t 5m temp-credentials.txt   # expira en 5 minutos
$ ttl send -t 30m meeting-link.txt      # expira en 30 minutos
$ ttl send -t 6h backup.tar.gz          # expira en 6 horas
$ ttl send -t 1d daily-report.pdf       # expira en 1 día
$ ttl send -t 3d project-archive.zip    # expira en 3 días
$ ttl send -t 5d design-assets.zip      # expira en 5 días
$ ttl send report.xlsx                  # expira en 7 días (predeterminado)

Descarga de archivos

Interactiva (terminal)

$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, document.pdf landed safe and sound (4.2 MB)

La contraseña no se muestra en la terminal. El nombre de archivo original se conserva.

Solo token

# puedes usar solo el token de 10 caracteres en lugar de la URL completa
$ ttl get aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, document.pdf landed safe and sound (4.2 MB)

Directorio de salida

$ ttl get -o ~/Downloads aBcDeFgHiJ

Por defecto, los archivos se guardan en el directorio actual. Usa -o / --output para especificar otro directorio.

Con flag de contraseña

$ ttl get -p mySecretPass https://ttl.space/aBcDeFgHiJ

Navegador

También puede descargar y descifrar archivos en su navegador visitando el enlace directamente. La interfaz web usa la misma biblioteca de cifrado y solicita su contraseña. No se requiere instalación de software.

Gestión de contraseñas

La contraseña es la semilla de la clave de cifrado. Nunca sale de tu dispositivo y nunca se envía al servidor. Hay cinco formas de proporcionarla:

1. Generación automática (solo al enviar)

$ ttl send notes.txt
No password provided. Generate one? [Y/n]: y
Generated password: aB3kL9mX

Genera una contraseña criptográficamente aleatoria de 8 caracteres del conjunto [0-9A-Za-z]. Solo disponible durante send en una terminal.

2. Solicitud interactiva

$ ttl send notes.txt
No password provided. Generate one? [Y/n]: n
Enter password: ********
Confirm password: ********

$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********

La contraseña no se muestra. Durante send, primero se ofrece la generación automática. Durante get, se solicita directamente.

3. Flag: -p / --password

$ ttl send -p mySecretPass file.zip
$ ttl get --password mySecretPass https://ttl.space/aBcDeFgHiJ
-p / --password es visible en la salida de ps aux y puede guardarse en el historial del shell (~/.bash_history). Evita su uso en entornos compartidos y scripts. Usa --password-stdin o --password-file en su lugar.

4. Stdin: --password-stdin

# pipe desde echo
$ echo "mySecretPass" | ttl send --password-stdin backup.tar.gz

# pipe desde gestor de contraseñas
$ pass show ttl/key | ttl send --password-stdin data.zip

# pipe desde variable de entorno
$ printenv MY_SECRET | ttl get --password-stdin https://ttl.space/aBcDeFgHiJ

# heredoc
$ ttl send --password-stdin report.pdf <<<"mySecretPass"

Lee la primera línea de stdin. Útil en scripts, pipelines de CI/CD y automatización. Cuando stdin no es una terminal y no se proporciona una fuente de contraseña, el CLI termina con un error (excepto con --json, que genera automáticamente una contraseña).

5. Archivo: --password-file

$ ttl send --password-file /run/secrets/key report.xlsx
$ ttl get --password-file ~/.ttl-key https://ttl.space/aBcDeFgHiJ

Lee la primera línea del archivo (el salto de línea final se elimina). Compatible con Docker secrets (/run/secrets/), archivos de Vault agent y patrones similares.

6. Archivo detectado automáticamente: ttl.password

Si no se proporciona una contraseña explícita, el CLI busca un archivo ttl.password junto al binario y luego ~/.ttl/password. Se usa la primera línea como contraseña.

Solo se puede usar una fuente explícita de contraseña a la vez. -p / --password, --password-stdin y --password-file no se pueden combinar. El archivo ttl.password detectado automáticamente solo se verifica cuando no se proporciona ninguno de estos. Longitud mínima: 8 caracteres.

Referencia de opciones

Flags de envío

FlagDescripciónPredeterminado
-p, --password PContraseña de cifradointeractivo
--password-stdinLeer contraseña de stdin
--password-file FLeer contraseña de archivo
-t, --ttl DURTiempo de vida7d
-b, --burnDestruir tras lectura (descarga única)desactivado
--timeout DURTiempo de espera de transferenciaautomático
--server URLURL del servidorhttps://ttl.space
-h3, --http3Intentar HTTP/3 (QUIC), volver a TCPdesactivado
--jsonSalida JSON en stdout (para scripts y agentes de IA)desactivado

Flags de descarga

FlagDescripciónPredeterminado
-p, --password PContraseña de descifradointeractivo
--password-stdinLeer contraseña de stdin
--password-file FLeer contraseña de archivo
-o, --output DIRDirectorio de salidadirectorio actual
--timeout DURTiempo de espera de transferenciaautomático
-h3, --http3Intentar HTTP/3 (QUIC), volver a TCPdesactivado
--jsonSalida JSON en stdout (para scripts y agentes de IA)desactivado

Valores de TTL

Gratis: 5m 10m 15m 30m 1h 2h 3h 6h 12h 24h 1d 2d 3d 4d 5d 6d 7d

Orbit añade: 14d 15d 28d 30d

Tiempo de espera

Predeterminado: automático — estimado a partir del tamaño del archivo asumiendo 1 Mbps + 2 minutos de margen (mínimo 5 minutos). Se puede anular con --timeout 10m o --timeout 1h.

Ejemplos

Script: respaldo y subida

#!/bin/bash
tar czf /tmp/backup.tar.gz /data
echo "$BACKUP_KEY" | ttl send --password-stdin -t 6h /tmp/backup.tar.gz
rm /tmp/backup.tar.gz

Copiar enlace al portapapeles (macOS)

$ ttl send -p mypass123 file.pdf | pbcopy

Copiar enlace al portapapeles (Linux)

$ ttl send -p mypass123 file.pdf | xclip -sel clip

Destruir: secreto de un solo uso

$ echo "$DB_PASSWORD" | ttl send --password-stdin -b -t 5m credentials.env
# el enlace funciona exactamente una vez, expira en 5 minutos

Modo JSON (scripts & agentes de IA)

# envío — contraseña autogenerada en modo JSON
$ ttl --json send report.pdf
{"ok":true,"link":"https://ttl.space/xK9mQ2vLpA","filename":"report.pdf","size":2097152,"ttl":"7d","burn":false,"password":"aB3kL9mX"}

# descarga
$ ttl --json get -p aB3kL9mX xK9mQ2vLpA
{"ok":true,"filename":"report.pdf","size":2097152,"saved_to":"/home/user/report.pdf"}

# los errores devuelven ok:false
{"ok":false,"error":"Link not found"}

En modo --json, toda la salida es JSON estructurado en stdout. Si no se proporciona contraseña durante el envío, se genera una automáticamente y se incluye en la respuesta. El código de salida es 0 en éxito y 1 en error.

Plan Orbit

Orbit desbloquea archivos más grandes (10 GB), mayor retención (30 días) y gestión de archivos (listar y eliminar).

La clave API se detecta automáticamente: variable de entorno TTL_API_KEY, ttl.key junto al binario o ~/.ttl/key. Use ttl activate para guardar la clave o escríbala manualmente en cualquiera de estas ubicaciones.

# activar su clave
$ ttl activate ttl_orbit_aBcDeFgHiJ...
Orbit plan activated. Key saved to /usr/local/bin/ttl.key

# verificar plan y uso
$ ttl plan
Plan: orbit
Max file size: 10.0 GB
Max TTL: 30 days
Uploads per day: Unlimited

Usage:
  Uploads today: 3
  Active storage: 1.2 GB / 250.0 GB

# enviar con TTL extendido
$ ttl send -t 30d large-backup.tar.gz

# listar subidas recientes
$ ttl list
  xK9mQ2vLpA    4.2 MB  2026-03-16 10:30 → 2026-04-15 10:30  [active]
  https://ttl.space/xK9mQ2vLpA
  rT7bNw3KpF  912.0 KB  2026-03-15 14:20 → 2026-03-17 14:20  [active (burn)]
  https://ttl.space/rT7bNw3KpF

# eliminar un archivo
$ ttl delete xK9mQ2vLpA
Deleted: xK9mQ2vLpA

# eliminar la clave guardada
$ ttl deactivate
Key file removed: /usr/local/bin/ttl.key

HTTP API

La subida y descarga requieren el pipeline de cifrado del CLI (Argon2id + XChaCha20-Poly1305 + AEAD por bloques). Para scripts, use ttl send / ttl get o el modo --json. Los endpoints a continuación son para la gestión de archivos Orbit.

Listar archivos (Orbit)

$ curl https://ttl.space/v1/files -H "X-API-Key: ttl_orbit_..."
{"files":[{"token":"xK9mQ2vLpA","link":"https://ttl.space/xK9mQ2vLpA","size_bytes":1048576,"created_at":1711800600,"expires_at":1714392600,"burn":false,"expired":false}]}

Devuelve todos los archivos subidos con esta clave. Requiere plan Orbit.

Eliminar archivo (Orbit)

$ curl -X DELETE https://ttl.space/v1/files/xK9mQ2vLpA -H "X-API-Key: ttl_orbit_..."

Devuelve 204 No Content en caso de éxito. Requiere plan Orbit. El archivo debe pertenecer a esta clave.

Respuestas de error

EstadoSignificado
401Clave API inválida o expirada
403Función requiere plan Orbit
404Archivo no encontrado o no pertenece a esta clave
429Límite de solicitudes excedido

Límites

RestricciónGratisOrbit
Tamaño máx.2 GB10 GB
TTL máx.7 días30 días
Subidas por día1050
Cuota de almacenamiento250 GB
Listar y eliminar
Longitud mín. contraseña8 caracteres
Solicitudes por IP30 por 10 segundos
Conexiones por IP10 simultáneas

Cifrado

Los archivos se cifran en tu dispositivo antes de subirlos. El servidor solo almacena texto cifrado y no puede descifrar tus archivos.

ComponenteAlgoritmo / Valor
Derivación de claveArgon2id (time=3, memory=64 MB, parallelism=1)
CifradorXChaCha20-Poly1305 AEAD

Cualquier modificación del texto cifrado provoca que el descifrado falle. El servidor verifica que quien descarga conoce la contraseña correcta antes de entregar el texto cifrado, usando un token unidireccional derivado de la clave de cifrado.