Skip to content
Scanlity

Know the scope.

Website, code and application reviews answer different questions. Each result keeps its own evidence and limits.

Check a website

Public website

Observable behavior without a website login.

We request supported public pages, response headers, DNS records and TLS information. A fresh browser session observes JavaScript, cookies and tracking requests before interaction. We do not sign in, submit forms or exploit findings in this review.

Each scan has request and time limits. Bot challenges, network failures and exhausted limits can leave checks unverified. If a security check cannot finish, the security assessment is provisional. Its observed score remains separate from a final grade.

Privacy and Trust show their own unverified counts. Zero findings does not mean those checks passed. A public review cannot assess private application logic, authorization, stored data or infrastructure behind the public interface.

Code & pull requests

Supported source and dependency observations, tied to the reviewed version.

Configured repository reviews inspect supported JavaScript/TypeScript source, secrets, selected configuration and npm dependencies. Analyzer availability, supported inputs and coverage belong to the review profile; unsupported stacks are not silently treated as checked.

Source is inspected without executing the submitted project. A repository review records the exact commit. Baseline comparisons distinguish new findings from previously observed and newly unobserved candidates; disappearance alone is not proof that a risk was fixed.

Repository access and the configured GitHub App are required for GitHub workflows. Suggested fixes, copyable remediation tasks and supported diffs remain review material. A proposed change, passing tests and a successful retest are separate facts; no production change is made by reading a result.

Open code review tools

Authenticated app

A declared read-only access matrix, with explicit authorization.

The configured application profile compares expected access to declared GET/JSON resources across synthetic roles and tenants. It requires verified domain control, explicit consent and fresh, short-lived test sessions. Resources must be declared safe to read; the HTTP method alone does not establish that.

The result covers those resources, sessions, environment and any recorded commit/deployment binding. Expired or unavailable sessions cannot establish an authorization result. Missing evidence is kept visible, and revoked authorization prevents the affected review from continuing as an authorized run.

This profile performs no write operations or automated login. It is not a universal DAST engine, business-logic review or penetration test. A code review and an application retest remain separate observations even when they reference the same commit.

Configure an application

Website grades

An observed grade summarizes supported public security findings. It is not a certificate of safety.

Security findings are grouped into account takeover, data exposure, email impersonation, code injection and connection interception. Severity, confidence and site features affect deductions. Related findings can increase a scenario’s risk. Confirmed sensitive exposures can cap the grade.

A
90+
B
80+
C
70+
D
60+
F
0+

Advisory security hygiene contributes at most 10 points of deduction. Privacy and Trust & polish observations do not change the security grade.

Confirmed means a check observed its technical condition. Likely means interpretation depends on context. Advisory marks a recommended improvement. Privacy observations are technical signals, not a determination of legal compliance.

Public check catalog

Expand a family to read every supported public check. This catalog does not describe complete code or application coverage.

Security36 checks
Invalid TLS certificate
Checks that the certificate is trusted, unexpired and issued for the scanned domain.
TLS certificate expires soon
Flags certificates that expire within 14 days.
Outdated TLS versions enabled
Checks whether the server still accepts TLS 1.0 or 1.1.
HTTP does not redirect to HTTPS
Requests the site over plain HTTP and checks that it redirects to HTTPS.
Login or payment form sent over HTTP
Checks that password and payment forms are served and submitted over HTTPS.
Scripts loaded over HTTP
Looks for scripts, iframes and stylesheets loaded over plain HTTP on an HTTPS page.
HSTS missing or too short
Checks the Strict-Transport-Security header (at least 180 days).
Weak or missing Content Security Policy
Checks for a Content-Security-Policy that blocks inline scripts. Severity rises when the page has a login.
Clickjacking protection missing
Checks for frame-ancestors in CSP or X-Frame-Options. Severity rises when the page has a login.
X-Content-Type-Options missing
Checks for X-Content-Type-Options: nosniff.
Referrer-Policy missing or unsafe
Checks for a Referrer-Policy header that does not leak full URLs.
Permissions-Policy missing
Checks for a Permissions-Policy header.
Server software version disclosed
Checks whether Server or X-Powered-By headers reveal exact versions.
Session cookie without protective flags
Checks that cookies that look like sessions are Secure, HttpOnly and have SameSite.
Cookies without Secure flag
Checks that cookies set over HTTPS carry the Secure flag.
Any website can read authenticated responses (CORS)
Sends a request with Origin: https://scanlity-probe.example and checks whether the response allows that origin together with credentials.
CORS allows any origin
Checks for Access-Control-Allow-Origin: * on the main page.
Git repository exposed
Requests /.git/config and /.git/HEAD and checks for Git file contents.
Environment file exposed
Requests common .env file names and checks for KEY=value lines.
Database dump exposed
Requests common SQL dump file names and checks for SQL statements.
Configuration backup exposed
Requests common backup names of PHP configuration files and checks for credentials.
Directory listing enabled
Checks whether the root and common upload directories list their files.
Source maps expose original code
Checks whether the site's own JavaScript files have public source maps that include the original source.
phpinfo() page exposed
Requests common phpinfo file names and checks for the phpinfo output.
.DS_Store file exposed
Requests /.DS_Store and checks for the macOS Finder file header.
Dependency manifest exposed
Requests package.json and composer files and checks for dependency lists.
No security.txt
Checks for /.well-known/security.txt with a Contact field.
JavaScript library with known vulnerabilities
Detects library versions from file names and banners and looks them up in OSV.dev.
Outdated WordPress
Compares the detected WordPress version with the latest release from api.wordpress.org.
Server software past end of life
Detects PHP, nginx and Apache versions from headers and checks endoflife.date.
Secret key exposed in JavaScript
Searches the site's own JavaScript and inline scripts for secret keys with unambiguous formats. Public keys (Stripe pk_, Supabase anon, Firebase) are not reported.
SPF missing or too permissive
Reads the domain's SPF record and checks that it ends with ~all or -all.
DMARC missing or not enforced
Reads _dmarc and checks that the policy is quarantine or reject.
MTA-STS not configured
For domains that receive email, checks for an MTA-STS policy record.
No CAA record
Checks for a CAA record that limits which authorities may issue certificates.
Subdomain can be taken over
Finds subdomains whose CNAME points to a service that no longer hosts them, using service fingerprints from can-i-take-over-xyz.
Privacy4 checks
Tracking before visitor interaction
Observes known tracking requests and cookies before any interaction. This is a technical signal, not a legal verdict.
Tracking without a recognized consent manager
Looks for consent manager markers when tracking is observed.
No visible privacy policy link
Looks for a privacy policy link on the main page.
Third-party tracker inventory
Lists recognized tracking services seen in a fresh browser session.
Trust & polish7 checks
No visible company or legal information
Looks for links identifying the operator or terms of use.
No visible way to contact the operator
Looks for email, phone, a contact page or contact form.
Copyright year looks out of date
Compares the most recent copyright year with the scan date.
Broken internal links
Checks up to ten internal links from the main page.
Missing page metadata
Checks title, description, viewport, social preview and favicon.
Social proof without a visible source
Looks for rounded customer or team counts without a nearby source.
Generic marketing language
Flags three or more generic phrases or emoji in headings. This does not identify AI-generated text.

Catalog 1.2.1

Keep the limits visible.

Read the example, choose a scope or begin with a public website review.

Check a website Explore the example