The Tech LeverageBuild with AI · Audit the risk Get The Brief

Builds · Build 001 · 12 Nov 2026

I built the X bookmarks feature we all wanted

Tweet Vault saves posts, replies, threads, X Articles, links, videos and voice notes from my phone in one tap, then merges them into one clean block of text for Claude.

Live and in daily use · server on schema v12 · Android app 1.7.0 · open source

The 40-second launch film. Every screen in it is the real product. Music: Vibe Check by Blue Deer Studio.
1 tap
to save from any app on the phone
9
kinds of things it keeps, from posts to voice notes
958
server tests, plus 221 in the Android app
2
npm packages the server depends on
90 min
the longest voice note it will turn into notes

Why I built it

I save a lot of posts on X. A sharp one-line definition, a reply that disagrees well, a long thread, an article someone published natively on X. Then I sit down to script a video and none of it is usable.

X bookmarks is one long list. Folders sit behind Premium. There are no notes, so I never remember why I saved something. There is no export. A reply is saved without the post it answers. And nothing in there can be handed to an AI: I end up opening ten tabs and pasting ten things into Claude one at a time.

What I wanted was simple to say. Save anything in one tap, then turn a pile of saves into one clean block of text that an AI can read. X never built that, so I did.

A note on the screenshots. Everything below comes from a demo vault filled with well-known public posts, so you see the real product without seeing my own reading list. The website shots are from a desktop browser. The app shots are from an Android emulator.

The whole thing in four steps

  1. SaveShare a post, link or video to Vault from any app. Or select text, or talk.
  2. FetchThe server pulls the full text, thread, article, images and transcript.
  3. MergeTick the items that belong together and rank the replies.
  4. AskCopy the merged text into Claude, or let Claude read it directly.

There are two parts. A small server with a website, which is where I organize and merge. And an Android app, which is where I save, and now also where I browse, merge and write notes when I am away from the desk.

Save: one tap from the phone

Saving has to be easier than bookmarking, or I will not do it. So the app sits in the Android share sheet. Share a post from X, a page from Chrome or a video from YouTube, pick Vault, and it is done. There is no screen to fill in. A toast says “Saved to Vault” and I am back where I was.

Android share sheet for a web article, with Save to Vault Inbox at the top and Vault in the app row.
Share sheet. "Save to Vault Inbox" is pinned at the top.
A sentence selected in Chrome with the text menu open, showing Save to Vault.
Selected text. Highlight a passage, then ⋮ and "Save to Vault".
The same page a moment later with a Saved to Vault message at the bottom.
Done. One message, no extra screen.

There are five ways in, because no single one works in every app:

  • Share → Vault for posts, links and videos.
  • Save to Vault in the text selection menu, for a passage from any page or app.
  • Save copied text, for apps that hide Vault from their share sheet. Kindle is the one that pushed me to add it. It is a button in the app, a Quick Settings tile and a home screen shortcut.
  • Voice note, for thinking out loud for up to 90 minutes with the screen off.
  • New note, typed or dictated, with drafts kept as I type.

Saves do not need a connection. Each one is queued on the phone and sent when the network is back, and it survives a restart. The Save tab shows what went through and where it came from.

The app's Save tab with a Voice note card, a Save copied text card and a list of recent saves marked In Inbox.
Save tab. Recent saves, with the app each one came from.
The app recording a voice note, with a timer, a title field and Pause, Stop and send, and Discard.
Voice note. Records in the background, pauses for calls.

On the computer there is a box at the top of the Inbox: paste a link or type a note and press Save.

What the vault fetches for you

A bookmark is a pointer. If the post is deleted, the bookmark is empty. The vault keeps the content itself.

The Inbox: a note, a post with its image, and an X Article with four pictures, each as a card with category and tags.
The Inbox. Notes, posts and articles as cards, with the pictures kept on my own server.
You saveThe vault keeps
A postFull text, author, date, likes, replies, reposts and views, and the post it quotes.
A replyThe reply, attached to its conversation. Posts above it that I did not save are added as dimmed context, so a reply always makes sense.
A thread"Get full thread" pulls every part by the author, up to 100, in order.
An X ArticleThe whole article as Markdown: headings, lists, quotes, code and images.
A web linkThe readable article text, with title, site, author and date. Up to 60,000 characters.
A YouTube linkTitle, channel, length, chapters and the transcript, with a time mark about once a minute.
A Kindle highlightThe passage, with the book title and authors.
A voice noteA transcript with timestamps, then written notes: summary, key points, action items, decisions and open questions.
PicturesCopies of post photos and article images, stored once each.

