Free · About a minute · Nothing to install

Your site is live.
What did you leave unlocked?

A live payment key sitting in your JavaScript. Files you never meant to upload. A setting that quietly keeps you out of Google. These are the checks a senior engineer runs before launch — and not one of them is visible from a browser.

No account · No card · Nothing stored

Ready nothing stored
Is the site actually finished?·homepage, 404s
Is the padlock real everywhere?·TLS, HTTPS, www
Can another site hijack yours?·HSTS, CSP, cookies
Can Google actually see it?·robots, noindex
Does it look right when shared?·title, social cards
Can someone email as you?·SPF, DKIM, DMARC
Is a key in the JavaScript you serve?·in report
Is a key committed in your repo?·code check
Are your dependencies vulnerable?·code check
Did you upload more than the site?·once verified
42
Checks
~1s
Free scan
$29
Full report
0
Accounts

01What catches people

The model wrote your app.
It never saw how it got deployed.

None of these are bugs in your code. They are defaults nobody turned off, and files that rode along with the upload.

Critical

A live key in your bundle

A publishable Stripe key belongs in your JavaScript. The secret one looks almost identical and moves money. We read what your site actually serves and match the shapes of real credentials — sk_live_, AKIA…, Supabase service roles, private keys.

Critical

Files you never meant to publish

Upload a project folder and the hidden files go too. A .git directory makes your whole repository downloadable — every version, every past commit. A .env is a text file anyone can request by name. Nothing links to them, so browsing your own site will never find them.

High

Invisible to Google since launch

Templates ship with noindex and Disallow: / because they were written for a site that wasn't finished. Your site works, your analytics stay empty, and nothing reports an error — the instruction is being followed exactly.

High

Broken where you can't see it

Debug mode prints your file paths and config to anyone who hits an error. Source maps publish your original source. Console errors and failed requests mean something didn't load — and no visitor will ever tell you.

None of it is visible from a browser. The site loads, nothing is slow, no warning appears. The failures that cost you most look exactly like everything working.


02What you actually get

Every finding says
where it stops.

Most tools try to sound like they cover more than they do. Every finding here carries the same four things — what we saw, how the mechanism works, what it does not prove, and the change that fixes it. The third one is the reason to believe the other three.

A scanner that overstates is easy to build and impossible to trust: once you catch it claiming one thing it did not check, you have to re-examine everything else it told you. This is a real finding, from a real scan.

High LAUNCH-01 · v1

The homepage tells search engines not to index it

Observed
<meta name="robots" content="noindex, nofollow">
Field
launch_noindex_via_meta = true
Detected stack
next

How this works. A <meta name="robots" content="noindex"> tag instructs compliant search engines to exclude the page from their index. A page carrying it is served normally to visitors and omitted from search results. It is commonly set globally in a staging environment and inherited by production.

What this does not prove. Nothing about whether it is intentional. Staging sites, client previews and internal tools carry this tag on purpose. This records that the directive is present on the homepage served to a public request.

How to fix it — written for next

In Next.js this is usually the robots key of the exported metadata object, or a robots.ts route. Check for NEXT_PUBLIC_ environment flags gating it, and confirm the production environment sets them.

Preflight launch report 5 findings · 36 checks clear
0
Critical
1
High
4
Medium
0
Low
01High The homepage tells search engines not to index it
02Medium A path that does not exist returns HTTP 200
03Medium No Content-Security-Policy header is sent
04Medium The domain publishes no SPF record
05Medium The domain publishes no DMARC record

There is no score. A number out of a hundred would be a claim we cannot defend — it implies a standard nobody published and averages away the one finding that matters. You get an ordered list and the reason for the order.

And the checks that passed
TLS certificatepassedvalid · 83 days left
HTTPS enforcementpassed301 → https
Secrets in bundlepassed0 found
Source mapspassednot reachable
Content-Security-Policyfindingabsent
DMARCfindingno record

A check that could not run is listed as exactly that — never folded into "nothing found".

And proof it wasn't edited later

Combined hash
a4f1…c72b
TSA serial
116501515
Timestamped
RFC 3161

Every scan is hashed and timestamped by an independent authority. The report prints the openssl command that verifies it — against the issuing authority, not against us.


03What arrives

Three things, and you keep all of them

Screenshots of the real thing — not mock-ups. This is a genuine scan of example.org.

digitaltrustpass.com/preflight/r/…
A finding in the Preflight report: what was observed, how the mechanism works, what it does not prove, and the change that fixes it.

The report. Every finding gets the same four things: what we saw, how it works, what it does not prove, and the change that fixes it — for your stack.

digitaltrustpass.com/preflight/verify/…
The verification section of the public record: combined hash, timestamp and authority serial number.

A public address for it. Send the link to anyone and they see the same record — with a timestamp they can check against the issuing authority, not against us.

2 changes on example.org
A drift alert email listing what changed since the previous scan.

With monitoring

And an email when something moves

Only when something has actually changed. A header that disappeared on deploy day, a certificate with eleven days left, a key that appeared in a bundle that did not have one last week.

Silence is the normal state. That is the point of it.


04Why it can't be edited afterwards

Including by us

A report is only worth anything in an argument if the person reading it doesn't have to take the word of whoever wrote it. So the record is built to be checked against someone else. Here is the whole mechanism — it is public, and none of it is ours.

How a scan becomes a record that cannot be altered Each response the scan collects is hashed and linked to the one before it. The run's records combine into a single hash, which is sent to an independent RFC 3161 timestamping authority. The authority returns a countersigned token, which is stored with the report. 01 · Collect 02 · Combine 03 · Countersign GET / headers TLS DNS SHA-256 over the response bytes, taken as they arrive e(n) = SHA-256( e(n−1) + response hash + n ) combined hash RFC 3161 authority countersigned token · serial 116501515

