Say hello to `threadcat`!
-
Say hello to `threadcat`! 🧶

It's a little Rust tool which takes the URL to a Mastodon thread, and converts it to a Markdown file. It also downloads all attached media files (and their alt texts)!
That way, it's really easy to get a "first draft" for a blog post from a thread you wrote!
Installation: `cargo install threadcat`
@blinry Does it mean that it's time for me to say that I've created a small CLI tool in PHP to list your threads in HTML files?
I mean, it's still a prototype, but it's definitely worth having IMO.
-
Correct me if I am wrong:
You wrote a tool that enables people to download complete Mastodon threads from other participants / on other instances?
So that's NOT made for collecting OWN content, but for other people's content?
One question:
Isn't that called STEALING?
@khzimmer2 Yeah it is and I'm stealing your reply with my eye-tools as we speak!
-
Say hello to `threadcat`! 🧶

It's a little Rust tool which takes the URL to a Mastodon thread, and converts it to a Markdown file. It also downloads all attached media files (and their alt texts)!
That way, it's really easy to get a "first draft" for a blog post from a thread you wrote!
Installation: `cargo install threadcat`
@blinry@chaos.social Thanks for this app. I thought there was a web-based version somewhere. I used it sometime ago.
Do you want to make it a plugin/extension/webapp/Mastodon feature?
-
Say hello to `threadcat`! 🧶

It's a little Rust tool which takes the URL to a Mastodon thread, and converts it to a Markdown file. It also downloads all attached media files (and their alt texts)!
That way, it's really easy to get a "first draft" for a blog post from a thread you wrote!
Installation: `cargo install threadcat`
@blinry Oh! for a change it's a Rust tool!!
-
@blinry any consideration to making this a tool to archive your feed? I’ve been thinking it would be nice to have a static website of my toots for if/when it stops making sense to maintain a dynamic mastodon server to serve this content.
@waffles That sounds like a tool I'd love, as well, but it seems out of scope for threadcat. Maybe something like that even already exists?
-
I've been hacking on it a lot this week, with my silly human hands, and it's been a lot of fun!
Right now, it can only read threads from Mastodon, and only output Markdown, but both directions could be extended.
To try it out, I've been using it to publish one blog post each day this week – you might have noticed!

`threadcat` downloads files using their original filename on the Mastodon server. So you'll end up with a lot of files like "f55dbddca60e64cb.jpg"…
I tried deriving better filenames from the alt text – for example, taking the first two "non-filler" words from the alt text. That gives you filenames like "colorful-circles.jpg", "small-grey.jpg" or "drawing-snow.jpg", and possibly "drawing-snow-2.jpg".
Another option would just be using timestamps: "2026-04-17T13:54Z.jpg"
What do you think?
-
Say hello to `threadcat`! 🧶

It's a little Rust tool which takes the URL to a Mastodon thread, and converts it to a Markdown file. It also downloads all attached media files (and their alt texts)!
That way, it's really easy to get a "first draft" for a blog post from a thread you wrote!
Installation: `cargo install threadcat`
@blinry that makes me want to learn Rust
-
@blinry that makes me want to learn Rust
@glitcx I think it's worth learning! \o/ I tried to make the code easy to read, and there's not a lot of it in this li'l project! :3
-
`threadcat` downloads files using their original filename on the Mastodon server. So you'll end up with a lot of files like "f55dbddca60e64cb.jpg"…
I tried deriving better filenames from the alt text – for example, taking the first two "non-filler" words from the alt text. That gives you filenames like "colorful-circles.jpg", "small-grey.jpg" or "drawing-snow.jpg", and possibly "drawing-snow-2.jpg".
Another option would just be using timestamps: "2026-04-17T13:54Z.jpg"
What do you think?
@blinry I like "non-filler words from alt text", but maybe prefix with an incremental ID so they are sorted the same as in the post?
-
Correct me if I am wrong:
You wrote a tool that enables people to download complete Mastodon threads from other participants / on other instances?
So that's NOT made for collecting OWN content, but for other people's content?
One question:
Isn't that called STEALING?
@khzimmer2 lol. read the post again. the fourth sentence
-
Say hello to `threadcat`! 🧶

