Ken280 downloadsSync your Twitter/X bookmarks into your vault as Markdown notes, with optional local-AI monthly summaries. Unofficial, cookie-based, personal use.
Sync your own Twitter/X bookmarks into your Obsidian vault as Markdown notes —
one note per bookmark, fully searchable, permanently archived, and consumable by
your other tools. Architecture mirrors
obsidian-weread-plugin:
embedded web login captures your session cookie, that cookie calls X's internal
GraphQL Bookmarks endpoint, and each bookmark is rendered through a Nunjucks
template into Twitter/.
⚠️ Unofficial, personal use, your own risk. This plugin uses X's private web API with your own session cookie (no paid API). It only ever reads your own bookmarks — it never posts, edits, or deletes. X may change its internal API at any time. Don't use it for bulk/commercial scraping. Your cookie is stored only in this plugin's local
data.jsonand is never sent anywhere except to x.com.
auth_token + ct0; no manual cookie hunting. 2FA works because it's the real
login page.note_tweet long-form),
author + handle + avatar, timestamp, permalink, images/videos/GIFs, quoted
tweets (one level), and external-link cards. Threads are intentionally not
reconstructed.tweet_id. An existing
note is skipped, never re-written, so any manual annotations are safe. (This is
the weread pain point this plugin designs around.)queryId every few
weeks. The plugin auto-discovers it from X's JS bundle, caches it, lets you
override it, and falls back to a static value — and on failure says so clearly
instead of dying silently.Network + privacy note: this plugin sends requests to x.com with your own session cookie (stored only in this plugin's local
data.json) and, if you enable the digest, to your local Ollama. It is unofficial and for personal use — see the disclaimer at the top.
Copy main.js, manifest.json, and styles.css into
<vault>/.obsidian/plugins/x-bookmarks-to-vault/, then enable it in
Settings → Community plugins.
npm install
npm run build # produces main.js
Maintainers: see PUBLISHING.md for releasing and store submission.
auth_token and ct0.Twitter/).Commands:
| Command | What it does |
|---|---|
| Sync X bookmarks | Pulls new bookmarks; skips ones already saved. |
| Force re-render all X bookmarks | Re-renders every fetched bookmark (e.g. after changing your template). Overwrites existing notes. |
| Log in to X | Opens the embedded login window (desktop only). |
Twitter).src/render/default-template.njk for the
default to copy from. Available variables: author.{name,handle,avatar},
text, created_at, permalink, media[], quoted, card, tweet_id,
bookmarked_at.<folder>/_attachments/.Each note carries a frontmatter sentinel used for dedup:
---
doc_type: "x-bookmark"
tweet_id: "1234567890"
author: "Alice"
handle: "alice"
created: "2018-10-10T20:19:24.000Z"
url: "https://x.com/alice/status/1234567890"
bookmarked_at: "2026-06-16T00:00:00.000Z"
---
Filename: {handle}-{tweet_id}.md (block-ref-sensitive characters sanitized).
queryId and
paste it into Advanced → queryId override.npm install
npm test # vitest — parser, pagination guardrails, queryId, dedup, render, cookies, media
npm run dev # esbuild watch
npm run build # typecheck + production bundle
The networked seams (parser, queryId extraction, pagination loop, dedup, render, cookies, media) are pure/injectable and unit-tested against recorded fixtures — no live X calls in tests. The embedded Electron login is manually tested.
MIT