LibreChat is a self hosted chat front end that talks to a long list of model providers. It has proper proxy support, which is rarer than it should be. It also has two of them, built on two different libraries, and knowing which is which saves an afternoon. We read release v0.8.7 on 20 September 2026.
A note on versions first. Every release in the list carries the prerelease flag, including the ones without a release candidate suffix, so that flag cannot tell you what is stable. We read the newest version without a candidate suffix, and one file quoted below exists only on the default branch.
One variable, two resolvers
| Lane | Resolver | Variables it reads |
|---|---|---|
| model calls, assistants, image tools | the project's own utility | PROXY first, then http_proxy and https_proxy, plus no_proxy |
| web search scraping | the standard resolver library | http_proxy or https_proxy by protocol, or all_proxy, plus no_proxy |
The first row is the interesting one. Their utility checks a variable named PROXY, and if it is set, it fills both schemes and returns immediately. The standard variables are never consulted on that path.
The second row never sees that variable at all. Its library resolves with one line:
var proxy = getEnv(proto + '_proxy') || getEnv('all_proxy');
A protocol prefixed name, or all_proxy. There is no bare PROXY in it.
If you set only the project's own variable, your model traffic is routed and your web searches are not. Setting the standard pair covers both, because the project's utility falls back to them.
It does not rely on the runtime
Worth pausing on, because it is the opposite of a problem we measured elsewhere.
Node only reads proxy variables in recent versions, and only behind a flag. On the runtime we tested for another project, neither the variables nor the flag routed anything, because the flag arrived in a later release than the one installed.
LibreChat does not depend on any of that. It imports undici's proxy agents and builds the dispatchers itself, caching one per configuration. Whatever runtime you are on, the routing is the project's own code.
The bypass list
The no_proxy handling here is the most complete we have read in this series. It splits on commas or whitespace, lowercases hostnames and strips a trailing dot, turns a leading star into a suffix match, treats a lone star as everything, parses a bracketed address with an optional port, and only matches an entry with a port against that port.
| Entry | What it matches |
|---|---|
example.com | that host and any subdomain of it |
.example.com | the same |
*.example.com | the same, after normalisation |
example.com:8080 | that host, only on that port |
[::1]:3000 | that address, only on that port |
* | everything, proxy disabled |
The guard and its one exemption
The search lane builds agents that refuse to connect to private addresses, which is the right default for a feature that fetches URLs a model chose.
That creates the conflict we have now seen in six projects: a proxy usually lives on a private address, so a blanket refusal would block your own proxy. Their exemption is the narrowest of the six, and the comment explains exactly why:
For a plaintext http destination Axios repoints the caller's agent at the proxy host, so the connect-time check would resolve the proxy itself and reject a private one.
And the limit on it:
Only http destinations are considered: for an https destination Axios substitutes its own CONNECT tunnel and never uses the injected agent for the proxy connection, so no exemption is owed.
That is precise engineering. The exemption exists only where the mechanism forces it, and since the provider defaults are all encrypted, in practice it is rarely used at all.
Which proxy type fits it?
Residential, for the services that answer a hosting address differently. Our own paired test is the size of that effect: 4 of 13 sites answered a residential address differently from a server one.
Think about which lane you actually care about. Model provider calls are usually about reaching an API from a particular country. Web search scraping is the lane that meets block lists, so if that is your problem, the standard variables are the ones to set.
A self hosted chat server is one machine, which suits address authentication: no proxy password in your environment file, and the machine allowed by its address, up to 150 per plan on a Residential Premium plan. The traffic is API calls and generated images rather than full pages, so a per gigabyte line goes a long way. The residential proxies page lists the plans, and the plan API manages allowed addresses from code.
What breaks
- Model calls are routed and searches are not. You set the project's own variable only. Set the standard pair as well.
- Nothing is routed. Check for a typo in the variable name, then check your bypass list for a stray star.
- A search fails to reach your local proxy. The exemption covers plaintext destinations only, by design.
- You cannot tell which release is stable. They are all flagged prerelease. Pick by version number.
- You searched the code for proxy and found hundreds of files. Most are the monitoring module and the deployment charts.
What this page does not cover
We read the code as text and did not run LibreChat, so we did not watch a request use an address and did not measure traffic. We did not verify by experiment that the search lane ignores the project's variable. We read both resolvers and the library's own source, and a reader who needs certainty should test it. We read the proxy utility, the search agent and that library closely, and used a code search for the call sites rather than reading each one. This project pushes daily, and one file quoted here exists only on the default branch. We will read it again by 20 October 2026.
Where to go from here
Proxies for last30days covers the runtime problem this project sidesteps, measured. Proxies for PicoClaw covers the same guard exemption solved in another language. Proxies for SearXNG covers the search backend many LibreChat users point their search lane at.
Sources
- The proxy utility with its variable precedence, its undici and agent imports, its dispatcher caching and its bypass matcher (packages/api/src/utils/proxy.ts), and the call sites in the endpoint configuration, the assistants initialisers and the image tools. danny-avila/LibreChat, release v0.8.7 of 24 June 2026, read 20 September 2026.
- The web search agent, its resolver import and its exemption comment (packages/api/src/web/agent.ts). On the default branch; this path returns 404 at the v0.8.7 tag.
- Which variables the standard resolver reads. proxy-from-env, index.js, read 20 September 2026.
- The release list and its prerelease flags. GitHub API, read 20 September 2026.
- Our paired address test of 19 September 2026: 16 URLs, plain requests, two runs from our server and two through a residential line of our house plan. Raw output is kept in the research folder of our OpenClaw page.
- Plans, allowed addresses and per gigabyte pricing. HProxy documentation, hproxy.com/docs, 20 September 2026.