It's a little Rust tool which takes the URL to a Mastodon thread, and converts it to a Markdown file. It also downloads all attached media files (and their alt texts)!
That way, it's really easy to get a "first draft" for a blog post from a thread you wrote!
Installation: `cargo install threadcat`
@blinry this sounds awesome. i keep wasting time copying and pasting my threads into my notes app, i will definitely try this next time
-
`threadcat` downloads files using their original filename on the Mastodon server. So you'll end up with a lot of files like "f55dbddca60e64cb.jpg"…
I tried deriving better filenames from the alt text – for example, taking the first two "non-filler" words from the alt text. That gives you filenames like "colorful-circles.jpg", "small-grey.jpg" or "drawing-snow.jpg", and possibly "drawing-snow-2.jpg".
Another option would just be using timestamps: "2026-04-17T13:54Z.jpg"
What do you think?
@blinry those alt text filenames are a fun and useful feature! i think a combo could be good sense, either
[post-id]-colourful-circles.jpgor[timestamp]-colourful-circles.jpg- that way it's both in some useful order and readable as well -
System shared this topic
-
`threadcat` downloads files using their original filename on the Mastodon server. So you'll end up with a lot of files like "f55dbddca60e64cb.jpg"…
I tried deriving better filenames from the alt text – for example, taking the first two "non-filler" words from the alt text. That gives you filenames like "colorful-circles.jpg", "small-grey.jpg" or "drawing-snow.jpg", and possibly "drawing-snow-2.jpg".
Another option would just be using timestamps: "2026-04-17T13:54Z.jpg"
What do you think?
@blinry I have not tried using threadcat yet, but my hunch would be to keep the original filename (ensures there are no collisions) and add some metadata.
Depending on how you handle individual posts, maybe add the post ID or the ID of the anchor in your output. Having all media from a specific post in a dedicated subdirectory might be useful? -
@blinry I like "non-filler words from alt text", but maybe prefix with an incremental ID so they are sorted the same as in the post?
@jer @blinry I like that too! (I have a script to generate message IDs for mails which does a similiar thing
https://github.com/rohieb/dotfiles/blob/master/.neomutt/gen-msgid.sh ) -
`threadcat` downloads files using their original filename on the Mastodon server. So you'll end up with a lot of files like "f55dbddca60e64cb.jpg"…
I tried deriving better filenames from the alt text – for example, taking the first two "non-filler" words from the alt text. That gives you filenames like "colorful-circles.jpg", "small-grey.jpg" or "drawing-snow.jpg", and possibly "drawing-snow-2.jpg".
Another option would just be using timestamps: "2026-04-17T13:54Z.jpg"
What do you think?
@blinry throwing the post id in there sounds reasonable. Will threadcat also download someone else’s threads if my account is allowed to read them?
-
Say hello to `threadcat`! 🧶

It's a little Rust tool which takes the URL to a Mastodon thread, and converts it to a Markdown file. It also downloads all attached media files (and their alt texts)!
That way, it's really easy to get a "first draft" for a blog post from a thread you wrote!
Installation: `cargo install threadcat`
@blinry grand little tool, and just what I need to help in copy/pasting text from toots!
Could do with a Usage message, if I may say so.
$ ~/.cargo/bin/threadcat
thread 'main' (89252287) panicked at
-
@blinry grand little tool, and just what I need to help in copy/pasting text from toots!
Could do with a Usage message, if I may say so.
$ ~/.cargo/bin/threadcat
thread 'main' (89252287) panicked at
@jpmens Already added that today!
https://codeberg.org/blinry/threadcat/commit/7aaa4daec08bc3cb1da35bf3c0cb9ac58a390953 -
@blinry throwing the post id in there sounds reasonable. Will threadcat also download someone else’s threads if my account is allowed to read them?
@chrismarquardt Jup!
-
@jpmens Already added that today!
https://codeberg.org/blinry/threadcat/commit/7aaa4daec08bc3cb1da35bf3c0cb9ac58a390953@blinry oh, I built just half an hour or so ago; must have missed it
-
Uhm, the poster nick before the alt-text would allow you to group images by the author, too.
️
️