What the Markdown looks like
One file per month, grouped into folders by year, plus an index that links to all of them. Each post gets a timestamped heading, its text with links, mentions and hashtags converted into proper Markdown links, its images embedded, and a permalink back to the original post.
Every file starts with YAML front matter — title, handle, month, post count — so note-taking apps and static site generators can read it without any conversion step.
Why not one file per post?
Because it breaks things. A three-year account produces thousands of files, which makes some importers fail outright, slows down search in others, and turns a tidy folder into an unusable mess. Grouping by month keeps the archive readable and the imports reliable.
If you do want a note per post — for backlinks and graph views — pick the Obsidian vault instead. It is built exactly that way, on purpose.
The text is preserved exactly
Bluesky stores links and mentions as byte offsets into the UTF-8 encoding of your post, not as character positions. Tools that slice text by JavaScript string index corrupt any post containing emoji, accented characters or non-Latin scripts — the link lands in the wrong place and letters go missing.
This converter slices on byte boundaries. Every post in every archive we test rebuilds to a byte-identical copy of the original, emoji included.
Questions
- Are my images included?
- Yes, if you ask for them. Bluesky's own export leaves media out entirely, so this fetches every photo and video from your server and stores them in a media folder, with each file named after the post it belongs to.
- Does it include replies?
- Everything is included, and replies are marked so you can filter them out. For blog-style exports, replies are excluded automatically because they read as fragments without their context.