| description | allowed-tools |
|---|---|
Sync Twitter bookmarks to Obsidian vault with metadata and embedded media |
Bash(bird:*), Read, Write, Edit, Glob, Grep, AskUserQuestion, WebFetch |
Fetches Twitter bookmarks using the Bird CLI and creates/updates notes in the Bookmarks/ folder with full metadata and embedded media.
- Twitter Bookmarks (via Bird CLI):
- Fetch bookmarks:
bird bookmarks -n <count> --json - Get full tweet details:
bird <tweet-id> --json - Extract text, media, author, timestamps, and engagement metrics
- Fetch bookmarks:
-
Determine sync count:
- Check if user provided an argument (e.g.,
/sync-bookmarks 5to sync 5 bookmarks) - Default to 10 bookmarks for testing
- Ask user if they want to sync all bookmarks or a specific count
- Check if user provided an argument (e.g.,
-
Fetch bookmarks:
- Use
bird bookmarks -n <count> --jsonto get bookmark list (for structured data) - For each bookmark, fetch full details using
bird thread <tweet-url>to get:- Full tweet text (not truncated)
- Parent tweets if it's a reply (for context)
- Thread context
- Better formatting than JSON
- Use
-
Process each bookmark:
- Extract metadata: author, created date, tweet text, media URLs, engagement metrics
- Generate filename:
<author-username>-<tweet-id>.md(e.g.,ryancarson-2008548371712135632.md) - Check if note already exists in
~/Obsidian/Bookmarks/to avoid duplicates
-
Create note with frontmatter:
--- title: "<First 60 chars of tweet text>..." source: "https://twitter.com/<username>/status/<tweet-id>" author: - "[[<Author Name> (@username)]]" created: YYYY-MM-DD tweet_date: "<full created timestamp>" engagement: replies: <count> retweets: <count> likes: <count> tags: - "bookmarks" - "twitter" ---
-
Format note content:
- Include full tweet text
- Embed media (images/videos) using Obsidian syntax
- For images:
or embed multiple images - For videos: Embed using Twitter video URL or
<video>tag - Include link back to original tweet
- Add engagement metrics as metadata
-
Handle media embedding:
- Check tweet JSON for
mediafield - Images: Use
markdown syntax - Videos: Embed with
<video src="url" controls></video>or link to Twitter video - GIFs: Treat as images
- For tweets with multiple images, embed all in sequence
- Check tweet JSON for
-
Create Bookmarks directory if needed:
- Ensure
~/Obsidian/Bookmarks/exists before writing notes - Use
mkdir -pvia Bash if needed
- Ensure
-
Deduplicate:
- Use Glob to find existing bookmark notes:
~/Obsidian/Bookmarks/*.md - Extract tweet IDs from filenames to skip already-synced bookmarks
- Only create new notes for bookmarks not already synced
- Use Glob to find existing bookmark notes:
---
title: "Step-by-step guide to get Ralph working and shipping code"
source: "https://twitter.com/ryancarson/status/2008548371712135632"
author:
- "[[Ryan Carson (@ryancarson)]]"
created: 2026-01-06
tweet_date: "Tue Jan 06 14:37:03 +0000 2026"
engagement:
replies: 80
retweets: 207
likes: 2928
tags:
- "bookmarks"
- "twitter"
---
Step-by-step guide to get Ralph working and shipping code
Everyone is raving about Ralph. What is it?
Ralph is an autonomous AI coding loop that ships features while you sleep.
Created by @GeoffreyHuntley and announced in his original post, it runs @AmpCode (or your agent of choice) repeatedly until all tasks are complete.
[Full tweet text...]
---
**Original Tweet**: [View on Twitter](https://twitter.com/ryancarson/status/2008548371712135632)
**Engagement**: 2928 likes · 207 retweets · 80 replies---
title: "Tweet with image/video"
source: "https://twitter.com/username/status/id"
author:
- "[[Author Name (@username)]]"
created: YYYY-MM-DD
media_type: "image" # or "video", "gif"
tags:
- "bookmarks"
- "twitter"
---
Tweet text here...

<!-- For videos -->
<video src="https://video.twimg.com/video-url.mp4" controls></video>
<!-- Or multiple images -->


---
**Original Tweet**: [View on Twitter](https://twitter.com/username/status/id)- CRITICAL: Always check existing bookmarks first! Use Glob to list
~/Obsidian/Bookmarks/*.mdand extract tweet IDs from filenames to avoid duplicates - CRITICAL: Fetch full tweet details! Use
bird thread <tweet-url>for each bookmark to get:- Full context and thread
- Parent tweets for replies
- Better formatting than JSON
- Parse the human-readable output instead of JSON
- CRITICAL: Use
~for paths! Always use~/Obsidian/Bookmarks/not full paths - Default to testing mode: Sync 10 bookmarks by default unless user specifies a count
- Filename format:
<username>-<tweet-id>.mdfor easy identification and deduplication - Media embedding: Check JSON for
media,photos,videofields - format varies - Thread support: For threads, consider adding thread context or parent tweet reference
- Quoted tweets: Include quoted tweet content if present
- Handle errors gracefully: If Bird CLI fails or tweet is deleted, skip and continue
- Preserve formatting: Keep line breaks and formatting from original tweets
- Author wiki-links: Use format
[[Author Name (@username)]]for easy linking - Tag consistently: Always include
bookmarksandtwittertags - Summary output: After syncing, report how many bookmarks were synced, how many were skipped (duplicates), and any errors
If the user provides a count (e.g., /sync-bookmarks 50), use that count. Otherwise, default to 10 for testing.
Provide a summary:
- ✅ Synced: X new bookmarks
- ⏭️ Skipped: Y existing bookmarks
- ❌ Errors: Z failed bookmarks (if any)
- 📁 Location:
~/Obsidian/Bookmarks/
Uh oh!
There was an error while loading. Please reload this page.