{
"path": "/a/3mjfruooqgz23-automatically-announce-blog-posts-on-bluesky",
"site": "at://did:plc:7qktq2csymlprtxrkgdchy3s/site.standard.publication/3mjfpvajyp62k",
"$type": "site.standard.document",
"title": "Automatically announce blog posts on Bluesky",
"content": {
"$type": "app.offprint.content",
"items": [
{
"$type": "app.offprint.block.heading",
"level": 2,
"plaintext": "The perfect use case"
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"index": {
"byteEnd": 61,
"byteStart": 48
},
"features": [
{
"did": "did:plc:pgjkomf37an4czloay5zeth6",
"$type": "app.offprint.richtext.facet#mention",
"handle": "offprint.app"
}
]
},
{
"index": {
"byteEnd": 75,
"byteStart": 63
},
"features": [
{
"did": "did:plc:btxrwcaeyodrap5mnjw2fvmz",
"$type": "app.offprint.richtext.facet#mention",
"handle": "leaflet.pub"
}
]
},
{
"index": {
"byteEnd": 87,
"byteStart": 77
},
"features": [
{
"did": "did:plc:revjuqmkvrw6fnkxppqtszpv",
"$type": "app.offprint.richtext.facet#mention",
"handle": "pckt.blog"
}
]
},
{
"index": {
"byteEnd": 130,
"byteStart": 116
},
"features": [
{
"did": "did:plc:re3ebnp5v7ffagz6rb6xfei4",
"$type": "app.offprint.richtext.facet#mention",
"handle": "standard.site"
}
]
}
],
"plaintext": "Let's say you just published a new blog post on @offprint.app, @leaflet.pub, @pckt.blog, or your own blog that uses @standard.site. You may want to post something on Bluesky to announce it."
},
{
"$type": "app.offprint.block.text",
"plaintext": "Airglow lets you build this exact workflow. Especially thanks to a few features that were released today:"
},
{
"$type": "app.offprint.block.bulletList",
"children": [
{
"content": {
"$type": "app.offprint.block.text",
"plaintext": "Automatically resolve links (and other facets) in Bluesky posts"
}
},
{
"content": {
"$type": "app.offprint.block.text",
"plaintext": "Retrieve data from previous actions, such as the ID of a new Bluesky post"
}
},
{
"content": {
"$type": "app.offprint.block.text",
"plaintext": "Update records on your PDS, to link the blog post back to its Bluesky announcement"
}
}
]
},
{
"$type": "app.offprint.block.heading",
"level": 2,
"plaintext": "How to implement it"
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"index": {
"byteEnd": 128,
"byteStart": 88
},
"features": [
{
"uri": "https://airglow.run/u/airglow.run/3mj37fmeccs22",
"$type": "app.offprint.richtext.facet#webMention",
"title": "Announce new blog posts on Bluesky — @airglow.run — Airglow",
"siteName": "Airglow"
}
]
}
],
"plaintext": "You can sign in on Airglow with the account you use to post, and duplicate this action:\nAirglow Announce new blog posts on Bl..."
},
{
"$type": "app.offprint.block.text",
"plaintext": "It will be enabled on your account and run in \"dry-mode\" by default, meaning that it won't actually perform the actions. You can disable \"dry-mode\" straight away, and your next blog entry will automatically be posted on Bluesky."
},
{
"$type": "app.offprint.block.heading",
"level": 3,
"plaintext": "How it works"
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"index": {
"byteEnd": 68,
"byteStart": 46
},
"features": [
{
"$type": "app.offprint.richtext.facet#code"
}
]
}
],
"plaintext": "This automation subscribes to the creation of site.standard.document records. It then filters publications that belong to your DID."
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"index": {
"byteEnd": 73,
"byteStart": 45
},
"features": [
{
"$type": "app.offprint.richtext.facet#code"
}
]
}
],
"plaintext": "It fetches the original publication based on {{event.commit.record.site}}, to retrieve the base URL of the blog."
},
{
"$type": "app.offprint.block.text",
"plaintext": "It then performs two actions:"
},
{
"$type": "app.offprint.block.orderedList",
"children": [
{
"content": {
"$type": "app.offprint.block.text",
"facets": [
{
"index": {
"byteEnd": 99,
"byteStart": 70
},
"features": [
{
"$type": "app.offprint.richtext.facet#code"
}
]
},
{
"index": {
"byteEnd": 201,
"byteStart": 147
},
"features": [
{
"$type": "app.offprint.richtext.facet#code"
}
]
}
],
"plaintext": "A \"Bluesky post\" action, that creates the Bluesky post with the title {{event.commit.record.title}} and the URL, built from the publication record {{publication.record.url}}{{event.commit.record.path}}."
}
},
{
"content": {
"$type": "app.offprint.block.text",
"facets": [
{
"index": {
"byteEnd": 90,
"byteStart": 79
},
"features": [
{
"$type": "app.offprint.richtext.facet#code"
}
]
}
],
"plaintext": "Update the original site.standard.document that triggered the event to set the bskyPostRef, so that the blog post is linked to the Bluesky post."
}
}
]
},
{
"$type": "app.offprint.block.text",
"plaintext": ""
},
{
"$type": "app.offprint.block.image",
"image": {
"$type": "blob",
"ref": {
"$link": "bafkreieafzrobzzqxv6ncct46pogt7p46aevcarverx5gotvgncxfltv4a"
},
"mimeType": "image/jpeg",
"size": 189085
},
"alignment": "center",
"aspectRatio": {
"width": 2000,
"height": 1875
}
},
{
"$type": "app.offprint.block.heading",
"level": 2,
"plaintext": "Next steps"
},
{
"$type": "app.offprint.block.text",
"facets": [
{
"index": {
"byteEnd": 50,
"byteStart": 31
},
"features": [
{
"uri": "https://airglow.run",
"$type": "app.offprint.richtext.facet#link"
}
]
}
],
"plaintext": "You'll see your action logs on https://airglow.run every time it runs, it's especially useful if an error happens."
},
{
"$type": "app.offprint.block.text",
"plaintext": "And you can set up many more automations on Airglow, even just call arbitrary HTTP callbacks. It really enables a lot of use cases."
},
{
"$type": "app.offprint.block.text",
"plaintext": ""
}
]
},
"coverImage": {
"$type": "blob",
"ref": {
"$link": "bafkreidojivgmy4ianazzztgbba2ihvtdhxtsjjotrd7ks25anmifvh5si"
},
"mimeType": "image/jpeg",
"size": 144376
},
"description": "Airglow is an automation system built for the AT Protocol. It enables flexible workflows to react to events in the Atmosphere.",
"publishedAt": "2026-04-13T21:51:12+00:00",
"textContent": "The perfect use case\nLet's say you just published a new blog post on @offprint.app, @leaflet.pub, @pckt.blog, or your own blog that uses @standard.site. You may want to post something on Bluesky to announce it.\nAirglow lets you build this exact workflow. Especially thanks to a few features that were released today:\n- Automatically resolve links (and other facets) in Bluesky posts\n- Retrieve data from previous actions, such as the ID of a new Bluesky post\n- Update records on your PDS, to link the blog post back to its Bluesky announcement\n\nHow to implement it\nYou can sign in on Airglow with the account you use to post, and duplicate this action:\n\nIt will be enabled on your account and run in \"dry-mode\" by default, meaning that it won't actually perform the actions. You can disable \"dry-mode\" straight away, and your next blog entry will automatically be posted on Bluesky.\nHow it works\nThis automation subscribes to the creation of site.standard.document records. It then filters publications that belong to your DID.\nIt fetches the original publication based on {{event.commit.record.site}}, to retrieve the base URL of the blog.\nIt then performs two actions:\n- A \"Bluesky post\" action, that creates the Bluesky post with the title {{event.commit.record.title}} and the URL, built from the publication record {{publication.record.url}}{{event.commit.record.path}}.\n- Update the original site.standard.document that triggered the event to set the bskyPostRef, so that the blog post is linked to the Bluesky post.\n\n\nNext steps\nYou'll see your action logs on https://airglow.run every time it runs, it's especially useful if an error happens.\nAnd you can set up many more automations on Airglow, even just call arbitrary HTTP callbacks. It really enables a lot of use cases."
}