curl that reads
the page for you.

Ink drawing of a man in a suit and leopard-print tie, pinching his fingers as if picking something out
$ jurl --find "a cathedral" en.wikipedia.org/wiki/Cologne
https://thumb.wikimedia.org/wikipedia/commons/thumb/2/27/Kdom.jpg/250px-Kdom.jpg
73 images looked at · 2.3 s · $0.002

Tell it what you want. It picks it out of the page.

Why jurl

It picks.
It doesn't write.

jurl doesn't use a chatbot. It uses decision models: Jev reads the text and Clef looks at the images. Neither writes a word. They only say how likely each paragraph, link or image is to be what you want, and jurl prints the winners exactly as they appear on the page. No summary that drifts, no URL that doesn't exist.

It's fast.

Most pages take under a second, end to end.

jurl <url> · 0.6–1 s

It's cheap.

About a thousand pages per dollar of API usage.

jurl <url> · $0.0004–0.0013
What you can do

Same command. Six things to ask for.

Pages built by JavaScript just work. jurl spots the empty app shell and renders it in Lightpanda, a fast headless browser it fetches the first time one shows up.

You want
the point of a long blog post
The page
Cloudflare's “Introducing Markdown for Agents”, with its navigation, author bios and related posts
jurl gives
the title, what kind of page it is, and the blocks that carry it · 0.6 s
jurl -n 3 blog.cloudflare.com/markdown-for-agents/
# Introducing Markdown for Agents

<https://blog.cloudflare.com/markdown-for-agents/> · article (1.00)

The way content and businesses are discovered online is changing rapidly. In the past, traffic originated from traditional search engines, and SEO determined who got found first. …

## Convert HTML to markdown, automatically

Cloudflare's network now supports real-time content conversion at the source, …

Here’s how it works. To fetch the markdown version of any page from a zone with Markdown for Agents enabled, the client needs to add the …
Recipes

Plain text out. Pipes in.

Everything prints plain text or plain URLs, so jurl fits in a pipe — or in an agent's toolbox.

Read the top 3 Hacker News stories, one key paragraph each

jurl -l -n 3 news.ycombinator.com | xargs -n1 jurl -n 1

Download the photo that matches

jurl -f "a bridge over a river" en.wikipedia.org/wiki/Cologne | xargs curl -sO

Every chart in a post

jurl -f "a chart or graph" -n 10 blog.cloudflare.com/markdown-for-agents/ | xargs -n1 curl -sO

Only the confident answers, for scripts

jurl --json -q "installation" github.com/BurntSushi/ripgrep | jq -r '.blocks[] | select(.p > 0.8) | .text'
Speed and cost

Under a second. A fraction of a cent.

CommandTypical timeTypical cost
jurl <url>0.6–1 s$0.0004–0.0013
jurl -i <url>0.5–0.7 s$0.00004
jurl --vision <url>1.3–1.9 s$0.0002
jurl --find "…" <url> (73 images)2.2–2.9 s$0.002
JavaScript apps+3–6 ssame

Measured on 2026-10-04. Run any command with -t to see your own numbers.

Install

Two lines. That's the whole setup.

brew install rayoplateado/tap/jurlmacOS, Linux
curl -LsSf https://github.com/rayoplateado/jurl/releases/latest/download/jurl-installer.sh | shno 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

jurl example.com jurl reads pages with Jev, TypeSafe's decision model. It needs your API key, once. Get one at https://console.typesafe.ai TypeSafe API key (hidden): Checking… ok. Saved to ~/.config/jurl/env

The first run asks for a TypeSafe API key, checks it and saves it. For --vision and --find, run jurl init and add a Cloudflare Workers AI token.

Your keys, your data

No server. No account.

jurl talks to the model APIs directly, with your keys.

Who you pay

TypeSafe for Jev ($0.042 per million input tokens) and Cloudflare for Clef-flash ($0.09 per million). Output is free on both.

What leaves your machine

The text of the page goes to TypeSafe. With --vision or --find, the images go to Cloudflare too. Keep that in mind for internal pages.

What jurl can't read

It sends no cookies, so pages behind a login are out of reach.

How it works

One yes-or-no question per candidate.

01 · FETCHSplit the page

jurl asks for markdown first. Otherwise its own extractor drops navigation, footers and scripts, and splits the rest into blocks, links and images. Empty JavaScript app? It renders it in Lightpanda.

02 · ASKTwo judges, at once

Jev reads text"is block 12 the point?"
p = 0.97
Clef looks at images"does this show a cathedral?"
p = 0.96

Every question goes to Jev in a single request, so asking 100 takes about as long as asking one. Clef looks at the pixels while Jev reads, not after.

03 · PRINTKeep the winners

What clears the threshold, in page order. A heading comes back only when something in its section does. Verbatim, always.

Models choose, they don't write. That's why the output is safe to pipe into xargs curl.