# jurl CLI: curl that reads the page for you

Ask a page a question. jurl prints only the part that answers it, word for word, with a link to where it says it. When the answer is pages away, it goes looking.

```
$ jurl --precise --follow 15 -q "What is the boiling point of mercury?" en.wikipedia.org/wiki/Tennis
629.88 K (356.73 °C, 674.11 °F)
```

A recorded run: 13 pages read, 8 dropped, 3.8 s. The path it took: Tennis → Kevlar → Chemical formula → Periodic table → Mercury (element).

- Install: `brew install rayoplateado/tap/jurl`
- New in 0.2.0: `jurl login` reads with jurl cloud, no API keys: https://jurl.dev/cli/#cloud
- Code: https://github.com/rayoplateado/jurl (MIT or Apache-2.0)
- All flags: https://github.com/rayoplateado/jurl#reference
- Changelog: https://github.com/rayoplateado/jurl/blob/main/CHANGELOG.md
- Blog: https://jurl.dev/blog/ (every post also in markdown: add `.md`)

## Why

- **Picks, never writes.** Every line it prints is on the page as you see it. No summary, no invented URL.
- **Says when it isn't there.** No answer, exit code 1. A script gets an empty cell, not a wrong one.
- **Under a second a page.** Most pages, end to end. About $4 per 10,000 pages with your own keys.

## One command, a flag for each job

### The exact answer: `--precise`

One value, for a spreadsheet cell or a script. The link highlights the sentence.

```
$ jurl --precise -q "what is the primary rate limit for authenticated users?" docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api
5,000 requests per hour

All of these requests count towards your personal rate limit of 5,000 requests per hour. …

<https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api#:~:text=rate%20limit%20of-,5%2C000%20requests%20per%20hour>
```

### Find it on the site: `--follow`

Give it the bare domain. It finds the page. Same site only, `robots.txt` respected, 5 pages unless you say more (`--follow 15`).

```
$ jurl --follow --precise -q "What is the monthly price of the cheapest paid plan?" linear.app
$10 per user/month
```

2.4 s. Link: https://linear.app/pricing#:~:text=%2410%20per%20user%2Fmonth,-Billed%20yearly%20All

### A photo, by what it shows: `--find`

Looks at the pixels, captions or not. Wikipedia's Cologne article has 70 images:

```
$ jurl --find "a cathedral" -n 3 en.wikipedia.org/wiki/Cologne
https://thumb.wikimedia.org/wikipedia/commons/thumb/2/27/Kdom.jpg/250px-Kdom.jpg?…
https://thumb.wikimedia.org/wikipedia/commons/thumb/0/0a/K%C3%B6ln_um_1890.jpg/500px-K%C3%B6ln_um_1890.jpg?…
https://thumb.wikimedia.org/wikipedia/commons/thumb/5/5f/Kranh%C3%A4user_Cologne%2C_April_2018_-01.jpg/1280px-Kranh%C3%A4user_Cologne%2C_April_2018_-01.jpg?…
```

2.9 s. The third match has no alt text and no caption: only its pixels say there's a cathedral in it. When nothing on the page matches, jurl says so and exits with code 1.

### Links worth following: `--links`

```
$ jurl --links -q "essays about startups" -n 4 paulgraham.com/articles.html
https://paulgraham.com/start.html
https://paulgraham.com/startupmistakes.html
https://paulgraham.com/startupideas.html
https://paulgraham.com/13sentences.html
```

0.8 s. Safe to pipe into `xargs curl`.

Also: `--code` for just the code, `-q "…"` for one answer, `--pages` to read a list to its end, and plain `jurl <url>` for the gist. Pages built with JavaScript just work.

## Never rewrites the page

Ten documentation pages, one question each, read by jurl and by the tools agents use today.

| | jurl | Claude Code WebFetch | Exa | Tavily |
|---|---|---|---|---|
| Exact answer | **10/10** | **10/10** | 8/10 | 5/10 |
| Code lines not on the page | **0 of 60** | 33 of 63 | **0 of 59** | 8 of 36 |
| Cost per 10,000 pages | **$4** | ~$150 | $10 | $16 |
| Finds an image by what it shows | **yes** | no | no | no |

Measured on 2026-10-07. The tasks, the scripts and every answer: https://github.com/rayoplateado/jurl/tree/main/bench

## New in 0.2.0: an answer today, a sheet that stays true

Sign in once and jurl reads with jurl cloud: no API keys, same flags, same output. At a terminal, an answer ends with a link that turns it into a sheet in jurl cloud, which reads it again on a schedule.

```
$ jurl login
To sign in to jurl cloud, open https://cloud.jurl.dev/device and enter this code:

    KQ7M-PX4T

…
Signed in as you@acme.com to Acme. Console: https://cloud.jurl.dev
$ jurl --follow --precise -q "What is the monthly price of the cheapest paid plan?" linear.app
$10 per user/month
…
jurl: keep it up to date in a sheet: https://cloud.jurl.dev/w/…
```

`jurl status` shows the account and the page reads used; `jurl logout` signs out. jurl cloud doesn't take `--image`, `--vision` or `--find`: those read with your own keys.

## Install

```
brew install rayoplateado/tap/jurl                                                     # macOS, Linux
curl -LsSf https://github.com/rayoplateado/jurl/releases/latest/download/jurl-installer.sh | sh   # no Homebrew
```

Windows: `powershell -ExecutionPolicy Bypass -c "irm https://github.com/rayoplateado/jurl/releases/latest/download/jurl-installer.ps1 | iex"` · From source: `cargo install --git https://github.com/rayoplateado/jurl`

Then pick how it reads:

- **jurl cloud**: `jurl login`. A free account with a monthly allowance of page reads. Nothing to set up.
- **Your own keys**: `jurl init`, or just the first run. A TypeSafe key (https://console.typesafe.ai), checked and saved. You pay per page. For `--vision` and `--find`, add a Cloudflare Workers AI token.

For your agent: `claude mcp add jurl -- jurl mcp` gives Claude Code, Claude Desktop or Cursor jurl as a tool.

- **What leaves your machine:** with your keys, the page's text goes to TypeSafe, and with `--vision` or `--find` its photos go to Cloudflare. With jurl cloud, jurl's servers read the page.
- **What it can't read:** pages behind a login. jurl never sends your cookies.

---

Made in Murcia by Ray García (@rayoplateado on X). MIT or Apache-2.0. Lightpanda, which jurl downloads for JavaScript pages, is a separate program under AGPL-3.0.
