loading…
Search for a command to run...
loading…
Archives posts from X into a local SQLite database and provides tools for semantic analysis and natural language search. It enables agents to manage low-cost da
Archives posts from X into a local SQLite database and provides tools for semantic analysis and natural language search. It enables agents to manage low-cost data ingestion and retrieve relevant posts using local embeddings and topic labeling.
Kisa aciklama: X uzerinden post toplayan, bunlari yerel SQLite arsivine yazan ve MCP ile ajanlara kullandiran daemon tabanli bir arsivleme ve akilli arama projesi.
X Archive Daemon archives posts from X into a local SQLite database, exposes them through a daemon-first architecture, and optionally adds a local semantic analysis layer for smarter retrieval.
If you work with coding agents, the easiest setup flow is:
Manual setup:
npm install
Create .secrets/x.json:
{
"authMode": "bearer_token",
"bearerToken": "YOUR_X_BEARER_TOKEN"
}
Start the daemon:
npm run daemon:start
Start the MCP bridge:
npm run mcp:start
This project has three layers:
ingestanalysissemantic searchScenario:
ingest = put boxes into storageanalysis = attach labels to the boxessemantic search = find the right boxes quicklydaemonGET /healthGET /toolsPOST /invokeMCPSQLiteThe system avoids paying twice for the same coverage.
Example:
501005050This works for:
latest N timelinelatest N original postsWhen a user generically says "fetch posts" or "archive tweets", the default tool is:
ingest.accounts.original_backfillThis excludes:
That keeps the archive cleaner and cheaper.
If a post contains images:
mediaUrls are storedThis keeps disk and network usage low.
Analysis is off by default.
That means:
Once analysis exists, you can search with natural language prompts like:
The system then:
sources.accounts.resolveingest.accounts.backfillingest.accounts.original_backfillingest.accounts.syncingest.search.backfillarchive.posts.listarchive.posts.searcharchive.posts.semantic_searcharchive.accounts.listarchive.accounts.getarchive.billing.summaryanalysis.posts.runanalysis.labels.listarchive.insights.summaryMCP also exposes:
system.daemon.startsafe-readoperator-writeNote:
analysis.posts.run is also operator-writeMeasured system:
M4 mini16 GB RAMMeasured analysis speed:
900 posts = about 30.69s100 posts = about 3.41s980 posts = about 33.42s expected totalImportant:
The current analysis layer uses one small local model:
sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2Its role is:
This layer does not generate final answers. It builds a local meaning layer on top of the archive.
When analysis runs, each post gets signals such as:
Tagging is based on:
The repository includes a versioned label catalog with Turkish descriptions.
Examples:
software_architecturemonolith_vs_microservicesbackend_apidatabase_sqldatabase_indexingcachingdistributed_systemstesting_qaclean_codecode_reviewsecurity_appsecauthentication_authorizationci_cd_releaseai_assisted_codingvibe_codingprompting_for_engineeringtechnical_decision_makingCheck daemon health:
curl http://127.0.0.1:3200/health
List available tools:
curl http://127.0.0.1:3200/tools
Estimate original-post ingest:
curl -X POST http://127.0.0.1:3200/invoke \
-H 'content-type: application/json' \
-d '{
"tool": "ingest.accounts.original_backfill",
"input": {
"username": "sampleauthor",
"searchMode": "recent",
"targetCount": 100,
"estimateOnly": true
}
}'
Run local analysis:
curl -X POST http://127.0.0.1:3200/invoke \
-H 'content-type: application/json' \
-d '{
"tool": "analysis.posts.run",
"input": {
"username": "sampleauthor",
"limit": 200,
"onlyUnanalyzed": true
}
}'
Run semantic search:
curl -X POST http://127.0.0.1:3200/invoke \
-H 'content-type: application/json' \
-d '{
"tool": "archive.posts.semantic_search",
"input": {
"username": "sampleauthor",
"query": "teaching posts about coding",
"educationalOnly": true,
"limit": 10
}
}'
The repository is public and safe to clone, but the local model files are not stored in git history because of GitHub file size limits.
The codebase is public-ready. Model packaging is handled separately from normal git push history.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"x-archive-daemon": {
"command": "npx",
"args": []
}
}
}