You pressed F12 and the page went white. Or it bounced you to the homepage, or froze behind a “Paused in debugger” banner, or printed “developer tools detected” and stopped loading. Either way the site noticed, and no event told it.
A page’s scripts get no signal when you open DevTools, pick an element or read a panel. What they can do is notice what an open DevTools does to the page. The widget on this page runs those checks on your own browser, so open DevTools now and watch it react.
debugger statement stalls the page while the clock keeps running. Two of those three have a cheap way past them (undock the panel, deactivate breakpoints). Console timing has none, and it fires for Puppeteer too. None of it identifies a person, and the checks in the widget run entirely in your browser.Can a website see you use Inspect Element?
Not through its scripts. Browsers fire no “DevTools opened” event, and picking an element or reading a panel tells the page nothing. The server can still see ordinary requests. View source is a plain request for the page or a read from your cache, and Chrome fetches a site’s source maps when DevTools opens, so a server that ships them can log that. It never learns which element you picked or which panel you read.
Editing a page in Inspect Element changes nothing for anyone else. You change the copy held in your tab, the server’s copy is untouched, and a reload brings the original back. The page can notice that one of its elements changed, because a MutationObserver reports edits like these as ordinary DOM changes. I confirmed it for text and attribute edits in Chrome, and the record says nothing about who made the change. Try it on the price in the widget: right-click it, choose Inspect, edit the text. The diagram shows where the change lands.
How a page can tell DevTools is open
Three of the tricks work the same way. The page cannot ask “is DevTools open?”, so it sets up a measurement and watches for a side effect. Same idea as ad blocker detection: the page cannot see the tool, so it measures what the tool changes.
The window size gap. Docking DevTools to the side or bottom takes space from the page, so window.outerWidth - window.innerWidth (or the height equivalent) jumps. Scripts flag a gap of roughly 160 to 170 pixels. On my Windows 11 machine, docking DevTools to the right moved the width gap from 14 to 569 pixels, and undocking it put the gap back at 14. It fires by mistake when you zoom the page or open a sidebar. The best-known library for it, devtools-detect, was archived in May 2026, and its README admits the method gives many false positives.
Console cost. The classic trick logs an object with a getter and waits to see whether the console reads it. Many older answers still describe it, and it no longer fires in current Chrome: in my test on Chrome 155 for Windows, a getter on Error.stack and one on an element’s id stayed silent with DevTools open. Other variants, such as a custom toString, fire whether DevTools is open or not, so they tell you nothing.
What still shows is time. Logging is almost free until a console client is attached, and then Chrome has to build a preview of each object. Forty console.debug calls on a 40-key object took under a millisecond with DevTools closed and a few milliseconds with it open, about a ten-fold jump on my machine. It made no difference whether the panel was docked or in its own window. The same jump appeared with a bare Chrome DevTools Protocol session, which is what Puppeteer and Playwright open by default. A page that times its own logging against a baseline can tell. It also cannot tell a developer from a script, which is why bot detection uses it. I did not test Firefox or Safari.
The debugger statement. Without DevTools it does nothing. With DevTools open and breakpoints on, it stalls the page until you press Resume. A script reads the clock before and after, and a gap over about 100 ms is read as a pause. Scripts take that to mean someone was looking, though a throttled tab or a slow machine can fake it. This is also the “Paused in debugger” banner. The button in the widget runs it once so you can feel it.
The edit watcher. The fourth signal is not a DevTools check at all. It is the MutationObserver from the section above, pointed at whatever a script wants to protect, such as a price or a paywall element. It reports the change, not DevTools.
- caughtWindow size gapOuter window minus page area
- caughtConsole costTiming 40 console calls against a baseline
- caughtdebugger timingA debugger statement and a stopwatch
Why a site freezes, redirects or says “developer tools detected”
Sites that react are not using one trick. Christian Heilmann took one apart in Cracking a “Developer Tools Killer” script. It blocks right-click and the F12, Ctrl+Shift+I and Ctrl+U shortcuts, then runs a debugger loop every 100 ms and redirects the page if a pause lasts longer than 200 ms. Its check function is not wrapped in a closure, so he simply overwrote it.
The motive is usually to make copying and scraping more annoying. It protects nothing, because everything the server sends is already in your browser. Copy, paste, tab switches and screenshots are a separate set of signals, covered in can websites see you switch tabs, copy or screenshot.
Can a website block Inspect Element or F12?
A page can cancel the F12 and Ctrl+Shift+I key events and the right-click menu, and most “blocking” scripts do exactly that. It is cosmetic. The browser menu (More tools, Developer tools) runs outside the page and cannot be stopped. The last row of the widget logs which of these events reach the page in your browser. It only watches, it never cancels them.
How to bypass DevTools detection and stop the freeze
DevTools is a standard browser feature, so a check that trips on it is the site’s problem. Match the fix to the check:
- Deactivate breakpoints in the Sources panel (Ctrl+F8, or Cmd+F8 on a Mac). Every
debuggerstatement becomes a no-op and the pause check sees no gap. - Undock the panel into its own window, which defeats the size gap.
- Deal with the script itself when console timing is what fires. There is no setting that hides the console from a page. You can override or block the detection script, as Heilmann’s walkthrough does by overwriting its check function, or inspect a saved copy of the page that runs no scripts.
Do not reach for an extension that fakes window.outerWidth or patches console. A replaced built-in stops reporting [native code], and that is its own tell, as patched native functions are in bot detection.
Is using Inspect Element illegal?
No. Every major browser ships it and documents it, and it edits only your local copy. The trouble starts with what you do next: a doctored screenshot passed off as a real receipt, invoice or bank statement can amount to forgery or fraud, depending on where you live and what you intend, whichever tool made it.
If you run browsers at scale
For a developer a trip means a broken page until you deactivate breakpoints. For anyone running browsers at scale it means a flag on every site that times its console, because the cost shifts when an automation channel attaches, not only when a person opens DevTools. If you drive profiles with Puppeteer or Playwright, run each setup against the widget above, with no DevTools window open, before you rely on it.
Incogniton profiles are real Chromium builds, so the checks above apply to them as they do to Chrome. Whether console timing stays quiet depends on how you drive the profile, so test that part yourself. Whether a given site allows automation is set by its own rules, so read them first.Try it now: open DevTools with the widget watching, then undock the panel and deactivate breakpoints. Two rows go quiet. The console row does not. The full browser scan covers the rest of what a page can read, from network to fingerprint.