Here is a 31-part thread saved from one link. I shared the first post and chose “Get full thread”.

A saved thread opened in the Inbox: the first post with a personal note, then each part of the thread listed below it.
A full thread. One share, every part, in posting order. The green block is my own note on why I saved it.

X Articles open in a reader inside the vault. So do web articles and video transcripts.

An X Article open in a reading window over the list, with Open source, Copy text and Close buttons.
The reader. An X Article, kept as text.
A category called Lectures with a post and two YouTube videos, each showing channel, length, number of chapters and a Transcript label.
Videos. Each one shows its length, chapter count and whether the transcript is in.
A one-hour talk's transcript open in the reader, with minute marks at the start of each block.
A one-hour talk as text. The minute marks let Claude point back to a moment in the video.

Posts in Chinese, Japanese and other non-Latin scripts can be translated to English, on request or automatically, and a merged collection has an “In English” switch.

Organize: categories, tags and a daily AI pass

Sorting is where every read-later tool dies, because nobody wants to do it. So the vault gives me the usual tools and then does most of the filing itself.

  • Inbox, Archived and Trash. Trash empties itself after 30 days, and never deletes something that is in a merge.
  • Categories and subcategories, two levels deep.
  • Tags, priority (High, Medium, Low) and a High priority view.
  • My note on any item: one line on why I saved it. This is the feature I missed most in bookmarks.
  • Search, filters by category, priority and tag, and five sort orders including “Most liked”.
  • Select items for bulk work: file, tag, archive or merge many at once, each with Undo.
Three items ticked in the AI category with a bar showing 3 selected, Organize, Add to merged and Merge 3 items.
Select items. Tick what belongs together. The bar offers Organize, "Add to merged…" and "Merge 3 items".

Once a day, a small Claude model (Haiku) reads the loose items in the Inbox and files them into categories and subcategories. It follows three rules I set. It never changes a category I chose. It may create new categories, but only a few per run. And anything it filed carries a small AI mark, so I can always tell its work from mine.

A category called Launches with two posts, each showing an AI badge beside the category name.
Filed by the daily run. The "AI" badge beside the category means a model put it there, not me.

The same run can merge items, but only when they are about the same specific story, and only into merges it made itself. It never touches a merge I made by hand.

Merge: the part X never built

This is the reason the vault exists. A merge takes a set of saved items and produces one piece of text, in a fixed order, that reads top to bottom.

Below is a merge of seven sources on one idea: a post, three replies to it, a second post that quotes it, a blog article about both, and my own note.

A merged collection called Context engineering. Sources are listed on the left with numbers; on the right a reading preview shows the combined text with headings for the post and each reply.
A merged collection. Sources on the left, the text Claude will get on the right.

The order is the useful part:

  1. Each conversation starts with its post.
  2. Then the author’s own thread, in posting order.
  3. Then the replies, in the order I rank them. I drag them, or use Alt and the arrow keys.
  4. My notes sit under the item they belong to, as “My note”.
  5. Several conversations become “Part 1”, “Part 2” and so on, and parts can be moved too.

Ranking replies matters more than it sounds. The best reply to a post is often the counter-argument, and it is usually buried under fifty people agreeing. I put it first.

Every merge ends with a Sources block: one line per item with the author, date, like count and link. So anything Claude writes from it can be traced back to a real post.

The end of the merged text with a Sources section listing each post and reply with handle, date, likes and URL, and a line saying Stats as of a date.
Sources. Every item with its author, date, numbers and link, plus the date the numbers were read.

A merge can mix kinds. This one has a post, the replies to it, and a 39-minute talk with its chapters and transcript.

A merged collection that starts with a long post and three replies, with a video as Part 2 in the sources list.
Posts and a video in one merge. The video comes in as its own section with chapters and transcript.

Merges stay editable. “Add items” searches everything I have saved. “Add to merged…” sends an item to an existing merge. “Combine into…” folds one merge into another. “Unmerge” puts everything back in the Inbox, and nothing is deleted.

Hand it to Claude

There are four ways to get a merge into Claude. I use all of them.

Copy with sources

One button copies the whole merged text with its Sources block. Paste it into any chat.

Copy with a prompt recipe

A recipe is a saved instruction that goes in front of the merge. I keep three: Hook angles, 10-minute outline and Counter-arguments. Choose “Copy with…”, pick one, and the clipboard holds my instruction followed by the material, wrapped so the model treats the material as something to read and not as orders to follow.

