Skip to content
This site is still under construction!

ATproto Post Formatting

On Bluesky (an ATproto based platform) its possible to use links mentions and hashtags in posts. Thats not a new concept, but it is also possible to customize the displayed text of a link.

Unfortunately, at the time of writing (2026-08), this is not possible with the official Bluesky apps. I have found a workaround how to achieve this without the official app.

Bluesky uses “facets” for this. These are additional information that are attached to the post data. This additional data is currently not available to be set in the official Bluesky apps.

There is a website pds.ls that allows you to create posts “manually”. It just requires a bit of accuracy.

  1. Log into your Bluesky account on pds.ls.
  2. Click on the symbol which looks like a pen and paper, in the upper right corner.
  3. Nun ist eine Art Formular erschienen. In diesem sieht man nun schon einige Informationen vorausgefüllt. Wir müssen ein paar davon ändern und ein paar hinzufügen.
    • facets wird auf der selben Ebene wie text eingefügt und soll folgendermaßen aussehen:
      "facets": [
        {
          "index": {
            "byteStart": 0,
            "byteEnd": 3
          },
          "features": [
            {
              "$type": "app.bsky.richtext.facet#link",
              "uri": "https://example.com"
            }
          ]
        }
      ]
      byteStart und byteEnd geben an, wo im Text der Link vorkommt. Dazu muss man die Zeichen des Textest abzählen. Die Zählung beginnt allerdings bei 0. Auch muss man bei byteEnd 1 zur Position des letzten Zeichens hinzuzählen. uri ist die URL des Links.
  4. A form appeared. You’ll see some information already filled in. We just have to adjust it and add in the missing fields.
    • The value for text defines the text content of the post. The complete contents as it should appear in the final post should be pasted here.
    • You can delete the embed field if you don’t want to include an embedded link. If you do, adjust the values of the uri title and description fields accordingly.
    • langs lists the language(s) used in the post. The correct languages using the correct language codes should be entered here. de is for German, en is for English.
    • facets will be inserted at the same level as text and should look like this:
      "facets": [
        {
          "index": {
            "byteStart": 0,
            "byteEnd": 3
          },
          "features": [
            {
              "$type": "app.bsky.richtext.facet#link",
              "uri": "https://example.com"
            }
          ]
        }
      ]
  5. When you’re done, click Create to send the post. Done!

Technical details for this feature can be found in the official documentation.