Glossar

Warum das Bluesky-Bildgrößenlimit bei 2,000,000 Bytes liegt

Taras Shynkarenko
Taras Shynkarenko
Aktualisiert: 7 Min. Lesezeit
Warum das Bluesky-Bildgrößenlimit bei 2,000,000 Bytes liegtWarum das Bluesky-Bildgrößenlimit bei 2,000,000 Bytes liegt

TL;DR, Kurze Antwort

7 Min. Lesezeit

Bluesky begrenzt ein Beitragsbild auf 2,000,000 Bytes, eine Zahl, die als maxSize im Lexicon app.bsky.embed.images steht. Das sind zwei Millionen Bytes, nicht 2 MiB, ein Bild, das dein Dateimanager 1.95 MB nennt, ist also schon zu groß. Avatare, Banner und Vorschaubilder von Linkkarten sind auf die Hälfte begrenzt, 1,000,000 Bytes. Die Bluesky-App sendet nie deine Originaldatei: Sie kodiert jedes Beitragsbild neu nach JPEG mit höchstens 4,000 Pixeln und sucht eine Qualitätsstufe, die unter die Obergrenze passt.

Was ist das Bluesky-Bildgrößenlimit?

Jedes Bild, das an einen Bluesky-Beitrag angehängt wird, ist auf 2.000.000 Bytes begrenzt. Das Bluesky-Bildgrößenlimit beträgt damit zwei Millionen Bytes und nicht die 2 MiB, die die meisten Dateimanager meinen, wenn sie „2 MB“ anzeigen. Die Zahl steckt nicht in einem Hilfeartikel. Sie steht im Protokollschema, in app.bsky.embed.images, als Feld namens maxSize am Bild-Blob:

"image": {
  "type": "blob",
  "description": "The raw image file. May be up to 2 MB, formerly limited to 1 MB.",
  "accept": ["image/*"],
  "maxSize": 2000000
}

Zwei Millionen Bytes sind 1.907 MiB. Ein exportiertes JPEG, das der macOS Finder als „1.9 MB“ meldet, hat etwa 1.992.294 Bytes und rutscht gerade noch durch; eines, das als „2 MB“ gemeldet wird, hat 2.097.152 Bytes und rutscht nicht durch. In dieser Lücke von 97.152 Bytes steckt der größte Teil der Verwirrung um dieses Limit.

Der Wortlaut des Lexicons bewahrt die Geschichte. Dort steht, der Blob „May be up to 2 MB, formerly limited to 1 MB“, weshalb so viele Größenratgeber von Drittanbietern weiterhin 1 MB nennen. Vor zwei Jahren hatten sie recht, und niemand ist zurückgegangen, um sie zu korrigieren.

Welcher Bluesky-Upload bekommt welches Limit?

Bluesky hat nicht ein einziges Bildlimit. Es hat sechs Blob-Obergrenzen, deklariert über sechs Lexicons, und sie widersprechen einander mit Absicht.

