Web fetch
Drop an http:// or https:// URL into a prompt and Loach downloads the page, strips the markup to readable text and appends it to your message as a fenced block. The model sees the contents of the page alongside your question, no separate browser extension needed.
Off by default
Loach is offline-first. Web fetch is the only switch in Settings → Tools that reaches out to the network on your behalf, so it ships off. Turn it on there when you want it - or type /web-fetch on (and /web-fetch off) in the composer - or leave it off if you would rather everything stay strictly local. The onboarding wizard’s Tools step offers it too, but never switches it on for you. Private Chat never fetches URLs, whatever the setting says.
How it works
When you send a message, Loach scans the text you typed for URLs. Only those are fetched: the model can’t ask Loach to fetch a page on its own. Punctuation right after a link, such as a full stop or the bracket closing an aside, is left off the URL, but a bracket that is part of it stays - (see https://en.wikipedia.org/wiki/Rust_(programming_language)) fetches the right article. For each URL it finds, Loach:
- Downloads the page, deduping repeated links and fetching several URLs in parallel.
- Decodes the page in the character set it declares - in its
Content-Typeheader, or else a<meta charset>near the top of the page - and as UTF-8 when it declares none. - Sanitises the HTML into readable plain text, keeping the page title and dropping scripts, styles and markup. Plain-text responses are used as they are. No JavaScript runs, so a page that builds its content in the browser can come back nearly empty.
- Inlines the extracted text into your message as a fenced block headed with the final URL and the page title, so the model knows where the content came from.
The page text is saved with your message - hidden from the bubble - so the model still has it on later turns of the chat. If a single page is huge, only the leading portion of its text is sent and the model is told it was cut. If a fetch fails, a short Failed to fetch <url>: … stub takes its place so the model knows you meant to share it; the rest of the message still goes out.
To check what Loach would extract from a page without sending anything to the model, type /fetch <url>: it shows the page title, its size and the first 200 characters of text. It works whether or not the switch is on, since you asked for that one page yourself.
Limits
- Up to 5 URLs per message - duplicates are collapsed, anything beyond the cap is skipped.
- 30 s per URL in total, DNS lookups and redirects included, with a 10 s connect timeout.
- 5 MB download cap per URL - a larger page is cut at the cap and marked truncated.
- ~12,000 characters of extracted text per URL - the leading portion of long pages.
- Shared message budget - fetched pages and attachments share the 500,000-character limit on what one message can inline. A page that only partly fits is clipped, never in the middle of an emoji, with a note to the model; a page with no room left is fetched but only listed by URL.
Links you add to the Library are fetched the same way, with the same time, size, redirect and safety rules, but keep much more of the page’s text.
Safety guards
- Schemes - only
httpandhttps. - Private-IP guard -
localhostand any URL whose resolved address (IPv4 or IPv6) is on loopback, a private network range, link-local, carrier-grade NAT (100.64.0.0/10, which Tailscale uses), IPv6 unique-local (fc00::/7) or site-local, a 6to4 or Teredo tunnel address, an IPv6 address that wraps a private IPv4 one (as IPv4-mapped and NAT64 addresses can), or another reserved block is refused - even when a public-looking hostname resolves there through DNS. A malicious URL therefore cannot pivot into your local network (this defends against SSRF - a class of attack where a crafted URL tricks an app into reaching into networks the attacker can’t). The addresses that pass the check are the ones Loach connects to, so DNS can’t switch them in between. - No proxy - fetches connect straight to the screened address and never go through a proxy, whether one is set in
HTTP_PROXY/HTTPS_PROXYor in your system settings. A proxy would look the hostname up again itself, out of reach of the check above. - Redirects - walked manually, up to 10, and re-screened at every hop with the same rules.
- Failures stay per URL - a dead link does not block your message; you get a short stub for that one URL, and the reason shows on the reply.
- Rate-limited - at most 60 URLs per 60 seconds, shared across all chats, so a prompt full of links can’t hammer the network.
Shown on the reply
Each URL Loach fetched for a turn appears as a web_fetch entry in the collapsible tool-call block above the assistant’s answer, so you can see exactly which pages fed into it. Expand an entry to see the page title and size, the final URL after redirects, whether Loach truncated it - or, for a failed fetch, the reason, marked in red.