The Copy with menu open on a merged collection, listing Hook angles, 10-minute outline, Counter-arguments and Edit recipes.
Copy with… One click gives Claude the instruction and the material together.
The Prompt recipes page with editable recipes, each with a name and an instruction that uses a title placeholder.
Prompt recipes. Plain text I can edit. The title of the merge is filled in for me.

Let Claude read the vault itself

The vault has its own MCP endpoint, so Claude can open it without me copying anything. In Claude Code I type “get vault bundle context engineering” and it fetches the merge by name. The tools are read-only: list collections, get one, search items, get an item, list recipes. Claude can read my vault. It cannot save, change or delete anything in it.

The Connect Claude section of the Security page: a field to name a read-only key, a Create key button, and four steps to add the vault as a custom connector in Claude.
Connect Claude. A read-only key for Claude Code, or a custom connector for claude.ai and the Claude apps. The address shown is a placeholder.

The claude.ai connector

For claude.ai, Claude desktop and the Claude phone app, the vault runs a small OAuth server of its own. I add the vault’s address as a custom connector, sign in with my password and two-step code, press Allow, and my merges are available in any chat on any device.

The Android app

The app started as a share target and nothing else. Then I noticed the phone is the device I actually reach for, so it grew. Version 1.7.0 keeps its own copy of the vault and works offline.

The app Inbox filtered to the AI category, listing an article, a link with a note and a post, each with category and tags.
Inbox. Search, plus filters for tag and category.
The category filter open in the app, showing categories with their subcategories.
Categories. Subcategories sit under their parent.
An X Article open in the app with Copy, Share, Open original, Add my note, Add to merged, Tag and Archive.
An item. Full text, kept for offline reading.
The Merged tab in the app listing two merged collections with item counts, stars, category and tag.
Merged. Every collection, with its priority.
A merged collection open in the app with Copy, Share, Copy with a prompt, Add items, Rename and Combine into, above the merged text.
A merge. Copy it, or copy it with a recipe.
The sources of a merge in the app, each reply with Up, Down and Remove.
Rank replies. Up, Down and Remove on each source.

What it does:

  • Five tabs: Inbox, Merged, Notes, Voice and Save.
  • Merge on the phone: press and hold to tick items, then merge, add to a merge, tag, archive or trash.
  • Undo that is real. Trash, Remove and Unmerge wait six seconds before they are sent, so Undo simply cancels them.
  • Offline changes. Edits show at once and wait in a queue until the network is back. If the server refuses one, the app takes back that change and only the later ones that depended on it.
  • Notes: write, edit and dictate, with search across typed notes and voice notes.
  • App lock with fingerprint or the screen lock. Sharing still works while it is locked, so saving stays one tap.
  • Updates from my own server. The app checks for a new build, verifies the file’s size and SHA-256 hash, and installs it. No app store.
The Notes tab in the app with two notes, a search box and a New note button.
Notes. Typed notes and voice notes together.
A web page in Chrome with a Saved to Vault message after sharing.
And back to reading. Saving never takes me out of the app I was in.

Security: it is my reading list, on the public internet

I audit systems for a living, so I could not put this online with a password field and hope. What I save says a lot about what I am working on, and a paired phone holds a token that can write to it.

The Security page with Two-step sign-in switched on, eight recovery codes left, a paired phone with an Allow organizing switch, and sections for Connect Claude and signed-in browsers.
Security. Two-step sign-in, paired phones with their own permissions, Claude keys, signed-in browsers and an activity log.
  • Two-step sign-in is required, with an authenticator app. Eight one-time recovery codes cover a lost phone.
  • Phones pair with a six-digit code that lasts ten minutes and works once. Each phone gets its own token, stored only as a hash on the server and encrypted with the Android Keystore on the phone.
  • Permissions are narrow. A phone can save. With “Allow organizing” on, it can also merge, tag, archive and trash. It can never delete for good or open Security. A Claude key can only read.
  • Rate limits per device. A stolen token cannot flood the vault or churn through it.
  • Fetching is locked down. The server reads web pages for me, which is a classic way to get attacked. So it only fetches over HTTPS, refuses private and internal addresses, checks every redirect, and caps size and time. Pictures come from one host only.
  • Saved text is treated as data. Every model call tells the model not to follow instructions found in the material. A post that says “ignore previous instructions” is just a post.
  • A strict content policy on the page, and page text is never written as raw HTML.
  • An activity log for 30 days: sign-ins, wrong codes, pairing, every time Claude reads the vault.
  • Nightly backups, kept 14 days on the server and 60 days off it, with an integrity check and a restore script.