LexiconWas es enthältmaxSizeaccept
app.bsky.embed.imagesBeitragsbilder, bis zu 42000000image/*
app.bsky.embed.galleryGalerie-Elemente2000000image/*
app.bsky.embed.externalVorschaubild der Linkkarte1000000image/*
app.bsky.actor.profileAvatar1000000image/png, image/jpeg
app.bsky.actor.profileBanner1000000image/png, image/jpeg
app.bsky.embed.videoVideodatei300000000video/mp4

Zwei Dinge in dieser Tabelle überraschen die meisten. Avatare und Banner sind auf die Hälfte eines Beitragsbildes begrenzt, und sie lehnen alles ab, was nicht PNG oder JPEG ist, ein WebP-Avatar, der als Beitragsbild problemlos hochlädt, wird auf deinem Profil also zurückgewiesen. Und der Video-Blob liegt bei 300.000.000 Bytes, wobei seine eigene Beschreibung festhält, er sei „formerly limited to 100mb“ gewesen, dasselbe Muster wie beim Bildlimit.

Das neuere Lexicon app.bsky.embed.gallery erlaubt eine maxLength von 20 Elementen, doch sein eigener Schemakommentar weist Clients an, sich zurückzuhalten: „The schema-level maxLength of 20 is a future-proof ceiling. Clients should currently enforce a soft limit of 10 items in authoring UIs.“ Das ältere Embed app.bsky.embed.images bleibt bei 4.

Ein Smartphone zeigt ein Foto vor dem Teilen, ein Sinnbild für den Komprimierungsschritt vor dem Hochladen.

Was macht die Bluesky-App mit deinem Bild vor dem Upload?

Der offizielle Client sendet nie deine Originaldatei. Bevor er uploadBlob aufruft, lässt der Composer compressImage gegen eine Konfiguration in src/lib/constants.ts laufen:

export const IMAGE_SIZE_CONFIG_POSTS = {
  maxDimension: 4000,
  maxSize: 2000000,
};

Diese Funktion prüft nicht, ob deine Datei bereits klein genug ist. Sie kodiert bedingungslos neu, immer nach JPEG, und sucht binär nach einer Qualitätsstufe, die unter 2.000.000 Bytes landet. Sie startet bei Qualität 51, geht hoch, wenn das Ergebnis passt, und runter, wenn nicht, und stoppt, sobald sich das Suchfenster schließt.

Wenn ein Bild sich der Komprimierung widersetzt, weigert sich der Code, die Qualität weiter zu senken. Der Kommentar im Quellcode buchstabiert die Regel aus: „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.“ Jeder Reset multipliziert die Arbeitsdimension mit 0,8, was 4000 auf 3200 herunterführt, dann 2560, dann 2048, dann rund 1638 Pixel. Vier Resets sind die Obergrenze, danach scheitert der Upload mit Unable to compress image.

Drei Konsequenzen folgen daraus, dass jedes Beitragsbild nach JPEG neu kodiert wird. Transparenz ist weg, weil JPEG keinen Alphakanal hat, ein PNG-Logo auf transparentem Hintergrund kommt also mit einem festen Hintergrund an. Scharfer Text und flache Farbflächen fangen sich Ringing-Artefakte ein, die dieselbe Datei auf einer Plattform, die PNG durchreicht, nicht zeigen würde. Und deine sorgfältigen Exporteinstellungen landen im Müll, da der Client seine eigene Qualitätszahl wählt, unabhängig von deiner. Dieselbe Neukodierung füllt auch das Feld aspectRatio aus dem komprimierten Ergebnis statt aus deinem Original, und dieses Feld besteht aus zwei Ganzzahlen mit einem Minimum von 1, nicht aus einem Float.

Wie der Kompressor eskaliert, wenn Qualität allein nicht reicht
1
Start bei Qualität 51. Prüfen, ob das JPEG unter 2.000.000 Bytes bleibt.
2
Weitersuchen. Bei zu großer Datei auf Qualität 26, dann 13 (gerundet) wechseln.
3
Qualität nicht unter 25 senken. Stattdessen die Suche zurücksetzen und die Abmessung um den Faktor 0,8 verkleinern.
4
Abmessung schrittweise verkleinern. Aus 4000 Pixeln werden 3200, dann 2560, dann 2048, dann rund 1638.
5
Nach vier Resets aufgeben. Danach schlägt der Upload mit "Unable to compress image" fehl.
Die App sendet nie die Originaldatei, sondern kodiert sie zu JPEG um und arbeitet diese Stufen ab, bevor sie aufgibt.

Warum lädt ein übergroßes Bild manchmal trotzdem hoch?

Weil der Blob-Upload und das Schreiben des Records zwei verschiedene Anfragen mit zwei verschiedenen Limits sind und nur die zweite das Lexicon liest.

Der Endpunkt com.atproto.repo.uploadBlob erzwingt die eigene Obergrenze des Servers, die im Referenz-PDS standardmäßig bei 5 * 1024 * 1024 liegt, also 5.242.880 Bytes, konfigurierbar über die Umgebungsvariable PDS_BLOB_UPLOAD_LIMIT. Wird sie überschritten, bricht der Stream mit Max size of 5242880 bytes exceeded ab. Bleibst du darunter, wird der Blob selbst bei 4 MB akzeptiert, weit jenseits der 2.000.000 des Lexicons.

Das Lexicon benennt selbst, wo die eigentliche Prüfung stattfindet. Seine Beschreibung lautet: „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.“ Ein 4-MB-Bild lädt also erfolgreich hoch, liegt im temporären Speicher, scheitert an der Validierung, sobald du es an einen Beitrag hängst, und wird Minuten später aufgeräumt. Wer über einen eigenen Client statt über die offizielle App postet, trifft auf diese Reihenfolge und liest den erfolgreichen Upload als grünes Licht.

Derselbe Endpunkt trägt ein Rate Limit von 1.000 Punkten pro Tag, was hart begrenzt, wie viele Bilder ein Konto in 24 Stunden durchschieben kann. Es ist eine von mehreren Grenzen, die sich zusammen mit den Rate Limits, die das AT Protocol auf Schreibvorgänge anwendet, zu lesen lohnen, wenn du nach Plan veröffentlichst.

AdaptlyPost
AdaptlyPost

7-Tage-Testversion starten

Plattformübergreifende Analysen

Sozialer Posteingang

KI-gestützter Assistent

Ein Fotograf prüft Exporteinstellungen auf einem Kamerabildschirm, passend zur Wahl der richtigen Abmessungen vor dem Posten.

Welche Abmessungen solltest du für Bluesky exportieren?

Nichts im Lexicon schränkt die Pixelabmessungen ein. Es gibt keine Mindestbreite, keine Maximalhöhe und nirgendwo in app.bsky.embed.images ein vorgeschriebenes Seitenverhältnis. Die einzige Abmessungszahl, die existiert, ist das clienteigene maxDimension: 4000, und das ist ein Auslöser für die Skalierung, keine Ablehnung.

Der praktische Rat, der daraus folgt, ist kurz. Exportiere mit 2.000 Pixeln an der langen Kante oder weniger, damit der Client keinen Grund hat zu skalieren und keinen Grund, die Qualität hart abzusenken. Nutze selbst JPEG, da die App ohnehin nach JPEG konvertiert und dein Encoder besser abgestimmt ist als eine binäre Qualitätssuche. Halte die Datei unter etwa 1,8 MB, damit für die Neukodierung Luft bleibt. Brauchst du Transparenz oder knackigen Text, lege das Bild vor dem Upload auf die Hintergrundfarbe, die du willst, denn die Alternative ist, den JPEG-Encoder für dich wählen zu lassen.

Alt-Text hat im Lexicon überhaupt keine deklarierte Obergrenze. Die offizielle App erzwingt ihr eigenes MAX_ALT_TEXT = 2000, eine Client-Regel und keine Protokollregel, andere Clients setzen also ihre eigene. Das spiegelt, wie Bluesky Links und Erwähnungen behandelt, wo die Byte-Offsets in den Facets eines Beitrags Sache des Protokolls sind und das Rendering Sache des Clients.

Wenn du vor dem Bau eines Export-Presets Spezifikationen über Netzwerke hinweg vergleichst: Die Rechnung zu Instagrams Bildabmessungen läuft anders, da Meta serverseitig skaliert, statt den Client rechnen zu lassen. Und wenn du Bilder im Voraus einreihst, gehört der Komprimierungsschritt zum Planen von Beiträgen für Bluesky, egal ob du ihn selbst ausführst oder einen Client machen lässt.

Häufig gestellte Fragen

Liegt das Bluesky-Bildlimit bei 1 MB oder 2 MB?

Es liegt bei 2.000.000 Bytes. Die Angabe 1 MB stimmte, bevor die Obergrenze angehoben wurde, und das Lexicon hält die Änderung in seiner eigenen Beschreibung fest: „May be up to 2 MB, formerly limited to 1 MB.“ Ratgeber, die 1 MB nennen, wurden seit der Änderung nicht aktualisiert.

Wie viele Bilder passen in einen Bluesky-Beitrag?

Vier, festgelegt durch "maxLength": 4 am images-Array in app.bsky.embed.images. Das neuere Lexicon app.bsky.embed.gallery hebt die Schemagrenze auf 20 an und weist Clients zugleich an, ein weiches Limit von 10 durchzusetzen.

Akzeptiert Bluesky PNG und WebP?

Der Blob für Beitragsbilder deklariert "accept": ["image/*"], jeder Bild-MIME-Typ besteht also die Protokollvalidierung. Die offizielle App konvertiert vor dem Upload alles nach JPEG, ein PNG, das du sendest, kommt also als JPEG an. Avatare und Banner sind strenger und akzeptieren nur image/png und image/jpeg.

Wie groß dürfen Avatar und Banner auf Bluesky sein?

Beide liegen bei 1000000 Bytes in app.bsky.actor.profile, der Hälfte der Obergrenze für Beitragsbilder. Avatare von Feed-Generatoren und Listen-Avatare in app.bsky.feed.generator und app.bsky.graph.list nutzen dieselbe Zahl 1.000.000.

Warum war mein Bild-Upload erfolgreich, mein Beitrag aber nicht?

Der Upload-Endpunkt prüft das Blob-Limit des Servers, das standardmäßig bei 5.242.880 Bytes liegt, und die 2.000.000 des Lexicons werden später geprüft, wenn der Blob von einem Record referenziert wird. Ein Bild zwischen diesen beiden Zahlen lädt hoch und scheitert dann beim Posten.

Komprimiert Bluesky Bilder nach dem Upload?

Die App komprimiert vor dem Upload, nicht danach. Die App View liefert anschließend skalierte Ableitungen aus ihrem CDN für Vorschaubilder und Vollansichten, und das Lexicon hält fest, die ausgelieferte Datei „May or may not be the exact original blob“. Der in deinem Repository gespeicherte Blob ist genau das, was der Client gesendet hat.

Komprimiert Bluesky auch ein Bild, das schon unter 2.000.000 Bytes liegt?

Die Bluesky-App führt compressImage bei jedem Beitragsbild aus, unabhängig von der Ausgangsgröße, und kodiert es zu JPEG um, bevor die Qualitätssuche startet. Die Funktion prüft die Dateigröße vorher nicht, sodass selbst eine schon perfekt exportierte Datei eine neue, von der App gewählte JPEG-Qualität bekommt.

Warum verliert mein transparentes PNG beim Posten auf Bluesky den Hintergrund?

JPEG kennt keinen Alphakanal, und die Bluesky-App wandelt jedes Beitragsbild vor dem Upload in JPEG um, sodass der transparente Hintergrund eines PNGs mit einer Vollfarbe gefüllt wird. Das passiert auch dann, wenn dein Original korrekt aussah, weil compressImage jedes Bild ohne Ausnahme neu kodiert.

Übernimmt Bluesky das Seitenverhältnis aus meiner Originaldatei?

Die App trägt das Feld aspectRatio aus der komprimierten JPEG-Ausgabe ein, nicht aus deiner Originaldatei, weil das Verhältnis erst nach Größenänderung und Qualitätssuche berechnet wird. Das Feld speichert zwei Ganzzahlen mit einem Minimum von 1, kein Dezimalverhältnis.

Gibt es ein Zeichenlimit für Alt-Text auf Bluesky?

Das Lexikon app.bsky.embed.images legt für Alt-Text keine Obergrenze fest. Die offizielle Bluesky-App setzt ihre eigene clientseitige Regel MAX_ALT_TEXT = 2000. Das ist eine App-Entscheidung und kein Protokolllimit, weshalb andere Clients eigene Grenzen setzen können.

AdaptlyPost
AdaptlyPost

7-Tage-Testversion starten

Plattformübergreifende Analysen

Sozialer Posteingang

KI-gestützter Assistent

War dieser Artikel hilfreich?

Teilen Sie uns Ihre Meinung mit!

Sieh uns öfter bei Google

Ein Klick macht AdaptlyPost zu einer bevorzugten Quelle. Unsere Artikel stehen dann weiter oben in deinen Top-Meldungen, im KI-Modus und in den KI-Übersichten.

Bevor Sie gehen...

AdaptlyPost

AdaptlyPost

Planen Sie Ihre Inhalte für alle Plattformen

Verwalten Sie alle Ihre Social-Media-Konten an einem Ort mit AdaptlyPost.

Plattformübergreifende Analysen

Sozialer Posteingang

KI-gestützter Assistent

Verwandte Glossarbegriffe

Verwandte Artikel