How to Connect Ghost CMS to Bluesky: 3 Methods That Work

Ghost CMS Bluesky integration setup guide

Quick answer: Ghost CMS connects to Bluesky in two ways. Ghost 6+ has a built-in Social Web (ActivityPub) toggle that bridges your posts to Bluesky via Bridgy Fed — readers can follow your site on Bluesky without you having a separate account. For direct, fully-automated posting, use a webhook + the ghost-bluesky-integration Docker service or a Zapier/n8n workflow.

Ghost CMS Bluesky integration setup guide

Dozens of Ghost users ask this every week: "I publish new posts — how do I get them to Bluesky automatically?" The question keeps coming up because Ghost doesn't have a one-click Bluesky button in the admin panel. Instead there are three different paths depending on what you need, and each one works in a completely different way.

Ghost 6 shipped the Social Web feature (built on ActivityPub) in August 2025. That changed the picture significantly — Bluesky distribution is now baked in, just hidden behind a toggle that most people miss. On top of that, there's a lightweight Docker service and a no-code Zapier route if you want more control over how posts appear.

This guide covers all three approaches with exact steps, what to expect from each, and the fixes for the most common things that break.

How does Ghost connect to Bluesky in Ghost 6?

Ghost 6 introduced a Social Web panel in admin settings (Settings → Network). Toggle "Distribute posts to the social web" and your Ghost site gets an ActivityPub actor — meaning it becomes a first-class citizen of the fediverse.

Bluesky runs on AT Protocol, not ActivityPub, so Ghost bridges to it through Bridgy Fed. Once your site is on the social web, Bluesky users can follow your publication using the handle @yourdomain.com.ap.brid.gy. When you publish a post, it automatically shows up in their Bluesky feeds.

One important caveat: this isn't a native Bluesky account. Your posts appear bridged, not as a first-party bsky.social or custom-handle account. For a publication-first setup where readers follow your content (not your personal account), this works well. If you want a dedicated Bluesky presence with your own handle, use Method 2 instead.

Requirements for the Social Web feature:

  • Ghost 6.0 or later (check with ghost version)
  • A custom domain — Ghost.com subdomains don't support ActivityPub
  • Self-hosted or Ghost Pro with a custom domain attached

Already on Ghost 5 and need to upgrade? The process takes about 10 minutes on a typical VPS.

How do I automatically post to Bluesky when I publish in Ghost?

If you want a real Bluesky post — with your own handle, image card, and full control over the excerpt — the ghost-bluesky-integration Docker service by Elliot Clyde is the cleanest self-hosted option.

It works via a Ghost webhook: when you publish a post, Ghost fires a post.published event to the service, which then calls the Bluesky API and creates a post with a link card.

Step 1: Create a Bluesky App Password

Go to Bluesky → Settings → Privacy and Security → App Passwords. Create one named something like "ghost-integration". Copy it.

Step 2: Run the Docker service

version: "3.3"
services:
  ghost-bluesky-integration:
    container_name: ghost-bluesky-integration
    image: ghcr.io/elliotclyde/ghost-bluesky-integration:latest
    environment:
      - IDENTIFIER=yourhandle.bsky.social
      - PASS=your-app-password
      - USETITLE=TRUE
    ports:
      - 7969:7969
    restart: unless-stopped

Run with docker-compose up -d. The service listens on port 7969.

Step 3: Add the Ghost webhook

In Ghost admin: Settings → Integrations → Add custom integration. Name it "Bluesky Auto-Post". Copy the integration ID, then go to the Webhooks section and add:

  • Event: Post published
  • URL: http://YOUR_SERVER_IP:7969/post-published

Save it. Test by publishing a draft post — the integration will fire and create a Bluesky post with the title (or excerpt) and link.

If your Ghost and the integration run on the same server, use http://localhost:7969/post-published or the internal Docker network address. Check the Ghost webhook setup guide if you run into authentication issues.

Can I use Zapier or n8n to post to Bluesky from Ghost?

Yes — both work without running any server. Zapier has a native Ghost + Bluesky zap template. n8n requires a bit more setup but gives you full control over the post content.

MethodSetup timeCostControl over post
Ghost Social Web (Bridgy Fed)2 minutesFreeLow — mirrors full post
Docker webhook service15 minutesFree (self-hosted)High — title + excerpt + card
Zapier10 minutesPaid (Zapier plan)Medium — template-based
n8n workflow20-30 minutesFree (self-hosted)Very high — full custom logic

The Zapier setup: Connect Ghost as a trigger (Post Published), then Bluesky as an action (Create Post). Map the Ghost post custom_excerpt or title field to the Bluesky post content, and include the post URL. Zapier handles auth for both sides.

For n8n, use a Ghost trigger node with the post.published event, then an HTTP Request node to call the Bluesky com.atproto.repo.createRecord API endpoint with a Bearer token from your App Password. The Ghost + n8n integration guide covers getting Ghost triggers set up end-to-end.