How it is built

I built Tweet Vault with Claude Code, working in phases: write a plan, build a phase, run a code review on it, fix every finding, then ship. The first version went live in the first week of November 2026. App 1.7.0 went out on 12 November.

PartWhat it is
ServerNode.js 22 using only what ships with Node for the web server and the database (node:http and node:sqlite). About 75 routes.
DependenciesTwo npm packages: the Anthropic SDK and a QR code library for two-step setup.
DatabaseOne SQLite file, on schema version 12. Every upgrade keeps a copy of the file first.
WebsitePlain JavaScript and CSS. No framework and no build step.
Android appKotlin with Jetpack Compose, Room for the offline copy and WorkManager for the queues. Android 8 and up.
Post dataFxTwitter's free public API, at one request a second. No X API key.
AIClaude Haiku for translation and daily filing. Claude Sonnet for voice notes. Groq's Whisper for transcripts.
Tests958 on the server, run against saved real responses. 221 in the app.
HostingOne Docker container behind Nginx on a small server I already had.
Running costNothing extra for the server. The AI calls are pay-per-use, and each kind has a daily cap.

Keeping the server to two dependencies was a choice. Fewer packages means fewer things that can be compromised upstream, and for a tool that holds my own data that matters more than saving a day of work.

It also has a dark theme.

The Inbox in the dark theme.
Dark theme. Follows the system, or set it by hand.

The full feature list

Saving

  • Share to Vault from any Android app, with a pinned “Save to Vault Inbox” target
  • “Save to Vault” on selected text
  • “Save copied text” as a button, a Quick Settings tile and a shortcut
  • Voice notes up to 90 minutes, in the app or the browser, and audio files shared in from WhatsApp or a recorder
  • Typed and dictated notes, with drafts
  • A capture box on the website
  • Offline queue for saves, voice uploads and edits
  • Sharing the same thing twice never makes a duplicate

Fetching

  • Full post text, stats and the quoted post
  • Replies attached to their conversation, with context
  • Full threads, up to 100 parts
  • X Articles as Markdown
  • Web article text
  • YouTube title, channel, chapters and transcript
  • Kindle highlights with book and authors
  • Pictures copied to the vault
  • Translation to English
  • Voice transcripts and written notes, with “Another pass” for my own prompt

Organizing

  • Inbox, Archived, Trash
  • Categories and subcategories
  • Tags, priority and personal notes
  • Search, filters and five sort orders
  • Bulk actions with Undo
  • Daily AI filing with a visible “AI” mark
  • Strict auto-merge for items on the same story

Merging

  • Merge any mix of items into one text
  • Rank replies by dragging or with the keyboard
  • Reorder parts
  • Add items, add to a merge, combine merges, unmerge
  • A Sources block on every merge
  • An English version of any merge

Claude

  • Copy text, or copy with sources
  • Prompt recipes
  • A read-only MCP endpoint with five tools
  • Read-only keys for Claude Code
  • An OAuth connector for claude.ai and the Claude apps
  • A Claude Code skill: “get vault bundle” and a name

Android app

  • Inbox, Merged, Notes, Voice and Save tabs
  • An offline copy of the vault
  • Merging, tagging, archiving and notes on the phone
  • App lock
  • Updates from my own server

What it does not do

I would rather you hear this from me than find out.

  • It is for one person. There are no accounts, teams or sharing. One vault, one owner.
  • You host it yourself. There is no hosted version to sign up for.
  • Android only. There is no iPhone app. The website works in any phone browser, but the one-tap share needs the app.
  • It depends on a free third-party API for posts. If FxTwitter stops working, post fetching stops until I change the source. What is already saved stays saved.
  • It does not import your existing X bookmarks. It starts from the day you install it.
  • YouTube sometimes blocks servers. When that happens the transcript comes from a small script on my PC that runs once a day.
  • The phone cannot do everything. Setting categories and priority, and managing security, happen on the website.
  • No videos are copied. It keeps the poster image and the link.

Get the code

Both parts are open source.

To run your own you need a small Linux server with Docker, a domain name for HTTPS, and an Android phone. The README walks through it: set a password, start the container, scan the QR code for two-step sign-in, then pair the phone with a six-digit code.

Three keys are optional. Without them the vault still saves, fetches and merges.

  • An Anthropic key turns on translation, daily filing and voice notes.
  • A Groq key turns on voice transcripts.
  • A YouTube Data API key makes video details more reliable.

If you build on it, or find a hole in it, tell me. I read every reply.