name: a16z-blog description: Browse and read posts on a16zcrypto.com. Use when the user asks to find, list, or read articles from a16z crypto's blog (https://a16zcrypto.com), filter posts by tag or author, or pull article text into the conversation. The site has no llms.txt, sitemap, or RSS, so this skill scrapes the embedded Algolia JSON on tag pages instead.
a16z crypto blog CLI
A small uv-based CLI that enumerates and reads posts from
https://a16zcrypto.com. Bundled as a16z.py next to this SKILL.md.
When to use this skill
- "What has a16z written about ${topic}?"
- "List posts tagged X on a16z crypto."
- "Read the article about Y from a16z and summarize it."
- "Pull the full text of <a16zcrypto.com URL>."
If the user wants any post on a16zcrypto.com, prefer this skill over a generic
curl/WebFetch — it returns clean, anchored body text without site chrome.
Why a CLI (and not just WebFetch)
The site is a static Astro app behind CloudFront with no llms.txt,
robots.txt, sitemap.xml, or RSS feed. Tag pages render their post lists
client-side via an Algolia search that is gated behind a WAF challenge
(/api/generate-key returns HTTP 202 with a challenge). However, every tag
page server-renders a single page of Algolia hits as escaped JSON in the HTML
source, with rich post metadata (title, date, permalink, description, authors,
tag_slugs). This CLI parses that JSON for listings and parses the static
post HTML for body text.
Invocation
The CLI is a16z.py in this skill's directory. It uses
uv inline script metadata,
so dependencies (httpx, click, beautifulsoup4) are auto-installed on first run
— no venv, no pip install. Requires uv on PATH.
Run it via:
uv run "$CLAUDE_SKILL_DIR/a16z.py" <command> [args...]
…or, if executable, just "$CLAUDE_SKILL_DIR/a16z.py" <command>. (When this
skill is installed by npx skills, $CLAUDE_SKILL_DIR resolves to the skill's
install path, e.g. ~/.claude/skills/a16z-blog/.)
Commands
list — list articles
a16z.py list # full archive (~770 posts; ~2s warm)
a16z.py list -n 20 # cap at N
a16z.py list -t ai-crypto # filter by tag slug (AND, repeatable)
a16z.py list -t stablecoins -t defi # multiple tags (AND-filter)
a16z.py list -a "Chris Dixon" # filter by author substring (repeatable)
a16z.py list --json # JSON for downstream piping
a16z.py list ai-agents-agentic-ai # SINGLE-tag mode: faster but capped at 20
Default output columns: date | slug | tags | title.
The bare list form (no tag arg) does a BFS crawl over every tag page on the
site and unions the results. This is necessary because no global enumeration
endpoint exists; a post truncated by Algolia's 20-hit cap on one tag is
recovered via its other tags.
read — fetch one article
a16z.py read ai-agents-defi-exploits # bare slug
a16z.py read /posts/article/ai-agents-defi-exploits/ # path
a16z.py read https://a16zcrypto.com/posts/article/... # full URL
a16z.py read <slug> -o article.md # write to file
a16z.py read <slug> --no-meta # skip title/source header
Bare slugs default to /posts/article/<slug>/ and fall back to
/posts/podcast/<slug>/ on a 404 (podcasts and articles share the slug
namespace).
Output is plain Markdown-ish text: title, source URL, optional
description, then headings/paragraphs/list items in document order. Site
chrome (<nav>, <header>, <footer>) is stripped; body extraction is
anchored at the article's <h1> so sidebar items don't leak in.
tags — list tags by post count
a16z.py tags # all tags across the blog with post counts
a16z.py tags ai-crypto # tags co-occurring with this one
Useful for discovering tag slugs to feed back into list -t.
Output discipline
list writes a one-line crawling all tags… notice and a final
found N posts across the site. to stderr. Stdout is always machine-parseable
(plain text table or JSON with --json). When piping into another tool, the
stderr lines won't pollute the data.
For the read command, prefer --no-meta if you're going to add your own
header to the output downstream.
Pitfalls and known limits
- 20-hit cap per tag page. Single-tag mode (
list TAG) returns at most 20 posts because that's all the static HTML embeds. Use the barelistform with-t TAGfor the full set. - No author enumeration. The CLI filters on author substrings in the
metadata it already has — there's no
authorscommand. Listing all authors requireslist --json | jq '.[].authors[]' | sort -u. - Algolia search is WAF-gated. Free-text search across the blog is not
available without a real browser. Use
tags+list -tfor discovery. - Layout.
SKILL.mdanda16z.pyboth live at the repo root; the whole repo is the skill.npx skills addcopies/symlinks both into~/.claude/skills/a16z-blog/.