{"slug": "curl", "name": "curl", "category": "terminal", "category_name": "Terminal and shell", "description": "Command-line tool and library for transferring data with URLs over many protocols.", "recommenders": 7, "commenters": 13, "warners": 1, "score": 6.078, "rising": -2.29, "first": "2025-12-10", "latest": "2026-10-21", "why": "Liked for fetching web pages and APIs straight from the terminal, for small shell scripts and automation, and for being the default tool already present on servers.", "why_is_quote": false, "has_verdict": true, "sentiment": {"recommend": 7, "neutral": 9, "compare": 0, "warn": 1}, "spark": [0, 0, 0, 0, 1, 3, 0, 0, 3, 0, 0, 0], "listed": true, "loved": ["Terminal page fetching", "Shell scripting"], "caveat": "No CT checks", "short_quote": "The curl command is extremely popular so models seem to be really good at using it.", "icon": true, "domain": null, "github_repo": "github.com/curl/curl", "official_url": "https://curl.se", "pricing": "open source", "aliases": ["curl"], "verdict": [{"text": "Liked for fetching web pages and APIs straight from the terminal,", "cites": [{"id": 785226448, "item_id": 49076653, "url": "https://news.ycombinator.com/item?id=49076653", "by": "andros", "date": "2026-07-27", "stance": "recommend", "quote": "you can read it in terminal mode with: curl -H \"Accept: text/markdown\" [URL]", "excerpt": "If you want to eliminate any friction, I recommend enabling JavaScript. Otherwise, you can read it in terminal mode with: curl -H \"Accept: text/markdown\" [URL]", "context": "", "use_case": "reading page as markdown", "switched_from": "", "story": "Modern email can be built from borrowed parts"}, {"id": 766674160, "item_id": 47917135, "url": "https://news.ycombinator.com/item?id=47917135", "by": "1vuio0pswjnm7", "date": "2026-04-26", "stance": "recommend", "quote": "echo url=\"$x\"|curl -K/dev/stdin", "excerpt": "Alternative to archive.ph Text-only, no CAPTCHA, no Javascript, no DDoS on blog, no geo-blocking x=\"https://www.bloomberg.com/news/articles/2026-04-26/how-google-s-sergey-brin-helped-fuel-a-political-war-in-california\" echo url=\"$x\"|curl -K/dev/stdin \\ egrep -o \"(type\\\":\\\"paragraph)|(type\\\":\\\"text\\\",\\\"value\\\":\\\"[^\\\"]+)\" \\ |sed '/Read More:/{N;d;};s/type\\\":\\\"paragraph/<p>/;s/.\\{22\\}//' \\ |sed '1s/^/<meta charset=utf-8", "context": "", "use_case": "fetching Bloomberg article text", "switched_from": "", "story": "Sergey Brin Confronted Gavin Newsom"}, {"id": 764679905, "item_id": 47792494, "url": "https://news.ycombinator.com/item?id=47792494", "by": "pmontra", "date": "2026-04-16", "stance": "recommend", "quote": "I curl to the server from the terminal.", "excerpt": "A customer of mine uses Postman for its API docs. I never use it to run API calls. I curl to the server from the terminal. I keep a file with the most common sequences and I can add -d @request.json much more easily than from within Postman. Basically I use it only to edit the documentation.", "context": "", "use_case": "running API calls", "switched_from": "", "story": "The API Tooling Crisis: Why developers are abandoning Postman and its clones?"}, {"id": 761691457, "item_id": 47605716, "url": "https://news.ycombinator.com/item?id=47605716", "by": "artakulov", "date": "2026-04-01", "stance": "recommend", "quote": "jq piped with curl for API debugging.", "excerpt": "jq piped with curl for API debugging. Sounds obvious but I still see people open Postman for things that take 10 seconds in the terminal. `curl -s url | jq '.data[] | {id, status}'` and you're done. Also `entr` for file watching \u2014 `ls *.js | entr -r node build.js`. Replaced like three different watch tools for me.", "context": "", "use_case": "API debugging", "switched_from": "", "story": "Ask HN: What dev tools do you rely on that nobody talks about?"}]}, {"text": " for small shell scripts and automation,", "cites": [{"id": 783435184, "item_id": 48964699, "url": "https://news.ycombinator.com/item?id=48964699", "by": "mmh0000", "date": "2026-07-18", "stance": "recommend", "quote": "I love curl.", "excerpt": "I use this in all the various little bash scripts I have running via timers. I love curl. local email_body=$(cat <<- PANCAKE From: ${SMTP_FROM} To: ${SMTP_TO} Subject: BACKUP SCRIPT FAILED $0 backup script failed on ${HOSTNAME} Exit code: ${exit_code} Failed at line: ${line_number} $(journalctl -o cat --user _SYSTEMD_INVOCATION_ID=${invocation_id} || true) PANCAKE ) ## TODO: see above # Send email via authenticated S", "context": "", "use_case": "sending backup failure emails via SMTP", "switched_from": "", "story": "curl can be used to send emails with SMTP"}, {"id": 782071349, "item_id": 48879459, "url": "https://news.ycombinator.com/item?id=48879459", "by": "raffraffraff", "date": "2026-07-12", "stance": "neutral", "quote": "For small stuff I use bash / sed / awk / jq / yq / curl etc.", "excerpt": "For small stuff I use bash / sed / awk / jq / yq / curl etc. I stopped using perl (a long time ago) and hate trying to build or distribute anything in Python. \"You asked for a script! I give you... a venv, a pip install, woops need to compile something, so let's install build tools. Actually let's get github actions set up to handle this, or would you prefer a Docker image? Do you have a registry so I can share the i", "context": "", "use_case": "small scripts", "switched_from": "", "story": "Amber the programming language compiled to Bash/Ksh/Zsh"}]}, {"text": " and for being the default tool already present on servers.", "cites": [{"id": 760078004, "item_id": 47504875, "url": "https://news.ycombinator.com/item?id=47504875", "by": "ventana", "date": "2026-03-24", "stance": "recommend", "quote": "httpie for curl, just to always return to the default options", "excerpt": "One thing I learned over the years is that the closer my setup is to the default one, the better. I tried switching to the latest and greatest replacements, such as ack or ripgrep for grep, or httpie for curl, just to always return to the default options. Often, the return was caused by a frustration of not having the new tools installed on the random server I sshed to. It's probably just me being unable to persevere", "context": "", "use_case": "HTTP requests", "switched_from": "HTTPie", "story": "Ripgrep is faster than {grep, ag, Git grep, ucg, pt, sift}"}]}, {"text": " The one caveat raised is that it cannot enforce Certificate Transparency checks.", "cites": [{"id": 802790160, "item_id": 50174385, "url": "https://news.ycombinator.com/item?id=50174385", "by": "CGamesPlay", "date": "2026-10-21", "stance": "warn", "quote": "\"Is it possible to enable CT checks in curl?\" \"No.\"", "excerpt": "What a crazy coincidence! > This would have been possible since the certificates were created in April 2025. ... CT-enforcing clients like Firefox, Chrome, Edge and Safari could not have been attacked. Meanwhile, back in April 2025: \"Is it possible to enable CT checks in curl?\" \"No.\" https://github.com/curl/curl/discussions/17078", "context": "", "use_case": "", "switched_from": "", "story": "eMudhra intermediate CA compromise"}]}], "praise": [{"label": "Terminal page fetching", "summary": "Used to pull pages as text or Markdown without a browser, JavaScript or CAPTCHAs.", "quotes": [{"id": 766674160, "item_id": 47917135, "url": "https://news.ycombinator.com/item?id=47917135", "by": "1vuio0pswjnm7", "date": "2026-04-26", "stance": "recommend", "quote": "echo url=\"$x\"|curl -K/dev/stdin", "excerpt": "Alternative to archive.ph Text-only, no CAPTCHA, no Javascript, no DDoS on blog, no geo-blocking x=\"https://www.bloomberg.com/news/articles/2026-04-26/how-google-s-sergey-brin-helped-fuel-a-political-war-in-california\" echo url=\"$x\"|curl -K/dev/stdin \\ egrep -o \"(type\\\":\\\"paragraph)|(type\\\":\\\"text\\\",\\\"value\\\":\\\"[^\\\"]+)\" \\ |sed '/Read More:/{N;d;};s/type\\\":\\\"paragraph/<p>/;s/.\\{22\\}//' \\ |sed '1s/^/<meta charset=utf-8", "context": "", "use_case": "fetching Bloomberg article text", "switched_from": "", "story": "Sergey Brin Confronted Gavin Newsom"}, {"id": 790341056, "item_id": 49396316, "url": "https://news.ycombinator.com/item?id=49396316", "by": "1vuio0pswjnm7", "date": "2026-08-22", "stance": "neutral", "quote": "curl -A \"\" -Haccept:", "excerpt": "Alternative to archive.ph No risk of CAPTCHA or geo-blocking No cookies, no Javascript, text-only curl -A \"\" -Haccept: https://www.winonapost.com/news/wpd-wont-replace-stolen-flock-cameras-citing-public-trust/article_06a67859-2d97-414b-aa8f-d8751ad214bb.html \\ |egrep -o '(og:image.*https://.*..image.jpg)|(<p[ ]class=\\\"p1\\\".*div>)' \\ |sed '1s/^/<meta charset=utf-8>/; s|og:image\\\" content=\\\"|<a href=|; s|\\.jpg|&>Photo<", "context": "", "use_case": "fetching articles without JS", "switched_from": "", "story": "WPD won't replace stolen Flock cameras, citing public trust"}, {"id": 785226448, "item_id": 49076653, "url": "https://news.ycombinator.com/item?id=49076653", "by": "andros", "date": "2026-07-27", "stance": "recommend", "quote": "you can read it in terminal mode with: curl -H \"Accept: text/markdown\" [URL]", "excerpt": "If you want to eliminate any friction, I recommend enabling JavaScript. Otherwise, you can read it in terminal mode with: curl -H \"Accept: text/markdown\" [URL]", "context": "", "use_case": "reading page as markdown", "switched_from": "", "story": "Modern email can be built from borrowed parts"}]}, {"label": "Shell scripting", "summary": "A staple in small bash scripts and pipelines, including sending email via SMTP.", "quotes": [{"id": 783435184, "item_id": 48964699, "url": "https://news.ycombinator.com/item?id=48964699", "by": "mmh0000", "date": "2026-07-18", "stance": "recommend", "quote": "I love curl.", "excerpt": "I use this in all the various little bash scripts I have running via timers. I love curl. local email_body=$(cat <<- PANCAKE From: ${SMTP_FROM} To: ${SMTP_TO} Subject: BACKUP SCRIPT FAILED $0 backup script failed on ${HOSTNAME} Exit code: ${exit_code} Failed at line: ${line_number} $(journalctl -o cat --user _SYSTEMD_INVOCATION_ID=${invocation_id} || true) PANCAKE ) ## TODO: see above # Send email via authenticated S", "context": "", "use_case": "sending backup failure emails via SMTP", "switched_from": "", "story": "curl can be used to send emails with SMTP"}, {"id": 782071349, "item_id": 48879459, "url": "https://news.ycombinator.com/item?id=48879459", "by": "raffraffraff", "date": "2026-07-12", "stance": "neutral", "quote": "For small stuff I use bash / sed / awk / jq / yq / curl etc.", "excerpt": "For small stuff I use bash / sed / awk / jq / yq / curl etc. I stopped using perl (a long time ago) and hate trying to build or distribute anything in Python. \"You asked for a script! I give you... a venv, a pip install, woops need to compile something, so let's install build tools. Actually let's get github actions set up to handle this, or would you prefer a Docker image? Do you have a registry so I can share the i", "context": "", "use_case": "small scripts", "switched_from": "", "story": "Amber the programming language compiled to Bash/Ksh/Zsh"}]}, {"label": "API debugging", "summary": "Preferred over Postman for quick API calls, often piped into jq.", "quotes": [{"id": 761691457, "item_id": 47605716, "url": "https://news.ycombinator.com/item?id=47605716", "by": "artakulov", "date": "2026-04-01", "stance": "recommend", "quote": "jq piped with curl for API debugging.", "excerpt": "jq piped with curl for API debugging. Sounds obvious but I still see people open Postman for things that take 10 seconds in the terminal. `curl -s url | jq '.data[] | {id, status}'` and you're done. Also `entr` for file watching \u2014 `ls *.js | entr -r node build.js`. Replaced like three different watch tools for me.", "context": "", "use_case": "API debugging", "switched_from": "", "story": "Ask HN: What dev tools do you rely on that nobody talks about?"}, {"id": 764679905, "item_id": 47792494, "url": "https://news.ycombinator.com/item?id=47792494", "by": "pmontra", "date": "2026-04-16", "stance": "recommend", "quote": "I curl to the server from the terminal.", "excerpt": "A customer of mine uses Postman for its API docs. I never use it to run API calls. I curl to the server from the terminal. I keep a file with the most common sequences and I can add -d @request.json much more easily than from within Postman. Basically I use it only to edit the documentation.", "context": "", "use_case": "running API calls", "switched_from": "", "story": "The API Tooling Crisis: Why developers are abandoning Postman and its clones?"}]}, {"label": "Ubiquity", "summary": "Commenters return to it from alternatives like HTTPie because it is already on remote servers.", "quotes": [{"id": 760078004, "item_id": 47504875, "url": "https://news.ycombinator.com/item?id=47504875", "by": "ventana", "date": "2026-03-24", "stance": "recommend", "quote": "httpie for curl, just to always return to the default options", "excerpt": "One thing I learned over the years is that the closer my setup is to the default one, the better. I tried switching to the latest and greatest replacements, such as ack or ripgrep for grep, or httpie for curl, just to always return to the default options. Often, the return was caused by a frustration of not having the new tools installed on the random server I sshed to. It's probably just me being unable to persevere", "context": "", "use_case": "HTTP requests", "switched_from": "HTTPie", "story": "Ripgrep is faster than {grep, ag, Git grep, ucg, pt, sift}"}]}, {"label": "AI agent use", "summary": "Its popularity means models use it reliably in agent skill files.", "quotes": [{"id": 780633536, "item_id": 48789596, "url": "https://news.ycombinator.com/item?id=48789596", "by": "socketcluster", "date": "2026-07-04", "stance": "recommend", "quote": "The curl command is extremely popular so models seem to be really good at using it.", "excerpt": "When building agent integration for my serverless backend https://saasufy.com/, I decided to not use MCP but to put curl commands inside skill markdown files instead: https://github.com/Saasufy/skills The curl command is extremely popular so models seem to be really good at using it. Also I like that curl uses a bash syntax and my platform requires JSON payloads; it makes the separation clear to the agent. I find it ", "context": "built a serverless backend platform", "use_case": "agent integration via skill files", "switched_from": "", "story": "Better Models: Worse Tools"}]}], "caveats": [{"label": "No CT checks", "summary": "It has no option to enforce Certificate Transparency, unlike major browsers.", "quotes": [{"id": 802790160, "item_id": 50174385, "url": "https://news.ycombinator.com/item?id=50174385", "by": "CGamesPlay", "date": "2026-10-21", "stance": "warn", "quote": "\"Is it possible to enable CT checks in curl?\" \"No.\"", "excerpt": "What a crazy coincidence! > This would have been possible since the certificates were created in April 2025. ... CT-enforcing clients like Firefox, Chrome, Edge and Safari could not have been attacked. Meanwhile, back in April 2025: \"Is it possible to enable CT checks in curl?\" \"No.\" https://github.com/curl/curl/discussions/17078", "context": "", "use_case": "", "switched_from": "", "story": "eMudhra intermediate CA compromise"}]}], "who": [{"by": "socketcluster", "context": "built a serverless backend platform", "url": "https://news.ycombinator.com/item?id=48789596", "date": "2026-07-04"}, {"by": "simoncion", "context": "runs a home-built router", "url": "https://news.ycombinator.com/item?id=46469748", "date": "2026-01-02"}], "tags": ["for API debugging", "for shell scripts", "for archiving web pages", "for AI agent tooling"], "use_cases": ["http requests", "fetching articles without js", "http client", "fetching article text", "testing site responses", "reading page as markdown"], "compared": [{"slug": "firefox", "name": "Firefox", "co": 5, "switched_from": 0, "switched_to": 0}, {"slug": "httpie", "name": "HTTPie", "co": 2, "switched_from": 1, "switched_to": 0}, {"slug": "links", "name": "links", "co": 3, "switched_from": 0, "switched_to": 0}, {"slug": "postman", "name": "Postman", "co": 3, "switched_from": 0, "switched_to": 0}, {"slug": "wget", "name": "wget", "co": 3, "switched_from": 0, "switched_to": 0}, {"slug": "jq", "name": "jq", "co": 2, "switched_from": 0, "switched_to": 0}], "makers": [], "threads": [{"url": "https://news.ycombinator.com/item?id=50166579", "title": "eMudhra intermediate CA compromise", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49388682", "title": "WPD won't replace stolen Flock cameras, citing public trust", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49322107", "title": "Tell HN: Cloudflare silently injects its analytics when you switch nameservers", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49318835", "title": "The 'Country Hicks' Who Refused $26M from an AI Data Center", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49182041", "title": "TIME Is Serving AI Bots a Different Website, with Ads Built In", "mentions": 1}, {"url": "https://news.ycombinator.com/item?id=49066639", "title": "Modern email can be built from borrowed parts", "mentions": 1}], "sentiment_by_month": {"2025-11": {}, "2025-12": {"neutral": 1}, "2026-01": {"neutral": 1}, "2026-02": {}, "2026-03": {"recommend": 1}, "2026-04": {"recommend": 3, "neutral": 1}, "2026-05": {"neutral": 1}, "2026-06": {"neutral": 1}, "2026-07": {"recommend": 3, "neutral": 2}, "2026-08": {"neutral": 2}, "2026-09": {}, "2026-10": {"warn": 1}}, "quotes": [{"id": 802790160, "item_id": 50174385, "url": "https://news.ycombinator.com/item?id=50174385", "by": "CGamesPlay", "date": "2026-10-21", "stance": "warn", "quote": "\"Is it possible to enable CT checks in curl?\" \"No.\"", "excerpt": "What a crazy coincidence! > This would have been possible since the certificates were created in April 2025. ... CT-enforcing clients like Firefox, Chrome, Edge and Safari could not have been attacked. Meanwhile, back in April 2025: \"Is it possible to enable CT checks in curl?\" \"No.\" https://github.com/curl/curl/discussions/17078", "context": "", "use_case": "", "switched_from": "", "story": "eMudhra intermediate CA compromise"}, {"id": 790341056, "item_id": 49396316, "url": "https://news.ycombinator.com/item?id=49396316", "by": "1vuio0pswjnm7", "date": "2026-08-22", "stance": "neutral", "quote": "curl -A \"\" -Haccept:", "excerpt": "Alternative to archive.ph No risk of CAPTCHA or geo-blocking No cookies, no Javascript, text-only curl -A \"\" -Haccept: https://www.winonapost.com/news/wpd-wont-replace-stolen-flock-cameras-citing-public-trust/article_06a67859-2d97-414b-aa8f-d8751ad214bb.html \\ |egrep -o '(og:image.*https://.*..image.jpg)|(<p[ ]class=\\\"p1\\\".*div>)' \\ |sed '1s/^/<meta charset=utf-8>/; s|og:image\\\" content=\\\"|<a href=|; s|\\.jpg|&>Photo<", "context": "", "use_case": "fetching articles without JS", "switched_from": "", "story": "WPD won't replace stolen Flock cameras, citing public trust"}, {"id": 789572048, "item_id": 49348253, "url": "https://news.ycombinator.com/item?id=49348253", "by": "1vuio0pswjnm7", "date": "2026-08-18", "stance": "compare", "quote": "curl is more limited than the programs I use to generate HTTP, it's slower", "excerpt": "The forward proxy also allows me to mix and match TCP clients with various SSL libraries The so-called \"modern\" browser is generally tied to some specific SSL library It's possible to compile curl with several different SSL libraries, but I prefer TCP clients over HTTP clients; curl is more limited than the programs I use to generate HTTP, it's slower", "context": "", "use_case": "HTTP client", "switched_from": "", "story": "Tell HN: Cloudflare silently injects its analytics when you switch nameservers"}, {"id": 789182032, "item_id": 49323877, "url": "https://news.ycombinator.com/item?id=49323877", "by": "1vuio0pswjnm7", "date": "2026-08-16", "stance": "neutral", "quote": "", "excerpt": "Alternative to (a) archive.is or (b) \"gift link\" (a) No risk of CAPTCHA or geoblocking, no <center>, etc. (b) No unique ID tracking, no connection to WSJ account No required headers except Host:, no cookies No Javascript, text-only HTTPS optional curl -A \"\" -Haccept: https://assets.msn.com/content/view/v2/Detail/en-in/AA2acUvZ \\ |grep -o \"<p.*</p>\" \\ |tr -d '\\134' \\ |sed '1s/^/<meta charset=utf-8>/' firefox ./1.htm #", "context": "", "use_case": "fetching article text", "switched_from": "", "story": "The 'Country Hicks' Who Refused $26M from an AI Data Center"}, {"id": 786921888, "item_id": 49182618, "url": "https://news.ycombinator.com/item?id=49182618", "by": "Apreche", "date": "2026-08-05", "stance": "neutral", "quote": "I used curl and set the User-agent, and I indeed got a markdown reply", "excerpt": "This would be an interesting story, but I can\u2019t replicate it. I used curl and set the User-agent, and I indeed got a markdown reply, but no ads.", "context": "", "use_case": "testing site responses", "switched_from": "", "story": "TIME Is Serving AI Bots a Different Website, with Ads Built In"}, {"id": 785226448, "item_id": 49076653, "url": "https://news.ycombinator.com/item?id=49076653", "by": "andros", "date": "2026-07-27", "stance": "recommend", "quote": "you can read it in terminal mode with: curl -H \"Accept: text/markdown\" [URL]", "excerpt": "If you want to eliminate any friction, I recommend enabling JavaScript. Otherwise, you can read it in terminal mode with: curl -H \"Accept: text/markdown\" [URL]", "context": "", "use_case": "reading page as markdown", "switched_from": "", "story": "Modern email can be built from borrowed parts"}, {"id": 783435184, "item_id": 48964699, "url": "https://news.ycombinator.com/item?id=48964699", "by": "mmh0000", "date": "2026-07-18", "stance": "recommend", "quote": "I love curl.", "excerpt": "I use this in all the various little bash scripts I have running via timers. I love curl. local email_body=$(cat <<- PANCAKE From: ${SMTP_FROM} To: ${SMTP_TO} Subject: BACKUP SCRIPT FAILED $0 backup script failed on ${HOSTNAME} Exit code: ${exit_code} Failed at line: ${line_number} $(journalctl -o cat --user _SYSTEMD_INVOCATION_ID=${invocation_id} || true) PANCAKE ) ## TODO: see above # Send email via authenticated S", "context": "", "use_case": "sending backup failure emails via SMTP", "switched_from": "", "story": "curl can be used to send emails with SMTP"}, {"id": 782071349, "item_id": 48879459, "url": "https://news.ycombinator.com/item?id=48879459", "by": "raffraffraff", "date": "2026-07-12", "stance": "neutral", "quote": "For small stuff I use bash / sed / awk / jq / yq / curl etc.", "excerpt": "For small stuff I use bash / sed / awk / jq / yq / curl etc. I stopped using perl (a long time ago) and hate trying to build or distribute anything in Python. \"You asked for a script! I give you... a venv, a pip install, woops need to compile something, so let's install build tools. Actually let's get github actions set up to handle this, or would you prefer a Docker image? Do you have a registry so I can share the i", "context": "", "use_case": "small scripts", "switched_from": "", "story": "Amber the programming language compiled to Bash/Ksh/Zsh"}, {"id": 781845393, "item_id": 48865337, "url": "https://news.ycombinator.com/item?id=48865337", "by": "sixtyj", "date": "2026-07-10", "stance": "neutral", "quote": "I use wget or curl for few pages", "excerpt": "The issue with scrapping is the intensity and volume of bots. I think that nobody would care if I use wget or curl for few pages, e.g. because I would like to read a site as offline or archive it. Btw average age of any page is 10 years. Deletion or structural change after acquisition is common, Signal vs Noise site recent wipe out could serve as an example why we need to archive sites.", "context": "", "use_case": "fetching a few pages", "switched_from": "", "story": "An Update on the scraper situation"}, {"id": 780633536, "item_id": 48789596, "url": "https://news.ycombinator.com/item?id=48789596", "by": "socketcluster", "date": "2026-07-04", "stance": "recommend", "quote": "The curl command is extremely popular so models seem to be really good at using it.", "excerpt": "When building agent integration for my serverless backend https://saasufy.com/, I decided to not use MCP but to put curl commands inside skill markdown files instead: https://github.com/Saasufy/skills The curl command is extremely popular so models seem to be really good at using it. Also I like that curl uses a bash syntax and my platform requires JSON payloads; it makes the separation clear to the agent. I find it ", "context": "built a serverless backend platform", "use_case": "agent integration via skill files", "switched_from": "", "story": "Better Models: Worse Tools"}, {"id": 777123040, "item_id": 48570190, "url": "https://news.ycombinator.com/item?id=48570190", "by": "1vuio0pswjnm7", "date": "2026-06-17", "stance": "compare", "quote": "This is more flexible than curl. There are some things curl cannot do, even though it has too many options", "excerpt": "\"This is not a real HTTP client.\" It's a TCP client curl is an HTTP client I prefer TCP clients to HTTP clients. Simpler, easier to modify, faster to compile There are many to choose from. For example, I use a modified version of tcploop For generating HTTP, I use own utilties. This is more flexible than curl. There are some things curl cannot do, even though it has too many options", "context": "", "use_case": "HTTP requests", "switched_from": "", "story": "TIL: You can make HTTP requests without curl using Bash /dev/TCP"}, {"id": 773848833, "item_id": 48365552, "url": "https://news.ycombinator.com/item?id=48365552", "by": "1vuio0pswjnm7", "date": "2026-06-01", "stance": "neutral", "quote": "curl https://www.lrb.co.uk/the-paper/v48/n09/john-lanchester/squillions", "excerpt": "Alternative to archive.ph Disable Javascript and CSS For example curl https://www.lrb.co.uk/the-paper/v48/n09/john-lanchester/squillions \\ |sed '1s/^/<meta http-equiv=content-security-policy content=\\\"default-src none\\\">/' > 1.htm firefox ./1.htm There are also Firefox add-ons that can do this as well Or use a text-only browser links https://www.lrb.co.uk/the-paper/v48/n09/john-lanchester/squillions links -dump https", "context": "", "use_case": "fetching page for no-JS reading", "switched_from": "", "story": "Squillions \u2013 two books about money-laundering"}, {"id": 768415296, "item_id": 48025956, "url": "https://news.ycombinator.com/item?id=48025956", "by": "1vuio0pswjnm7", "date": "2026-05-05", "stance": "neutral", "quote": "|curl -K/dev/stdin", "excerpt": "Alternative to archive.ph No Javascript, no CAPTCHA, no DDoS^1, no geo-blocking, other nonsense^2 echo ' url https://www.economist.com/by-invitation/2026/04/29/stop-big-tech-from-making-users-behave-in-ways-they-dont-want-to user-agent \"Mozilla/5.0 (Linux; Android 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.6533.103 Mobile Safari/537.36 Liskov\" header accept: output 1.htm '|curl -K/dev/stdin firefox ./1.h", "context": "", "use_case": "fetching paywalled article without JS", "switched_from": "", "story": "Stop big tech from making users behave in ways they don't want to"}, {"id": 767284640, "item_id": 47955290, "url": "https://news.ycombinator.com/item?id=47955290", "by": "1vuio0pswjnm7", "date": "2026-04-29", "stance": "neutral", "quote": "|curl -H@/dev/stdin $url > 1.htm", "excerpt": "Alternative to archive.is Text-only, no Javascript, no CAPTCHA, no DDoS on blog, no geo-blocking: url=https://www.washingtonpost.com/technology/2026/04/23/musk-altman-lawsuit-trial-openai/ echo \" sec-gpc: 1 x-forwarded-for: 66.249.66.1 user-agent: Chrome/115.0.5790.171 Mobile Safari/537.36 (compatible ; Googlebot/2.1 ; +http://www.google.com/bot.html) connection: close \"|curl -H@/dev/stdin $url > 1.htm firefox ./1.ht", "context": "", "use_case": "fetching articles as Googlebot", "switched_from": "", "story": "The unflattering secrets revealed so far in Elon Musk's latest legal feud"}, {"id": 766674160, "item_id": 47917135, "url": "https://news.ycombinator.com/item?id=47917135", "by": "1vuio0pswjnm7", "date": "2026-04-26", "stance": "recommend", "quote": "echo url=\"$x\"|curl -K/dev/stdin", "excerpt": "Alternative to archive.ph Text-only, no CAPTCHA, no Javascript, no DDoS on blog, no geo-blocking x=\"https://www.bloomberg.com/news/articles/2026-04-26/how-google-s-sergey-brin-helped-fuel-a-political-war-in-california\" echo url=\"$x\"|curl -K/dev/stdin \\ egrep -o \"(type\\\":\\\"paragraph)|(type\\\":\\\"text\\\",\\\"value\\\":\\\"[^\\\"]+)\" \\ |sed '/Read More:/{N;d;};s/type\\\":\\\"paragraph/<p>/;s/.\\{22\\}//' \\ |sed '1s/^/<meta charset=utf-8", "context": "", "use_case": "fetching Bloomberg article text", "switched_from": "", "story": "Sergey Brin Confronted Gavin Newsom"}, {"id": 764679905, "item_id": 47792494, "url": "https://news.ycombinator.com/item?id=47792494", "by": "pmontra", "date": "2026-04-16", "stance": "recommend", "quote": "I curl to the server from the terminal.", "excerpt": "A customer of mine uses Postman for its API docs. I never use it to run API calls. I curl to the server from the terminal. I keep a file with the most common sequences and I can add -d @request.json much more easily than from within Postman. Basically I use it only to edit the documentation.", "context": "", "use_case": "running API calls", "switched_from": "", "story": "The API Tooling Crisis: Why developers are abandoning Postman and its clones?"}, {"id": 763248322, "item_id": 47703020, "url": "https://news.ycombinator.com/item?id=47703020", "by": "dhruv3006", "date": "2026-04-09", "stance": "neutral", "quote": "I still use curl sometimes", "excerpt": "Yeah, I know what you mean. I still use curl sometimes,but for anything beyond a basic GET, the monolithic nature of tools like Postman feels way too heavy. I recommend checking out Voiden, - all Markdown files and uses composable blocks, this makes it easy for quick, version-controlled tests. Good for the \"quick checks\" but also for more advanced workflows (collection runner, scripting etc).", "context": "", "use_case": "basic GET requests", "switched_from": "", "story": "Ask HN: What you use for quick API checks?"}, {"id": 761691457, "item_id": 47605716, "url": "https://news.ycombinator.com/item?id=47605716", "by": "artakulov", "date": "2026-04-01", "stance": "recommend", "quote": "jq piped with curl for API debugging.", "excerpt": "jq piped with curl for API debugging. Sounds obvious but I still see people open Postman for things that take 10 seconds in the terminal. `curl -s url | jq '.data[] | {id, status}'` and you're done. Also `entr` for file watching \u2014 `ls *.js | entr -r node build.js`. Replaced like three different watch tools for me.", "context": "", "use_case": "API debugging", "switched_from": "", "story": "Ask HN: What dev tools do you rely on that nobody talks about?"}, {"id": 760078004, "item_id": 47504875, "url": "https://news.ycombinator.com/item?id=47504875", "by": "ventana", "date": "2026-03-24", "stance": "recommend", "quote": "httpie for curl, just to always return to the default options", "excerpt": "One thing I learned over the years is that the closer my setup is to the default one, the better. I tried switching to the latest and greatest replacements, such as ack or ripgrep for grep, or httpie for curl, just to always return to the default options. Often, the return was caused by a frustration of not having the new tools installed on the random server I sshed to. It's probably just me being unable to persevere", "context": "", "use_case": "HTTP requests", "switched_from": "HTTPie", "story": "Ripgrep is faster than {grep, ag, Git grep, ucg, pt, sift}"}, {"id": 743515968, "item_id": 46469748, "url": "https://news.ycombinator.com/item?id=46469748", "by": "simoncion", "date": "2026-01-02", "stance": "neutral", "quote": "For example, curl prefers IPv6 addresses, and falls back to IPv4 if the v6 connection fails.", "excerpt": "> Problem with ULA is that it's functionally useless on a dual-stack network. Nope, it works just fine. I use it for stable local addressing and LAN host AAAA records and let my ISP-delegated global prefix drift as my ISP wishes it to. And -as it happens- the prose in that article about source address selection is incorrect. On Linux, source address preference appears to be application-specific. For example, curl pre", "context": "runs a home-built router", "use_case": "testing source address selection", "switched_from": "", "story": "IPv6 just turned 30 and still hasn't taken over the world"}, {"id": 739587840, "item_id": 46224240, "url": "https://news.ycombinator.com/item?id=46224240", "by": "1vuio0pswjnm7", "date": "2025-12-10", "stance": "neutral", "quote": "curl -K/dev/stdin -Agooglebot > 1.htm", "excerpt": "Alternative to archive.md, archive.ph Text-only: https://assets.msn.com/content/view/v2/Detail/en-in/AA1S3fVC/ https://assets.msn.com/content/view/v2/Detail/en-in/AA1S2nVb/ echo url=https://www.nytimes.com/2025/12/09/world/asia/australia-social-media-ban-under-16.html \\ |curl -K/dev/stdin -Agooglebot > 1.htm firefox ./1.htm links -dump 1.htm|sed -n '/Effect/,/region./p' More https://assets.msn.com/content/view/v2/Det", "context": "", "use_case": "fetching paywalled articles", "switched_from": "", "story": "Australia begins enforcing world-first teen social media ban"}]}