It remembers your app between scans.
A scanner that starts from zero every time can only ever tell you generic things. AppScan keeps what it learned, re-verifies it as the code changes, and uses it to write findings in your application's own terms.
15 domains of what we know.
Each fact records which scan established it, what evidence it rests on, and how sure we are. You can open the list and read the whole picture - there is no hidden model state that only the product can see.
- TECH_STACKNext.js 15 on Vercel, Prisma against Postgres, Stripe for payments.
- ROUTES38 endpoints from source, 12 of them mutating, 4 seen at runtime only.
- AUTHENTICATIONSession cookies issued by the app; no third-party identity provider.
- AUTHORIZATIONrequireRole guards 9 of 12 mutating routes.
- TENANCYRows are scoped by organizationId; two lookups are not.
- DATA_MODELOrders, customers and refunds hold personal data.
- EXTERNAL_SERVICESStripe, Resend, Supabase storage, Sentry.
- SECURITY_CONTROLSCSP present, HSTS present, webhook signatures verified.
- RATE_LIMITSNo rate limit observed on the public search route.
- INFRASTRUCTUREDockerfile runs as root; database port published in Compose.
A fact says how sure it is.
Security tools lose trust by stating guesses as facts. Every fact here carries its state on its face.
Proven by evidence a rule collected, from source or from runtime.
Strongly indicated but not proven. Used for ranking, never for a claim.
A check is in flight; the fact is being re-established right now.
We do not know, and the product says so instead of inventing an answer.
It used to be true. A change made it false, and the history is kept.
Memory is what makes the next scan better.
- Findings in your terms
“Your Stripe key” rather than “a credential”. The brain knows which services you use and what they can do.
- Cheaper AI
A summary of established facts is a far smaller prompt than a repository, which is why a deep review fits inside a fixed budget.
- Sharper priorities
A route that holds personal data outranks one that does not. Ranking needs to know which is which.
- Regressions worth the name
Invariants and baselines only exist because something remembered how things were before.
Give it one app and let it learn.
The first scan establishes the facts. Every scan after that is measured against them.