sendaifun/ct-alpha
> Crypto Twitter intelligence and alpha research. Search X/Twitter for real-time crypto narratives, trending tokens, yield strategies, smart money signals, and protocol research. Features TweetRank (PageRank-inspired credibility scoring), multi-signal token detection, coordinated raid detection, and dynamic tool discovery for execution suggestions. Solana-first but covers all major chains.
npx skills add https://github.com/sendaifun/skills --skill ct-alpha
Turn X/Twitter into an actionable crypto intelligence layer. Search CT for narratives, alpha, strategies, and sentiment, then rank results using TweetRank (a PageRank-inspired credibility scoring system), extract tokens/CAs from multiple signals, detect coordinated raids, and suggest execution steps using available tools.
# Clone the skill
git clone https://github.com/yashhsm/skills.git
cd skills/skills/ct-alpha
# Run the installer (configures token, watchlist, cache)
bun run install.ts
# Set your X API Bearer Token
export X_BEARER_TOKEN="your_token_here"
# Or save to persistent env file
mkdir -p ~/.config/env
echo 'export X_BEARER_TOKEN="your_token_here"' >> ~/.config/env/global.env
source ~/.config/env/global.env
# Search for alpha on a token
bun run ct-search.ts search "$SOL alpha" --quick
# Detect trending tokens
bun run ct-search.ts trending --window 6h --solana-only
# Monitor watchlist accounts
bun run ct-search.ts watchlist --since 24h
# Read a specific tweet or article
bun run ct-search.ts read https://x.com/user/status/123456
# Check API spending
bun run ct-search.ts cost
bun run ct-search.ts search "<query>" [flags]
| Flag | Description | Default |
|------|-------------|---------|
| --quick | 20 tweets, 1hr cache, ~$0.10 | Default mode |
| --full | Up to 100 tweets, 15min cache, ~$0.50 | Confirm cost first |
| --limit N | Max total tweets | 20 (quick), 100 (full) |
| --sort <field> | likes, recency, relevancy | relevancy |
| --since <duration> | 1h, 6h, 24h, 7d | 24h |
| --min-likes N | Engagement filter | 3 (quick) |
| --from user1,user2 | Restrict to specific accounts | — |
| --extract-tickers | Show extracted tickers | — |
| --extract-cas | Show contract addresses and crypto URLs | — |
| --raw | JSON output | — |
bun run ct-search.ts trending [flags]
| Flag | Description | Default |
|------|-------------|---------|
| --window <duration> | 1h, 6h, 24h | 6h |
| --min-mentions N | Minimum mention count | 3 |
| --solana-only | Solana ecosystem only | — |
| --top N | Top N results | 20 |
bun run ct-search.ts watchlist [flags]
| Flag | Description | Default |
|------|-------------|---------|
| --category <cat> | Filter by category | all |
| --since <duration> | Time window | 24h |
bun run ct-search.ts read <tweet_url_or_id> [--thread] [--raw]
Accepts x.com URLs, twitter.com URLs, or raw tweet IDs. Articles (long-form posts) are fetched in full.
bun run ct-search.ts thread <tweet_id>
bun run ct-search.ts cost [--reset]
Every tweet is scored by three factors multiplied together:
1 / (1 + hoursAgo / 24) — newer tweets score higher.TweetRank = AuthorCred × EngagementQuality × RecencyBoost
Each tweet receives a source label:
[WATCHLIST] — Author is on your watchlist (highest trust)[HIGH-CRED] — AuthorCred ≥ 5[UNKNOWN] — Unverified author[SUSPICIOUS] — Bot-like patterns detectedCashtag-only detection misses how tokens actually spread on CT. This extracts from four signal types:
| Signal | Example | Confidence |
|--------|---------|------------|
| Cashtag | $SOL, $JTO | High |
| Name-phrase | "pendle" + crypto context | High/Medium |
| Crypto URL | pump.fun, dexscreener, birdeye, jup.ag | High |
| Contract Address | Base58 (Solana) / 0x (Ethereum) with context | High/Low |
Supported crypto URL domains: pump.fun, dexscreener.com, birdeye.so, jup.ag, raydium.io, solscan.io, etherscan.io.
Detects coordinated pump campaigns by analyzing author credibility distribution per ticker:
Every search auto-appends crypto noise filters:
-is:retweet (removes retweets)-"airdrop", -"giveaway", -"whitelist" (spam removal)-"follow and RT", -"follow & RT", -"free mint", -"dm to claim" (engagement bait)-is:replyAggressive caching prevents redundant API calls:
| Cache Type | TTL | Use Case |
|------------|-----|----------|
| Quick search | 1 hour | Default searches |
| Full search | 15 minutes | Deep dives |
| Thread | 2 hours | Conversation threads |
| Profile | 24 hours | User lookups |
| Watchlist | 4 hours | Account monitoring |
Cache is file-based (JSON) with auto-pruning on startup (24h hard limit).
Follow this 6-step loop for every research request:
Break the user's question into 1-3 targeted search queries.
$TICKER and plain name with ORBefore any API call:
Execute with --quick mode first (always):
bun run ct-search.ts search "$TOKEN alpha" --quick --extract-tickers
Analyze TweetRank scores and trust labels. Look for extracted tickers, contract addresses, and crypto URLs.
bun run ct-search.ts thread <id>--from author1,author2--full only if quick was insufficientCombine findings into actionable intelligence:
The query argument supports X API v2 operators:
| Operator | Example | Description |
|----------|---------|-------------|
| keyword | solana alpha | Both words |
| "exact" | "yield strategy" | Exact phrase |
| OR | $SOL OR solana | Either term |
| - | -airdrop | Exclude term |
| from: | from:username | Tweets by user |
| has:links | has:links | Tweets with URLs |
| lang: | lang:en | Language filter |
| $ | $SOL | Cashtag |
Do NOT use these v1.1 operators (they cause 400 errors on v2 pay-per-use):
min_faves:N, min_retweets:N — use --min-likes CLI flag insteadplace:, bio:, sample: — not available on v2Do NOT manually include noise filters in the query — the CLI auto-appends them.
After completing research, suggest execution steps using available MCP tools:
| Tool Prefix | Use Case | Example |
|-------------|----------|---------|
| mcp__defillama__* | TVL, yields, fees, prices | get_protocol_tvl("pendle") |
| mcp__backpack__* | Exchange price, depth, trades | backpack_get_ticker("SOL_USDC") |
| mcp__polymarket__* | Prediction markets | search_polymarket("solana ETF") |
| mcp__coingecko__* | Token data, market charts | get_id_coins("solana") |
Always frame suggestions as "verify" not "confirm" — encourage skepticism about CT alpha.
--quick first (~$0.10 for 20 tweets). Relevancy sort = best results come first.--limit if 20 results are genuinely insufficient.--full mode.--from for signal: Restrict to watchlist accounts for highest signal-to-noisehas:links for substance: Analytical content, not hot takescost command to monitor API usage~/.config/env/global.env — ensure proper file permissionsct-alpha/
├── SKILL.md # This file — agent instructions
├── ct-search.ts # Main CLI entry point
├── setup.ts # Interactive setup script
├── install.ts # Full installer
├── lib/
│ ├── api.ts # X API v2 integration, pagination, caching
│ ├── extract.ts # Multi-signal token extraction
│ ├── tweetrank.ts # TweetRank scoring and raid detection
│ ├── format.ts # Output formatting with trust labels
│ ├── cache.ts # File-based caching layer
│ ├── cost.ts # API cost tracking
│ └── filters.ts # Noise filtering, engagement filtering
├── resources/
│ ├── x-api.md # X API v2 reference
│ ├── query-templates.md # Pre-built search patterns
│ └── tool-discovery.md # Dynamic tool suggestion map
├── data/
│ ├── known-tokens.json # Token name → ticker mappings
│ └── watchlist.default.json # Default watchlist categories
└── examples/
└── basic-search.ts # Quick start example
Take sendaifun/ct-alpha from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.