Chrome's Local Network Access prompt makes running localhost helpers look uninstalled
Since Chrome 142, a public website needs the user's permission before it can reach a helper service on 127.0.0.1. Scanner and printer agents with short health-check timeouts mistake the pending prompt for a missing install, a developer found and documented on dev.to.
The Engineer · Build desk

Key figures: in the author's example the health check gives up after 1.5 seconds. Chrome 142 began showing the permission prompt, Chrome 145 split the permission in two, Chrome 156 is planned to remove the opt-out policy, and Firefox 153 applies the same restriction on desktop.
| Figure | Value | Note | Claim |
|---|---|---|---|
| Wait before the example health check gives up | 1.5 seconds | 19 | |
| Permission prompt begins | 142 Chrome version | 1 | |
| Permission split in two | 145 Chrome version | 3 | |
| Opt-out removal, planned | 156 Chrome version | 5 | |
| Same rule on desktop | 153 Firefox version | 6 |
What happened
- Dynamsoft's FAQ for its document scanning SDK says that on Chromium 142 and later the page keeps asking users to install a service that is already installed and running.
- While the permission prompt is open, the page's request neither fails nor fires an event; it simply waits until the user clicks.
- Chrome 145 split the permission into loopback-network for programs on the same computer and local-network for other LAN devices, keeping the old name as an alias.
- Chrome 147 put WebSocket and WebTransport connections behind the same prompt, so helpers that speak WebSocket are covered as well.
Why it matters
- decision Helper vendors have to report at least three states to users, because a blocked permission and an absent agent reach page script as the same TypeError.
- constraint Recovery from a Block click moves into the user's browser settings, because script can neither re-raise the prompt nor clear the block.
- exposure IT teams that switched the feature off with the LocalNetworkAccessRestrictionsTemporaryOptOut policy will see the failure come back when Chrome 156 removes it as planned.
- precedent With Firefox 153 prompting on desktop too, permission handling becomes a standing code path for browser hardware agents in both Chrome and Firefox.
"This week I found a bug in my own code by reading another company's support page," wrote the developer behind the post, who builds the same kind of local agent for receipt printers [18][15]. He checked his own agent against the symptom Dynamsoft documents, and it failed the same way [15].
His health check had the common shape. It sends GET /v1/health with a 1.5 second timeout and returns false on any exception, and the app then tells the user to install the helper [10]. Under Local Network Access, the pending prompt holds that request open with no error and no event [9]. The timer fires first. A 1.5 second limit assumes a person who answers browser prompts faster than that, and the user in the post's example is a cashier looking at the till, not the address bar [19]. "The helper is running. The browser is waiting for a click nobody knows they need to make," he wrote [16].
He tested on Chrome 155 on Windows, with the agent on 127.0.0.1:17777 and a public https origin that had never asked for permission before [7]. Chrome accepted all three names, loopback-network, local-network and local-network-access, and each returned "prompt" [7]. The test covers one build on one operating system. For the result to transfer, Chrome would have to behave the same on macOS and Linux, and the post does not test them [7].
A Block click leaves less room. The post says this part comes from the author's reading, not his own testing: Chrome does not ask that site again, and every later request fails [21]. Dynamsoft's page shows the console line "Permission was denied for this request to access the unknown address space." [21] Page script cannot read that string. It gets the same TypeError a missing agent would produce [11].
His replacement, agentStatus, keeps the 1.5 second AbortController and passes targetAddressSpace: 'loopback' to fetch. When the request fails, it asks the Permissions API for the state [13]. Denied returns permission_denied; prompt plus an AbortError returns permission_prompt; anything else returns not_running [13]. The middle branch is good engineering. Chrome prompts only when something is listening, so a timeout while the state reads "prompt" means a live helper is waiting on a click [8][20]. The state lookup tries loopback-network first and falls back to local-network-access for Chrome 142 to 144. It reports "unsupported" for Safari and older browsers [14].
We think three states is the minimum for anyone shipping a localhost agent, and the message text matters as much as the branch logic. Only the user can fix a denied state, in the site setting Chrome labels "Apps on device", and the denied message should send them there [12][3]. Support desks have a check of their own to run. He wrote that when a customer says they fixed it with a policy, support should ask which policy [17].
What to watch
- Whether Chrome 156 ships on schedule with the LocalNetworkAccessRestrictionsTemporaryOptOut policy removed.
- Whether Chrome adds a way for a page to re-request loopback-network access after a Block, which would change how vendors handle the denied state.
- Whether Dynamsoft and other helper vendors ship SDK updates that report the permission state to users.
Clarity's read
What the record supports and how the coverage leans. The claims behind it follow.
Reality
- Evidence55
- Adoption65
- Hype gap+5
- Incentives25
- Confidence55
Claim ledger
Ranked by verification strength, evidence, and original report placement.
- [1]
Since Chrome 142 (28 October 2025), a public website cannot simply fetch() something on the user's machine or LAN; Chrome shows a permission prompt first. The Chrome team calls this Local Network Access.
- [2]
Dynamsoft sells a document scanning SDK that works through a service installed on the user's PC, reached by the web page on 127.0.0.1. Its FAQ lists a symptom for Chromium 142 and later: the page keeps asking the user to download and install the service even though it is already installed and running.
- [3]
Chrome 145 split the single permission into two: loopback-network for programs on the same computer, shown in site settings as "Apps on device", and local-network for other devices on the LAN. The old name local-network-access still works as an alias.
- [4]
Chrome 147 put WebSocket and WebTransport connections behind the same prompt.
- [5]
Chrome 156 is planned to remove LocalNetworkAccessRestrictionsTemporaryOptOut, the enterprise policy some IT teams used to switch Local Network Access off.
- [6]
Firefox 153 now applies the same restriction on desktop, with its own prompt.
- [7]
The author tested Chrome 155 on Windows with his agent listening on 127.0.0.1:17777 and a page on a public https origin that had never asked before. Querying loopback-network, local-network and local-network-access: all three names were accepted and all returned 'prompt'.
- [8]
Chrome only prompts when something is actually listening; a request to a dead port fails straight away with no prompt.
- [9]
While the prompt is open, the request does not fail; it waits, with no error and no event, until the user clicks something.
- [10]
A typical 'is the helper installed?' check, including the author's, sends GET /v1/health with a 1.5 second timeout and returns false on any exception; the app then says the helper is not running and asks the user to install it.
- [11]
Page JavaScript cannot read that console text; it gets the same TypeError as when the agent is missing.
- [12]
A page cannot trigger the prompt on demand and cannot clear a block from script.
- [13]
The author's agentStatus function uses a 1500 ms AbortController timeout and calls fetch with targetAddressSpace: 'loopback'. On failure it checks the permission state: 'denied' returns permission_denied; 'prompt' with an AbortError returns permission_prompt; otherwise not_running.
- [14]
The author's lnaState helper queries loopback-network and then local-network-access (Chrome 145+, then 142-144) and returns 'unsupported' for Safari and older browsers.
- [15]
The author builds the same kind of local helper for receipt printers, suspected his would show the Dynamsoft symptom, and found that it did.
- [16]
"The helper is running. The browser is waiting for a click nobody knows they need to make."
- [17]
"If a customer told you 'we fixed it with a policy', ask them which one."
- [18]
"This week I found a bug in my own code by reading another company's support page."
- [19]
In the author's example, the prompt appears while the cashier is looking at the till, not at the address bar, and after 1.5 seconds the check gives up.
- [20]
A request that times out while the permission state is 'prompt' indicates a live helper awaiting the user's click, because a dead port fails immediately without prompting.
- [21]
If the user clicks Block, from what the author has read, Chrome does not ask that site again and every request fails from then on. Dynamsoft's page shows the console message: "Permission was denied for this request to access the unknown address space."
Get this ledger inside ChatGPT. Ask about any of our stories and the answer brings its figure, each claim’s verdict and the sources. Free, no account.
Sources
1 independent publisher whose own reporting we read for this story.
- dev.to"Agent not running" when it is running: Chrome's local network prompt and localhost helpers
1 article · October 10, 2026
Topics and entities
Follow any of these and your For You feed starts watching them — no settings page required.
Topics
Entities
- Google ChromeFollow
- Mozilla FirefoxFollow
- DynamsoftFollow
- Local Network AccessFollow
- Private Network AccessFollow