Free preview before you pay

Turn your X archive into a PDF

X's archive comes with a page for browsing it, but the data files end in .js, not .json, so anything expecting JSON rejects them. Upload tweets.js or direct-messages.js and get a dated document back.

The finished PDF, made from an invented example

This is the real output of this tool, made from an invented example by the same code that makes yours. The people and details in it are fictional.

Messages 20People 1From 6 Jan 2026To 29 Mar 2026Pages ~1Price $7
Page 1 of the sample PDFPage 2 of the sample PDF
Open the whole sample PDF (2 pages)
Optional. Labels your own posts. If you upload the whole zip, your account.js already gives your username for this and for your side of any DMs, so this is only needed to show a different name.
From $7 · one payment, no account
Free preview first · files deleted within 7 days

How it works.

Every data file this reads starts with a line like window.YTD.tweets.part0 = before the actual data. That single line is why JSON.parse fails and why people go looking for a tool. Strip it and the rest is ordinary JSON.

Step 1

Request your archive

On X, open Settings, Your account, Download an archive of your data. Confirm your password and the code X sends you, then Request data. X says it may take a few days, and you download it as a zip.

Step 2

Upload the file you want

Open the data folder. tweets.js is your posts, direct-messages.js is your DMs. Or drop the whole zip and both get picked up, your own side of any DM conversation gets labelled with your handle automatically, and any pictures whose filename matches get placed. If your archive calls the posts file tweet.js, upload that file on its own.

Step 3

Check it, then download

You see it parsed first. Posts show their like and repost counts when there are any, and are labelled when they were replies.

Four ways to print it.

Every sample below is page one of a real PDF, made from the same sample as the one above by the same code that makes your file. Pick a style when you preview, and change it as often as you like.

A page of the sample transcript in the X look style
X lookPosts as a timeline, with names, handles and counts, and direct messages as bubbles, like X.
A page of the sample transcript in the Clean document style
Clean documentPlain and readable, made for paper. The safe choice if you are not sure.
A page of the sample transcript in the Formal / legal style
Formal / legalNumbered entries and full timestamps, for a hearing or a claim. No colour, so it photocopies.
A page of the sample transcript in the Book style
BookSet like a printed book, for binding or keeping. Warm paper, wide margins.

Trust, with receipts.

No invented review scores, no badges, no “trusted by thousands”. Here is what is actually true, and you can check every line of it.

  • You see the result before you payUpload, look at your own parsed file, then decide. No account, no card, no email required to get that far.
  • Files are deleted within 7 daysYour upload, anything extracted from it, and the finished download. Automatically, on a schedule.
  • A person answers the emailOne Time Tool is a small independent studio in Johannesburg, South Africa. Questions go to hello@onetimetool.com and a person replies, not a bot.
  • Your card never touches this siteCheckout is hosted by Dodo Payments. We never see your card number.
  • One payment, for this one jobThere is no subscription, no plan and nothing to cancel. Depending on where you are, checkout may show the price in your currency and add local VAT or sales tax.
  • 7-day money backIf the output is not what you needed, email us and we refund it. No form to fill in.

Questions, answered.

Why will my JSON tools not open tweets.js?
Because it is a JavaScript file, not a data file. It assigns the data to a variable, and that assignment line breaks every JSON reader. It is a two second fix if you know it, and impossible if you do not.
My archive has tweets-part1.js, tweets-part2.js and so on.
That happens on large accounts. Upload the whole zip and all the parts are read and merged in date order.
Can it tell who sent each DM?
Your own side, yes, automatically. Upload the whole zip and it reads your numeric account ID and current username from the account.js file in it, so your messages come back labelled with your handle without you typing anything. X stores DMs by numeric account ID only, and the other person's username is never in the archive anywhere, so their side of the conversation shows as User and a number.
Are images included?
Only if they are in the archive's media folder under the filename the post or DM actually points to, and only if you choose to include them on the preview, which is an optional extra priced before you pay. That only works when you upload the whole zip, since the pictures sit in a separate folder from tweets.js and direct-messages.js. A single photo over 2 MB is listed by filename instead of printed.
What happens to my file?
It is deleted within 7 days, along with the finished PDF. It is used to make your file and nothing else. Nobody reads it.
Do I need an account?
No. There is no signup, no subscription and no password. You upload, you see the result, you pay once if you want it.