Free tools/Bluesky video downloader
Bluesky Video Downloader
Paste a post link and save the video as an MP4 you can actually edit.
Only download content you have the right to save. Public content only — respect creators and each platform's terms.
- No signup
- No extension
- Nothing stored on our servers
- The poster is never notified
Only download content you have the right to save: your own uploads, Creative Commons material, or videos whose owner has given you permission. Unsora hosts nothing, stores nothing, and is not affiliated with Bluesky or Bluesky Social PBC. We read the public files the app already fetches to play the post, join them, and keep no copy.
How it works

01
Copy the post link
On the web, copy the URL from the address bar. In the app, tap share and choose Copy link. Both give a bsky.app/profile/.../post/... link, which is all we need.

02
Paste it and let it resolve the post
We turn the handle into the account's identifier, find the video attached to the post, and fetch it.

03
Check the preview, then save
Play a few seconds. If it looks right, save the MP4.
What you get
Segments joined into one MP4
Bluesky streams video as a playlist of short chunks. We fetch each one in order and write them into a single file.
Handles and DIDs both resolve
Paste a link with a handle in it, or one with a raw did:plc: identifier. Both find the same post.
Only the quality that exists
You get what the transcode produced, usually topping out around 720p. No 4K button that fails, because Bluesky never made a 4K rendition.
GIFs handled too
Most Bluesky GIFs are Tenor embeds rather than uploaded media, and they save as the silent looping file Tenor serves.
Nothing installed, nothing kept
No extension, no app, no account. The finished file is streamed to you and the working copy dropped.
Then cut it and post it back
AI clipping cuts a saved clip into captioned verticals, and the Bluesky scheduler queues them back out on a calendar you set. From $19/mo with a 3-day free trial.
How this Bluesky video downloader gets the file
Bluesky runs on the AT Protocol, and that changes what it takes to download Bluesky videos.
Every post is a record in the poster's repository, held on their PDS, or Personal Data Server. The record's real address is a URI like at://did:plc:z72i7hdynmk6r22z27h6tvur/app.bsky.feed.post/3k2yx4rmgnc2b: the account's DID, a permanent identifier that survives a username change, then the record type, then the record key.
That is never the link you paste. You copy bsky.app/profile/alice.bsky.social/post/3k2yx4rmgnc2b, which uses the handle instead. Handles are rented and move between accounts, so the first job is resolving one to the DID that owns it, through a DNS record or a file served at the handle's domain. Then you have the post's permanent address.
Attached to that record is the video, stored as a blob. A blob is content-addressed: referenced by a CID, a hash of the bytes, rather than by a filename. The record holds the CID, the aspect ratio, the alt text and any caption files. The bytes live on the PDS.
Playback takes a different path. On upload, the video service transcodes the file and publishes it to a CDN as HLS, which means the video is not one file. It's an .m3u8 playlist pointing at a ladder of quality variants, each variant its own playlist pointing at a run of .ts segments a few seconds long. Your player pulls the chunks as it goes, which is why a post plays instantly and quietly changes quality on a bad connection.
It's also why right-click and Save video as gives you nothing useful. There's no single file behind the player. Getting an MP4 means fetching every segment in order, joining them, and rewriting the result into an MP4 container. That last step is a remux rather than a re-encode: the bytes are copied across untouched and only the packaging changes.
Three consequences follow, and they're the ones people get wrong. Quality is fixed at whatever the transcode produced: those ladders typically top out around 720p, and nothing recovers detail already thrown away. There is no 4K option, whatever a tool claims — Bluesky never made a 4K rendition, so nothing can hand you one. And a very fresh post can fail: transcoding runs after the upload, and until it finishes there's no playlist to read. Try fifteen seconds after posting and you'll get a failure that isn't a bug.
Federation, and why the video isn't always where you'd expect
Here's the part no other page on this subject covers. The network is open, and the app you use isn't the only place the data lives.
Anyone can run their own PDS, and plenty of people do, on a small server with their own domain as their handle. Their posts show up in the app like everyone else's, because the app view is a separate service that crawls the network and assembles the timeline you read. It's a convenience layer, not the source of truth.
So a downloader can't assume one hostname. It resolves the DID to an identity document, reads the service endpoint listed there, and goes wherever the video actually lives. For an account on Bluesky's own infrastructure that endpoint is one of theirs. For a self-hosted account it's a machine in somebody's flat. A tool that hardcodes a single domain silently fails on the second kind.
This matters more over time, not less. Every account that moves to its own server becomes a link that breaks on tools which never learned to resolve identity properly.
GIFs on Bluesky are not videos
A Bluesky GIF is usually not uploaded media at all. The GIF button in the composer searches Tenor, and picking one attaches an external link embed: a URL, a title and a thumbnail pointing at a file on Tenor's servers.
That's a different object with different rules. It isn't a blob in the poster's repository, it has no CID, and it never touched the video service or the HLS pipeline. The file behind it is usually an MP4 Tenor serves, which is why these are silent and loop.
Practically, they save quickly at whatever size Tenor hosts, with no quality ladder to choose from. If someone uploaded an actual GIF file as media instead, it behaves like any other blob.
Quotes, reposts, and deleted posts
Reposts carry no media. A repost is a small record pointing at someone else's post, so either link lands in the same place.
Quote posts embed another record, and the quoting post can carry its own video on top of the one it's quoting. If the video you want is on the quoted post, open that post and copy its own link — the most reliable way to say which of the two you mean.
Deleted posts are gone. Deleting the record removes the reference to the blob, and an unreferenced blob gets cleaned up on the server that held it. We archive nothing and won't pretend otherwise.
Custom feeds change none of this. A feed generator returns a list of post addresses and the app fetches the posts, so a video from a niche feed is stored like any other. Open the post and copy its link. A feed URL holds no media.
Backing up your own posts, and what to do with them next
The strongest reason to use this on your own account is a migration. The AT Protocol lets you move to a different server and keep your identity, and blobs are handled separately from records in that process. Pulling down the videos you care about first takes a few minutes.
Then the obvious next step, which here is unusually direct: Unsora has a Bluesky scheduler. Save a clip, run it through AI clipping to cut it to a captioned vertical, and schedule it straight back out to Bluesky, or to TikTok, Instagram, YouTube, Facebook and LinkedIn alongside it. Save it, cut it, schedule it. All of it is callable over one MCP connection from the AI tools you already use.
Plans start at $19/mo with a 3-day free trial. This downloader is free and stays free. It isn't a trial.
Next steps
Post links out to YouTube? save it from YouTube.
Reposting on your own account? schedule the Bluesky post and let it go out on time.
Want more from your assistant? browse the skills library.
Related tools
Other free tools you might need next
Honest limits
What this tool does
- Video from any public post, joined into a single MP4
- Links with a handle in them, and links with a raw did:plc: identifier
- Posts hosted on self-run servers
- Reposts, which resolve to the original post
- Tenor GIF embeds, saved as the file Tenor serves
What it doesn't do
- Accounts that turned off logged-out visibility. We don't sign in as you.
- Videos still transcoding. A post seconds old often has no playlist yet.
- Deleted posts. When the record goes, so does the reference to the video.
- 4K, or anything above what Bluesky transcoded. Nothing here upscales.
- Direct messages. Different system, and we don't touch it.
- Anything behind a login, a paywall or DRM. We don't build that.
Checklist
What a clean downloader looks like
This category has a trust problem, so here is a checklist worth running on any tool, this one included.
01
It works from the link you already copied
A bsky.app URL out of the address bar should be enough. Anything demanding a raw file address has left the hard part with you.
02
Nothing to install
A tool wanting an extension is asking to read every tab you open.
03
No waiting screen
A countdown in front of your file is selling impressions.
04
One save button
Where four buttons compete, three of them are adverts.
05
No sign-up, nothing retained
Stitching a playlist together needs no email address, and deleted is the only good answer to where your file lives afterwards.
06
A ceiling it admits to
Anyone advertising 4K here is promising pixels Bluesky never made.
07
It names the reason it failed
A post still transcoding and a deleted one are separate problems and should say so.
Saved the clip. Now cut it and post it.
Unsora turns a saved video into captioned vertical shorts and schedules them straight back to Bluesky, plus TikTok, Instagram, YouTube, Facebook and LinkedIn. This tool stays free.
Start the free trialFAQ
Common questions
Does the person who posted it know I saved their video?
No. There's no download notification on Bluesky, and fetching the video looks identical to watching it. Nothing appears in their notifications.
What's the highest quality I can get?
Whatever Bluesky transcoded for that post, usually around 720p at the top. There's no 4K version to download.
I just posted a video and it won't save. Why?
Transcoding runs after the upload. Until it's done there's no playlist to read. Give it a minute.
How long can a Bluesky video be?
Up to three minutes. It was 60 seconds when video launched in September 2024, raised in March 2025.
The account runs its own server. Will that work?
Yes. The account's identity record says where its data lives, and the post resolves from there. Self-hosted accounts work like any other.
Can I download a GIF from Bluesky?
Yes. Most are Tenor embeds rather than uploaded media, so they save as the silent looping MP4 Tenor serves.
What happens with a quote post?
If the video you want is on the quoted post, open that post and copy its own link. Reposts resolve to the original automatically.
Can you recover a video from a deleted post?
No. Deleting the post removes the reference to the stored file. We run no archive.
How do I back up my clips before moving to a different server?
Paste each post link and save the files. Videos are handled separately from posts during a migration, so local copies first is the safe order.
Is there a Bluesky downloader app or extension?
There are some. This runs in the browser: nothing to install, no permissions, no access to your other tabs.
Is it free, and do I need an account?
Free, no account, no limit on links. Unsora sells a paid AI video suite and this tool exists so people find it. Not a trial.
Is it legal to download Bluesky videos?
Saving a public video for your own use is generally fine in most places. Reposting someone else's clip as your own can be copyright infringement however you got it. Read Bluesky's Terms before reusing anything commercially. General information, not legal advice.
Built and maintained by the Unsora team.
How Bluesky stores and serves video over the AT Protocol last reviewed on August 14, 2026.
Changelog
August 14, 2026. Page rewritten. Documented how a post stores video as a blob, how HLS playback works, DID resolution for self-hosted servers, and how Tenor GIF embeds differ.