This browser tool flags Python logging, print, and raise calls that write sensitive data into logs, with a PCI DSS requirement and fix for each line.

What you get: Checks every .py file in the repository in one run and exports the findings as a Markdown evidence table for the PCI DSS assessment Full version · $149 →
Updated 2026-09-25 · ReadyStack
Flags Python logging, print and raise calls that write card numbers, CVV, track data, PINs, passwords or auth headers into logs, with the PCI DSS v4.0.1 requirement and a fix per line. Runs entirely in your browser — nothing is uploaded.
Same engine as the VS Code extension, byte for byte.
Free for the file open in your editor - no key, no limit. The workspace sweep and the report ask for a key.
Open VSX (Cursor, VSCodium)Team? One key for every ReadyStack linter, 5 seats, $149 once
Checks every .py file in the repository in one run and exports the findings as a Markdown evidence table for the PCI DSS assessment
One payment, one licence key for this tool. The key is shown right after payment.
Semgrep Teams, a general code-scanning service, lists $35 per contributor per month once a team is past its free 10-contributor tier
Buy the full version — $29Need more than this one? ReadyStack Pass opens all 679 files and 559 full versions — $29/month or $199/year. See the Pass →
· ReadyStack
Real numbers from this tool, line by line.

6 PCI DSS leaks in Python logs: that is what one Flask payment handler produced when I checked it on 2026-09-24. If you are a Python backend developer at a card-accepting merchant, payment provider or fintech, and a PCI DSS v4.0.1 assessment is coming, this is the file to look at first.
The handler is short: a /pay route that reads a JSON body and calls Stripe, a /terminal route that receives a card swipe, and a /login route. Here are the 6 findings, with line numbers:
logger.info("incoming payment payload: %s", request.json) logs the whole body. On a payment route it carries the PAN and CVV. Req 3.3.1.logger.debug("charging card %s", card_number) writes the full PAN. Req 3.5.1 says a PAN must be unreadable anywhere it is stored, and logs count.logger.error(f"card declined, cvv={cvv}: {e}") puts the card verification code into an error log. Req 3.3.1.2 says it must not be retained after authorization.print("swipe received", track2) writes track 2 data to stdout. Req 3.3.1.1.logger.debug("auth headers: %s", request.headers) logs the Authorization header. Req 8.3.2.The fixed version of the same file logs the order id, the amount and card_number[-4:]. It gives 0 findings.
A leaked line does not go away when you fix the code. Req 10.5.1 asks you to keep audit log history for at least 12 months. A line written on 2026-09-24 is still stored on 2027-09-24. Every log store that holds it is in scope for the assessment.
General Python linters check style, and some flag hard-coded passwords. None of them tells you that cvv inside an f-string in logger.error is a Req 3.3.1.2 problem. A chat assistant can explain the requirement, but it gives no line numbers in your file.
Plain message text is ignored. logger.info("password reset for %s", user) is not a finding, because the password is not in the values. Only the arguments, the f-string {expressions} and concatenations count. A call that wraps over several lines is joined first. There are 10 rules: PAN, CVV, track data, PIN, password, auth headers, whole request bodies, locals() dumps, Luhn-valid numbers inside log text, and send_default_pii=True in Sentry.
The date matters. Check a point-of-sale handler on 2026-12-01 that logs track_data and pin_block, dumps locals() and prints a test card number, and you get 4 findings, each stored until 2027-12-01 under the 12-month retention. A refund module with Sentry's send_default_pii=True, a raise ValueError that includes card.pan, and a logged STRIPE_API_KEY gives 3.
Semgrep Teams, a general code-scanning service, lists $35 per contributor per month once a team is past its free 10-contributor tier. This lint does one narrow job and cites the requirement per line.
The free version checks the open .py file against all 10 rules and lists every leaking line with its requirement and fix, in VS Code or in the browser. For one file, that finishes the job. The full version checks every .py file in the repository in one run and exports a Markdown evidence table for the assessment.
It does not prove compliance and does not follow data across files. Paste your payment handler in and see what it writes to your logs.
It checks every logger, logging, print and raise statement in a Python file against 10 rules. For each line that writes card data or credentials, it names the PCI DSS v4.0.1 requirement and gives a fix. A Flask payment handler gave 6 findings: request.json logged whole, card_number, cvv in an f-string, print of track2, password and request.headers. The fixed file gave 0.
It is for Python backend developers at card-accepting merchants, payment service providers and fintechs who use Flask, Django, FastAPI or Celery and are preparing for a PCI DSS v4.0.1 assessment. It also suits reviewers checking a payment handler that an AI coding assistant wrote, before that code writes a CVV or card number into production logs.
General Python linters check style, and some check for hard-coded passwords. They do not map a CVV, track data, a PIN block or a Luhn-valid card number inside a log call to PCI DSS Req 3.3.1 or 3.5.1. A chatbot can explain the rule, but it gives no line numbers in your own file.
The free version checks the open Python file against all 10 rules and lists every leaking line with its line number, PCI DSS requirement and fix. For one file, that is the whole job. The full version is $29 once for a licence key. It checks every .py file in the repository in one run and exports a Markdown evidence table for the assessment.
Semgrep Teams, a general code-scanning service, lists $35 per contributor per month once a team is past its free 10-contributor tier. That service covers far more than logging. This lint does one narrow job: it finds the log, print and raise lines that write card data or credentials, and cites the PCI DSS v4.0.1 requirement for each one.
One question, answered by the person who built it. Your email only if you want the answer sent.
Paste this code into your page. It runs in your visitor’s browser and stays up to date. Nothing your visitors type is stored.
For businesses: your name and logo instead of ours, and each visitor’s result + e-mail in your inbox (only when they tick consent) — Pro from $19/month. See Pro →
For a team or company: for an invoice with your company details, a quote or several licences, write to [email protected].
Recruiting workflow template: applicant retention clockRecruiting workflow template for n8n: when may you delete a rejected applicant's file? 29 CFR 1602.14, 41 CFR 60-1.12 and German AGG dates…FreeFull version $199
RF DETR Migration Check — find yolo ties and show replacementsThis free browser tool finds Ultralytics YOLO ties in project files and Python code and shows Apache-2.0 RF-DETR replacement lines.FreeFull version $29Security Headers Lint - CSP and Dead HeadersReads security headers and CSP line by line in your config file and names the lines that silently do nothing: retired headers, keywords…FreeFull version $29
IEC 62304 SOUP List — check your SOUP list freeWhat you get: Scan every SOUP list in the workspace at once and export a dated evidence record (Markdown + CSV) to file with the technical…FreeFull version $29
Superseded Standard checker — check citations for superseded standardsThis browser tool finds superseded standards and repealed laws cited in RST and Markdown documentation and gives the date each ended.FreeFull version $29Tax Year Constant DriftFinds the tax years, statutory limits, filing thresholds and rates that are hardcoded in your payroll and invoicing code. 26 rules, in your…FreeFull version $29ReadyStack
Calculators, templates and deadlines for the rules that change every year — free in your browser.