TL;DR, Resposta Rápida
8 min de leituraO Bluesky limita a imagem de um post a 2,000,000 bytes, um número escrito como maxSize no lexicon app.bsky.embed.images, o esquema do protocolo. São dois milhões de bytes, não 2 MiB, então uma imagem que o seu gerenciador de arquivos chama de 1.95 MB já passou do teto. Avatares, banners e miniaturas de cartões de link ficam na metade disso, 1,000,000 bytes. O app do Bluesky nunca envia o seu arquivo original: ele recodifica cada imagem de post para JPEG com no máximo 4,000 pixels e procura uma qualidade que caiba abaixo do teto.
Qual é o limite de tamanho de imagem do Bluesky?
Cada imagem anexada a um post do Bluesky tem teto de 2.000.000 bytes, ou seja, o limite de tamanho de imagem do Bluesky são dois milhões de bytes e não os 2 MiB que a maioria dos gerenciadores de arquivos quer dizer quando escreve "2 MB". O número não está escondido em um artigo de ajuda. Ele fica no esquema do protocolo, em app.bsky.embed.images, como um campo chamado maxSize no blob da imagem:
"image": {
"type": "blob",
"description": "The raw image file. May be up to 2 MB, formerly limited to 1 MB.",
"accept": ["image/*"],
"maxSize": 2000000
}Dois milhões de bytes são 1.907 MiB. Um JPEG exportado que o Finder do macOS relata como "1.9 MB" tem cerca de 1.992.294 bytes e passa raspando; um relatado como "2 MB" tem 2.097.152 bytes e não passa. É nessa diferença de 97.152 bytes que mora a maior parte da confusão sobre este limite.
A própria redação do lexicon preserva o histórico. Ela diz que o blob "May be up to 2 MB, formerly limited to 1 MB", e é por isso que tantos guias de tamanho de terceiros ainda publicam 1 MB. Estavam certos dois anos atrás e ninguém voltou para editá-los.
Qual envio do Bluesky recebe qual limite?
O Bluesky não tem um único limite de imagem. Ele tem seis tetos de blob declarados em seis lexicons, e eles se contradizem de propósito.
| Lexicon | O que guarda | maxSize | accept |
|---|---|---|---|
app.bsky.embed.images | Imagens de post, até 4 | 2000000 | image/* |
app.bsky.embed.gallery | Itens de galeria | 2000000 | image/* |
app.bsky.embed.external | Miniatura do cartão de link | 1000000 | image/* |
app.bsky.actor.profile | Avatar | 1000000 | image/png, image/jpeg |
app.bsky.actor.profile | Banner | 1000000 | image/png, image/jpeg |
app.bsky.embed.video | Arquivo de vídeo | 300000000 | video/mp4 |
Duas coisas nessa tabela pegam as pessoas de surpresa. Avatares e banners têm teto de metade de uma imagem de post, e recusam tudo que não seja PNG ou JPEG, então um avatar WebP que sobe sem problema como imagem de post é rejeitado no seu perfil. E o blob de vídeo chega a 300.000.000 bytes, com a própria descrição anotando que antes era "formerly limited to 100mb", o mesmo padrão do teto de imagem.
O lexicon mais novo, app.bsky.embed.gallery, permite um maxLength de 20 itens, mas o próprio comentário do esquema manda os clientes segurarem: "The schema-level maxLength of 20 is a future-proof ceiling. Clients should currently enforce a soft limit of 10 items in authoring UIs." O embed mais antigo, app.bsky.embed.images, continua em 4.

O que o app do Bluesky faz com a sua imagem antes do envio?
O cliente oficial nunca envia o seu arquivo original. Antes de chamar uploadBlob, o compositor roda compressImage contra uma configuração em src/lib/constants.ts:
export const IMAGE_SIZE_CONFIG_POSTS = {
maxDimension: 4000,
maxSize: 2000000,
};Essa função não verifica se o seu arquivo já é pequeno o bastante. Ela recodifica sem condição, sempre para JPEG, e faz uma busca binária por um nível de qualidade que caia abaixo de 2.000.000 bytes. Começa na qualidade 51, sobe se o resultado couber e desce se não couber, e para quando a janela de busca se fecha.
Quando uma imagem resiste à compressão, o código se recusa a continuar derrubando a qualidade. O comentário no código-fonte soletra a regra: "binary search will check 51, 26, 13(rounded). We don't want to go below 25, so if we've halved to 13, reset the loop and reduce the image dimensions instead." Cada reinício multiplica a dimensão de trabalho por 0,8, o que leva 4000 para 3200, depois 2560, depois 2048 e depois cerca de 1638 pixels. Quatro reinícios são o teto, e passado isso o envio falha com Unable to compress image.
Do fato de toda imagem de post ser recodificada para JPEG seguem três consequências. A transparência some, porque JPEG não tem canal alfa, então um logo PNG em fundo transparente chega com fundo sólido. Texto nítido e cor chapada pegam artefatos de anel que o mesmo arquivo não mostraria em uma plataforma que deixa o PNG passar. E os seus ajustes caprichados de exportação vão para o lixo, já que o cliente escolhe o próprio número de qualidade sem olhar para o que você escolheu. Essa mesma recodificação também preenche o campo aspectRatio a partir da saída comprimida em vez do seu original, e esse campo são dois inteiros com mínimo de 1, não um float.
Por que uma imagem grande demais às vezes sobe mesmo assim?
Porque o envio do blob e a gravação do registro são duas requisições diferentes com dois limites diferentes, e só a segunda lê o lexicon.
O endpoint com.atproto.repo.uploadBlob aplica o teto do próprio servidor, que no PDS de referência vale por padrão 5 * 1024 * 1024, ou 5.242.880 bytes, configurável pela variável de ambiente PDS_BLOB_UPLOAD_LIMIT. Passe disso e o stream aborta com Max size of 5242880 bytes exceeded. Fique abaixo e o blob é aceito mesmo com 4 MB, bem além dos 2.000.000 do lexicon.
O lexicon diz onde a checagem de verdade acontece. A descrição dele reza: "The blob will be deleted if it is not referenced within a time window (eg, minutes). Blob restrictions (mimetype, size, etc) are enforced when the reference is created." Então uma imagem de 4 MB sobe com sucesso, fica no armazenamento temporário, falha na validação quando você tenta anexá-la a um post e é recolhida como lixo minutos depois. Quem publica por um cliente próprio em vez do app oficial esbarra nessa ordem e lê o envio bem-sucedido como sinal verde.
Esse mesmo endpoint carrega um limite de 1.000 pontos por dia, o que impõe um teto duro em quantas imagens uma conta consegue empurrar em 24 horas. É um de vários tetos que vale ler junto com os limites de taxa que o AT Protocol aplica às escritas se você publica com calendário.
AdaptlyPost
Teste grátis de 7 dias
Análises multiplataforma
Caixa Social
Assistente com IA

Que dimensões você deve exportar para o Bluesky?
Nada no lexicon restringe as dimensões em pixels. Não há largura mínima, nem altura máxima, nem proporção obrigatória em lugar nenhum de app.bsky.embed.images. O único número de dimensão que existe é o maxDimension: 4000 do próprio cliente, e isso é um gatilho de redimensionamento, não uma rejeição.
O conselho prático que sai daí é curto. Exporte com 2.000 pixels no lado maior ou menos, para o cliente não ter motivo de redimensionar nem de derrubar a qualidade com força. Use JPEG por conta própria, já que o app vai converter para JPEG de qualquer jeito e o seu codificador está mais bem ajustado do que uma busca binária de qualidade. Mantenha o arquivo abaixo de cerca de 1,8 MB para sobrar espaço para a recodificação. Se você precisa de transparência ou de texto nítido, achate a imagem sobre a cor de fundo que quiser antes de enviar, porque a alternativa é deixar o codificador JPEG escolher por você.
O texto alternativo não tem teto declarado no lexicon. O app oficial aplica o próprio MAX_ALT_TEXT = 2000, que é regra de cliente e não de protocolo, então outros clientes definem a sua. Isso espelha o jeito como o Bluesky trata links e menções, onde os deslocamentos em bytes nos facets de um post são assunto do protocolo e a renderização é assunto do cliente.
Se você está comparando especificações entre redes antes de montar um preset de exportação, a aritmética das dimensões de imagem do Instagram funciona de outro jeito, já que a Meta redimensiona no servidor em vez de fazer o cliente redimensionar. E se você enfileira imagens com antecedência, o passo de compressão faz parte de agendar posts no Bluesky, seja você a rodar ou um cliente.
Perguntas frequentes
O limite de imagem do Bluesky é 1 MB ou 2 MB?
São 2.000.000 bytes. O número de 1 MB estava certo antes de o teto ser elevado, e o lexicon ainda guarda a mudança na própria descrição: "May be up to 2 MB, formerly limited to 1 MB." Guias que publicam 1 MB não foram atualizados desde a mudança.
Quantas imagens cabem em um post do Bluesky?
Quatro, definidas por "maxLength": 4 no array de imagens em app.bsky.embed.images. O lexicon mais novo, app.bsky.embed.gallery, eleva o teto do esquema para 20 enquanto instrui os clientes a aplicar um limite brando de 10.
O Bluesky aceita PNG e WebP?
O blob de imagem de post declara "accept": ["image/*"], então qualquer tipo MIME de imagem passa na validação do protocolo. O app oficial converte tudo para JPEG antes do envio, então um PNG que você manda chega como JPEG. Avatares e banners são mais rígidos e aceitam apenas image/png e image/jpeg.
Qual é o limite de tamanho de avatar e banner no Bluesky?
Ambos são 1000000 bytes em app.bsky.actor.profile, metade do teto de imagem de post. Avatares de geradores de feed e de listas em app.bsky.feed.generator e app.bsky.graph.list usam o mesmo número de 1.000.000.
Por que o envio da minha imagem deu certo mas o post falhou?
O endpoint de envio checa o limite de blob do servidor, que vale por padrão 5.242.880 bytes, e o teto de 2.000.000 do lexicon é checado depois, quando o blob é referenciado por um registro. Uma imagem entre esses dois números sobe e então falha na hora de postar.
O Bluesky comprime imagens depois do envio?
O app comprime antes do envio, não depois. A App View então serve derivados redimensionados do CDN dela para miniaturas e visualizações em tamanho cheio, e o lexicon anota que o arquivo servido "May or may not be the exact original blob". O blob guardado no seu repositório é o que o cliente enviou.
O Bluesky comprime uma imagem que já está abaixo de 2.000.000 bytes?
O compositor do Bluesky roda o compressImage em toda imagem de post, seja qual for o tamanho de partida, e recodifica para JPEG antes de começar a busca por qualidade. A função não verifica o tamanho do arquivo antes de começar, então até uma exportação já bem ajustada recebe uma qualidade JPEG nova escolhida pelo app.
Por que meu PNG transparente perde o fundo ao postar no Bluesky?
O JPEG não tem canal alfa, e o app do Bluesky converte toda imagem de post para JPEG antes do envio, então o fundo transparente de um PNG fica preenchido com uma cor sólida. Isso acontece mesmo quando o arquivo original estava certo, porque o compressImage recodifica todas as imagens sem exceção.
O Bluesky mantém a proporção da minha imagem original?
O app preenche o campo aspectRatio a partir da saída já comprimida em JPEG, não do seu arquivo original, porque essa proporção é calculada depois do redimensionamento e da busca por qualidade. Esse campo guarda dois números inteiros com mínimo de 1, não uma proporção decimal.
Existe um limite de caracteres para o texto alternativo no Bluesky?
O léxico app.bsky.embed.images não define nenhum teto para o texto alternativo. O app oficial do Bluesky aplica sua própria regra do lado do cliente, MAX_ALT_TEXT = 2000, uma decisão do app e não um limite do protocolo, então outros clientes podem definir o próprio.
AdaptlyPost
Teste grátis de 7 dias
Análises multiplataforma
Caixa Social
Assistente com IA
Coloque isso em prática com o AdaptlyPost
Este artigo foi útil para você?
Conte-nos o que você achou!
Veja-nos mais no Google
Um clique marca a AdaptlyPost como fonte preferida e nossos artigos passam a aparecer mais acima nas suas Principais notícias, no modo IA e nas visões gerais com IA.
Antes de ir...
AdaptlyPost
Agende seu conteúdo em todas as plataformas
Gerencie todas as suas contas de redes sociais em um só lugar com o AdaptlyPost.
Análises multiplataforma
Caixa Social
Assistente com IA
Termos relacionados do glossário


Os dois registros por trás de um handle de domínio personalizado no Bluesky
Um handle de domínio personalizado no Bluesky precisa de um registro: TXT em _atproto ou texto puro em /.well-known/atproto-did. Os valores e as TLDs vetadas.


Por que o limite de caracteres do Threads conta emojis como bytes UTF-8
São 500 caracteres, mas o limite de caracteres do Threads mede cada emoji pelos bytes UTF-8: um emoji de família custa 25. Veja como contar direito.


Por que o limite de caracteres da legenda do TikTok é medido em runas UTF-16
O limite de caracteres da legenda do TikTok é de 2200 runas UTF-16 no vídeo e 90 no título de uma foto. Um único emoji pode custar onze runas.
Artigos Relacionados


Como funciona um gerador de feeds do Bluesky, do lexicon ao feed no ar
Um gerador de feeds do Bluesky é um serviço HTTPS que responde a uma consulta XRPC. Os lexicons, a entrada no documento DID, o JWT e as lacunas nos docs.


Por que a métrica contas que interagiram no Instagram não é igual a interações
A métrica contas que interagiram no Instagram conta contas únicas, não ações, e os campos da API não correspondem mais aos rótulos do app.


Por que Bluesky facets byteStart byteEnd contam bytes, não caracteres
Os offsets Bluesky facets byteStart byteEnd contam bytes UTF-8, não índices UTF-16 do JavaScript. O aviso do lexicon, um exemplo e código que acerta.

