{"id":302405,"date":"2026-05-20T10:04:50","date_gmt":"2026-05-20T10:04:50","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/atmosphere\/"},"modified":"2026-05-21T07:04:47","modified_gmt":"2026-05-21T07:04:47","slug":"atmosphere","status":"publish","type":"plugin","link":"https:\/\/ca.wordpress.org\/plugins\/atmosphere\/","author":5279457,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.0","requires":"6.2","requires_php":"8.2","requires_plugins":null,"header_name":"ATmosphere","header_author":"Automattic","header_description":"Publish WordPress posts to AT Protocol (Bluesky + standard.site) via native OAuth.","assets_banners_color":"107cec","last_updated":"2026-05-21 07:04:47","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/pfefferle\/atmosphere","header_author_uri":"https:\/\/automattic.com","rating":0,"author_block_rating":0,"active_installs":10,"downloads":191,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"automattic","date":"2026-05-20 10:04:21"},"1.1.0":{"tag":"1.1.0","author":"automattic","date":"2026-05-21 07:04:47"}},"upgrade_notice":{"0.1.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3538797,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon-512x512.png":{"filename":"icon-512x512.png","revision":3538797,"resolution":"512x512","location":"assets","locale":"","width":512,"height":512},"icon.svg":{"filename":"icon.svg","revision":3538797,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3538797,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3538797,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.1.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[263650,223780,223781,20949,162215],"plugin_category":[],"plugin_contributors":[77494,77548,77968,77571],"plugin_business_model":[],"class_list":["post-302405","plugin","type-plugin","status-publish","hentry","plugin_tags-at-protocol","plugin_tags-atproto","plugin_tags-bluesky","plugin_tags-crossposting","plugin_tags-fediverse","plugin_contributors-automattic","plugin_contributors-kraftbj","plugin_contributors-pfefferle","plugin_contributors-ryancowles","plugin_committers-automattic","plugin_committers-pfefferle"],"banners":{"banner":"https:\/\/ps.w.org\/atmosphere\/assets\/banner-772x250.png?rev=3538797","banner_2x":"https:\/\/ps.w.org\/atmosphere\/assets\/banner-1544x500.png?rev=3538797","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/atmosphere\/assets\/icon.svg?rev=3538797","icon":"https:\/\/ps.w.org\/atmosphere\/assets\/icon.svg?rev=3538797","icon_2x":false,"generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>ATmosphere<\/strong> turns your WordPress site into a first-class citizen of the AT Protocol \u2014 the open network behind <a href=\"https:\/\/bsky.social\/\">Bluesky<\/a>.<\/p>\n\n<p>When you publish a post, ATmosphere automatically shares it on Bluesky and stores the full article on your AT Protocol account so any compatible app can read it. When people on Bluesky reply, like, or repost what you shared, those reactions show up as comments on your post. And approved comments your readers leave on WordPress are sent right back to Bluesky as replies under your original post \u2014 so the same conversation happens in both places without you having to copy anything by hand.<\/p>\n\n<h4>What you get<\/h4>\n\n<ul>\n<li><strong>Your posts on Bluesky, automatically.<\/strong> Hit \"Publish\" on WordPress, and a moment later your post appears on Bluesky. Links, @-mentions, and #hashtags are detected for you.<\/li>\n<li><strong>Long posts done right.<\/strong> A long article becomes a short, readable Bluesky thread that links back to the full piece on your site. Edits are kept tidy so existing replies and reposts on Bluesky don't get orphaned.<\/li>\n<li><strong>Use your own domain as your Bluesky handle.<\/strong> With one click, your handle becomes something like <code>@yourblog.com<\/code> instead of <code>@you.bsky.social<\/code>. ATmosphere does the technical bit; Bluesky verifies it.<\/li>\n<li><strong>Bluesky reactions become WordPress comments.<\/strong> Replies appear in your comments. Likes and reposts show up alongside them with their own counts so the engagement is visible to your readers.<\/li>\n<li><strong>WordPress comments become Bluesky replies.<\/strong> When a logged-in reader leaves an approved comment on a cross-posted article, it's sent to Bluesky as a reply under the original post.<\/li>\n<li><strong>Catch up on older posts.<\/strong> A built-in Backfill tool can publish posts you wrote before installing the plugin.<\/li>\n<li><strong>Per-post control.<\/strong> You can opt individual posts out of cross-posting straight from the editor sidebar.<\/li>\n<li><strong>No middleman.<\/strong> ATmosphere talks directly to your Bluesky account using modern, secure sign-in. Nothing is routed through a third-party service, and your tokens never leave your WordPress site.<\/li>\n<li><strong>Translation-ready.<\/strong> Help translate ATmosphere into your language.<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Install ATmosphere and activate it.<\/li>\n<li>Go to <strong>Settings \u2192 ATmosphere<\/strong> and click \"Connect\" \u2014 sign in to Bluesky in the normal Bluesky window, then come back to WordPress.<\/li>\n<li>Fill in a name, description, and icon for your \"publication\" \u2014 this is how your site is represented on the AT Protocol.<\/li>\n<li>Publish a post.<\/li>\n<li>Open Bluesky \u2014 your post is there. People can reply, like, repost, and follow as they normally would.<\/li>\n<li>Replies, likes, and reposts will start appearing as comments on your WordPress post. Comments you approve on WordPress will appear as replies on Bluesky.<\/li>\n<\/ol>\n\n<p><strong>Note:<\/strong> Cross-posting only kicks in for posts you publish <em>after<\/em> connecting. To bring older posts across, use the <strong>Backfill<\/strong> tool on the settings page.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>atmosphere<\/code> folder to <code>\/wp-content\/plugins\/<\/code> (or install from the Plugins screen in WordPress).<\/li>\n<li>Activate the plugin through the \"Plugins\" menu.<\/li>\n<li>Go to <strong>Settings \u2192 ATmosphere<\/strong> and click \"Connect\" to sign in with your Bluesky account.<\/li>\n<li>Set the name, description, and icon for how your site should appear on the AT Protocol.<\/li>\n<li>You're done \u2014 your next WordPress post will appear on Bluesky.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20bluesky%20account%3F\"><h3>Do I need a Bluesky account?<\/h3><\/dt>\n<dd><p>Yes \u2014 or an account on any AT Protocol provider. Most people sign up at <a href=\"https:\/\/bsky.app\/\">bsky.app<\/a>, but the plugin works with any compatible AT Protocol service.<\/p><\/dd>\n<dt id=\"does%20my%20account%20information%20stay%20on%20my%20site%3F\"><h3>Does my account information stay on my site?<\/h3><\/dt>\n<dd><p>Yes. ATmosphere signs in to Bluesky directly from your WordPress site. Nothing is routed through Automattic or any other intermediary, and your sign-in tokens are stored encrypted on your site.<\/p><\/dd>\n<dt id=\"can%20i%20use%20my%20own%20domain%20as%20my%20bluesky%20handle%3F\"><h3>Can I use my own domain as my Bluesky handle?<\/h3><\/dt>\n<dd><p>Yes \u2014 that's one of the headline features. Once you've connected, open Bluesky's app settings, choose \"Change Handle\", pick \"I have my own domain\", and enter your WordPress site's domain. Bluesky will check that it really is your site (ATmosphere takes care of the verification file) and switch your handle.<\/p><\/dd>\n<dt id=\"can%20i%20stop%20a%20single%20post%20from%20being%20cross-posted%3F\"><h3>Can I stop a single post from being cross-posted?<\/h3><\/dt>\n<dd><p>Yes. In the post editor sidebar there's an \"ATmosphere\" panel where you can opt the current post out before publishing.<\/p><\/dd>\n<dt id=\"what%20about%20long%20posts%3F\"><h3>What about long posts?<\/h3><\/dt>\n<dd><p>Long posts are turned into a short Bluesky thread of a few connected posts, with the last one linking back to the full article on your site. The full text of your post lives on your AT Protocol account, so other AT Protocol-aware apps and readers can show it too.<\/p><\/dd>\n<dt id=\"are%20my%20wordpress%20comments%20published%20to%20bluesky%3F\"><h3>Are my WordPress comments published to Bluesky?<\/h3><\/dt>\n<dd><p>Yes \u2014 approved comments left by logged-in readers on cross-posted articles are sent to Bluesky as replies under your original post. Anonymous comments, trackbacks, and pingbacks are skipped.<\/p><\/dd>\n<dt id=\"are%20bluesky%20replies%20and%20reposts%20pulled%20back%20into%20wordpress%3F\"><h3>Are Bluesky replies and reposts pulled back into WordPress?<\/h3><\/dt>\n<dd><p>Yes. ATmosphere checks Bluesky periodically and turns replies, likes, and reposts into WordPress comments on the matching post. Likes and reposts have their own comment types so they show up as engagement counts, not as duplicate comment text.<\/p><\/dd>\n<dt id=\"what%20about%20posts%20i%20already%20published%20before%20installing%3F\"><h3>What about posts I already published before installing?<\/h3><\/dt>\n<dd><p>By default, only new posts are shared. You can publish older ones on demand with the <strong>Backfill<\/strong> tool on the settings page.<\/p><\/dd>\n<dt id=\"can%20i%20undo%20a%20cross-post%3F\"><h3>Can I undo a cross-post?<\/h3><\/dt>\n<dd><p>Yes. If you delete or unpublish a WordPress post, the matching Bluesky post and AT Protocol records are removed too. If you trash a post and then restore it, ATmosphere re-publishes it.<\/p><\/dd>\n<dt id=\"does%20atmosphere%20support%20wordpress%20multisite%3F\"><h3>Does ATmosphere support WordPress Multisite?<\/h3><\/dt>\n<dd><p>Not at this time. ATmosphere is designed for a single WordPress site. On a Network-activated install only the current site's data is read and written, and uninstall only cleans the current site \u2014 credentials and records on other sites in the network are left intact.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h3>1.1.0 - 2026-05-21<\/h3>\n\n<h4>Added<\/h4>\n\n<ul>\n<li>Add <code>atmosphere_post_embed<\/code> filter so downstream code can swap the default external link card for a richer embed (<code>app.bsky.embed.images<\/code>, <code>app.bsky.embed.video<\/code>, \u2026) or attach an embed to a short-form post that would otherwise ship with none. The filter accepts <code>null<\/code> (suppress) or an array with a non-empty string <code>$type<\/code> key; non-array, empty-array, or missing-<code>$type<\/code> returns are rejected with <code>_doing_it_wrong<\/code> and the pre-filter value is restored. <code>Post::upload_thumbnail()<\/code> becomes a backward-compatible alias for the new generic <code>Post::upload_image_blob()<\/code>; a new <code>Post::get_attachment_aspect_ratio()<\/code> helper exposes the pixel dimensions consumers need for <code>embed.images<\/code>.<\/li>\n<li>Advertise the site's standard.site publication record from the front page and from each published post via a new <code>&lt;link rel=\"site.standard.publication\"&gt;<\/code> tag, alongside the existing document link.<\/li>\n<\/ul>\n\n<h4>Changed<\/h4>\n\n<ul>\n<li>Refresh the site's publication record when the site URL, the active theme, or the theme's colours change, so the published record always reflects the current site state.<\/li>\n<\/ul>\n\n<h4>Fixed<\/h4>\n\n<ul>\n<li>Fix posts not appearing on Bluesky after a frontend visit lazily stamped the post, restore standard.site verification after reconnecting to a different account, and let the \"use my domain as my Bluesky handle\" button complete reliably without timing out.<\/li>\n<li>Stop publishing replies to local-only WordPress comments to Bluesky. Previously such replies were demoted to a top-level reply on the post; they are now skipped so the Bluesky thread only mirrors comments whose ancestors are also on Bluesky.<\/li>\n<\/ul>\n\n<h3>1.0.0 - 2026-05-20<\/h3>\n\n<h4>Security<\/h4>\n\n<ul>\n<li>Harden OAuth and PDS HTTP request paths against SSRF, encrypt the temporary DPoP key used during connect, and validate URLs received from third-party servers before they are used or stored.<\/li>\n<li>Tighten DPoP proof lifetime when talking to the AT Protocol auth server and PDS, and harden the OAuth and PDS HTTP paths against malformed server responses.<\/li>\n<li>Tighten OAuth redirect handling, validate hook return values from third-party plugins, gate DNS lookups for @mentions, and clean up additional plugin data on uninstall.<\/li>\n<\/ul>\n\n<h4>Added<\/h4>\n\n<ul>\n<li>Add extensible content parser support and a JSON preview endpoint for AT Protocol records.<\/li>\n<li>Add <code>atmosphere_publish_post_result<\/code> and <code>atmosphere_publish_comment_result<\/code> actions so subscribers can react to publish success or failure (e.g., for metrics and notifications) without observing internal state.<\/li>\n<li>Add <code>atmosphere_should_sync_reply<\/code> filter so consumers can suppress specific incoming replies before they become WordPress comments \u2014 primarily useful for teaser-thread publishers that don't want their own follow-up records re-ingested as self-replies.<\/li>\n<li>Automatically sync the publication record when the site name, tagline, or site icon changes.<\/li>\n<li>Choose how long-form posts publish to Bluesky from the ATmosphere settings page \u2014 link card (default), a single post combining body text with the permalink, or a two-post teaser thread.<\/li>\n<li>Choose which post types are published to AT Protocol from the ATmosphere settings page. Plugins and themes can also opt their custom post types in directly with <code>add_post_type_support( 'your_type', 'atmosphere' )<\/code>.<\/li>\n<li>Liftoff! ATmosphere has cleared the troposphere \u2014 version 1.0 is now generally available.<\/li>\n<li>Long-form posts can now be published to Bluesky as a short thread that points readers back to the full article. Sites can keep the existing single-post behavior, publish a shortened text version with a link, or use a two-post teaser thread. When a threaded post is edited, ATmosphere updates the existing Bluesky posts when possible so links and replies stay connected. If the publishing format changes, ATmosphere replaces the old Bluesky posts with new ones.<\/li>\n<li>Preserve the connection success notice after completing Bluesky setup, and let integrating plugins customize the OAuth callback destination.<\/li>\n<li>Publish replies from registered WordPress users to Bluesky as native replies, with edit and unapprove\/delete synced back to the AT Protocol record.<\/li>\n<li>Request the identity:handle permission when connecting to Bluesky so handle changes can be kept in sync.<\/li>\n<li>Short-form posts (untitled or with a post format) now publish as native Bluesky posts instead of link cards, matching the ActivityPub plugin's Note discriminator. Added the <code>atmosphere_is_short_form_post<\/code> filter for downstream override.<\/li>\n<li>Sync Bluesky replies, likes, and reposts back as WordPress comments.<\/li>\n<li>Use your site domain as your Bluesky handle with one click from the ATmosphere settings page.<\/li>\n<li>Use your WordPress domain as your Bluesky handle with automatic domain verification.<\/li>\n<\/ul>\n\n<h4>Changed<\/h4>\n\n<ul>\n<li>Always use HTTPS for the AT Protocol OAuth callback URL, and keep encrypted connection tokens out of the always-loaded options cache.<\/li>\n<li>Improved Bluesky connection reliability and disconnect speed, fixed a rare duplicate-record issue when publishing simultaneously from multiple workers, and now respects your comment moderation and spam filter settings when importing Bluesky reactions and replies.<\/li>\n<li>Improve the development test setup so automated tests can run while another local WordPress environment is already using the default ports.<\/li>\n<li>Limit backfill to the 10 most recent unsynced posts to avoid overwhelming the server on large sites.<\/li>\n<li>Long-form teaser threads now use a 3-post default (hook, body chunk, \"continue reading\" reply with a link card), so the thread reliably surfaces on bsky.app profiles and the terminal post offers a clear path back to the WordPress article.<\/li>\n<li>Redesign the settings page to use the standard WordPress Settings API for a cleaner, more consistent admin experience.<\/li>\n<li>Replace third-party JWT library with native OpenSSL signing and add a custom class autoloader.<\/li>\n<\/ul>\n\n<h4>Fixed<\/h4>\n\n<ul>\n<li>Break up large cleanup batches when removing a post and its replies so deletion still completes on threads with many comments.<\/li>\n<li>Clear every plugin-owned scheduled event on deactivate and uninstall so leftover jobs don't linger after the plugin is removed.<\/li>\n<li>Clear queued sync events on disconnect, deactivation, and uninstall so leftover jobs cannot fire against a different connected account.<\/li>\n<li>Editing a WordPress post that was published before connecting to Bluesky no longer creates a new Bluesky post on save. Use the Backfill tool to sync existing posts on purpose.<\/li>\n<li>Fix auto-publish being disabled by default after saving settings.<\/li>\n<li>Fix PHPCS warnings about unprefixed global variables and hook names.<\/li>\n<li>Fix published posts being incorrectly deleted from Bluesky when editing.<\/li>\n<li>Fix restoring a trashed post not republishing it to Bluesky.<\/li>\n<li>Fix the settings page, meta box, and backfill actions not loading after the previous admin hook change.<\/li>\n<li>Keep your AT Protocol verification headers and publishing preferences in place when your session expires. Reconnect is required to resume publishing, but your settings no longer reset and standard.site verification keeps working.<\/li>\n<li>Move scheduled action hook registration into the standard plugin initialization flow.<\/li>\n<li>Preserve remote cleanup of already-synced posts when their post type is removed from the syncable allowlist.<\/li>\n<li>Preserve the OAuth connection when token refresh fails due to temporary server errors.<\/li>\n<li>Prevent concurrent token refreshes from racing each other and accidentally disconnecting the plugin.<\/li>\n<li>Prevent password-protected or otherwise non-public posts from being published to AT Protocol records, and remove existing records when public posts become protected.<\/li>\n<li>Remove a comment reply from Bluesky if the comment was deleted or unapproved while it was being published, instead of leaving an orphan reply behind.<\/li>\n<li>Short posts under the long-form teaser-thread strategy no longer ship a redundant \"continue reading\" reply when the entire body already fits in a single Bluesky post. The link-back is preserved as a card on the same post.<\/li>\n<\/ul>\n\n<p>See full Changelog on <a href=\"https:\/\/github.com\/Automattic\/wordpress-atmosphere\/blob\/trunk\/CHANGELOG.md\">GitHub<\/a>.<\/p>","raw_excerpt":"Share your WordPress posts on Bluesky and the wider AT Protocol network \u2014 and let conversations there come back as comments on your site.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/302405","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=302405"}],"author":[{"embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/automattic"}],"wp:attachment":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=302405"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=302405"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=302405"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=302405"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=302405"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=302405"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}