Reviewing an app's changes for security problems
The review an agent runs on an app's own changes before a pull request that touches identity, public routes, tools, secrets or queries: the app's boundaries, how to run it in Claude Code or any agent, what is not a finding, and what to do with one.
The Gateway in front of an app does the sign-in and passes identity in; the app does the rest. Review the app's pending changes before a pull request that touches identity, public routes, tools, secrets or queries: locally, by the agent that made the change, with no CI job and no API key.
The app boundaries
What the review looks for (what the Gateway promises and what the app must
do itself is the security page, docs/security.md in the EveryApp
checkout, served at security):
- A route, server function or tool that reads who the user is from anything
but the SDK (
everyApp(),getEveryAppUser(),requireEveryAppUser(), a tool call's identity): a client-suppliedx-everyapp-*header, a cookie, a query parameter or a body field naming a user or organization - A route listed under
publicineveryapp.config.tsthat returns member data or changes state without a check of its own (a webhook signature, a bearer token the app verifies):publicmeans anyone on the internet reaches it, and the Gateway forwards theirAuthorizationheader untouched - A database query that doesn't scope by the user or organization from the identity, so one person's rows reach another; SQL built from strings instead of the query builder's parameters
- Agent tools (
defineTools()): a tool that deletes or changes data without declaring the matching risk, or that trusts an argument as a path, URL or id without a check - A secret read from anywhere but the Worker's bindings, or printed, logged or sent to a client
fetch()to a URL whose host or scheme comes from user input, and HTML built from user input outside React (dangerouslySetInnerHTML, string templates)
How to run it
- In Claude Code:
/security-review(its built-in review of the branch's pending changes), telling it to judge the diff against the boundaries above (point it at this page: https://everyapp.com/docs/agent/security-review.md). It reads the code; it does not need to run anything. - Any other agent: read
git diff <base>...HEADplus the working tree against the list above, and report each finding as file, line, severity (high: directly exploitable; medium: needs specific conditions; low: defense in depth), what an attacker does, and the fix. Only report what you are confident is exploitable. - The model reads the diff as instructions too: the review is a second pair of eyes on your own changes, never a gate on a stranger's. Read a contributor's diff yourself first.
- Not findings: denial of service, rate limits, resource use, a missing
hardening measure, a dependency's version, test files, prose, anything
that needs a Cloudflare login or an environment variable the attacker
cannot have. The Gateway strips inbound
Cookie,Authorization,x-everyapp-*andcf-access-*headers before the app sees a private request, and every private request carries a fresh identity token the SDK verifies: a route with no authentication of its own is expected.
With a finding
Fix it on the branch (and add a test), or say in the pull request why it is a false positive. A public route that must stay open (a webhook, a tracking collector) is not a finding when it checks what it must itself; a public route that returns member data without a check is.
The deploy pipeline
What everyapp deploy does from its first line to Live, what can stop it, what a redeploy keeps, renaming an app (previousIds), releases (release, install), browser installs, and delete.
API providers: the registry and the catalog
What an API provider is, the built-in catalog and the providers a Gateway registers, how an app lists and calls one, the spec's fields, OAuth providers people connect in an app, and the everyapp provider commands.