How I built SiteSafeCheck

I'm Nick Castro. I built SiteSafeCheck, a free website security check for small businesses, with AI tools, and AI also runs inside the product. This page covers the problem, how it works, and the tradeoffs I made.

The problem

Most security scanners talk in jargon: "Missing HSTS header", "DMARC p=none", "TLS 1.1 accepted". A bakery owner can't tell which of those matter or what to do about them, so the report gets ignored and the gaps stay open.

Who it's for

Small-business owners, and whoever manages their website. They get a grade, the evidence for each issue, what it means in plain English, the realistic worst case, and what kind of change fixes it. For me, it's also an honest way to find people who need the fixes I offer.

How it works

  1. Passive checks in plain code. The scanner loads the public home page, reads headers and the certificate, looks up public DNS records (SPF, DMARC, 18 common DKIM selectors), and requests 10 well-known paths like /.env. No AI decides what's wrong.
  2. A transparent score. Fixed rules turn the findings into a 0–100 score and an A–F grade, and the report shows the math.
  3. One batched Gemini call. Every finding that needs attention goes to Gemini in a single JSON request, which writes a plain-English "what this means" and a one-sentence "worst case" for each.
  4. Honesty filters and fallbacks. Each AI line is checked before it's shown. Anything that calls a site "secure", cites statistics, uses certainty words, pitches a service, or leaks a copy-paste config snippet is dropped and replaced with copy I wrote by hand. Every check has a hand-written version, so the report works even with AI off.

How I used AI and other tools

Key decisions and tradeoffs

Passive-only scanning
Sending attack traffic to someone's site can be illegal and can break things, so the scanner only does what a normal visitor or search engine does. The tradeoff: it can't find bugs inside code or plugins, and every report says so.
Holding the AI to hand-written baselines
In early live testing, the AI overstated a low-risk issue: it suggested a script could quietly use visitors' webcams, but browsers ask permission first. Now each AI worst case gets my hand-written version as a baseline, and the AI isn't allowed to go beyond it. I gave up some variety in exchange for accuracy.
Free diagnosis, paid fix
The free report explains each problem and names the kind of change that fixes it, but leaves out copy-paste configuration. The fix itself is my paid service. Work I don't do (penetration tests, code audits, malware or breach cleanup) is referred out, never sold.
A confirmation line instead of a checkbox
A required "I own this site" checkbox was stopping first-time visitors at the button. I replaced it with a line under the button ("By scanning, you confirm you own or manage this site"). The API still refuses requests without that confirmation, and it logs every one.

Results so far

Only numbers I can verify:

Scan my site freeView the code on GitHubMore of my work