AI App Builder Audits · AI Development Series
Databutton gives you a proper backend rather than pushing everything into the browser. That is the right shape. It also means every endpoint has to defend itself.
Databutton generates full applications with a genuine separation between front end and back end, aimed particularly at data-heavy and analytical work where Python is the natural choice.
Having a real backend is a meaningful advantage: there is one place where access rules can be enforced properly, rather than scattered through browser code. The catch is the same as with any FastAPI application — protection is opt-in per route. An endpoint without an authentication dependency attached is simply public, with no warning and no error.
Databutton applications also tend to accumulate endpoints quickly, because adding one is the natural way to make anything work. The ones added late in a build are the ones we find unprotected.
These recur in generated FastAPI applications.
FastAPI protects a route only when you attach a dependency that checks the caller. Generated code gets this right on the obvious routes and misses it on exports, reports, administrative actions and anything added to fix a problem at the end of a session.
We go through every route and record what it requires before it will answer.
What it costs you: one public endpoint exposing the data behind all the protected ones.The subtler and more common version: the endpoint confirms you are logged in, then takes a record identifier from the request and returns that record without checking it belongs to you.
Every honest user requests only their own data, so nothing ever looks wrong. Changing a number in a request is all it takes.
What it costs you: customer data exposed to other customers. Reportable under UK GDPR.Because Databutton is often used for data work, we frequently find endpoints that pull an entire dataset into memory and compute over it on each request. With test data this is instantaneous.
At real volume it is slow, expensive, and eventually falls over. The fix is usually to push the work into the database rather than the application, which is straightforward once identified.
What it costs you: an application that degrades sharply as your data grows.For anything analytical, Databutton is a sensible choice: Python is genuinely the right language for that work, and getting a usable interface on top of it without building one by hand saves real time.
The honest summary: Databutton starts from a better architecture than most generators, which means the problems it leaves are narrower and more fixable. They are also entirely invisible until somebody goes looking, because a missing check never announces itself.
The code, exported from Databutton or in a repository you control, and read-only access to whatever database it uses. We do not need your Databutton account, we will not deploy anything, and we will not change your application.
It depends what it can reach. Internal tools frequently have broader data access than customer-facing ones, so the consequences of a mistake or a compromised account can be larger rather than smaller. If it only reads data nobody would mind leaking, you are probably fine.
No, and we would rather say so plainly than pretend otherwise. We build with Claude Code and Cursor, with senior developers designing the system, reviewing every change and testing it. What makes us useful here is not Databutton expertise, it is that Databutton produces React, Python and FastAPI, which is what we have been building and fixing for years.
We audit what these tools produce, whichever one you used.
Tell us roughly what you built and how many people use it. If an audit is not the right thing for you, we will say so.
What the report covers:
We reply within one working day.