Matt Turley, Continuum. Updated November 5, 2026.
For founders whose product is a thin or thick layer over a model API (chat, summarisation, agents, generation), usually built with AI coding tools.
Cost and trust. An app that calls an AI model for each user turns every request into money. The usual failures are the provider key reachable from the browser, no per-user limit or spend cap, user data stored in prompts and logs, untrusted text treated as instructions, and long responses that time out.
A normal web request costs a fraction of a cent. A model request can cost orders of magnitude more, and the cost varies with input length, so a bug, a bot or a single heavy user is a billing event. Wrapper apps are the category most likely to receive a surprise invoice.
There is also a trust problem that older apps do not have. The model follows instructions in whatever text it is given, including text from a web page, a document or another user. When your app feeds that text to a model that can take actions, the author of the text can steer them.
And the data is often the point. Users paste in contracts, code, customer lists and medical notes. The app's logs, its prompt history and the provider's retention settings become places that data lives.
How to tell Search the built JavaScript for your key prefix, and inspect network calls. If the browser calls the model provider directly, the key is public. Variables with a public prefix ship to every visitor.
The fix Call the model only from server code, rotate the exposed key at the provider and put your own authenticated route in front of it.
How to tell One account can send unlimited requests, anonymous users can call the endpoint and the provider dashboard has no budget alert.
The fix Require login, add per-user quotas and rate limits, cap the input and output length and set spend limits and alerts at the provider.
How to tell Your app summarises web pages, emails or uploaded documents, and a hidden line in one of them can change what the model does, such as revealing other content or calling a tool.
The fix Treat all fetched and uploaded text as untrusted. Give the model the minimum tools and data, require confirmation for consequential actions and never let model output run as code or render as raw HTML.
How to tell Prompts and responses are saved in your database, in logs and in analytics. The provider retains requests under its default terms. Users never agreed to that, and your privacy policy does not say it.
The fix Decide what you store and for how long, check the provider's retention and training terms, minimise what goes in prompts and make the privacy policy match reality.
How to tell Responses stop partway, users see a timeout or a blank screen and the failures grow with the length of the output. A function that waits for a whole generation can exceed its time limit.
The fix Stream the response, raise the function's duration where the plan allows or move long jobs to a background process with a status the user can check.
How to tell The provider returns 429 or 5xx and the app shows a crash or silently returns nothing. Model names are deprecated and calls begin to fail on a date.
The fix Retry with backoff, show a clear message, fall back where it makes sense and track the provider's deprecation notices for the model you use.
If the app is an internal tool used by a handful of people you know, most of the abuse and cost controls matter less. A key kept server-side and a provider spend cap still take ten minutes and are worth doing.
The free Leak Check looks for secrets exposed in the client bundle, which is the first thing to rule out. A Ship Check reads the server code for limits, data handling and untrusted-input risks.
free Leak Check: Paste your live URL. It runs seven surface checks (reachability, SSL, auth flow, payment path, exposed secrets in the client bundle, Supabase exposure, broken links and performance) and returns a green, yellow or red for each. It is a surface scan, not a full security audit. Or: Get a Ship Check, $299.