Top AI Repos — open-source AI, indexed and scored
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Top AI Repos tracks AI repositories on GitHub and answers two different questions about each one: is it moving right now, and would you bet a product on it.
Fetch X/Twitter tweets, replies, timelines, and articles without login or API keys — field tool for AI agents.
| Date | Stars |
|---|---|
| 2026-07-31 | 920 |
| 2026-08-06 | 922 |
Today
+2 stars today
This week
— stars this week
This month
— stars this month
Momentum
8.0
growth rate 0.00%/day
<div align="center">
# x-tweet-fetcher
**Fetch X/Twitter tweets, replies, timelines, lists, and articles — no login, no API keys.**
[](LICENSE)
[](https://www.python.org)
[](https://github.com/ythx-101/x-tweet-fetcher)
*Three backends · Auto fallback · Unified JSON schema · Built for AI agents*
[Quick Start](#-quick-start) · [Backends](#-three-backends) · [Capabilities](#-capabilities) · [Python API](#-python-api) · [Self-hosted Nitter](#-self-hosted-nitter) · [Migrating from v1](#-migrating-from-v1)
</div>
---
## 😤 Problem
```
You: fetch that tweet / list / article for me
AI: I can't access X/Twitter. Please copy-paste the content manually.
You: ...seriously?
```
X has no free API. Scraping gets you blocked. Browser automation is fragile in headless environments.
**x-tweet-fetcher** solves this with **smart backend routing**: FxTwitter for single tweets (zero deps), Nitter for timelines and search (direct HTTP), a browser driver for everything else — with automatic fallback between them.
## 🚀 Quick Start
```bash
git clone https://github.com/ythx-101/x-tweet-fetcher
cd x-tweet-fetcher && pip install .
# Single tweet — works instantly, zero configuration
xtf --url https://x.com/user/status/1234567890
# User timeline (needs a Nitter instance, see below)
export XTF_NITTER=http://127.0.0.1:8788
xtf --user elonmusk --limit 20
# Search
xtf --search "openclaw" --limit 10
# Human-readable output instead of JSON
xtf --user elonmusk --text-only
```
Prefer not to install? `python3 scripts/fetch_tweet.py --url ...` works straight from the clone (same flags).
## 🔀 Three Backends
| Backend | Deps | Speed | Covers |
|---------|------|-------|--------|
| **fxtwitter** | None (stdlib) | ⚡⚡ | Single tweets, user profiles |
| **nitter** | A Nitter instance | ⚡ | Timeline, search, replies, mentions |
| **browser** | Camofox *or* Playwright | 🐢 | Everything above + **Lists** + **X Articles** |
| **auto** (default) | Best available | ⚡→🐢 | Nitter first, browser fallback |
```bash
xtf --user elonmusk # auto (default)
xtf --user elonmusk --backend nitter # direct HTTP only
xtf --list 1455045069516357634 # lists always use the browser
```
**Browser driver** defaults to Camofox (`localhost:9377`). Playwright users:
```bash
pip install ".[playwright]" # from the clone
export XTF_BROWSER=playwright # or: --browser-driver playwright
```
## 📊 Capabilities
| Feature | Flag | Backend |
|---------|------|---------|
| Single tweet (text, stats, media, quotes) | `--url` | fxtwitter |
| Reply comments (threaded) | `--url --replies` | nitter / browser |
| User timeline (paginated) | `--user` | nitter / browser |
| Search | `--search` | nitter |
| User profile | `--user-info` | fxtwitter → nitter |
| X List tweets | `--list` | browser |
| X Article full text | `--article` | browser |
| Mentions monitor (incremental, cron-friendly) | `--monitor` | nitter / browser |
**Exit codes** (cron-friendly): `0` success / no new mentions · `1` error / new mentions found · `2` monitor setup error.
**Errors are machine-readable.** Every failure carries `error` (human message) plus `error_code` — one of `invalid_input`, `not_found`, `rate_limited`, `upstream_down`, `backend_unavailable`, `all_backends_failed` — so agents can branch on it. `all_backends_failed` additionally includes per-backend `error_causes`.
## 🐍 Python API
```python
from xtf import Router, NotFound, RateLimited
router = Router() # backend="auto"
tweet = router.fetch_tweet("user", "1234567890") # dict, v1-compatible shape
tweets = router.fetch_timeline("user", limit=20) # list[Tweet]
replies = router.fetch_replies("user", "1234567890")
results = router.search("openclExcerpt of 7,931 characters
Read on GitHub124
Burak Bayır
1
1
Would you bet a product on this? Bounded 0–100 and slow moving.
matched fp:5c6c3ac7f2472f0e, topic:ai-agent, desc:ai agents
matched fp:5c6c3ac7f2472f0e, topic:automation