Product
Client Secrets and false confidence from a quick glance
A site can look clean in a screenshot and still ship keys in public bundles. Quick glances create false confidence; Client-side secrets findings force the public-surface question.
· by Sam Ortega

Uptime was green. The homepage screenshot in the portal looked polished. The client asked if "security was done." Someone said yes because TLS had a padlock and the login page rendered. Two days later a contractor found a live token in a static JS chunk. That gap is false confidence wearing a launch checklist.
SlaySlop's Client-side secrets check does not care how the page looks in a PDF. It "searches public bundles and responses for exposed keys and tokens." Either those assets carry secret-shaped material or they do not.
Outcome I want from a secrets glance that is not a glance
I want the team to stop equating "site loads" with "nothing sensitive is downloadable." Concretely: the URLs in the handoff scope have been checked for exposed keys and tokens in public bundles and responses, urgent leaks are triaged before cosmetic work, and nobody pastes raw credentials into the shared portal because the product redacts sensitive findings.
Boundaries that keep the call from going sideways
Say what the tool is. SlaySlop is a read-only scan of the public surface. Permission is required. It does not edit the site. It is not a pentest—the compare page says that in plain language. A clean Client-side secrets result is not a substitute for vault hygiene or a signed offensive engagement.
Also say what the check is not looking at: private repos, CI secret stores, authenticated admin JSON, or employees' laptop env files. Public bundles and responses only.
Loading diagram.
Happy path that actually changes the room
Pick a permissioned production URL. Run the security pass. Open Client-side secrets if it fired. Read the asset path. Open that URL in a browser or with curl on a machine you control. Confirm the class of credential. Rotate first if it is secret-class. Then fix the build.
Security and secrets product steps match that discipline:
- Inspect HTTPS and headers.
- Search public assets for secrets.
- Run vulnerability probes.
- Rank by exposure.
Urgent leaks rise to the top for a reason. On a client call I would rather discuss one redacted token finding than twelve missing headers while a billing key stays downloadable.
# Authorized confirmation that a chunk is publicly fetchable
curl -sI "https://www.example.com/assets/checkout-widget.js" | sed -n '1,15p'HTTP/2 200
content-type: application/javascript
access-control-allow-origin: *
cache-control: public, max-age=86400Headers here only prove the object is public and cacheable. The secrets question is in the body. The product search is what turns that body into a finding with gated evidence.
When we move to fix mode, Fix prompts and integrations describes a boring loop that survives launch week: open the finding, copy a paste-ready prompt into your coding agent if that is your workflow, connect webhooks if you already live in a ticket system, then scan again to confirm the issue is gone.
Where false confidence comes from
The padlock glance. TLS means the pipe is encrypted. It does not mean the JS payload is free of secrets. Clients conflate the two constantly. I used to as well.
The Lighthouse slide from last month. Performance scores do not inventory tokens. You can have a fine LCP and a terrible client bundle.
"We use environment variables." Env vars that are inlined into the client build are just values in a file with extra steps. The question is whether the built asset is public, not whether the value started in a .env.
"Staging only." Public staging is still public. Contractors, crawlers, and mislinked Slack previews fetch it. Client-side secrets still applies.
"We grepped the repo." Source without sk_live_ can still produce a bundle that contains it after a plugin injects config. Observing the shipped response is the point of the check.
Uptime monitors. Availability status answers whether the site responds. It does not answer whether the response graph includes a key. Different instrument, different embarrassment.
Pitfalls when the report looks clean
No finding on the crawled assets is not the same as "we never leaked anything anywhere." Scope is the public surface the scan fetched. A second host, a forgotten preview deploy, or an old hashed object on the CDN can still bite you.
Redaction can confuse stakeholders who want to see the raw string. Explain that gated values prevent the report from becoming another leak channel. Rotate from the provider using the pattern and location; do not demand the secret be reprinted in email.
Do not invent prices or customer counts on the call. Point at the pricing page for plans. Stick to the glossary sentence for what the check claims.
Related next step
When a glance and a bundle disagree, trust the bundle. Rotate, remove, rescan, then update the portal note. Keep Client-side secrets, SlaySlop vs a pentest, and Monitoring nearby so the next regression is not a surprise screenshot from the client's intern. A permissioned SlaySlop pass is a cheap way to replace "looks fine" with evidence.