Guia de uso

Português (BR)

Início rápido

# Enviar arquivo: a senha é gerada automaticamente, link + senha são exibidos
$ 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

# Baixar: a senha é solicitada interativamente
$ ttl get https://ttl.space/aBcDeFgHiJ
Enter password: ********
Password verified
◉★✧· Phew, secret.pdf landed safe and sound (1.2 MB)

O CLI criptografa, faz upload, download e descriptografa automaticamente. O servidor nunca vê sua senha nem seus dados em texto puro.

Instalação

Homebrew (macOS)

$ brew install tweenietomatoes/ttl/ttl

Scoop (Windows)

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

Binário pré-compilado

# Baixar para sua plataforma a partir das releases
$ 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

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

A partir do código-fonte

$ 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 1.6.0

Enviar arquivos

Envio simples

# Gerar senha automaticamente, TTL padrão de 7d
$ ttl send report.xlsx

Quando nenhuma senha é fornecida no terminal, o CLI pergunta:

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

Pressione Enter ou digite y para gerar automaticamente.

Senha personalizada

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

Excluir após leitura

# Consumido no momento em que o primeiro download começa; após uma interrupção, só esse download pode continuar
$ ttl send -b photo.jpg

TTL personalizado

$ ttl send -t 5m temp-credentials.txt   # expira em 5 minutos
$ ttl send -t 30m meeting-link.txt      # expira em 30 minutos
$ ttl send -t 6h backup.tar.gz          # expira em 6 horas
$ ttl send -t 1d daily-report.pdf       # expira em 1 dia
$ ttl send -t 3d project-archive.zip    # expira em 3 dias
$ ttl send -t 5d design-assets.zip      # expira em 5 dias
$ ttl send report.xlsx                  # expira em 7 dias (padrão)

Baixar arquivos

Interativo (Terminal)

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

A senha não é exibida. O nome original do arquivo é restaurado; se já existir um arquivo com esse nome no diretório de saída, o arquivo é salvo como name (1).ext em vez de sobrescrevê-lo.

Apenas com token

# Você pode usar apenas o token de 10 caracteres em vez da URL completa
$ ttl get aBcDeFgHiJ

Diretório de saída

$ ttl get -o ~/Downloads aBcDeFgHiJ

Por padrão, os arquivos são salvos no diretório atual. Use -o / --output para especificar um diretório diferente.

Com flag de senha

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

Navegador

Você também pode baixar e descriptografar arquivos no navegador visitando o link diretamente. A interface web usa o mesmo formato de arquivo e os mesmos algoritmos (Argon2id, XChaCha20-Poly1305) e pede a sua senha. Não é necessário instalar software.

Gerenciamento de senhas

A senha serve como valor inicial para a chave de criptografia. Ela nunca sai do seu dispositivo e nunca é enviada ao servidor. Existem seis formas de fornecê-la:

1. Geração automática (apenas no envio)

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

Gera uma senha criptograficamente aleatória de 12 caracteres a partir de [0-9A-Za-z]. Disponível apenas no send (de forma interativa ou automaticamente no modo --json).

2. Entrada interativa

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

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

A senha não é exibida e não é salva no histórico do shell. No send, primeiro você escolhe se deseja gerar automaticamente. No get, a senha é solicitada diretamente.

3. Flag: -p / --password

$ ttl send -p mySecretPass file.zip
$ ttl get --password mySecretPass https://ttl.space/aBcDeFgHiJ
-p / --password é visível na saída de ps aux e pode ser salvo no histórico do shell (~/.bash_history). Evite o uso em ambientes compartilhados e scripts. Use --password-stdin ou --password-file em vez disso.

4. Stdin: --password-stdin

# Passar via echo
$ echo "mySecretPass" | ttl send --password-stdin backup.tar.gz

# Passar a partir do gerenciador de senhas
$ pass show ttl/key | ttl send --password-stdin data.zip

# Passar a partir de uma variável de ambiente
$ printenv MY_SECRET | ttl get --password-stdin https://ttl.space/aBcDeFgHiJ

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

Lê a primeira linha do stdin. Útil em scripts, pipelines de CI/CD e automação. Se o stdin não for um terminal e nenhuma fonte de senha for especificada, o CLI encerra com um erro (exceto com --json, que gera automaticamente uma senha).

5. Arquivo: --password-file

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

Lê a primeira linha do arquivo (a quebra de linha final é removida). Compatível com Docker Secrets (/run/secrets/), arquivos do Vault Agent e padrões semelhantes.

6. Arquivo detectado automaticamente: ttl.password

Se nenhuma senha explícita for fornecida, o CLI procura um arquivo ttl.password ao lado do binário, depois ~/.ttl/password. A primeira linha é usada como senha.

Apenas uma fonte explícita de senha pode ser usada por vez. -p / --password, --password-stdin e --password-file não podem ser combinados. O arquivo ttl.password detectado automaticamente só é verificado quando nenhum destes é fornecido. Comprimento mínimo: 8 caracteres.

Referência de opções

Flags de envio

FlagDescriçãoPadrão
-p, --password PSenha de criptografiainterativo
--password-stdinLer senha do stdin
--password-file FLer senha de arquivo
-t, --ttl DURTempo de validade7d
-b, --burnExcluir após leitura (download único)desativado
-u, --uploader-onlySomente a sua própria chave API pode baixar (Orbit; alias --private)desativado
--timeout DURTimeout de transferênciasem limite
--server URLURL do servidorhttps://ttl.space
-h3, --http3Tentar HTTP/3 (QUIC), fallback para TCPdesativado
--jsonSaída JSON no stdout (para scripts e agentes de IA)desativado

