Export · Markdown
Put your X bookmarks in an Obsidian vault
Obsidian has no importer for a plain CSV, so the route is CSV out of Sift, Markdown out of the converter, then the files copied into a folder in your vault — where the interesting decision is one note per bookmark versus one file with a heading per bookmark.
Start by converting, not importing
Obsidian’s official Importer handles Notion, Evernote, Bear, Roam and existing HTML or Markdown. It does not read arbitrary CSVs, and there is no built-in “make a note per row” command. So the CSV is an intermediate format here rather than the thing you file away: run it through the bookmark export converter — which works in the browser tab, uploads nothing, and can emit either shape described below — and copy the result into your vault.
Because a vault is just a folder of files on your disk, there is no import step to get wrong. Copy the files in, switch back to Obsidian, and they are there. If the vault is on Obsidian Sync or iCloud, give the sync a moment before you start linking to the new notes from elsewhere.
One note per bookmark, or one file with headings
| One note per bookmark | Single file, ## per bookmark | |
|---|---|---|
| Graph view | Each saved post is a node you can link to and backlink from. | One node. The graph learns nothing. |
| Linking | You can [[wikilink]] a specific post from a project note. | Only block references, which are fragile across re-exports. |
| Skimming | Requires a Dataview or Bases table to see them all at once. | Scroll, or use the outline pane. Fast. |
| Re-export | Filenames collide predictably, which is what you want. | A second file either replaces the first or sits beside it. |
| Vault size | 500 tiny files per export day. | One file per export day. |
What a note looks like
--- post_id: "1795432198765432198" post_url: https://x.com/rauchg/status/1795432198765432198 author: "@rauchg" posted_at: 2026-08-14T09:12:44Z saved_at: 2026-08-14T21:03:01Z category: Engineering tags: [caching, infra, performance] --- > the only two hard problems in caching > [!note] Sift summary > A one-line note on cache invalidation. [View the original on x.com](https://x.com/rauchg/status/1795432198765432198)
Three choices in there are load-bearing rather than cosmetic. The post ID is quoted, because YAML reads a bare 19-digit number as an integer and a good deal of tooling downstream will round it. The post text sits in a blockquote so that a post beginning with # renders as what the author wrote instead of becoming a first-level heading. And the summary is in an Obsidian callout, visually and structurally separate from the quote above it.
Filenames: use the post ID
The temptation is to name each note after the post it holds. Resist it. Post text contains /, :, ? and |, all illegal in filenames on at least one platform your vault might touch; it contains emoji, which survive but make the file miserable to reference from a terminal; and it runs to hundreds of characters, which collides with path length limits once the vault sits inside a synced folder.
A post ID is short, unique, immutable and safe everywhere. It also makes a repeat export idempotent: drop tomorrow’s batch into the same folder, choose replace, and the notes you already had are simply rewritten rather than duplicated as post (1).md. Put the human-readable title in the note instead — Obsidian shows an aliases frontmatter value in quick switcher results, so an alias of the first few words of the post gives you searchable titles without unsafe filenames.
Column to frontmatter mapping
| CSV column | Where it goes | Note |
|---|---|---|
post_id | Filename, and a quoted frontmatter value | Quote it. YAML integers of this size are not safe. |
post_url | Frontmatter, and a link at the foot of the note | Attribution is a requirement, not a nicety — every note keeps its permalink. |
author_handle | Frontmatter author | Leave the @ on; Obsidian does not treat it specially. |
posted_at | Frontmatter date | Obsidian Properties renders an ISO 8601 value as a date field. |
saved_at | Frontmatter date | The field to sort a Dataview or Bases table by. |
post_text | Note body, as a blockquote | Every line needs its own >, blank lines between paragraphs included. |
ai_category | Frontmatter category | One value from a fixed set. Group a Bases table on it. |
ai_tags | Frontmatter tags list | See the tag rules below. |
ai_summary | A > [!note] callout | Keeps generated text out of the quoted post. |
Reading them back
Once the frontmatter is consistent, the vault gives you the query layer for free. A Bases or Dataview table over the folder, grouped by category and sorted by saved_at descending, is a better version of the library view you exported from — because the notes sit next to your own writing and can be linked from it. That is the whole reason to prefer a vault over a spreadsheet; if a table is genuinely what you want, the spreadsheet route keeps the file tabular and skips the conversion entirely.
- Nothing flows back. Editing a note does not change anything in Sift, and nothing in Sift will ever reach into your vault.
- Posts deleted on X are already gone from the file — a nightly compliance job marks them and the export skips them — but notes you copied in last month are yours now, and no longer tracked. If that matters to you, re-export rather than accumulate.
- There is nothing for us to integrate with. A vault has no server: the only “Obsidian integration” possible would be a community plugin calling an API of ours, which runs into the same restriction on redistributing post content to third parties that a hosted sync would. Here the file boundary is not a compromise; it is how Obsidian works anyway.
Two things that are true of every export
Sort them first, then export
An export is only worth having if the categories are. Connect X read-only, let Sift import and sort your newest bookmarks, and the file you download inherits that structure — category, tags and a one-line summary already attached to every row.
Connect X