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 bookmarkSingle file, ## per bookmark
Graph viewEach saved post is a node you can link to and backlink from.One node. The graph learns nothing.
LinkingYou can [[wikilink]] a specific post from a project note.Only block references, which are fragile across re-exports.
SkimmingRequires a Dataview or Bases table to see them all at once.Scroll, or use the outline pane. Fast.
Re-exportFilenames collide predictably, which is what you want.A second file either replaces the first or sits beside it.
Vault size500 tiny files per export day.One file per export day.
Notes-per-bookmark is the right default if you cite saved posts in your own writing. The single file is better if you mostly want to reread what you saved this week and move on.

What a note looks like

1795432198765432198.md
---
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 columnWhere it goesNote
post_idFilename, and a quoted frontmatter valueQuote it. YAML integers of this size are not safe.
post_urlFrontmatter, and a link at the foot of the noteAttribution is a requirement, not a nicety — every note keeps its permalink.
author_handleFrontmatter authorLeave the @ on; Obsidian does not treat it specially.
posted_atFrontmatter dateObsidian Properties renders an ISO 8601 value as a date field.
saved_atFrontmatter dateThe field to sort a Dataview or Bases table by.
post_textNote body, as a blockquoteEvery line needs its own >, blank lines between paragraphs included.
ai_categoryFrontmatter categoryOne value from a fixed set. Group a Bases table on it.
ai_tagsFrontmatter tags listSee the tag rules below.
ai_summaryA > [!note] calloutKeeps 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