Free Bluesky Share Link Generator
Build a bsky.app compose link that opens Bluesky with your text, URL, and hashtags already typed. Live 300 character counter, ready HTML button, nothing leaves your browser.
Everything runs in your browser. Your draft never reaches our servers, and history stays in this browser only.
Your URL is eating your 300 characters.
Bluesky does not shorten links in the composer, so every character of your URL comes out of the message. Swap it for a Flyn short link, win back the space, and count every click while you are at it.
How to Create a Bluesky Share Link in 3 Steps
Write the post text
Type the message you want waiting in the composer when someone taps your button. The counter tracks it against Bluesky's 300 character limit in real time, and the bar turns amber when you get close.
Add the URL and hashtags
Paste the link you want shared and add optional hashtags. Both land inside the same text parameter, so the budget breakdown shows exactly how many characters each piece is costing you.
Copy the link or the HTML button
Copy the bsky.app/intent/compose URL for anywhere a link goes, grab the ready HTML anchor for your site, or press Preview on Bluesky to watch the composer open with your draft already in it.
What Is a Bluesky Share Link?
A Bluesky share link is an ordinary https URL that opens the Bluesky composer with a draft already typed in it. The whole thing is one address: https://bsky.app/intent/compose?text=.... Click it and Bluesky opens, the composer appears, and the message is sitting there waiting. Nothing is published until the person reads it and presses Post.
This pattern is usually called an intent link, and it is the same idea social platforms have used for years to power "share this" buttons. The value is friction removal. A reader who has to open an app, start a post, hunt down your URL and think of something to say usually gives up somewhere in the middle. A reader who taps once and sees a finished sentence they can tweak in two seconds usually posts.
The design of the endpoint is deliberately minimal. There is exactly one parameter, text, and everything you want in the draft has to be inside it, URL-encoded. There is no separate field for a link, no field for media, and no field to credit an account. That simplicity is why the link is so reliable across the web app, the iOS app, and the Android app, and it is also why the character budget matters so much.
The limit is 300 characters, counted in graphemes rather than bytes, and your URL is part of that count. This is the single detail that trips people up: a long campaign URL with tracking parameters can swallow a third of the post before you have written a word. Shortening the destination first is not a nice-to-have, it is how you buy back room for the actual message.
Anatomy of a bsky.app Compose Intent URL
Four pieces, one parameter. If a snippet you copied from somewhere else has a url= or via= parameter in it, it was written for a different network and Bluesky will silently ignore it.
| Piece | Role | What to know |
|---|---|---|
| https://bsky.app | Host | The only host that serves the compose intent. Do not swap in a PDS hostname or a custom domain handle, those serve the AT Protocol, not the web app UI. |
| /intent/compose | Path | The route that opens the Bluesky composer in intent mode. Hitting it with no parameters simply opens an empty composer. |
| ?text= | The one parameter | Everything you want in the draft goes here as a single URL-encoded string. There is no url, hashtags, via, or media parameter, no matter what a copied snippet claims. |
| %20 %0A %23 | Encoding | Spaces become %20, newlines become %0A, and a hash symbol becomes %23. Skip the encoding and your text truncates at the first space or breaks the query string. |
A finished example
https://bsky.app/intent/compose?text=Just%20read%20a%20sharp%20breakdown%20of%20link%20attribution.%0A%0Ahttps%3A%2F%2Fflyn.to%2Fblog%0A%0A%23marketingThat decodes to a sentence, a blank line, the URL, another blank line, and one hashtag. 82 characters used, 218 left for whoever clicks it to add their own take.
What Counts Toward Bluesky's 300 Characters
Bluesky enforces 300 graphemes per post. A grapheme is what a person sees as a single character, so an emoji is one, not four. Everything you put in the compose intent shares that one budget.
| Element | Counts? | Detail |
|---|---|---|
| Post text | Yes | Every visible character, including spaces and line breaks. |
| The URL you append | Yes, in full | Bluesky does not shorten links in the composer. A 72 character URL costs 72 characters. |
| Hashtags | Yes, hash included | Three tags at ten characters each is 10 percent of the budget gone before you write a word. |
| Emoji | One grapheme each | Bluesky counts what a human sees as one character. Flags and skin tones are the edge cases. |
| Line breaks | Yes | Each newline is one character, and it is encoded as %0A inside the link. |
| Link cards | No | A card is generated from the URL after posting. It costs nothing extra, but the URL text still counts. |
Our counter walks code points rather than graphemes, which means a flag or skin tone emoji may read as two here where Bluesky reads one. The gap only ever makes the tool stricter than the real limit, so a draft that fits in our counter always fits in the composer.
Share Link vs Shortened Bluesky Link
These two tools get confused constantly because both involve Bluesky and a link. They point in opposite directions. If you want to compress a bsky.app URL for sharing elsewhere, you want the Bluesky link shortener instead.
| Aspect | Share link (this tool) | Shortened link |
|---|---|---|
| Direction of travel | Sends people into Bluesky with a draft ready | Sends people out of Bluesky to your destination |
| Where it belongs | Your website, blog, newsletter, docs, thank you page | Your own Bluesky posts, bio, and starter packs |
| What the reader does | Reviews the prefilled text and presses Post | Taps and lands on your page |
| Analytics | None from Bluesky, wrap it in a short link to count clicks | Full click counts, with device and country on Pro |
| Character impact | The link is the whole point, 300 char budget applies | Saves characters inside your own posts |
The two work well together. Shorten your destination first, then drop the short link into the share text. You spend fewer characters, and you get the click count that Bluesky itself will never report back to you.
Where a Bluesky Share Button Earns Its Place
Blog post "share this" buttons
Put the headline plus the canonical URL in the draft so every reader who shares repeats the same framing instead of writing "interesting read".
Newsletter forward CTAs
A share link in the footer of an issue converts readers into distributors. Email clients handle plain https links cleanly, no app deep link weirdness.
Post-signup thank you pages
The moment right after someone converts is the highest intent moment you will get. A prefilled "just joined" draft catches it.
Changelog and release notes
Ship a share link next to each release entry with the version number already in the text, so shares stay searchable and specific.
Docs and support articles
Let people share the exact page that unblocked them. The URL in the draft is the deep link, not your homepage.
Event and webinar pages
Prefill the date and the registration link so attendees can invite their followers in one tap without retyping details.
Bluesky Share Link Best Practices
Six things that separate a share button people actually use from one that gets ignored.
Shorten the URL before you build the link
Since the URL eats the same 300 characters as your words, a short link is a direct trade of URL length for message length. It also gives you the click count Bluesky will never hand you.
Write in the sharer's voice, not yours
The draft is published by them, from their account. "We just launched" reads wrong in a stranger's feed. Write something a reader would plausibly say out loud.
Leave headroom under 300
Aim for roughly 260 characters. People edit the draft before posting, and a composer that is already full blocks them from adding their own take, which is the part their followers care about.
Put the URL on its own line
A blank line before the link keeps the message readable in the composer and keeps the link card preview tidy once the post goes out.
Test the encoded link before shipping it
Click your own button once on desktop and once on a phone. Double encoded text and stray unescaped ampersands only reveal themselves in a real composer.
Do not stuff hashtags
Bluesky discovery leans on feeds and follows more than tags. Two focused tags help, six make the post look automated and burn characters you needed for the point.
Why Use Flyn's Bluesky Share Link Generator?
Honest 300 counter
Text, URL, and hashtags counted together, the way Bluesky counts them. No surprise truncation after you ship the button.
100% client side
Your draft never leaves the browser. Nothing is logged, nothing is sent, safe for unannounced launches.
HTML snippet included
Copy a ready anchor tag with target and rel already set, paste it into any CMS, done.
Pairs with click tracking
Wrap the intent URL in a Flyn short link to finally see how many people tap your share button.
Frequently Asked Questions
What is a Bluesky share link?
A Bluesky share link is a normal https URL that opens the Bluesky composer with a draft already typed. The address is https://bsky.app/intent/compose?text= followed by your URL-encoded message. Bluesky calls these intent links, the same idea as the classic tweet intent or the LinkedIn share URL. The person clicking it still reads the draft and presses Post themselves, nothing is published automatically.
Why put a share link on my website instead of a plain link to my profile?
A profile link asks the reader to do the work: open Bluesky, start a post, find your URL again, write something. A share link collapses all of that into one tap and lands them in a composer that already says what you want said. The practical effect is that far more people finish the share, and the wording of those shares stays consistent, which matters when you are trying to get a specific phrase or product name repeated.
Does the 300 character limit include the URL I append?
Yes, and this is the single most common mistake. The compose intent has exactly one parameter, text, so your link is simply part of the message body and every character of it counts. A 60 character URL takes a fifth of your entire budget. Our counter adds the URL and hashtags to your post text and shows the real total before you ship the button.
Does Bluesky shorten links inside the compose intent?
No. Bluesky visually truncates long URLs when a post is displayed in the feed, but that is a display trick applied after posting, not a shortener. Inside the composer the full URL sits there as raw text and consumes the full character count. If your URL is long, shorten it before you build the share link, that is the only way to buy back characters.
Does the share link work in the Bluesky mobile app or only on the web?
It works in both, with a caveat. On desktop the link opens bsky.app in the browser and drops the text straight into the composer. On mobile, iOS and Android hand bsky.app URLs to the installed Bluesky app through Universal Links and App Links, so the app composer opens with your draft. If the app is not installed, the mobile browser opens the web composer instead, and the text still arrives.
Can I prefill an image, video, or GIF?
No. The compose intent accepts text only, there is no parameter for media, alt text, or a poll. Anyone telling you otherwise is describing a different network. If you need an image in the post you have two options: attach it manually after the composer opens, or publish through the AT Protocol API with your own client, which uploads the blob first and then creates the record.
Can I schedule a post with a share link?
Not with an intent link. A share link does nothing until a human clicks it, so there is no moment in time to schedule. Scheduling requires either a third party tool that holds an app password and posts on your behalf, or your own AT Protocol integration. Share links solve distribution, not timing.
How is this different from a shortened Bluesky link?
They point in opposite directions. A share link sends people INTO Bluesky with a draft ready to publish, so it belongs on your website, in your newsletter, or at the end of a blog post. A shortened link sends people OUT of Bluesky to your destination, so it belongs inside your own posts and bio. Use our Bluesky link shortener for that second job, and use this generator for the first.
Do emoji count as one character on Bluesky?
Bluesky counts graphemes, which is the technical term for what a human sees as one character, so a standard emoji counts as one and an accented letter counts as one. Our counter walks code points instead, which means a flag or a skin tone emoji can read as two here. That difference always errs on the safe side: if our counter says you fit, Bluesky agrees.
Do I need a Bluesky account or an API key to use this?
Neither. The generator builds a URL string in your browser, it never talks to Bluesky, and there is nothing to authenticate. You only need an account at the moment someone actually clicks the link and posts, and that account belongs to them, not to you. Nothing here touches the AT Protocol, app passwords, or OAuth.
Can I include hashtags, and do they become clickable?
Yes. Type them in the hashtags field without the hash symbol and we normalise and append them. Bluesky parses hashtags at post time and turns them into tappable facets, so they become real clickable tags in the published post. Two or three focused tags outperform a wall of them, and remember each one eats into the same 300 characters.
What happens if the person clicking is logged out?
Bluesky shows the sign in screen first. Whether the draft survives the login round trip depends on the client and the session state, so treat a logged out click as a lower probability share. This is a good argument for putting the share button where your logged in Bluesky audience already is: your newsletter, your docs, your thank you page after a signup.
Can I track how many people click my Bluesky share button?
Not from Bluesky, which reports nothing back to you about intent clicks. The workaround is to point your button at a Flyn short link that redirects to the bsky.app intent URL. Flyn counts every click, so you learn which page, newsletter, or docs section actually drives shares, and the composer still opens with your text intact.
Does my draft text get sent to Flyn or stored anywhere?
No. Everything on this page is built with client side JavaScript. Your text, URL, and hashtags never leave the browser, there is no API call behind the Build button, and no server log of what you typed. The optional history lives in your browser localStorage and is capped at the last twenty entries.
Why is my link breaking when I paste it into an email tool?
Almost always double encoding. The text parameter is already percent encoded, so a tool that helpfully encodes the whole href a second time turns %20 into %2520 and the composer fills with garbage. Paste the link exactly as generated, and if your email or CMS editor mangles it, use the HTML snippet we output instead of retyping the href.
Related Tools
Build the share button here, then shorten what it points at.
Bluesky Link Shortener
The other direction: turn long bsky.app profile, post, and starter pack URLs into short trackable links.
LinkedIn Share Link Generator
Same share button idea for LinkedIn, with its own quirks around what you can and cannot prefill.
Telegram Share Link Generator
Build t.me share links with a prefilled message for channels, groups, and direct chats.
Reddit Submit Link Generator
Prefill a Reddit submission with a title, target subreddit, and URL in one click.
Stop spending your post on the URL
Shorten the destination first, drop it into your share text, and get the click count Bluesky will never give you. Free click counts and QR codes, with analytics breakdowns and custom domains on Pro.
Tip: two focused hashtags beat six generic ones on Bluesky.