Flags de download

FlagDescriçãoPadrão
-p, --password PSenha de descriptografiainterativo
--password-stdinLer senha do stdin
--password-file FLer senha de arquivo
-o, --output DIRDiretório de saídadiretório atual
--timeout DURTimeout de transferênciasem limite
-h3, --http3Tentar HTTP/3 (QUIC), fallback para TCPdesativado
--jsonSaída JSON no stdout (para scripts e agentes de IA)desativado

Valores de TTL

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

Orbit adiciona: 14d 15d 28d 30d permanent

Timeout

Padrão: sem limite. Uma transferência que trava retoma sozinha e desiste se não conseguir avançar. Defina um limite com --timeout 30m ou --timeout 2h.

Exemplos

Script: backup e upload

#!/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 link para a área de transferência (macOS)

$ ttl send -p mypass123 file.pdf | pbcopy

Copiar link para a área de transferência (Linux)

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

Segredo de uso único com autodestruição

$ echo "$DB_PASSWORD" | ttl send --password-stdin -b -t 5m credentials.env
# O link funciona exatamente uma vez, expira após 5 minutos

Modo JSON (scripts & agentes de IA)

# envio: senha gerada automaticamente no 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"}

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

# erros retornam ok:false
{"ok":false,"error":"Link not found"}

No modo --json, toda a saída é JSON estruturado no stdout. Se nenhuma senha for fornecida durante o envio, uma é gerada automaticamente e incluída na resposta. O código de saída é 0 em caso de sucesso e 1 em caso de erro.

Plano Orbit

Orbit desbloqueia arquivos maiores (10 GB), retenção mais longa (30 dias ou permanente), arquivos apenas para quem enviou (somente a sua chave API pode baixá-los) e gerenciamento de arquivos (listar e excluir). Comparação completa: Features.

A chave API é detectada automaticamente: variável de ambiente TTL_API_KEY, ttl.key ao lado do binário ou ~/.ttl/key. Use ttl activate para salvar a chave ou escreva-a manualmente em qualquer um desses locais.

# ativar sua chave: solicitada sem ser exibida, para não ficar no histórico do shell
$ ttl activate
Enter Orbit API key: ********
Orbit plan activated. Key saved to /usr/local/bin/ttl.key
# não interativo: ttl activate --key-stdin  |  ttl activate --key-file F

# verificar plano e 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 com TTL estendido
$ ttl send -t 30d large-backup.tar.gz
# arquivo permanente (somente Orbit): sem expiração, mantido até você excluí-lo ou sua assinatura terminar
$ ttl send -t permanent archive.tar.gz
# enviar um arquivo privado: somente a sua chave API pode baixá-lo (somente Orbit)
$ ttl send -u payroll.xlsx

# listar envios recentes
$ 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

# excluir um arquivo
$ ttl delete xK9mQ2vLpA
Deleted: xK9mQ2vLpA

# remover chave salva
$ ttl deactivate
Key file removed: /usr/local/bin/ttl.key

HTTP API

Upload e download requerem o pipeline de criptografia do CLI (Argon2id + XChaCha20-Poly1305 + AEAD em blocos). Para scripts, use ttl send / ttl get ou o modo --json. Os endpoints abaixo são para gerenciamento de arquivos Orbit.

Listar arquivos (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}

# próxima página: somente quando has_more for true; passe o next_cursor da resposta anterior
$ curl "https://ttl.space/v1/files?cursor=1711800600123456" -H "X-API-Key: ttl_orbit_..."

Retorna os arquivos enviados com esta chave, do mais recente para o mais antigo, 20 por página. Quando has_more é true, a resposta também inclui next_cursor; passe-o como ?cursor= para obter a próxima página. Requer plano Orbit.

Excluir arquivo (Orbit)

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

Retorna 204 No Content em caso de sucesso. Requer plano Orbit. O arquivo deve pertencer a esta chave.

Respostas de erro

EstadoSignificado
401Chave API inválida ou expirada
403Recurso requer plano Orbit
404Arquivo não encontrado ou não pertence a esta chave
429Limite de requisições excedido
500Erro interno do servidor, tente novamente mais tarde
502Armazenamento temporariamente indisponível, tente novamente mais tarde

Limites

RestriçãoGratuitoOrbit
Tam. máx. arquivo2 GB10 GB
TTL máx.7 dias30 dias ou permanente
Envios por dia10Ilimitado
Volume de envios por dia (por IP)10 GBIlimitado
Envios simultâneos1 por IP1 por IP e por chave API
Cota de armazenamento✗500 GB
Listagem de arquivos✗✓
Exclusão antecipada✓✓
Arquivos apenas para quem enviou✗✓
Comprimento mín. senha8 caracteres
Requisições por IP30 por 10 segundos
Conexões por IP10 simultâneas

Criptografia

Os arquivos são criptografados no seu dispositivo antes de serem enviados. O servidor armazena apenas texto cifrado e não pode descriptografar seus arquivos.

ComponenteAlgoritmo / Valor
Derivação de chaveArgon2id (time=3, memory=64 MiB, parallelism=1)
CifraXChaCha20-Poly1305 AEAD

Qualquer modificação no texto cifrado causa falha na descriptografia. O servidor verifica que o downloader conhece a senha correta antes de liberar o texto cifrado, usando um token unidirecional derivado da chave de criptografia.