Does blocking the analytics script break the converter?

No. I ran the same conversions five times with the analytics scripts working, blocked, failed, and left hanging forever. All fifteen produced byte-identical JPGs, every download landed, and none of them logged a single console error.

15 conversions, 2 distinct files 0 console errors in 5 scenarios Ready in 236–478 ms either way

Short answer: no, it breaks nothing. Across five scenarios — analytics working normally, the Google tag blocked, every third-party request failed, and the analytics requests left hanging with no response — the converter produced the same 38,078-byte JPG from the small photo and the same 3,177,680-byte JPG from the 12-megapixel one, with matching SHA-256 hashes every time. All five downloads landed on disk at 38,078 bytes. All five runs logged 0 console messages and 0 uncaught exceptions.

What does change: with the analytics requests hanging and never returning, the page's load event never fired — after 20 seconds document.readyState was still interactive. That makes no difference to the converter, which was ready to use in 236 ms and finished every conversion anyway. The upload zone stayed 288 px from the top in all five runs.

How I measured it: today, in Chrome 153.0.8010.54 (headless, Windows, window 1280 × 900) against the live page, driving it through the DevTools protocol — blocking requests by pattern, failing them one by one, and in one run holding them open without answering. Each scenario got its own fresh browser profile.

What the page actually loads from elsewhere

The HTML carries one external script tag — the Google tag for measurement ID G-651SFXPRV2 — and once running, the page touched four things that are not its own converter. Here is what showed up in the baseline run:

RequestWhere it goesWhat it is
gtag/js?id=G-651SFXPRV2www.googletagmanager.comthe analytics library
beacon.min.jsstatic.cloudflareinsights.comCloudflare's analytics beacon
/cdn-cgi/rum?served from heicjpg.devCloudflare RUM endpoint
/g/collect?…www.google-analytics.comthe measurement hit itself

The converter's own decoder is a first-party file, heic-to.js, which came down at 678,876 to 678,928 bytes depending on the run. I could not measure the size of the two third-party scripts — the browser reports 0 transfer bytes for cross-origin resources that do not carry timing headers — so I am not going to put numbers on them.

Five scenarios, same fifteen conversions

In every scenario I loaded the page, converted the same two photos plus the 12-megapixel file, and pressed download once. Ready is when the converter's function exists on the page; load is the browser's load event.

ScenarioReadyLoad eventRequestsThird-party hosts reachedConversionsDownloadConsole
Nothing blocked413 ms630 ms6238,078 / 38,078 / 3,177,680 B38,078 B0
Analytics blocked by pattern292 ms414 ms61same three38,078 B0
Every third-party request failed336 ms352 ms50same three38,078 B0
Third-party requests left hanging236 msnever (20 s wait)50same three38,078 B0
Analytics blocked again (repeat)478 ms601 ms71same three38,078 B0

Fifteen conversions, two distinct outputs. The small photo's JPG hashed to 93859de257dc44a7… in all ten of its runs and the 12-megapixel one to 56ee525f012aa19f… in all five — the same hash this site's repeat-conversion measurements have recorded for that photo on other days. Conversion times moved around for unrelated reasons: 162 to 1,014 ms for the small photo and 4,930 to 7,849 ms for the 12-megapixel one, with no pattern matching which scenario they came from.

What the page notices

Two small differences showed up inside the page, and neither touches the result.

The analytics queue still fills. When the Google tag was allowed to load, the page's dataLayer array held 4 entries; with it blocked, 2. The page goes on recording events into that array; the difference is only that nothing carries them away. window.gtag stays a function in every scenario, because it is defined in the page's own inline script and does not depend on the external file arriving.

One fewer request during conversion. Counting requests made while the conversions ran, the unblocked page made 1 — the measurement hit to www.google-analytics.com. With analytics blocked or hanging, that number was 0, and the number of requests to heicjpg.dev itself was 0 either way, which is the same thing the network-layer measurements found: nothing about a conversion needs the site.

The one real difference: the load event

With the two third-party script requests held open and never answered, the page's load event did not fire. After waiting 20 seconds, document.readyState was still interactive. Both of those scripts are loaded asynchronously, and an asynchronous script that never arrives keeps the load event waiting even though it blocks nothing else.

For this page that is harmless: the converter does not wait for load. Its function was already on the page 236 ms in, the decoder file arrived in its own time, and all three conversions completed with the usual bytes. It is worth knowing anyway, because it is the failure mode that looks like a broken page: a spinner somewhere, a browser tab that never shows "finished loading", and a converter that works perfectly. In the other four scenarios the load event came at 352, 414, 601 and 630 ms.

Questions

So an ad blocker is safe to leave on?

Everything I measured says the conversion is unaffected: identical bytes, identical hashes, working downloads, no console errors, whether the analytics scripts loaded, were blocked, failed, or never answered. I blocked requests myself through the debugging protocol; I did not test a particular ad-blocking extension, so I am not claiming how any one of them behaves.

Is the conversion slower without analytics?

Not in any way I could pin down. Conversion times ranged from 162 to 1,014 ms on the small photo and 4,930 to 7,849 ms on the 12-megapixel one, and the spread did not follow the scenarios — the slowest small-photo run was in a blocked scenario and the fastest in another blocked one.

Does the site still know I converted something?

With analytics reachable, the page sent one measurement hit to www.google-analytics.com while I was converting, and the events were queued in dataLayer either way. What it does not send is your photo: the same measurements that found that hit found 0 bytes of it going to the site during a conversion.

How big are those two third-party scripts?

I could not measure them — the browser reports 0 transfer bytes for them because they are cross-origin without timing headers. The one first-party number I can give is the decoder, heic-to.js, at 678,876 to 678,928 bytes.

Does this hold if the whole network is gone after the first load?

That is a different test, covered by the offline measurements. What I tested today is narrower: the analytics scripts specifically, in three different failure states.

What about a phone, or another browser?

I measured Windows and Chrome 153 only. The reason blocking analytics does not matter is that the decoder is a first-party file and the conversion runs locally, which should hold anywhere — but I did not measure another browser or a phone today.

Try it: open the converter with your blocker on, convert a photo, and check the size — it is the same file you would have got with the blocker off.

First published: 7 October 2026