Publishing to the Atmosphere

August 2026
I wrote this blog post myself using a text editor. (engage on Bluesky)

I'm trying out the standard.site quick start. Mainly writing this up so I can refer to it later and copy-paste the commands when I publish a next blog post.

For step 2 I needed to add a record to my PDS. I thought I could do this with GOAT but I didn't find a way to use that for posting a JSON record (it only seems to allow posting a text post). I found HTTPie-based instructions and tried those against my own PDS.

Luckily I could still find my account password in my password manager. The following commands get an auth token for my PDS and publish this blog as a whole in a site.standard.publication record (that part will only need to be done once):


  export BLUESKY_HANDLE=michielbdejong.com
  export BLUESKY_APP_PASSWORD=...
  export AUTH_TOKEN=`http post \
https://bsky.michielbdejong.com/xrpc/com.atproto.server.createSession \
identifier="$BLUESKY_HANDLE" password="$BLUESKY_APP_PASSWORD" | json accessJwt`
  echo $AUTH_TOKEN

  export JSON="{\
  \"\$type\": \"site.standard.publication\",\
  \"url\": \"https://michielbdejong.com\",\
  \"name\": \"Michiel's Blog\",\
  \"description\": \"Michiel B. de Jong's Personal Blog\",\
  \"preferences\": {\
    \"showInDiscover\": true\
  }\
}"
  echo $JSON | json

  http post https://bsky.michielbdejong.com/xrpc/com.atproto.repo.createRecord \
    Authorization:"Bearer $AUTH_TOKEN" \
    repo="$BLUESKY_HANDLE" \
    collection=site.standard.publication \
    record:="$JSON"

I checked the output of that last command, manually copy the "uri" from it, store that in a text file that I uploaded to https://michielbdejong.com/.well-known/site.standard.publication. Then I uploaded a record for this post (this is the part I'll need to repeat for each next blog post):


    export DOC="{\
  \"\$type\": \"site.standard.document\",\
  \"site\": \
\"at://did:plc:ta2fuhked4lzt7mb6vsemcxb/site.standard.publication/3mssqd6mv6s25\",\
  \"title\": \"Publishing to the Atmosphere\",\
  \"path\": \"/blog/39.html\",\
  \"description\": \
\"A blogpost in which I try out how to properly publish \
a blogpost to the Atmosphere\",\
  \"publishedAt\": \"2026-08-11T14:30:00.000Z\",\
  \"tags\": [\"atmosphere\", \"blog\"]\
}"
  echo $DOC | json
  http post https://bsky.michielbdejong.com/xrpc/com.atproto.repo.createRecord \
    Authorization:"Bearer $AUTH_TOKEN" \
    repo="$BLUESKY_HANDLE" \
    collection=site.standard.document \
    record:="$DOC"

I left out the textContent field because first of all I'm still writing it and second I don't know how to properly convert from html to plain text for this. How can I include hyperlinks? It took a few tries to get the escaping right and get the | json check working correctly.

The URI that was created is at://did:plc:ta2fuhked4lzt7mb6vsemcxb/site.standard.document/3mssr4vlsxk25 but I was surprised to see nothing got posted on my public Bluesky profile. I'm adding a link tag in the header of this HTML page. Let's see what happens if I upload it.

goat get at://did:plc:ta2fuhked4lzt7mb6vsemcxb/site.standard.document/3mssr4vlsxk25 works. Ah, let's see what happens if I now post a http link to this html page on Bluesky, maybe it is able to retrieve the metadata from the document record.

I'm putting the link to the microblog post announcing this long-form post at the top because I can still only see my long-form post with goat and not with bsky.app.