Hashed as it arrives

Every response is hashed at the moment it is received, not reconstructed from a summary afterwards. Each record is then linked to the one before it — its hash is computed over the previous link, its own response hash, and its position in the sequence.

One hash for the run

Those records combine into a single hash for the whole scan. Alter one observed value later and that record's hash changes, every link after it stops recomputing, and the combined hash no longer matches the one that was sent away.

Signed by someone else

The combined hash goes to an independent timestamping authority under RFC 3161 — the same mechanism used for signed documents. It returns a token countersigning the hash and the time. The signing key is theirs. We cannot issue one and cannot alter one.

Your report prints the openssl command that checks the token — against the authority's certificate, not against anything we host. If we changed a single character of a finding afterwards, that check fails.

What the timestamp does not prove. That the scan was right. It proves this report existed in exactly this form at that time and has not been altered since — which is a smaller claim, and the only one the mechanism actually supports.


05The second checkpoint

Everything above is your site.
None of it is your code.

A key in a server-side file never reaches a browser, so no scan of your deployed site can find one. Nor can it tell which package versions you actually installed. Upload your project with the report and we read both — including your full git history, where a key you "removed" in a later commit is still sitting in every clone.

Critical

Keys that are still in the history

We read the working tree and every past commit, then say what the key opens — a database, an account, or a card. A Stripe publishable key belongs in your JavaScript and we will not call it a leak; a Supabase service_role key looks identical and bypasses every row-level rule you wrote. The difference is the whole finding.

High

Dependencies with known holes

The model pinned whatever versions it was trained on, and they have aged since. We check yours against the public vulnerability databases and separate what ships to production from what only runs at build time — because a flaw in a test runner is not the same emergency as one in the code you serve.

What we found when we tested this. We ran it against twelve real projects built with Lovable, Bolt, v0 and Cursor before building it.

Every project whose dependencies could be resolved carried a known vulnerability — several critical. One had a database key committed to its history. None of it was visible from outside the site. Four had no lockfile at all, which we report as not tested, never as clean.

Your upload is deleted the moment the scan finishes. Findings record a file, a line and a digest — never the credential. We never use a key we find to test whether it still works: that would be both a use of your credential and a way to run up the bill we are warning you about.

06And the rest of the list

42 checks, one scan

TLS validity and expiry HTTPS enforcement Security headers Mixed content Cookie flags apex + www certificate Mobile viewport Title, description, social cards 404s that return 404 Broken internal links Framework starter pages Third-party services and cookies SPF, DKIM, DMARC Subdomain takeover Privacy policy

Every finding says what we observed, how, what it does not prove, and the specific change that fixes it — for your stack, where we can identify it.

Read first, decide later

Is your .git directory publicly readable? — how to check in ten seconds, and why a CDN can hide it from you while the internet still gets it.

Is your .env file readable? — including the version that leaks your keys without the file being exposed at all.

What we found in 12 AI-generated codebases — every one we could check carried a known-vulnerable dependency.

What a scan can and cannot evidence for a security questionnaire — which questions you can answer with proof, and the longer list you cannot.

07Included, not an upgrade

Prove it's yours, and we look harder

Asking a server for /.env isn't something we'll do to a stranger's site. On your own it's the most useful question there is.

One DNS record or one file — about two minutes. That unlocks the checks no free scanner can offer you, because none of them know the site is yours.

Included with the $29 report →

.env and .env.production .git — is your repo cloneable? Cloud credential files Open admin surfaces Directory listing Database ports open to the internet

08Being straight with you

Some of this you can get free

Headers, TLS, cookies securityheaders.com, SSL Labs and Mozilla Observatory do this well, and for free. We check the same things in one pass — we didn't invent them and won't pretend otherwise.
noindex and robots Lighthouse flags these, and it's already in your browser's devtools. If you've run it against the deployed site, you may know already.
Secrets in your bundle None of them read the JavaScript you serve looking for the shapes of live credentials. This one is ours.
Keys and dependencies in your code GitHub does this free — secret scanning, push protection and Dependabot — and if your project lives there with those switched on, use them. What we add is for everyone else: no GitHub account needed, a plain answer about what each key actually opens rather than a raw alert list, and the result recorded in the same timestamped report as everything above.
Unlinked files on your server Structurally impossible for them — probing for .env needs proof the site is yours, and none of them have it. This one is ours.

So three of the five are genuinely available free, and if your site is small and you have the afternoon, go and get them. What you're buying here is one scan instead of four, an ordered list instead of four dashboards, a fix per finding — and the two rows nobody else can do.

09Pricing

Cheap enough to not think about

Free scan

$0

How many findings you have, and how serious. Doesn't name them.

Launch report

$29

Two checks, not one. Your deployed site, and — when you upload it — your project's code and full git history: committed keys, and dependencies with known vulnerabilities. Every finding named, ordered, with the change that fixes it. PDF, timestamped. No account.

Get the report →

Monitoring

$9/mo

Or $89 a year. Weekly re-scan, and an email only when something actually changed. You don't check the locks once — you check them every time you leave.

Start monitoring →

What this is not

Preflight observes your site from the outside on one date, plus — with your proof of ownership — a short list of specific files. It is not a penetration test. It does not read your source, log in as anyone, or send a payload. A clean report is not a guarantee that your site is secure — it means these named checks found nothing today, and every report lists exactly what was and wasn't checked.

Find out in about a minute.

Free · No account · No card