Changelog

Earlier releases

1 change

  • +`npx xploitscan cursor install` works again. It writes XploitScan's security rules to `.cursor/rules/xploitscan-security.mdc` and `.cursorrules` so Cursor follows them while it writes code. Earlier versions of the CLI rejected the command. Update to CLI 1.12.2 or later.
5 changes

Safer team invitations and clearer trial reminders

  • +The GitHub Action and GitLab and Bitbucket pipelines now use `XPLOITSCAN_API_KEY` to run your plan's full rule set and add the run to your dashboard, once per CI job. If the key is mistyped or revoked, the log now says so instead of quietly scanning with the free rules. If your plan's scan limit is reached, the build keeps going on the free rules rather than failing.
  • +We updated our Privacy Policy and Terms of Service. They now describe how long we keep your data, what deleting your account removes, and how Free Trust Page data is handled. If you had an account before this update, you'll see a short notice about it in the app for the next 30 days, or until you dismiss it.
  • +Joining a team is now always your choice. When someone invites you, the invitation waits in Settings → Team, with Accept and Decline buttons and a note explaining what the team will be able to see if you accept. Invitations only match email addresses you've verified. Team owners will see invitees as Pending until they accept. If you invited someone before this change, use Resend on their invitation so they get the email with the link to accept.
  • +The trial-ending reminder in the dashboard now counts down in hours when a trial ends within a day and a half, the same way the reminder email does. Before, it rounded up to whole days, so a trial ending tomorrow night said "2 days".
  • +Trial reminders now say exactly what happens when a trial ends: the renewal amount, the date your card will be charged, and how to cancel beforehand if you don't want to continue. The Privacy Policy and Terms now describe data retention as it works today. Scan results, audit logs and checklists are kept while your account is active, and you can delete scans at any time, or delete your account from Settings to remove your data.
1 change

Plan changes and team seats

  • +Switching plans now updates the subscription you already have, wherever you start from — pricing, the scan screen, a feature prompt or settings. Each route ends at the same confirmation, with prorated billing. Team members deactivated when a plan lapsed can be brought back: they show as **Inactive** with a Re-invite button beside them. Removing someone from a team ends their access to shared scans and nothing else — their own scan history stays with their account.
2 changes

Plan status that stays current, and whole-folder uploads

  • +Your plan, trial dates and renewal date are now reconciled against Stripe on a schedule, instead of only when a billing event reaches us or you happen to open the app. A subscription that changed while you were away shows its real state the next time you look. Backing out of Stripe checkout also returns you to the plans now, rather than to the settings page.
  • +The web scanner now takes a whole folder — dragged in, or picked with Browse Folder. It walks subdirectories and skips `node_modules`, build output and `.git`, so a real project uploads in one step instead of a file selection. It also tells you when a drop contained nothing it can scan, rather than looking as though nothing happened.
17 changes

Configuration, quality checks, team access and a round of fixes

  • +New accounts receive the welcome sequence — day 1, day 3 and day 5 — and the two-day "anything blocking your first scan?" note. Accounts created from today onwards enter the sequence; nobody receives a backlog of older messages.
  • +A page that cannot load your data says so instead of showing you an empty one. This covers your security checklist, account activity log, team, team scans, trend chart and saved scan intent — and the checklist no longer saves over itself when it could not load.
  • +Site-verification tokens are no longer reported as possible secrets. Google, Bing, Yandex and Facebook domain-ownership tokens are published on purpose — Next.js renders them into a meta tag on every page — so flagging them cost you grade for doing the right thing. Secret detection also now weighs the name a value is assigned to, so a credential called something like `apiKey` is caught even when the value itself looks unremarkable. Your next scan may report secrets earlier ones did not.
  • +The compliance page now covers NIST SP 800-53, the CIS Critical Security Controls and the HIPAA Security Rule, alongside SOC 2, ISO 27001, OWASP and CWE. Each finding maps to specific controls, with the control's official title shown so a reviewer can check it. As before, this is an informational mapping to help you answer a security questionnaire — not an audit, a certification, or a claim that any control is satisfied. Long control lists collapse, so a tab opens on what matters.
  • +Long lists are paged. A scan report showed every finding at once — up to 500 full cards on one page — and now shows 25 at a time, worst first, so the criticals are always on the first screen. Links that jump straight to a finding still land on it, whichever page it is on. Your saved questionnaire responses are paged the same way.
  • +A pull request whose scan failed gets scanned on the retry. GitHub re-sends a delivery when a scan does not complete, but the record we write to avoid scanning the same pull request twice was also swallowing those retries — so a scan interrupted by a timeout or a transient error left the pull request with no check at all, looking exactly like the App not being installed. An interrupted scan now releases its claim, and a completed one is still never repeated.
40 changes

The scanner now checks your code against what you said it would do

  • +Actions that fail now say so. Saving notification preferences, revoking an API key or a session, deleting a saved questionnaire response, renaming a device and creating a checklist share link all report the outcome instead of assuming success, and a failed rename puts the old name back.
  • +Claiming a free Trust Page after signing up completes cleanly. If the page has already been claimed by another account, you are told that directly rather than sent back to your inbox.
  • +Deleting your account now removes everything tied to it, including your Trust Page — which previously stayed reachable by its public link — along with saved questionnaires and their per-prospect responses, custom domain verifications, project descriptions, your AI-analysis preference, dismissed prompts, review reminders and feedback. A connected GitHub App is unlinked rather than deleted, since the App still exists on GitHub.
  • +Saved scans now keep up to 500 findings, most severe first, so the detail you open matches the counts you were shown. Scans saved earlier kept fewer — re-run one to see everything it found.
  • +New: an intent check. Every other thing a scanner tells you is about code; this one is about the gap between your code and your own description of it. If your README says "customers can only see their own orders" and an endpoint returns orders without checking who is asking, you get that as a sentence: what you wrote, where you wrote it, and the endpoint that disagrees. It reads README.md, CLAUDE.md, AGENTS.md, .cursorrules, and a .xploitscan-intent file if you keep one.
  • +Benchmark figures quoted on the comparison and blog pages now match the benchmark page: XploitScan catches all 16 of the held-out third-party set.
