Trump Truth Monitor
Pulls Donald Trump's Truth Social feed via the trumpstruth.org RSS mirror, classifies posts into market-relevant topic buckets, and hands the candidate list off for LLM-level market-impact grading.
When to use
- User asks what Trump has posted recently
- Pre-market gap on policy-sensitive sectors (semis, China ADRs, autos, energy, banks, defense) — check whether a Trump post is the trigger
- Building the "Catalyst (now)" lens of
stock-deep-dive for a name with policy exposure (TSM, NVDA, AAPL, F, GM, XOM, BAC, RTX, LMT)
market-session-tracker pre-market protocol — add a Trump-feed pass
If the user wants tweet history beyond ~5 days, this skill is insufficient — the RSS mirror only exposes the latest ~100 posts. Route to Factba.se / Roll Call (paid) or note the limitation explicitly.
Data source
trumpstruth.org/feed — a public third-party mirror of @realDonaldTrump on Truth Social. RSS 2.0 XML with these fields per item:
| Field |
Meaning |
<pubDate> |
RFC 2822, original Truth Social post timestamp |
<link> |
trumpstruth.org/statuses/{mirror_id} |
<truth:originalUrl> |
truthsocial.com/@realDonaldTrump/{truth_id} — the primary source |
<description> |
Full post body with HTML (links + ellipsis spans) |
The mirror typically lags the original by ≤2 minutes. Single feed pull returns ~100 most recent posts, covering ~5 days at Trump's typical cadence.
CLI
Read mode — fetch.py
# Default: last 24h, keyword-filtered, markdown
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py
# Wider window
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --hours 72
# All posts in feed regardless of keyword
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --hours 72 --all
# Single topic
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --topic tariff_trade
# JSON output (for chaining)
python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --json
Topic buckets defined in script: tariff_trade, semi_tech, energy, fed_macro, crypto, geopolitical.
Archive mode — archive.py
# Append new posts to journal/trump-feed/YYYY-MM-DD.md (idempotent)
python3 .claude/skills/trump-truth-monitor/scripts/archive.py
# Custom output dir
python3 .claude/skills/trump-truth-monitor/scripts/archive.py --out /path/to/dir
# Silent unless something new was added
python3 .claude/skills/trump-truth-monitor/scripts/archive.py --quiet
The archive de-dupes by mirror status_id — re-running on the same feed is a no-op. Designed to be scheduled (see launchd/README.md). Once archived, posts persist locally even if trumpstruth.org goes down.
Workflow
- Decide window. Default 24h. Use 48–72h when investigating a multi-day move. Use
--all when context-grazing.
- Decide scope. If user asks generally → no
--topic. If user names a domain (关税 / 半导体 / 油 / 加密) → pass --topic.
- Pull feed. Run
fetch.py with chosen flags. Always include --hours — never default to "all of feed" silently.
- Second-pass grading. Script output is candidates, not signals. For each post:
- Read the full text before assigning impact. Headlines and keyword tags lie.
- Assign a market-impact tier:
high / med / low / noise
- high = concrete action with $ figure, %, date, named country/company (e.g. "25% tariff on Mexican imports effective June 1", "Section 232 on chips")
- med = directional signal without specifics (e.g. "We'll be tough on China", "must invest in America")
- low = brand alignment with sector (e.g. "American Energy DOMINANCE", "Crypto Capital of the World" — already-priced policy stance)
- noise = keyword matched but body is endorsement / personal / off-topic (e.g. "support the Military" in a Senate endorsement)
- Anchor on original URL. When quoting, always cite
truth:originalUrl (the truthsocial.com link), not the mirror.
- Render output. For multi-post stretches, group by tier — high first, then med, then a one-line low/noise tally.
Output template
# Trump's Truth — {WINDOW}
## High-impact (potential market mover)
- [{utc_time}] {one-line summary} — `tier: high` · {topic tags}
> "{verbatim short quote ≤2 sentences}"
- Original: {truthsocial.com URL}
- Possible market read: {sector / ticker level expectation, anchored}
## Medium-impact (directional, no specifics)
- [{utc_time}] {one-line summary}
- Original: {URL}
## Noise (matched keyword, low signal)
- {N} posts ({topic distribution}) — endorsements / personal — not enumerated
⚠ Trump may delete or contradict within hours. Position decisions should require independent confirmation (sector ETF tape, peer reaction, official release).
Anti-patterns
| Mistake |
Reality |
| Treating script output as "market signal" |
Script is a keyword filter. LLM must read each post and tier. |
| Quoting a mirror URL as the source |
Always link truth:originalUrl (truthsocial.com). Mirror is a convenience. |
| Reporting Senate endorsements as "policy news" |
Politics-only posts with military / energy keywords are noise — filter at tier=noise. |
| "Trump said X about Y" with no link |
Always include the truthsocial.com link. User must be able to verify. |
| Pretending tweets are durable |
Trump posts can be deleted or retracted within hours. If consulted >12h after, note staleness. |
Integration
market-session-tracker pre-market protocol: insert a Trump-feed --hours 14 pull as step 0 (covers post-prev-close to pre-market). If high-tier post exists touching watchlist sectors, escalate to the explanation slot for any gap.
stock-deep-dive lens 4 (Catalysts): when the symbol has policy exposure (semis / China ADR / auto / energy / defense / bank), run a Trump-feed --hours 168 and surface high-tier hits.
gdelt can confirm market has already picked the post up (i.e. major outlets are reporting it). Trump feed = original; GDELT = market-validated.
Limitations
- Mirror dependency: trumpstruth.org is third-party. If it goes down, the live
fetch.py fails — but the archived posts under journal/trump-feed/ remain readable.
- 5-day depth via mirror: a single feed pull only exposes the last ~100 posts. Anything older than ~5 days that wasn't archived in time is lost. Schedule
archive.py (see launchd/) to grow a permanent local record.
- No X feed: Trump's X (Twitter) account is separate. This skill does not cover X posts. If user asks about X specifically, note the gap.
- Truth posts are not press releases. Treat as primary-but-volatile speech: original URL is authoritative for what was said, but the policy implementation may diverge (or never happen).
Local archive — searching past posts
Once archive.py has been running, journal/trump-feed/YYYY-MM-DD.md accumulates a complete record. To investigate a past day or query historically:
# All tariff-related posts ever archived
grep -l "tariff" journal/trump-feed/*.md
# Specific company mention
grep -B2 -A8 -i "nvidia\|tsmc" journal/trump-feed/*.md
# Posts on a specific date
cat journal/trump-feed/2026-05-26.md
The archive is plain markdown — grep-friendly, git-trackable.
Related skills
gdelt — market-validated news coverage of a Trump post
stock-deep-dive — caller for catalyst-lens enrichment
market-session-tracker — caller for pre-market protocol
sec-edgar — confirm whether a tweet translates into an actual filing (rare but does happen for trade-policy items affecting specific companies)
1---2name: trump-truth-monitor3description: Use when monitoring or interpreting Donald Trump's Truth Social posts for market-moving events — tariff announcements, sanctions, deals with countries (China / Mexico / Canada / EU / Japan / Korea / Taiwan), specific company / CEO mentions, Fed pressure, energy / oil commentary, crypto policy, or geopolitical escalation. Triggers on "trump 发了什么", "check trump", "trump 关税", "盘前 trump 推", "trump truth social", "trump tweet impact", "trump 对 X 说了什么", or whenever a pre-market gap / intraday spike on policy-sensitive names (semis, China ADRs, autos, energy, banks, defense) needs to be explained.4---56# Trump Truth Monitor78Pulls Donald Trump's Truth Social feed via the trumpstruth.org RSS mirror, classifies posts into market-relevant topic buckets, and hands the candidate list off for LLM-level market-impact grading.910## When to use1112- User asks what Trump has posted recently13- Pre-market gap on policy-sensitive sectors (semis, China ADRs, autos, energy, banks, defense) — check whether a Trump post is the trigger14- Building the "Catalyst (now)" lens of `stock-deep-dive` for a name with policy exposure (TSM, NVDA, AAPL, F, GM, XOM, BAC, RTX, LMT)15- `market-session-tracker` pre-market protocol — add a Trump-feed pass1617If the user wants tweet **history beyond ~5 days**, this skill is insufficient — the RSS mirror only exposes the latest ~100 posts. Route to Factba.se / Roll Call (paid) or note the limitation explicitly.1819## Data source2021**trumpstruth.org/feed** — a public third-party mirror of @realDonaldTrump on Truth Social. RSS 2.0 XML with these fields per item:2223| Field | Meaning |24| --------------------- | -------------------------------------------------------------------- |25| `<pubDate>` | RFC 2822, original Truth Social post timestamp |26| `<link>` | trumpstruth.org/statuses/{mirror_id} |27| `<truth:originalUrl>` | truthsocial.com/@realDonaldTrump/{truth_id} — **the primary source** |28| `<description>` | Full post body with HTML (links + ellipsis spans) |2930The mirror typically lags the original by ≤2 minutes. Single feed pull returns ~100 most recent posts, covering ~5 days at Trump's typical cadence.3132## CLI3334### Read mode — `fetch.py`3536```bash37# Default: last 24h, keyword-filtered, markdown38python3 .claude/skills/trump-truth-monitor/scripts/fetch.py3940# Wider window41python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --hours 724243# All posts in feed regardless of keyword44python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --hours 72 --all4546# Single topic47python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --topic tariff_trade4849# JSON output (for chaining)50python3 .claude/skills/trump-truth-monitor/scripts/fetch.py --json51```5253Topic buckets defined in script: `tariff_trade`, `semi_tech`, `energy`, `fed_macro`, `crypto`, `geopolitical`.5455### Archive mode — `archive.py`5657```bash58# Append new posts to journal/trump-feed/YYYY-MM-DD.md (idempotent)59python3 .claude/skills/trump-truth-monitor/scripts/archive.py6061# Custom output dir62python3 .claude/skills/trump-truth-monitor/scripts/archive.py --out /path/to/dir6364# Silent unless something new was added65python3 .claude/skills/trump-truth-monitor/scripts/archive.py --quiet66```6768The archive de-dupes by mirror status_id — re-running on the same feed is a no-op. Designed to be scheduled (see `launchd/README.md`). Once archived, posts persist locally even if trumpstruth.org goes down.6970## Workflow71721. **Decide window**. Default 24h. Use 48–72h when investigating a multi-day move. Use `--all` when context-grazing.732. **Decide scope**. If user asks generally → no `--topic`. If user names a domain (关税 / 半导体 / 油 / 加密) → pass `--topic`.743. **Pull feed**. Run `fetch.py` with chosen flags. **Always include `--hours`** — never default to "all of feed" silently.754. **Second-pass grading**. Script output is _candidates_, not signals. For each post:76 - **Read the full text** before assigning impact. Headlines and keyword tags lie.77 - Assign a **market-impact tier**: `high` / `med` / `low` / `noise`78 - **high** = concrete action with $ figure, %, date, named country/company (e.g. "25% tariff on Mexican imports effective June 1", "Section 232 on chips")79 - **med** = directional signal without specifics (e.g. "We'll be tough on China", "must invest in America")80 - **low** = brand alignment with sector (e.g. "American Energy DOMINANCE", "Crypto Capital of the World" — already-priced policy stance)81 - **noise** = keyword matched but body is endorsement / personal / off-topic (e.g. "support the Military" in a Senate endorsement)825. **Anchor on original URL**. When quoting, always cite `truth:originalUrl` (the truthsocial.com link), not the mirror.836. **Render output**. For multi-post stretches, group by tier — high first, then med, then a one-line low/noise tally.8485## Output template8687```88# Trump's Truth — {WINDOW}8990## High-impact (potential market mover)91- [{utc_time}] {one-line summary} — `tier: high` · {topic tags}92 > "{verbatim short quote ≤2 sentences}"93 - Original: {truthsocial.com URL}94 - Possible market read: {sector / ticker level expectation, anchored}9596## Medium-impact (directional, no specifics)97- [{utc_time}] {one-line summary}98 - Original: {URL}99100## Noise (matched keyword, low signal)101- {N} posts ({topic distribution}) — endorsements / personal — not enumerated102103⚠ Trump may delete or contradict within hours. Position decisions should require independent confirmation (sector ETF tape, peer reaction, official release).104```105106## Anti-patterns107108| Mistake | Reality |109| ---------------------------------------------- | ---------------------------------------------------------------------------------------------- |110| Treating script output as "market signal" | Script is a keyword filter. LLM must read each post and tier. |111| Quoting a mirror URL as the source | Always link `truth:originalUrl` (truthsocial.com). Mirror is a convenience. |112| Reporting Senate endorsements as "policy news" | Politics-only posts with `military` / `energy` keywords are noise — filter at tier=noise. |113| "Trump said X about Y" with no link | Always include the truthsocial.com link. User must be able to verify. |114| Pretending tweets are durable | Trump posts can be deleted or retracted within hours. If consulted >12h after, note staleness. |115116## Integration117118- **`market-session-tracker`** pre-market protocol: insert a Trump-feed `--hours 14` pull as step 0 (covers post-prev-close to pre-market). If `high`-tier post exists touching watchlist sectors, escalate to the explanation slot for any gap.119- **`stock-deep-dive`** lens 4 (Catalysts): when the symbol has policy exposure (semis / China ADR / auto / energy / defense / bank), run a Trump-feed `--hours 168` and surface `high`-tier hits.120- **`gdelt`** can confirm market has already picked the post up (i.e. major outlets are reporting it). Trump feed = original; GDELT = market-validated.121122## Limitations123124- **Mirror dependency**: trumpstruth.org is third-party. If it goes down, the live `fetch.py` fails — but the archived posts under `journal/trump-feed/` remain readable.125- **5-day depth via mirror**: a single feed pull only exposes the last ~100 posts. Anything older than ~5 days that wasn't archived in time is lost. Schedule `archive.py` (see `launchd/`) to grow a permanent local record.126- **No X feed**: Trump's X (Twitter) account is separate. This skill does **not** cover X posts. If user asks about X specifically, note the gap.127- **Truth posts are not press releases**. Treat as primary-but-volatile speech: original URL is authoritative for what was said, but the policy implementation may diverge (or never happen).128129## Local archive — searching past posts130131Once `archive.py` has been running, `journal/trump-feed/YYYY-MM-DD.md` accumulates a complete record. To investigate a past day or query historically:132133```bash134# All tariff-related posts ever archived135grep -l "tariff" journal/trump-feed/*.md136137# Specific company mention138grep -B2 -A8 -i "nvidia\|tsmc" journal/trump-feed/*.md139140# Posts on a specific date141cat journal/trump-feed/2026-05-26.md142```143144The archive is plain markdown — grep-friendly, git-trackable.145146## Related skills147148- `gdelt` — market-validated news coverage of a Trump post149- `stock-deep-dive` — caller for catalyst-lens enrichment150- `market-session-tracker` — caller for pre-market protocol151- `sec-edgar` — confirm whether a tweet translates into an actual filing (rare but does happen for trade-policy items affecting specific companies)