Why does my domain lock fail on a kiosk that loads files locally?
Because there is no hostname to match. The injected guard reads location.hostname and lowercases it; when a page is loaded from a file:// path or from a custom scheme in an embedded webview, that value is an empty string. The guard treats an empty hostname as a failure and runs your configured action immediately, before it ever compares against the allowed list. A device that never touches a web origin will therefore trip the lock on every boot. Use date locking and per-device builds for offline hardware, and keep LockDomain for the browser deployments it was designed for.
Will the browser and OS locks work inside an embedded webview?
Often not, and they fail closed rather than open. Both guards classify the user-agent string against a fixed list — chrome, edge, firefox, safari, opera, ie for the browser lock; windows, macos, linux, android, ios for the OS lock. Signage players and kiosk shells frequently ship a custom or stripped user agent, which classifies as unknown, matches nothing in your allowed list, and runs the failure action. Test the guard on the actual hardware before shipping, because a device that bricks its own player on first boot is indistinguishable from a bad build.
Can I expire a licence on a device that has no network?
Yes, with the caveat that you are trusting the device clock. LockDate and LockStartDate take a YYYYMMDD value and compare it against a local new Date() on the device, so no server is involved and no network is needed. The trade is that a device without a reliable time source — one that lost power, has a dead RTC battery, or was deliberately set back — reports whatever the clock says. Treat the date lock as a contractual tripwire that makes overrun deliberate and provable, not as a technical boundary.
How do I protect JavaScript that is inline in a signage HTML file?
Use mixed-file protection, which reads .html, .php, .asp, .aspx and .jsp files, protects the script inside them, and writes the surrounding markup back untouched. That covers the common signage and kiosk layout where a playlist page carries its own inline script and there is no bundler in the picture at all. MixedServer is an Enterprise-tier option. If your device build does have a bundler, protect the build output instead and leave the markup alone.
Should protected device code send runtime telemetry back to me?
Only if you have decided it should and said so. The runtime defense beacon is opt-in through RuntimeDefenseBeaconUrl and sends nothing unless you set it. On shipped hardware an unexplained outbound request is a genuine problem: it fails customer network reviews, it breaks on air-gapped installs, and it can silently retry forever on a device with no route out. Either leave it unset for offline fleets or point it at a collector inside the customer’s own network, and document which you chose in the deployment notes.
How do I debug a crash on a device I cannot log into?
Keep the protection report for every firmware image you cut, labelled with the commit and the image version. Symbolication translates an obfuscated stack trace back to real names, but only against the report that produced that exact build — so if the report is gone, the trace is unreadable for good. Embedded fleets make this worse than usual, because a photograph of an error on a screen is sometimes the only evidence you will ever receive.
Does a firmware image need a different protection setup from a web app?
The transforms are the same; the release discipline is not. A device image cannot be hotfixed on your schedule, so everything you would normally verify after deploying has to happen before the image is signed. Build with a seed so the artifact is reproducible, keep the manifest and its per-file hashes, run the end-to-end suite against the protected output rather than the source, and verify no source maps survived. A web app with a bad release is a rollback; a device fleet with a bad release is a truck roll.
Is obfuscation worth it if someone can just image the flash?
Physical access does defeat confidentiality of the storage — that is true of every device ever shipped, and no client-side control changes it. What protection changes is cost. Pulling an image is one step; turning a protected bundle back into a maintainable codebase someone can fork and sell is a much longer one, and the watermark means the copy they pulled still identifies itself. Set expectations accordingly and see is obfuscation reversible.