web-fetch
Web Fetch Skill
Fetch web content using the best available method, in priority order:
1. WebFetch Tool (Primary — always try this first)
Use the built-in WebFetch tool for all web page fetching. It renders pages in a real Electron BrowserWindow with full JavaScript execution, handles SPAs, dynamic content, anti-bot protections, and returns clean markdown. This is NOT a simple HTTP request.
WebFetch(url="https://example.com/article", prompt="Extract the main content")
- Handles JavaScript-rendered pages (React, Vue, etc.)
- Shares session cookies (can access logged-in content)
- Auto-extracts article content via Readability
- Returns clean markdown, ready to use
Always start with WebFetch. Only move to the next option if WebFetch fails or is insufficient.
2. Browser Skill (Fallback for interactive pages)
If WebFetch fails (e.g., page requires login interaction, CAPTCHA, or multi-step navigation), use the alma browser skill:
# Open URL in a real Chrome browser tab
alma browser open "https://example.com"
# Read the page content as markdown
alma browser read <tabId>
# For pages that need interaction first
alma browser click <tabId> "button.load-more"
alma browser read <tabId>
Use the browser skill when you need:
- To interact with the page (click, scroll, fill forms) before reading
- Access to the user's authenticated Chrome sessions
- To handle CAPTCHAs or complex anti-bot pages
3. curl (Last resort)
Only use curl when both WebFetch and browser skill are unavailable or for simple API/JSON endpoints:
# JSON API (curl is fine for APIs)
curl -s "https://api.example.com/data" | jq '.'
# API with auth headers
curl -s -H "Authorization: Bearer TOKEN" -H "Accept: application/json" "URL"
# Download a file
curl -sL -o /tmp/file.pdf "URL"
# Check HTTP status
curl -sL -o /dev/null -w "%{http_code}" "URL"
Do NOT use curl for regular web pages — it cannot execute JavaScript and gets blocked by most modern sites. Use WebFetch instead.
Tips
- WebFetch first, always. It handles 90%+ of web fetching needs.
- For JSON APIs, curl is acceptable since no JS rendering is needed.
- Pipe curl output to
head -Nto limit output size. - Use
jqfor JSON responses.
More from ninehills/skills
file-manager
Find, organize, and manage files on the user's computer. Search by name, type, size, or date. Move, rename, compress, and clean up files.
125self-reflection
Daily self-reflection and personal growth. Triggered by heartbeat at end of day. Review the day's experiences, extract lessons, update personality, and write a diary entry.
124send-file
Send files, photos, audio, or videos to the current chat. MUST use whenever you need to deliver any file to the user. Covers: sending images, selfies, generated art, documents, music, videos, voice messages, screenshots, or ANY file the user asks to see. Triggers: 'send it to me', 'send it over', 'let me see', 'send me', 'show me', 'send photo', 'send file', sharing any file path. NEVER paste raw file paths in text — ALWAYS use this skill to send files.
117news-aggregator-skill
Comprehensive news aggregator that fetches, filters, and deeply analyzes real-time content from 8 major sources: Hacker News, GitHub Trending, Product Hunt, 36Kr, Tencent News, WallStreetCN, V2EX, and Weibo. Best for 'daily scans', 'tech news briefings', 'finance updates', and 'deep interpretations' of hot topics.
99tvscreener
Query TradingView screener data for HK, A-share, A-share ETF, and US symbols with deepentropy/tvscreener. Use for stock lookup, technical indicators (price/change/RSI/MACD/volume), symbol filtering, and custom field/filter-based market queries.
65screenshot
Take screenshots of the screen using macOS screencapture. Use when users ask to see the screen, debug UI, or capture what's displayed. Resize before returning to avoid blowing up model context.
38