How do I let Bluesky users follow my Ghost site?

With the Social Web enabled (Ghost 6), your site is discoverable at @yourdomain.com@yourdomain.com from any ActivityPub app (Mastodon, Pixelfed, etc.). For Bluesky specifically, the bridged handle is @yourdomain.com.ap.brid.gy.

There's a shortcut: in your Ghost admin's Network settings, there's a "Bluesky sharing" preference at the bottom. Enabling it follows @bsky.brid.gy@bsky.brid.gy from your Ghost actor — this effectively opts your site into the AT Protocol bridge and makes it followable on Bluesky.

Once enabled, your Bluesky handle looks like: @index.yourdomain.com.ap.brid.gy. It's not the prettiest, but Bridgy Fed does support claiming a custom domain handle — check their docs for the verification flow.

Why aren't my Ghost posts showing up on Bluesky?

A few things cause this:

  • No custom domain — ActivityPub requires a real domain. Ghost.com subdomains won't work.
  • Ghost version below 6.0 — the Social Web panel doesn't exist. Upgrade first.
  • Social Web toggle is off — check Settings → Network → Social Web.
  • Webhook URL unreachable — if using the Docker method, make sure port 7969 is open in your firewall and the URL in Ghost points to a publicly accessible address, not localhost.
  • Bluesky app password scope — app passwords need the "Post" permission scope. Regenerate one if you're not sure.
  • Bridgy Fed delay — the bridge isn't instant. Wait 5-10 minutes after publishing before checking Bluesky.

If the Docker integration fires but no post appears, check the container logs: docker logs ghost-bluesky-integration. The most common error is an invalid app password or the wrong Bluesky identifier format (must be the full handle, e.g. yourname.bsky.social, not just yourname).

Can Ghost comments sync with Bluesky?

This is experimental but possible. A fork of Ghost called Zombie (by Cooperation.org) adds two-way comment sync: comments left on a Bluesky thread tied to your post sync back into Ghost, and Ghost native comments can flow out to Bluesky.

There's also a simpler approach that doesn't require forking Ghost at all: use a web component to embed Bluesky replies as comments on your posts. The pattern is: post to Bluesky manually or via automation, grab the post URI, then embed it in your Ghost post using the <bluesky-feed> web component. Readers don't need a Ghost account to comment — they reply on Bluesky, and the replies show on your site.

If you're using Ghost's native comments, you'll need to hide them first to avoid double comment sections:

<style>
#ghost-comments-root { display: none; }
</style>

The full two-way sync is only for self-hosted Ghost (you run the modified server code). If you're on Ghost Pro or a standard Ghost install, the embed-only approach is the practical option right now. For full-featured comment management, see the Ghost comments setup guide.

Frequently Asked Questions

Does Ghost have a native Bluesky integration?

Not a direct one. Ghost 6 includes Social Web (ActivityPub) which bridges to Bluesky through Bridgy Fed, but it doesn't create a native bsky.social account. For that, use a webhook-based service or Zapier.

Can Bluesky users follow my Ghost publication?

Yes. With Ghost 6's Social Web enabled, Bluesky users can follow your site using a bridged handle like @yourdomain.com.ap.brid.gy. Enable Bluesky sharing in Settings → Network to activate the bridge.

Is the ghost-bluesky-integration Docker service free?

Yes, it's open source under the MIT license. You just need a server to run Docker on — the same VPS running Ghost works fine.

Will Ghost ever have a built-in Bluesky account (not just a bridge)?

Ghost is focused on ActivityPub/fediverse as its social layer. Native AT Protocol support (a real bsky.social-style account) isn't on the public roadmap yet, but the Cooperation.org Zombie fork shows it's technically possible.

What's the difference between Bridgy Fed and Bridgy Classic?

Bridgy Classic cross-posts content between separate accounts. Bridgy Fed federates your existing account into another network — no separate account needed. Ghost's Social Web uses Bridgy Fed.

Do I need Ghost Pro to use the Social Web / Bluesky feature?

No — it works on self-hosted Ghost 6+ with a custom domain. Ghost Pro also supports it if you have a custom domain attached to your Ghost Pro site.

Why does my Bluesky handle look weird after enabling Social Web?

The default bridged handle is @yourdomain.com.ap.brid.gy, which isn't pretty. Bridgy Fed supports custom domain handles — you can verify ownership to use @yourdomain.com directly on Bluesky.

Can I post different content to Bluesky than what Ghost publishes?

Not with the Bridgy Fed bridge — it mirrors what you publish. With the Docker webhook service or n8n, you have full control over what the Bluesky post says, including custom excerpts, hashtags, and thread-style posts.

The easiest path for most Ghost site owners: enable Social Web in Ghost 6 settings for a quick, zero-maintenance Bluesky presence. If you need a proper Bluesky account with full control — title, excerpt, hashtags, and your own handle — go with the Docker webhook service. It takes 15 minutes and costs nothing beyond the server you're already running.

Subscribe to Ghost SEO

Don’t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe