bullshit-detector
Fact-check and hype-audit content. Extracts the discrete claims from a video, article, tweet, or PDF, verifies each against…
Render a finished BS report as a self-contained HTML page — score hero, filterable claims, readable on a phone, prints to a clean PDF. Use when the user wants to open, share, print, or show a report to someone who is not going to read a markdown table, or asks for "the HTML
$ npx -y skills add SerhiiKorniienko/bullshit-detector --skill report-card --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/report-cardContext preview
The summary Claude sees to decide when to auto-load this skill.
Render a finished BS report as a self-contained HTML page — score hero, filterable claims, readable on a phone, prints to a clean PDF. Use when the user wants to open, share, print, or show a report to someone who is not going to read a markdown table, or asks for "the HTML
name: report-card description: Render a finished BS report as a self-contained HTML page — score hero, filterable claims, readable on a phone, prints to a clean PDF. Use when the user wants to open, share, print, or show a report to someone who is not going to read a markdown table, or asks for "the HTML version", "something I can send", "a shareable page", or "make this readable".
Turn `bs-report-<slug>-<date>.md` into one HTML file anybody can open.
The markdown is the artifact and stays the artifact — it is what `tally.py` checks, what gets diffed against a later run, and what gets committed. This skill adds a **reader-facing** view of that same file. It renders; it never edits, recounts, or adds. Every number on the page is copied from the markdown verbatim.
A BS report is a five-column claims table. On a laptop that is fine. On a phone — which is where a shared link is actually opened — the Evidence column is unreadable, and the reader's first question ("what's wrong with it?") means scrolling twenty rows to find the two that matter.
uv run <this-skill-dir>/scripts/render_report.py ~/.bullshit-detector/reports/<YYYY>/bs-report-<slug>-<date>.md
Writes `bs-report-<slug>-<date>.html` beside the markdown. `-o <path>` puts it elsewhere. No install step, no dependencies — the script is stdlib-only, runs under plain `python3` as well as `uv run`, and the page it produces makes no network requests. That combination is what lets it work in a code-execution sandbox, where the HTML is the only thing the user can take away.
host — it says so and the file is still written. **It is skipped when the page already exists**, because re-rendering is normal (the run line gets finalised after a first pass) and every open spawns another tab — three consecutive real runs left the user with two. The file updates in place; reload the tab you have.
By default the script prints the block that ends a detector run:
BS score 4/10 · Mostly fine
the macro data is real and mostly checks out; the narrative glue is crypto-Twitter.
Tally: 35 claims extracted, 34 individually source-checked — 22 confirmed, 5 plausible,
5 misleading, 2 false. 1 not checked.
run: 16m30s, searches 35, tools 65, coverage 1, per claim 29s
markdown file:///Users/…/bs-report-japans-money-is-collapsing-2026-07-31.md
page file:///Users/…/bs-report-japans-money-is-collapsing-2026-07-31.html
opened in your browser**Paste it; don't rebuild it.** Every figure came out of the report that `tally.py` had just recounted. A summary retyped from memory of what you wrote is wrong in the direction that flatters the run — the same failure mode as the tally and the search count, one level up.
The paths are `file://` URLs on purpose: terminals linkify a bare URL, so both files are one cmd-click from opening. Don't shorten them to `~/…` or hide them behind link text.
Before rendering, the script runs the report through the detector's `tally.py` and **refuses to render a report that fails it**:
REFUSED: bs-report-our-solar-system-2026-07-31.md does not pass tally.py.
✗ run line: 25 claims individually source-checked from 21 searches — every claim
carrying a verdict needs its own search, so this reports more verification than
was performedExit 3. This is the point of the gate: a page this presentable, built from a report that fails its own arithmetic, launders a broken report into something that looks authoritative. Fix what the gate names and re-run.
If `tally.py` isn't installed at all — this skill can be installed without the detector — the script warns and renders. A missing validator is a reason to warn, not a reason to stop someone viewing a report they already have.
`--og-image <absolute-url>` adds a link-preview image. Only useful once the page is hosted somewhere; skip it for local files.
For a hosted page the script also emits `<link rel="canonical">`, Open Graph and Twitter card tags, and `Article` structured data. It needs the page's public URL to do that:
guesses one from `--og-image` or anything else: a wrong canonical tells search engines the wrong address is the real one, which is worse than none.
`--author <name>` and `--author-type Person|Organization` set the Article author. The default is the tool itself, since this skill runs for everyone; pass your own name when you publish.
`datePublished` comes from the report's own `**Checked:**` line, never from the render time. A fact-check that stamps today's date on work done last month is the one thing this structured data must not say, so a date it cannot read produces no date at all.
Then tell the user the path and that it opens in any browser. On macOS `open <path>` does it.
Mostly fine / Hype-heavy / Mostly bullshit / Fabricated), with the one-line verdict beside it.
incidental table. This is the whole reason a non-technical reader gets through the report.
Read a real report → — 60 claims from a 2.7M-view "the AI bubble is popping" video, 44 of them individually searched, every verdict linked. Agent skills that fact-check the internet.
Fact-check and hype-audit content. Extracts the discrete claims from a video, article, tweet, or PDF, verifies each against…
Explain content or any concept inside it at the depth the user needs — ELI5, practitioner level, or expert deep-dive — with a…
Produce a structured summary of a video, article, tweet thread, or PDF — TLDR, key points with timestamps/locations, notable…
Count how many independent origins are behind news coverage of a claim, instead of counting URLs. Queries GDELT for matching…
Fetch and normalize any content source into clean text with metadata — YouTube video transcripts, TikTok captions, web articles,…
Turn a BS report (or any analysis result) into ready-to-paste posts for X/Twitter, LinkedIn, Facebook, Reddit, Hacker News, or a…