ThreadSnap: Thread Exporter — Help
Last updated: 24 October 2026 · applies to version 0.4 and later
Getting started
ThreadSnap works on x.com (and twitter.com). Open
the page you want, click the ThreadSnap icon in Chrome's toolbar, choose
what to capture and how to save it, and click Export. Everything
happens inside your browser; the file is saved through Chrome's normal
download.
| Mode | Use it when |
| This page |
You want the posts on the page you have open: a thread, a search result or a profile. |
| Specific posts |
You have a list of particular posts (links or IDs) and want only those, in your order. |
Capture this page
- Open a thread, search result or profile on x.com and let the first posts load.
- Click the ThreadSnap icon. Capture is set to This page.
- Choose PDF or Images, and optionally set Max posts.
- Click Export. ThreadSnap scrolls from the top and photographs X's column in slices. A counter in the corner of the page shows progress, with a Cancel button. When the run ends, that box holds the final message and stays there until you press Dismiss — if you clicked the page at any point the popup closed, and this is the only place the summary is written.
A slice is a run of rows X drew next to each other, captured in one
picture — so when X draws a reply indented under the post it answers,
with its own line down the side, that stays one picture instead of
becoming two. One picture can therefore hold several posts, which is why
the final message gives both numbers when they differ: "Done —
exported 42 posts in 40 pictures." Neither number stands in for the
other.
Leave Max posts blank to capture everything as it scrolls. One
export holds at most 500 posts, so endless pages such as a profile or a
search always come to a stop. Both numbers are a floor rather than
an exact ceiling: ThreadSnap checks them before it starts a slice and
never cuts a picture through a row, so an export can come back with a few
posts more than you asked for. Those extra rows are deliberate — cutting
the slice would mean a picture that no longer shows X's column
unbroken.
Capture specific posts
- Open any page on x.com (the home page is fine).
- Click the ThreadSnap icon and switch Capture to Specific posts.
-
Paste the posts, one per line. Any of these works:
x.com/user/status/123…, twitter.com/user/status/123…,
or just the post ID. The popup shows how many posts it recognised, how many
lines repeated an ID already listed (those are captured once), and how
many it could not read.
-
Leave Include the posts it replies to on unless you want the replies bare.
For each post you list, ThreadSnap also captures the chain above it on that post’s
own page — the post it replies to, that one’s parent, up to the start — and puts
that chain ahead of the reply. A reply on its own (“you are right”) doesn’t show
what it agreed with. The replies underneath a post are not included.
Unlike the other settings, this one is not remembered: it is on every time
you open ThreadSnap. Turning it off applies to that one export, and the export
says that it was off.
- Choose PDF or Images and click Export.
ThreadSnap opens each post in the same tab, captures it, pauses a couple of
seconds, and moves to the next. When it's done, it takes you back to the
page you started from. Posts are saved in the order you listed them, and
duplicates are ignored.
- Up to 100 posts per export. Smaller lists are better: above 30, the popup warns you, because X may slow down heavy automated use.
- With Include the posts it replies to on, the posts a reply answers are captured in the same picture as the reply, exactly as X draws them on the reply's own page: indented above it, in X's shorter form, with X's connector line between. So the chain costs no extra page loads and no extra time — 20 listed posts are 20 pictures and 20 PDF pages however deep the chains run. Each post's own posting time still comes through; what the shorter form does not show is a parent's view count.
- A post that can't be opened (deleted, protected, or not visible to you) is skipped and listed at the end. The rest still export.
- If 3 posts in a row fail to load, ThreadSnap stops and keeps what it captured. Usually X is limiting requests or you're logged out; wait a while and try a smaller list.
- Each post is captured from its own page, so it shows X's full post layout (larger text, full date and time).
PDF or images, and the options
Export as
- PDF: all posts flowed onto pages in one file. A post is never split across two pages; a very long post gets a page of its own.
- Images: one image per picture, bundled in a ZIP — and a picture may hold more than one post (a slice of X's column, or a reply together with what it answers). Each image is named after the post it is filed under, for example
001-jdoe-2033188970296246273.png: the number keeps the original order, then the author's handle and the post ID. The manifest's shows lists every post visible in that image.
Options
- File name: filled in for you from the page or your list. Type your own at any time; ThreadSnap won't overwrite it.
- Image encoding: PNG gives the crispest text (lossless); JPEG makes smaller files, with a JPEG quality setting (Normal, High, Maximum).
- Your choices are remembered for next time — except Include the posts it replies to, which is on every time you open ThreadSnap. The list of posts you paste is not saved.
Evidence mode
An optional setting under Export as, off until you turn it on. Use
it when you need a record of exactly which post you saved and when: for
your own records, for a report, or to show someone else later. It works
with both capture modes and both outputs.
1. A stamp under every picture
A white strip is added below the picture, never over it. It's part
of the image itself, so it appears on the PDF page and in each ZIP image.
Under a picture of one post it reads:
https://x.com/jdoe/status/2033188970296246273 2025-09-12 19:42:49 UTC
Captured 2026-10-23 19:27:59 UTC · ThreadSnap 0.4.45
Posted times above are UTC; x.com showed them in America/New_York (UTC−04:00)
- Line 1: the post's own link, even if you captured it from a search or a thread, and when it was published, in UTC.
- Line 2: when ThreadSnap captured the picture, in UTC, and the ThreadSnap version.
-
Line 3: X shows post times in your computer's time zone without
saying which one. This line names it, with the offset in force on the
post's own date, so the time printed on the post can be matched to the
UTC time beside the link. Where no posting time could be read from any
row, it says so instead of going quiet.
-
One band per picture, at its foot. When a picture holds several
posts — a reply with what it answers, or a slice of X's column — every
post in it gets its own Line 1, in the order X drew them, and
then lines 2 and 3 are said once for the whole picture. They are
the same for every post in it: one picture, one capture, one instant.
A picture of two rows or more also carries the sentence "These posts
appear one after another in X's column, as X drew them. Nothing between
them has been left out."
-
A row X would not render — a deleted parent, say — has no link
to print, so it gets a line of its own in its place, quoting what X
drew there:
No link — x.com drew: This Post was deleted by the
Post author. The band accounts for every row it sits under.
-
One picture is one image with one fingerprint. Up to version
0.4.25 a reply and each post it answered were separate images; from
0.4.26 they are one, so the manifest has one
image_sha256 and one captured_at_utc per
picture, and lists the posts inside it under shows — each
with its own link, posting time and time-zone offset.
2. A manifest file
Alongside your export you get a small text file (JSON) that lists, for each
post: its link, ID and author handle, when it was posted and captured, the
image size, and a SHA-256 fingerprint of the image. It also records
the page you exported from, the ThreadSnap version, your browser's name and
version, and your time zone. It never includes your X account or any
password.
- Images: the manifest is inside the ZIP, named
threadsnap-manifest.json.
-
PDF: the manifest arrives as a second download right after the
PDF, named
<your file name>.manifest.json, and also holds a
fingerprint of the whole PDF. Chrome may ask
"This site is trying to download multiple files". Choose
Allow.
-
If the manifest isn't in your Downloads, open ThreadSnap and use
Settings → Save manifest. A copy of the last Evidence export's
manifest is kept inside the extension until the next one, so a download that
doesn't arrive can't cost you the file. ThreadSnap can't see your Downloads
folder, so it offers the copy rather than guessing. It sits in Settings
because you should never need it: your export already saves the manifest,
inside the ZIP or as a second download beside the PDF.
3. Checking a fingerprint
A fingerprint changes if even one pixel of the file changes. To confirm a
file is exactly what ThreadSnap saved, compute its SHA-256 and compare it
with the manifest (image_sha256 for an image,
pdf_sha256 for the PDF):
- Mac (Terminal):
shasum -a 256 001-jdoe-2033188970296246273.png
- Windows (PowerShell):
Get-FileHash .\001-jdoe-2033188970296246273.png
With PDF output, the per-post fingerprints describe each post's image
before it was placed on a page; the one you can check is the whole PDF's.
Choose Images if you want to check each post separately.
4. What the manifest says about replies
A reply means little without the post it answers, so the manifest is
explicit about what was captured — and about what wasn’t:
-
reply_context_included says whether ThreadSnap looked for the
chain above each post at all, and reply_context_reason says why
not when it didn’t (you turned it off, or you used This page mode,
which captures what’s on screen and doesn’t work out which post answers
which). So a file with no chains in it never has to be guessed about.
-
Each picture says whether its chain is whole:
chain_complete, with chain_end_reason giving
root when the chain reached the start of the conversation.
Only root is whole — but not every other value means
something is missing, and the final message sorts them into three
sentences for exactly that reason:
-
Something is missing and you could go and get it. The
10-parent limit, a parent X had not finished drawing, a post that
wouldn’t capture, a cancelled export, or a parent your own
block or mute list is hiding — which is the one obstacle you can
remove yourself. These are the chains worth a second look, and
they are what makes an export read as incomplete.
-
Nothing is missing that anyone could capture.
gap_in_chain means the picture does reach the
start of the conversation but rows inside it are posts X will not
serve to anybody; parent_unavailable means the chain
stopped at such a post. Either way the picture already
shows X’s own words where the post stood, and there is nothing to
go and fetch. ThreadSnap says so in its own sentence and does
not treat the export as a failure.
-
Where X says a parent was deleted, suspended or withheld, that notice is
captured in the chain’s place — inside the same picture, where X drew
it — and the row is marked
unavailable in
shows, with X’s own wording in
unavailable_reason. The notice is the record; the reply is
never exported as though it stood alone.
5. Leaving the tab while it runs
Keep the tab on screen. Chrome gives a hidden tab no rendering
pipeline, and X's timeline only draws posts in response to scrolling and
layout — so a hidden tab draws nothing at all, and no extension can
change that. ThreadSnap pauses rather than capturing blanks: it
stops at a post boundary, says so on the page, and carries on by itself
when you come back. A post interrupted part-way is taken again, not
counted as a failure.
Put the ThreadSnap tab in its own window and leave that window
uncovered.
A tab counts as hidden only when it isn't the active tab in its window,
or its window is minimized or fully occluded. An unfocused window is
still visible. So another app beside it, or even partly overlapping it,
is fine — you can work in Word, Mail, anything. What doesn't work is
another browser tab in front of it, or burying the window completely.
Good to know
- Turning Evidence mode on switches Image encoding to PNG, so images carry no compression artifacts. You can still choose JPEG afterwards.
- Keep the exported files unchanged. Renaming is fine, but editing or re-saving an image changes its fingerprint.
- Like everything ThreadSnap makes, the stamp and manifest are created on your computer and never uploaded. If you share the files, the details above go with them.
Tips and troubleshooting
- Keep the tab in front while ThreadSnap runs. Chrome slows down background tabs, which can give blank or missing posts.
- The Export button is greyed out. The open tab isn't on x.com. Open an x.com page and click the icon again.
- "Could not reach the page." Reload the X tab, then open ThreadSnap again (this happens right after installing or updating).
- Some posts couldn't be captured. They're skipped and counted in the final message. Running the export again usually picks them up.
- Images missing from a post. Wait for the post's media to finish loading before you export; ThreadSnap waits briefly, but very slow media can be left out.
- To stop a long run, use Cancel in the popup or in the
counter on the page. Cancelling while it is still capturing keeps what it has: the
export is written from the posts captured so far, and the message says
"Cancelled — exported 7 of 20". Cancelling while it is building the file, or clicking
Cancel a second time during that partial export, throws the whole thing away and saves
nothing. Either way the step already in progress — rasterizing a post, encoding a page —
has to finish first, so it can take a few seconds to stop.