# 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: aB3kL9mXq7Rt ·✧★◉ Thank goodness, secret.pdf is in orbit (1.2 MB) IMPORTANT! Save your password — required to download and decrypt the file. Password: aB3kL9mXq7Rt 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.
$ brew install tweenietomatoes/ttl/ttl
$ scoop bucket add ttl https://github.com/tweenietomatoes/scoop-ttl $ scoop install ttl
# descargar para tu plataforma desde las versiones publicadas $ curl -Lo ttl.tar.gz \ https://github.com/tweenietomatoes/ttl/releases/download/v1.6.0/ttl_1.6.0_linux_amd64.tar.gz $ tar xzf ttl.tar.gz && sudo mv ttl /usr/local/bin/
$ go install github.com/tweenietomatoes/ttl/cmd/ttl@latest
$ git clone https://github.com/tweenietomatoes/ttl $ cd ttl && go build -o ttl ./cmd/ttl/ $ sudo mv ttl /usr/local/bin/
$ ttl version ttl 1.6.0
# 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.
$ ttl send -p mySecretPass -t 1h document.pdf
# se gasta en cuanto empieza la primera descarga; tras un corte, solo esa descarga puede reanudarse $ ttl send -b photo.jpg
$ 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)
$ 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; si ya existe un archivo con ese nombre en el directorio de salida, el archivo se guarda como name (1).ext en lugar de sobrescribirlo.
# puedes usar solo el token de 10 caracteres en lugar de la URL completa $ ttl get aBcDeFgHiJ
$ ttl get -o ~/Downloads aBcDeFgHiJ
Por defecto, los archivos se guardan en el directorio actual. Usa -o / --output para especificar otro directorio.
$ ttl get -p mySecretPass https://ttl.space/aBcDeFgHiJ
También puede descargar y descifrar archivos en su navegador visitando el enlace directamente. La interfaz web usa el mismo formato de archivo y los mismos algoritmos (Argon2id, XChaCha20-Poly1305) y solicita su contraseña. No se requiere instalación de software.
La contraseña es la semilla de la clave de cifrado. Nunca sale de tu dispositivo y nunca se envía al servidor. Hay seis formas de proporcionarla:
$ ttl send notes.txt No password provided. Generate one? [Y/n]: y Generated password: aB3kL9mXq7Rt
Genera una contraseña criptográficamente aleatoria de 12 caracteres del conjunto [0-9A-Za-z]. Solo disponible durante send (de forma interactiva, o automáticamente en modo --json).
$ 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.
-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.--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).
--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.
ttl.passwordSi 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.
-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.| Flag | Descripción | Predeterminado |
|---|---|---|
-p, --password P | Contraseña de cifrado | interactivo |
--password-stdin | Leer contraseña de stdin | |
--password-file F | Leer contraseña de archivo | |
-t, --ttl DUR | Tiempo de vida | 7d |
-b, --burn | Destruir tras lectura (descarga única) | desactivado |
-u, --uploader-only | Solo tu propia clave API puede descargarlo (Orbit; alias --private) | desactivado |
--timeout DUR | Tiempo de espera de transferencia | sin límite |
--server URL | URL del servidor | https://ttl.space |
-h3, --http3 | Intentar HTTP/3 (QUIC), volver a TCP | desactivado |
--json | Salida JSON en stdout (para scripts y agentes de IA) | desactivado |
| Flag | Descripción | Predeterminado |
|---|---|---|
-p, --password P | Contraseña de descifrado | interactivo |
--password-stdin | Leer contraseña de stdin | |
--password-file F | Leer contraseña de archivo | |
-o, --output DIR | Directorio de salida | directorio actual |
--timeout DUR | Tiempo de espera de transferencia | sin límite |
-h3, --http3 | Intentar HTTP/3 (QUIC), volver a TCP | desactivado |
--json | Salida JSON en stdout (para scripts y agentes de IA) | desactivado |
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 permanent
Predeterminado: sin límite. Una transferencia que se detiene se reanuda sola y se abandona si no puede avanzar. Se puede fijar un límite con --timeout 30m o --timeout 2h.
#!/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
$ ttl send -p mypass123 file.pdf | pbcopy
$ ttl send -p mypass123 file.pdf | xclip -sel clip
$ echo "$DB_PASSWORD" | ttl send --password-stdin -b -t 5m credentials.env # el enlace funciona exactamente una vez, expira en 5 minutos
# 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,"uploader_only":false,"is_permanent":false,"password":"aB3kL9mXq7Rt"} # descarga $ ttl --json get -p aB3kL9mXq7Rt 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.
Orbit desbloquea archivos más grandes (10 GB), mayor retención (30 días o permanente), archivos solo para quien los sube (solo tu clave API puede descargarlos) y gestión de archivos (listar y eliminar). Comparación completa: Features.
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: se solicita sin mostrarla, así no queda en el historial del shell $ ttl activate Enter Orbit API key: ******** Orbit plan activated. Key saved to /usr/local/bin/ttl.key # no interactivo: ttl activate --key-stdin | ttl activate --key-file F # verificar plan y uso $ ttl plan Plan: orbit Max file size: 10.0 GB Max TTL: 30 days (or permanent) Uploads per day: 1000000 Usage: Uploads today: 3 Active storage: 1.2 GB / 500.0 GB # enviar con TTL extendido $ ttl send -t 30d large-backup.tar.gz # archivo permanente (solo Orbit): sin caducidad, se conserva hasta que lo elimines o termine tu suscripción $ ttl send -t permanent archive.tar.gz # enviar un archivo privado: solo tu clave API puede descargarlo (solo Orbit) $ ttl send -u payroll.xlsx # 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
ttl send / ttl get o el modo --json. Los endpoints a continuación son para la gestión de 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,"uploader_only":false,"is_permanent":false,"is_note":false,"perm_grace_until":0}],"has_more":false} # página siguiente: solo cuando has_more es true; pasa el next_cursor de la respuesta anterior $ curl "https://ttl.space/v1/files?cursor=1711800600123456" -H "X-API-Key: ttl_orbit_..."
Devuelve los archivos subidos con esta clave, del más reciente al más antiguo, 20 por página. Cuando has_more es true, la respuesta incluye también next_cursor; pásalo como ?cursor= para obtener la página siguiente. Requiere plan 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.
| Estado | Significado |
|---|---|
401 | Clave API inválida o expirada |
403 | Función requiere plan Orbit |
404 | Archivo no encontrado o no pertenece a esta clave |
429 | Límite de solicitudes excedido |
500 | Error interno del servidor, inténtalo de nuevo más tarde |
502 | Almacenamiento no disponible temporalmente, inténtalo de nuevo más tarde |
| Restricción | Gratis | Orbit |
|---|---|---|
| Tamaño máx. | 2 GB | 10 GB |
| TTL máx. | 7 días | 30 días o permanente |
| Subidas por día | 10 | Ilimitado |
| Volumen de subida por día (por IP) | 10 GB | Ilimitado |
| Subidas simultáneas | 1 por IP | 1 por IP y por clave API |
| Cuota de almacenamiento | ✗ | 500 GB |
| Listado de archivos | ✗ | ✓ |
| Eliminación anticipada | ✓ | ✓ |
| Archivos solo para quien los sube | ✗ | ✓ |
| Longitud mín. contraseña | 8 caracteres | |
| Solicitudes por IP | 30 por 10 segundos | |
| Conexiones por IP | 10 simultáneas | |
Los archivos se cifran en tu dispositivo antes de subirlos. El servidor solo almacena texto cifrado y no puede descifrar tus archivos.
| Componente | Algoritmo / Valor |
|---|---|
| Derivación de clave | Argon2id (time=3, memory=64 MiB, parallelism=1) |
| Cifrador | XChaCha20-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.