13 changes

Findings now tell you the URL they sit behind — CLI 1.5.0

  • +CLI 1.5.0 — machine-readable scan output now names the AI builder that scaffolded the project. The terminal has shown this for a while ("Detected: Lovable project"); JSON, SARIF and the Splunk, Elastic and Datadog formats did not carry it at all, which is exactly where it is most useful — grouping or filtering findings by builder across many repositories in CI. It is context only and never affects a finding's severity or your grade.
  • +SARIF output was reporting the scanner's version as 0.1.0 regardless of which version produced it. If you upload results to GitHub code scanning, runs from different releases were indistinguishable. It now reports the real version.
  • +A finding used to give you a file and a line. It now also tells you the URL that reaches it, where one exists: "reachable at /api/webhooks/clerk". The scanner reads your project's own route table rather than guessing from folder names, so the path it shows is the path your app actually serves. Next.js, TanStack Router, React Router, Express and Flask are supported. It appears in the terminal, in JSON output, and on the finding card in the web report. Route information is shown for context only and does not change any finding's severity or your grade.
  • +Two new rules for account state that lives in the browser. The first flags an entitlement or role — a plan, a tier, an admin flag — read out of localStorage or sessionStorage and then used to decide what the user can do. Anyone can edit those values in their own browser, so the check has to happen on the server. The second is informational and flags per-account lifecycle state, such as whether onboarding is finished, being decided by browser storage alone: it is not a vulnerability, but it is why a signed-in user gets greeted as a first-time visitor on a new device.
  • +That second rule came from our own bug, and it is fixed here too: the "Welcome to XploitScan" prompt no longer appears for people who have already run a scan. Whether you are new is now answered by your scan history rather than by a flag in the browser, so signing in from a different browser or clearing site data no longer makes the product forget you.
  • +A scanner coverage fix worth naming plainly: files inside a folder called "onboarding" were being skipped during scans. The exclusion was meant to ignore our own demo fixtures and was matching far too broadly. If your project keeps real code in an onboarding folder, it was not being scanned, and your next scan may report findings that were always there. We would rather tell you that than let the number quietly change.
2 changes

The benchmark page now names the version of every scanner it compares against

  • +The methodology section of the benchmark page was showing a blank space where Bearer's version number should have been. The comparison itself was never affected — the numbers on the page are correct — but the page could not tell you which build of Bearer produced them, which is the whole point of publishing a methodology. It now names the version, and the same page states Semgrep's version the same way.
  • +If a version genuinely cannot be determined, the page now leaves it out of the sentence instead of printing an empty value. We would rather say less than show you something we did not actually measure.
2 changes

CLI 1.3.4 — please upgrade if you are on 1.3.3

  • +If you installed xploitscan 1.3.3, upgrade to 1.3.4. A change intended only to print an accurate rule count in the terminal caused the published package to carry rule definitions that belong to the paid tier. 1.3.4 removes them; the count is unchanged and still correct. Run `npm i -g xploitscan@latest`, or nothing at all if you use `npx`, which will pick up the new version on its own.
  • +The scanner's own detection benchmark now reports its coverage correctly. The page said a number of rules had no test fixtures that was wrong twice over — first by four, then by one — because the count was written by hand and then computed against a list that includes the entropy scanner, which is not one of the rules being counted. It is now derived from the rule catalog itself, so it stays right as rules are added.
12 changes

Prove you own the domain, and we'll scan the source behind your public source maps

  • +The top navigation now fits every window it is in, and collapses to the menu button at widths it cannot fill. Signed-in visitors see their own links on first paint rather than the marketing menu, and the bar stays put as you move between pages.
  • +New: if your source maps are public, we can now scan the source behind them. When a URL scan finds source maps being served, prove you control that host and we'll download them, rebuild your original TypeScript, and run the full rule set over it — real findings at file and line, with no repository access and nothing to install. It is the same scan you'd get from pointing the CLI at your code, reached from a URL box.
  • +Proving it takes about a minute: we give you one line to save at /.well-known/xploitscan-verification.txt on that host, and check for it. A DNS TXT record works too if you'd rather, and if you control the zone — many apps live on a builder-provided subdomain where you don't, which is why the file comes first. The proof belongs to your account, so verifying a domain doesn't hand it to anyone else, and we re-check it rather than trusting it forever, because hosts change hands.
  • +The reconstructed scan always tells you what it could not read. Plenty of builds ship maps without the original file contents embedded, and a large map may be more than one scan will download — in either case you get the count of files that went unchecked instead of a clean-looking result over half your app. Nothing is stored: the source is rebuilt in memory for that one request and dropped.
  • +Everything the URL scan already did stays free and needs no account. The verification step exists only for the reconstructed scan, because that output is the one thing on the page that isn't already sitting in your visitors' devtools.
  • +Every verification command on those pages tells you what it can answer on your plan. Some of the checks they cover run only on a paid plan, so each command names the rules a free scan skips and says what the number it returns does and does not mean — a zero from a command whose checks never ran is not a clean result, and a command that mixes free and paid checks returns the free one's count, not nothing. Same for the closing call to action: the first scan still needs no card and no signup, and it runs the 30 free rules rather than the full 212 the Index round used.