Blog / Pre-Launch Checklist

Paste Your Own URL Into a Scanner Before Launch

· Fortus Team · 4 min read

Picture this: the night before launch, you finally type your own app's address into someone else's tool — a free header checker, a TLS grader, a backup-file probe — and watch it list problems you have lived with for months. A page served over plain HTTP. Scripts loading over unencrypted connections. A security header missing everywhere. None of these took skill to find; automated bots check exactly this inventory against every new site they discover, within hours of it appearing. The embarrassing email from a user who noticed first is entirely avoidable, because the easy stuff is also the easiest to verify yourself. This post is a sixty-second mindset plus an evening checklist: look at your own app the way the internet will, starting with the transport layer everything else depends on. Encryption in transit is not advanced security. It is the front step — and plenty of launched apps are still missing it.

Why local HTTP habits follow you to production

Imagine building entirely on your laptop, where every address starts with plain HTTP and everything works. That habit ships. The deploy goes out, the platform provisions a certificate or maybe it does not, and nobody adds the redirect that pushes visitors from the insecure version to the secure one. Meanwhile the codebase accumulates hardcoded resource addresses — scripts, images, stylesheets, fonts, API base URLs — some still pointing at unencrypted endpoints or defaulting to them through environment variables. The result is either pages served over plaintext, where sessions and credentials travel readable by anyone on the path, or "mixed content" pages where the main document is encrypted but sub-resources are not, which browsers flag and partially block. Vibe-coded projects hit this constantly because local development never complains: HTTP works on localhost, the app looks identical, and the missing redirect is invisible until someone checks from the outside. Browsers have opinions about this now, and so do your users' password managers.

The sixty-second review that saves the embarrassing email

Here is a scenario I keep seeing: a builder launches, shares the link widely, and only then discovers what automated scanners knew on day one — no forced HTTPS, a staging backup file sitting at a guessable path, verbose error pages describing the stack. So run the review yourself first, in this order. Open your own URL and confirm the lock: every page, not just the homepage, served over HTTPS with no plaintext variant reachable. Open your browser's developer tools, watch the network tab, and confirm every script, image, font, and API call loads over encrypted connections — a single insecure sub-resource is a finding. View your response headers and check for the standard hardening set your framework documents, plus an upgrade-insecure-requests directive as a backstop. Finally, probe the classics yourself: common backup paths, exposed map files, directory listings, and verbose error output triggered by a bad route. Each check takes seconds. Together they replicate the first pass every bot runs, except you get the results before launch instead of after.

Self-test: grep your repo for plaintext habits

Your manual browser review covers what is deployed today; this self-test covers what your code will deploy tomorrow. Search your entire codebase for literal insecure resource addresses — every hardcoded script source, image path, fetch base, and asset URL — and for environment-variable defaults that point at unencrypted origins. Localhost entries confined to development config are fine; production defaults are not. Then verify the redirect layer: does your framework config, middleware, or hosting config contain an explicit rule pushing HTTP to HTTPS, and is strict transport security enabled so browsers remember? Check your content-security configuration for an upgrade directive that promotes stray sub-resources automatically. The pass state is simple to describe: no insecure URLs in production code paths or production defaults, a redirect or upgrade configured at a layer you control, and every sub-resource loading encrypted. Re-run the search after every dependency or template change, because hardcoded addresses creep back in through copy-paste faster than any other habit.

Where a file-reading scanner fits in

The browser checks above need your eyes on the live app, and no file scanner replaces them — but a scanner that reads your repository is the right tool for the code half of the problem. It can grep every template, component, and config for insecure URLs, confirm whether production environment defaults use encrypted origins, verify that a redirect or upgrade rule exists in your framework or hosting config, and flag a missing content-security backstop — citing file and line for each finding so the fix is a short edit, not an investigation. What it cannot verify from files is the part outside your repo: whether certificates are actually provisioned and the live redirect truly answers. That is why the two halves pair well. Let file-level checks hold the line on every commit so plaintext habits never ship, and keep the sixty-second manual review as your launch ritual. Attackers automate the easy probes; there is no reason builders should not automate the easy answers first.

Automated Code Review

Catch plaintext leaks before you deploy

Fortus reads your repo and catches insecure asset paths, missing redirects, and exposed secrets before you launch. Every finding cites the exact file and line.

or learn more about Fortus →