SomedayX
SomedayX
For the X posts you'll read someday. Search everything you've bookmarked or liked on X by meaning, from your Mac's menu bar. It runs 100% on your Mac: no cloud, no account, no tracking.
Double-tap ⌥ anywhere to open search. Type what you remember ("that thread about pricing") and SomedayX finds it, even when the words don't match.
Search inside images. "screenshot of a dashboard" finds posts by what's in the picture, and text in screenshots and memes is searchable too.
X Articles included. The full text of saved X Articles is searchable, not just their titles.
Works with your AI apps. Ask Claude, the ChatGPT desktop app, Codex or Cursor about your saves over MCP: read-only, off until you turn it on.
SomedayX Wrapped. A shareable card that roasts your saving habits ("🤖 AI agent maximalist · 549 videos in watch later").
Your saves, your Mac. Google's Gemma models run locally through llama.cpp. Nothing you save is ever sent anywhere.
Requirements
macOS 14 or newer, Apple silicon recommended (Intel works, slowly)
8 GB of RAM or more, about 1.5 GB of free disk space
Homebrew (the installer uses it for
uvandllama.cpp)Xcode Command Line Tools (
xcode-select --install)Google Chrome, or the installer downloads Chromium
Related MCP server: Apple Tools MCP
Install
git clone https://github.com/priyank-saarthios-ai/somedayx.git
cd somedayx
macapp/install.shThe first launch walks you through it: log in to X once in SomedayX's own browser window, pick your search brain (optionally with tl;drs), and learn the shortcut. The first sync reads your whole history, and indexing about 3,000 saves takes roughly 35 minutes on an M2. Search works long before it finishes.
To uninstall: macapp/install.sh --uninstall (your data stays until you delete ~/Library/Application Support/SomedayX).
Using it
Double-tap ⌥, or ⌥⌘X | open or close SomedayX from any app |
↵ · ⌘L · ⇧⌘C | open on X · open the link · copy the post's link |
⌘1 ⌘2 ⌘3 | Both · Bookmarks · Likes |
⌘R | surprise me |
⌘Y | your Wrapped (⌘R in there shuffles the card) |
Esc | back to home, then close |
Search understands X-style operators: from:handle, is:bookmark, is:like, has:image, has:video, has:link, has:article, year:2025, since:2025-03, until:2025-06.
SomedayX syncs every night at 3 AM (and whenever you press sync). Right-click the menu bar icon for sync, settings and logs.
Use it from AI apps (MCP)
SomedayX includes an MCP server, so Claude Desktop, Claude Code, the ChatGPT desktop app, Codex, Cursor and other MCP apps can search your saves: "find the posts I saved about pricing and summarise the advice".
Click the SomedayX menu bar icon → AI Apps (MCP) → Let AI Apps Search My Saves. It's off until you turn it on.
In the same menu, choose Connect Claude Desktop, Connect ChatGPT Desktop & Codex or Connect Cursor (then reopen that app), or Copy Claude Code Command, which copies:
claude mcp add --scope user somedayx -- ~/Applications/SomedayX.app/Contents/Resources/somedayx-mcpFor other apps, Copy Setup for Other Apps copies the JSON config. It's a local stdio server. Apps that aren't installed show as "(not installed)"; SomedayX checks without running them.
ChatGPT: works in the ChatGPT desktop app for Mac and Codex (CLI and IDE extension), which share ~/.codex/config.toml. It does not work in chatgpt.com in a browser or the ChatGPT phone apps: those can only reach MCP servers on the internet, and SomedayX keeps your saves on your Mac.
Tool | What it does |
| Search by meaning and keywords, including text in images and X Articles. Takes the same operators as the app ( |
| What you saved lately, with the same filters |
| One post in full: text, image text, quoted post, X Article, links |
| Counts, date range, top authors and topics |
It's read-only: it opens the database read-only and never syncs, posts, or touches your X session. It works whether or not the SomedayX app is open, and shares the app's search model instead of loading a second copy. Turn sharing off in the same menu and every request is refused.
Privacy note: an AI app you connect reads your saved posts to answer you, and cloud-based apps send that text to their servers. Your saves stay on your Mac unless you connect one.
How it works
Collect. Playwright drives a Chrome window logged in to your X account and reads your Bookmarks and Likes timelines, the same data the X website loads for you. It's read-only: it never posts, likes, follows or clicks anything on a post.
Fetch. Link titles, quoted posts, images and the full text of X Articles.
Understand. Apple Vision reads text in images. EmbeddingGemma 2 (via llama.cpp) turns every post and image into a search vector. Gemma 4 E2B can optionally write a one-line tl;dr per post.
Search. Keyword search (SQLite FTS5) and meaning search (sqlite-vec) are combined, so both exact words and vague memories work.
The menu bar app is Swift/SwiftUI; the engine is Python (run with uv). Everything is in this repo.
Privacy
Your saves, images, models and search index live in
~/Library/Application Support/SomedayX, readable only by your macOS user.The only network traffic is to X (to read your saves), to the pages your saved links point to (for their titles), and a one-time model download from Hugging Face. If an identical copy of the model is already on your Mac, SomedayX clones it instead of downloading.
No analytics, no telemetry, no accounts, no servers.
AI apps can read your saves only if you turn on AI Apps (MCP) and connect one; cloud-based AI apps then send what they read to their servers. Off by default.
The local search server only answers SomedayX itself: it checks a private access token and refuses requests from web pages.
That data folder contains a logged-in X browser session. Treat it like a password and don't share it.
FAQ
Is this allowed by X? SomedayX is an unofficial tool, not affiliated with or endorsed by X Corp. It reads your own bookmarks and likes with your own logged-in session, at a human-like pace, much as you would by scrolling. Automated access may still conflict with X's terms; you decide whether to use it, at your own risk.
Could my account get flagged? Syncs scroll slowly and back off when X asks them to. The first sync of a big history is the heaviest; after that, a sync stops as soon as it reaches posts it already has. No problems have been seen so far, but no guarantees.
Why not the official X API? Reading posts through it is billed per post, and the bookmarks endpoint has historically returned only your latest ~800 bookmarks.
It broke after an X update. X changes its website from time to time; please open an issue with logs/sync.log from the data folder.
Windows or Linux? Not yet. Open a discussion if you'd use it.
For developers
uv run python -m somedayx # list commands
uv run python -m somedayx search "from:rauchg agents"
uv run python -m somedayx sync --headless # what the nightly sync runs
uv run python -m somedayx models # local model statusSet SOMEDAYX_HOME to keep data somewhere else (handy for testing with an empty library).
License
MIT. See LICENSE.
Available Tools
4 toolsget_postARead-onlyIdempotent
One saved post in full, by its id or x.com/twitter.com URL: complete text, text read from its images, the post it quotes, the full text of an X Article, and the links it contains.
| Name | Required | Description | Default |
|---|---|---|---|
| post | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real value beyond that by enumerating what comes back: full text, OCR of image text, quoted post, full X Article text, and contained links — an agent knows the payload is enriched, not raw.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with the action and keying method first, followed by an enumeration of return content. Dense but every clause (images, quotes, article text, links) conveys distinct payload information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly shouldered the return-value burden and did so thoroughly. However, it leaves gaps around failure behavior (invalid id, non-saved post), and doesn't clarify whether 'saved post' restricts the lookup to the user's library versus any public post.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single schema parameter 'post' has 0% description coverage, so the description must compensate — and it does, specifying that it accepts either a post id or an x.com/twitter.com URL. That accepted-format detail is the key semantic an agent needs and is absent from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific retrieval action (fetch one saved post in full) on a specific resource, scoped to 'saved post' and passable by id or URL. The 'one ... in full' framing implicitly distinguishes it from the sibling list/search tools (search_saves, recent_saves), though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use when you already hold a post id or x.com/twitter.com URL and want that single post. There is no explicit statement of when to prefer this over search_saves or recent_saves, and no guidance on what happens if the post isn't in the saved library.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
library_overviewARead-onlyIdempotent
A summary of the user's saved X library: how many bookmarks and likes, the date range, the people they save most, and their most common topics. Useful before answering broad questions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds genuine value by disclosing the payload composition (counts, date range, top people, top topics), which substitutes for the missing output schema; it does not mention cost or whether it scans the entire library.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the content of the summary front-loaded and the usage hint placed last. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, no output schema and full annotation coverage, the description carries the remaining burden and does so by enumerating the returned fields. Minor gaps remain around how many top people/topics are returned and any latency implications of aggregating a full library.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is trivially complete, so the baseline of 4 applies. No parameter meaning needs to be conveyed in prose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (the user's saved X library) and enumerates exactly what the summary contains: bookmark/like counts, date range, top saved people, and common topics. This is clearly distinct from the sibling tools search_saves, recent_saves and get_post, which return individual posts rather than aggregates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Useful before answering broad questions" gives a clear usage context and implicitly routes narrow lookups to the search/get siblings. It stops short of explicitly naming those alternatives or stating when not to use it (e.g. for a single post or a specific saved item).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recent_savesARead-onlyIdempotent
The user's most recently saved X posts, newest first, optionally filtered (source, author, has:image/video/link/article, publish dates since/until as YYYY, YYYY-MM or YYYY-MM-DD). Max 50.
| Name | Required | Description | Default |
|---|---|---|---|
| has | No | ||
| limit | No | ||
| since | No | ||
| until | No | ||
| author | No | ||
| source | No | both |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: result ordering, the hard cap of 50, allowed filter dimensions, and accepted date formats — enough for an agent to predict output shape without trial calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence identifying the resource first, then the optional filters, then the cap. No filler, and the dense parenthetical is a compact enumeration rather than prose padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description covers ordering, scoping, filters, and limits adequately. The remaining gap is sibling disambiguation (search_saves) and the meaning of the source enum values, which matter for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it does most of it: it enumerates the has values, explains since/until as YYYY, YYYY-MM or YYYY-MM-DD, and states the limit ceiling. It does not explain what source='both'/'bookmark'/'like' mean or note the default limit of 15, both of which remain undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (the user's recently saved X posts) with ordering (newest first) and an explicit cap (Max 50), so the agent knows exactly what it returns. It does not, however, distinguish this from the sibling search_saves, leaving the agent to infer the boundary between 'recent' and 'search'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the tool is for browsing recent saves with optional narrowing filters. The description never says when to prefer it over search_saves or get_post, nor any exclusions, so the agent must guess the selection rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_savesARead-onlyIdempotent
Search the user's saved X posts (bookmarks and likes) by meaning and keywords, including text inside
images and full X Articles. Describe what they remember in plain words ("that thread about pricing").
X-style operators also work inside the query: from:handle, is:bookmark, is:like, has:image, has:video,
has:link, has:article, year:2025, since:2025-03, until:2025-06. Dates are when the post was published.
Returns up to limit posts (max 25), best first.
| Name | Required | Description | Default |
|---|---|---|---|
| has | No | ||
| limit | No | ||
| query | Yes | ||
| since | No | ||
| until | No | ||
| author | No | ||
| source | No | both |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and closed-world, so safety is covered. The description adds real behavioral value beyond that: results are ranked best-first, capped at limit (max 25), and dates refer to publication time of the post. It stops short of permission/auth requirements or coverage caveats.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then operators, then result semantics — logical ordering with little waste. The operator list is dense but every item documents a real capability, so it earns its space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search with no output schema, the description covers intent, input operators, and a basic notion of output (up to 25 ranked posts). The main omission is explicit linkage between the in-query operators and the seven structured parameters, which the schema alone makes ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Despite 0% schema description coverage, the description documents that queries accept X-style operators (from:, is:bookmark/is:like, has:image/video/link/article, year:/since:/until:) whose value sets line up with the has, source, author, since, and until parameters, plus the limit ceiling. The gap is that it never states these can also be supplied as separate structured parameters, leaving the agent to infer the mapping.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (the user's saved X posts / bookmarks and likes), plus scope details like semantic search, OCR on images, and full Articles. This clearly distinguishes it from recent_saves, get_post, and library_overview without requiring the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The example ("that thread about pricing") tells the agent this is a natural-language recall tool rather than a structured query, which is useful context. However, it never explicitly routes to siblings — e.g., when to use recent_saves instead, or get_post to open a specific result — so the when-not guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.0- First observed
get_post - First observed
library_overview - First observed
recent_saves - First observed
search_saves
TDQS
Scored across 4 tools
Each tool targets a distinct mode: semantic search, chronological listing, single-post retrieval, and aggregate stats. search_saves and recent_saves both return filtered lists of saved posts, but their descriptions clearly separate semantic ranking from newest-first ordering.
All names use consistent snake_case and readable wording, but the verb_noun pattern is not universal: get_post and search_saves lead with verbs, while recent_saves and library_overview are noun/qualifier-based. The deviation is minor and still predictable.
Four tools is a tight, well-scoped surface for a read-oriented saved-posts library, with each tool covering a distinct access pattern (search, recency, detail, overview). Nothing feels redundant or missing at the count level.
The read surface is solid: search with operators, recency listing, full-post detail, and library stats cover the main retrieval workflows. Gaps are pagination beyond limit and any write operations (save/unsave/tag), which agents can largely work around.
Maintenance
Related MCP Connectors
Search, read, and organize your saves from X, Reddit, TikTok, Instagram, and more.
Search X (Twitter) posts and read profiles, followers, trends and X Articles. OAuth sign-in.
Read and search folders on your own computer with explicit consent. Files are never uploaded.
Academic literature search, retrieval, and private library management on top of OpenAlex.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables semantic search across browser bookmarks from Chrome, Firefox, Edge, Opera, and other browsers using natural language queries. Extracts and indexes bookmark content and metadata into a vector database for intelligent retrieval.1Apache 2.0
- AlicenseBqualityAmaintenanceEnables semantic search across Apple Mail, Messages, Calendar, and Contacts on macOS using natural language queries. All processing happens locally with privacy-first vector indexing for fast similarity search.40398 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables local AI agents to search, read, and manage a user's saved X likes and bookmarks, sync them from a local browser, and attach notes and tags.4 npm1-
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to securely search, analyze, and draft posts grounded in a local X/Twitter archive, with encrypted storage, scoped tool access, and full audit logging.1-