A browser extension that saves your X (formerly Twitter) bookmarks as PDFs, conversation included
Bookmark Vault is a browser extension that takes the bookmarks you have saved on X (formerly Twitter), saves each one to your computer as a PDF that looks close to how it appears on screen, and then removes from your bookmarks only the posts that were saved successfully.
All PDFs are created inside your own browser. We never receive or store the content of your bookmarks, the PDFs, or your X login. The only information sent to our server — used to count free runs and check your subscription — is described in the privacy policy.
| Item | Actual behavior |
|---|---|
| Posts per run | Up to 50. If you have more than 50, run it again and it continues where it left off |
| Save folder | Use “Choose a folder” in the panel to pick a folder inside your browser's download folder. To save somewhere outside it, change the download location in your browser's own settings (a limitation of the browser) |
| Posts with video | Videos are not included in the PDF. A thumbnail with a play mark is recorded instead |
| Multi-slide cards | All slides are recorded, laid out in two columns |
| Sleep during a run | If your computer goes to sleep, the run stops. Run it again after waking and it continues where it left off |
| Requirements | Desktop Google Chrome or Microsoft Edge, signed in to X. Does not work on smartphones |
| Item | Details |
|---|---|
| Free trial | 3 free runs (1 run = one execution, up to 50 posts). Enough to check that it works with your X account |
| Paid plan | US$4.99 per month or US$54.99 per year (€4.99 / €54.99, £3.99 / £43.99, CA$6.99 / CA$76.99, A$7.99 / A$87.99; ¥500 / ¥5,500 in Japan). In other countries, the price is converted into your local currency at checkout. Prices include tax where it applies. One subscription covers up to 2 X accounts |
| Cancellation | Cancel anytime from “Settings” in the panel. You can keep using it until the next billing date. No prorated refunds |
| Payment | Handled on Stripe's checkout page. Your card number never reaches us |
You also need to turn off the browser setting “Ask where to save each file before downloading.” If it stays on, a save dialog appears for every single PDF. The extension cannot change this setting for you, so the first-run guide walks you through it.
This section explains what data the extension handles and how. Browser extension store policies (Chrome Web Store and Microsoft Edge Add-ons) require developers to disclose how data is handled, even when it is processed only on the user's device and never sent anywhere. Accordingly, this policy also describes processing that stays entirely on your device.
| Data | Why it is used | Where it is kept | Sent to us |
|---|---|---|---|
| Content of your X bookmarks (text, images, author names, profile pictures, quoted posts, link cards, replies) | To create the PDFs | Your device only (saved as PDFs in your save folder) | No |
| The PDFs created | For you to keep | Your device only | No |
| Your X login session | To read your own bookmarks. The extension uses the session your browser already holds | Your browser (the extension does not copy or store it) | No |
| Settings and records (save folder, display language, IDs of posts already processed, run log, a local copy of your run count and subscription status) | To keep your settings for next time, avoid processing the same post twice, and keep working when our ledger server is briefly unreachable | Your device only (chrome.storage.local) |
No |
| Diagnostic information (environment, settings, recent run log) | To find the cause of problems. Written to a text file only when you press “Report a problem” | Your device only | No |
To count your 3 free runs and check your subscription status, the extension sends the following to our ledger server (api.hokanko.app):
The ledger server converts the account ID into a value that cannot be turned back (a one-way hash) before recording it. It does not store the ID number itself, your name, your handle or your email address.
The ledger records only the following:
| What is recorded | Why it is needed |
|---|---|
| A hash made from your account ID | To tell users apart (it cannot be turned back into the original ID) |
| Number of runs used, and the ID of the latest run | To count the 3 free runs |
| Subscription status (active, cancellation scheduled, cancelled) and next billing date | To decide whether the paid plan applies, and to show the next billing date in Settings |
| The subscription ID issued by Stripe | To match notices from Stripe (such as a cancellation) to the right subscription |
| Service | Role and information handled |
|---|---|
| Stripe (payments) | When you pay, Stripe receives your card details and email address directly. Your card number never reaches us. We receive only your subscription status and next billing date from Stripe |
| Cloudflare (hosts the ledger server and this website, and forwards contact email) | Cloudflare may process connection data such as IP addresses while delivering requests. Email sent to our contact address is forwarded to our inbox through Cloudflare |
| Email service (contact) | If you contact us by email, your message is stored on the email service |
Data on your device (settings and records) is deleted when you uninstall the extension. The PDFs are under your control; we have no involvement with them.
To have your ledger record deleted, please write to us at the contact address. Deleting it also removes your free-run count and the link to your subscription. If you have a paid subscription, please cancel it first.
If the way the extension handles data changes, we will post the change on this page and notify users inside the extension.
This policy is also available in Japanese. If the two versions differ, the Japanese version prevails.
The extension asks for the following permissions when installed. Below, together with the warning your browser shows, we explain why each is needed and what the extension does not do with it.
| Permission | Warning shown by the browser |
|---|---|
debugger | Access the page debugger backend Read and change all your data on all websites |
tabs | Read your browsing history |
downloads | Manage your downloads |
downloads.ui | (Included in the downloads warning) |
storage | (No warning) |
| 3 host permissions | Covered by the debugger warning, so no extra warning is shown |
debuggerWhy it is needed: To turn a post into a PDF that looks close to how it appears on screen. Among browser extension APIs, the only way to do this is Page.printToPDF through chrome.debugger. We considered three approaches that need weaker permissions and rejected each after confirming it could not meet the requirements:
window.print() — the system save dialog opens for every file. With up to 50 posts per run, that means 50 manual steps, which defeats batch processingWhat it does not do: Attach the debugger to x.com pages or to any other tab you have open (it attaches only to the extension's own rendering tab, and detaches when the run ends), collect browsing history, or send what it reads anywhere.
What you will see: While PDFs are being created, the browser shows a bar at the top saying the extension is debugging the browser. This is how the browser tells you the permission is in use, and it disappears when the run ends.
tabsWhy it is needed: To open the extension's own rendering tab (an extension page) in the background for PDF creation and close it when finished. It is also used to clean up leftover rendering tabs, to check that the X tab that started a run is still open, and to open the browser's download settings from the setup guide.
What it does not do: The warning for this permission reads “Read your browsing history,” but the extension does not read your browsing history. The browser shows the same warning for every extension that asks for this permission. The extension only works with its own rendering tab and the X tab that started the run.
downloadsWhy it is needed: To save the PDFs to your device. Files are saved only inside the download folder set in your browser.
Why downloads.ui is needed: When you choose a save folder, the extension places a tiny file there to confirm the location and deletes it right away. For that moment only, it hides the download indicator in the toolbar, and then restores it immediately.
What it does not do: Read your past download history, or touch any file other than those it created.
storageWhy it is needed: To keep settings (save folder, display language) and records (IDs of processed posts, run log, a local copy of your run count and subscription status) on your device. These values never leave your device (what is sent to the ledger server is described in 2-2).
| Domain | Purpose |
|---|---|
https://x.com/* | To show the panel, read your own bookmark list, and remove the posts that were saved from your bookmarks |
https://pbs.twimg.com/* | To fetch images attached to posts and embed them in the PDF |
https://abs.twimg.com/* | To read a configuration value needed to remove bookmarks |
These three domains, all operated by X Corp., are the only pages the extension interacts with. It also talks to our ledger server (api.hokanko.app), but without using a host permission (the server itself allows requests from the extension). It also reads hokanko.app/status.json to check service status.
The extension depends on how X works, and changes on X's side may temporarily stop it without notice. We provide the extension with this in mind.
Machine-readable status: https://hokanko.app/status.json
For bug reports, questions or inquiries about how your data is handled, please email:
support@hokanko.app
When reporting a bug, it helps a lot if you attach the text created by “Report a problem (export diagnostics)” in the panel when something goes wrong. This diagnostic file is created only when you press the button, and you can review its contents yourself before sending it.