
Security reviews for agencies shipping client apps
Define authorization, scope, evidence ownership, remediation, retesting, and handoff before an agency calls a client app ready to release.
Builder workflows
Practical security habits for builders shipping apps written largely by AI coding tools.
92published articles

Define authorization, scope, evidence ownership, remediation, retesting, and handoff before an agency calls a client app ready to release.

Block standing production delete authority with separate identities, permission ceilings, exact approvals, short-lived access, and audit records.

Prevent prompt injection in AGENTS.md and coding-tool rules with provenance, code ownership, protected review, scoped rules, and conflict tests.

Run an evidence-based pre-launch review across authorization, secrets, inputs, dependencies, deployment, agents, monitoring, recovery, and retests.

Map personal data, purposes, retention, processors, user rights, deletion, and incident handling before an AI-built app reaches real users.

Do not share live credentials, customer data, regulated records, unreleased business information, or code outside your authorized policy.

Verify package identity, lock resolved versions, inspect the dependency graph, and interpret advisory matches without treating a clean scan as proof.

Not by default. Generated code needs requirements, human review, independent tests, constrained deployment, monitoring, and recovery evidence.

Use AI-generated tests as regression checks, then add independent invariants, negative cases, mutation checks, and scoped retest evidence.

Secure Stripe billing with server-owned entitlements, raw-body webhook verification, idempotent processing, constrained keys, and failure-path tests.

Use a bounded AI security review prompt to produce traceable candidate findings, safe test ideas, and explicit uncertainty without mistaking output for proof.

Identify secrets shipped in browser bundles, move privileged calls behind a server boundary, and rotate exposed credentials safely.

Read an app security score as a versioned summary of scoped evidence, not a breach prediction, universal benchmark, or guarantee of safety.

Prove backup recoverability in an isolated restore drill before a coding agent receives destructive production access.

Separate Base44 app visibility from data permissions, review table access and backend secrets, then verify the deployed app with distinct accounts.

Identify the Bolt backend, protect server functions and webhooks, test database policy, and verify the published deployment.

Make authentication responses uniform, throttle online guessing by account and network signals, and test recovery flows safely.

Keep untrusted pull requests outside privileged CI jobs with narrow tokens, protected deployments, bound OIDC claims, and verified artifacts.

Constrain Claude Code permissions, sandbox access, MCP tools, and release actions while keeping the coding workflow useful.

Build a client security handoff with executive context, technical evidence, coverage limits, finding states, retests, owners, and secure delivery.

Understand why route guards and hidden controls cannot enforce access, then place authorization at the server operation that needs it.

Treat Worker bindings as capabilities, keep secrets encrypted, constrain outbound fetch and caching, and verify routes with production-shaped Wrangler config.

Set Codex sandbox, approval, network, environment, and MCP boundaries, then verify code changes before any release action.

Isolate coding agents with disposable workspaces, minimal mounts, non-root execution, resource limits, and explicit outbound network policy.

Remove unsafe shell boundaries from agent tools, constrain process arguments, and isolate the external commands that remain necessary.

Replace wildcard or reflected origins with a minimal browser-sharing policy, correct credential handling, and cache-safe headers.

Treat critical severity as a triage input: confirm scope and exposure, contain credible risk, preserve evidence, fix, and run a fresh retest.

Protect cookie-authenticated state changes with framework controls or verified tokens, plus SameSite and Fetch Metadata layers.

Review Cursor data handling, project rules, dependencies, app controls, agent permissions, and independent evidence before launch.

Stop production errors from exposing stack traces, paths, queries, and framework internals while preserving useful, access-controlled diagnostics.

Respond to an exposed API key: contain access, rotate safely, verify rejection, investigate misuse, clean reachable copies, and document recovery.

Separate Pydantic request validation from object authorization, then configure CORS, hosts, proxy trust, TLS, errors, and API documentation.

Harden coding-agent workflows with untrusted-input separation, minimal token permissions, pinned actions, constrained OIDC, and approval gates.

Check generated package names against official registries, repositories, releases, and owners before any installation runs.

Run a lightweight threat-model review for an AI-built app by mapping real data flows, assigning owners, and turning decisions into testable release checks.

Make retries and duplicate webhooks safe with durable operation keys, canonical request binding, atomic state changes, and stored results.

Use a safe two-account test to find object authorization flaws, then fix the resource lookup instead of hiding identifiers.

Contain indirect prompt injection by separating untrusted content from instructions, limiting tools, and testing with harmless canary actions.

Define strict server-side request schemas, reject unknown and oversized data, and enforce business invariants before processing.

Inspect dependency scripts before they execute, install without production credentials, and allow only reviewed lifecycle code in npm.

Validate JWT signatures, algorithms, issuers, audiences, time claims, and token types with a deployment-specific trust policy.

Narrow MCP tools by verb, resource, schema, token audience, and approval so model-controlled calls cannot inherit broad authority.

Review a Lovable app across its public frontend, Edge Functions, database RLS, authentication, scans, and publish settings.

Stop request bodies from changing roles, owners, prices, and workflow state with operation-specific schemas and explicit data writes.

Contain multi-agent prompt injection with preserved provenance, structured handoffs, separated capabilities, intent checks, and safe canary tests.

Carry a server-owned tenant context through APIs, jobs, caches, storage, and database queries, then verify it with two tenants.

Treat every callable Next.js server entry as an API, centralize authorization in a server-only data layer, and minimize data sent to the browser.

Build an ordered Express request contract, authorize resources at every route, and verify proxy, session, limit, error, and dependency settings.

Secure OAuth redirects with exact registration, transaction-bound callback state, PKCE, issuer checks, and a strict code exchange.

Scan resolved dependencies with OSV Scanner v2, interpret advisory matches, manage exceptions, update safely, and verify the result.

Store passwords with maintained memory-hard hashing, deployment-tested work factors, safe migration, and rehashing on login.

Design reset and verification flows with uniform responses, single-use tokens, trusted links, and explicit session decisions.

Keep file reads, exports, and archive extraction inside a trusted directory with canonical containment checks and safer identifiers.

Authorize paid features from server-owned entitlement state, reconcile provider updates, and handle stale access without trusting client claims.

Find generated code that reports success without completing the promised work, then verify durable state, failure behavior, and a fresh retest.

A prototype becomes production when failure or misuse can affect real people, data, money, access, obligations, or business operations.

Find exposed previews, app origins, database APIs, and storage before launch, then prove each access boundary with logged-out and second-account tests.

Design endpoint-specific rate, concurrency, payload, queue, and cost limits for AI APIs without trusting a single weak identifier.

Use React's rendering protections correctly while keeping authorization, secrets, sensitive data, and side effects behind verified server boundaries.

Separate Replit Preview from production, choose the right deployment, protect secrets and APIs, and inspect live response headers.

Structure security results as SARIF 2.1.0 with stable rules, locations, fingerprints, redaction, validation, and honest evidence limits.

Compare the evidence, timing, targets, and blind spots of SAST, DAST, and SCA, then combine them into a practical release workflow.

Catch secrets in staged changes, enforce scanning on the remote, govern bypasses, keep fixtures inert, and rotate real exposures before cleanup.

Keep live credentials out of AI tools, and use customer or regulated data only through an approved, minimized workflow with verified controls.

Inventory privileged actions, enforce one server-side policy across every method, and test admin routes with ordinary accounts.

Build a staged upload pipeline with early size limits, server-generated names, content checks, quarantine, and private delivery.

Secure an MCP server with deliberate transport choices, audience-bound tokens, per-tool authorization, session isolation, and execution-time approval.

Configure host-scoped session cookies, choose SameSite deliberately, rotate identifiers, and test server-side expiry and revocation.

Design scoped audit events that reconstruct sensitive actions, resist silent changes, protect private data, and survive collection failures.

Build a pull-request security gate around immutable commits, explicit coverage, scanner failures, reviewable results, and one required decision.

Retest a security fix against a fresh build, preserve equivalent coverage, check adjacent paths, and record confirmed or inconclusive outcomes.

Build browser security headers from application behavior, stage CSP safely, and verify policies by route instead of chasing a score.

Turn scoped security evidence into an accountable go, conditional, no-go, or not-evaluated decision with owners and rollback readiness.

Define security events, route actionable alerts to an owner, and test the complete monitoring path before an AI-built app launches.

Prevent PII, tokens, prompts, and request data from entering logs through source minimization, field allowlists, tested redaction, and retention controls.

Create one deny-by-default authorization seam for API actions, resources, and tenants, then test every sensitive path.

Share security reports safely with audience-specific copies, data minimization, verified redaction, controlled delivery, expiry, and revocation.

A founder-sized security sequence for accounts, authorization, secrets, dependencies, recovery, monitoring, and release decisions.

Inspect source maps, bundles, package tarballs, and CI artifacts before release so private source and files do not reach public storage.

Replace interpolated SQL values with bound parameters, map dynamic identifiers from allowlists, and test query builders safely.

Bind URL validation to DNS resolution and the connection, recheck redirects, block private destinations, and restrict egress.

Verify Stripe against the exact raw request body and the correct endpoint secret before parsing events or changing application state.

Build and test Supabase row-level security with precise grants, command policies, and two-account checks before release.

Build a lightweight startup threat model from assets, trust boundaries, misuse cases, mitigations, owners, tests, and review triggers.

Remove cleartext exceptions from mobile releases, test the real networking stack, and verify certificates, redirects, and backend TLS.

Use two owned accounts and synthetic records to test object-level authorization across reads, writes, deletes, exports, files, and nested resources.

Trace a v0 app from generated code through Next.js server boundaries, Vercel previews, environment variables, and the deployed site.

Verify a vulnerability finding by checking scope, code paths, prerequisites, safe reproduction, impact, and independent evidence.

A six-layer guide to testing AI-built apps, preserving evidence, retesting fixes, and making an honest release decision.

Combine event-triggered checks with a weekly default-branch scan, named ownership, response deadlines, and recorded retests.

Control Cascade terminal actions, MCP tools, credentials, shared rules, and branch review as Windsurf moves into Devin Desktop.

Trace untrusted Markdown and model output through parsing, sanitization, DOM insertion, CSP, and safe local verification.