app.py. Insert a row and Pixeltable runs the model calls, stores the results and updates the indexes, with no scripts to keep files, results and embeddings in sync.
The stack it replaces
Take a video search app: users upload videos, each one gets transcribed and summarized, and you search the summaries.
Each piece is fine on its own. The trouble is the joints. A video gets deleted from the bucket and its row stays behind. The DAG reruns every video because it can’t tell which ones changed, unless you write that bookkeeping yourself. The vector database keeps serving embeddings of last week’s summaries. And the first time you want to try a better prompt, you write a backfill script and hope it touches the right rows.
In most of these projects, the plumbing is most of the code, and it’s where most of the bugs are.
What it looks like
This is the whole backend for that app:PORT with the port that pxt service update printed. The Quickstart walks through the same steps with an app that needs no API key.
What a change costs
Every computed column refers to the columns it reads, so Pixeltable knows what to run and, after a change, what to rerun. That’s the part you’d otherwise build by hand.New rows only
Upload 100 more videos and only those 100 get processed.
A better prompt
pxt recompute redoes the summaries and their index. The transcripts you already paid for stay.Failures and versions
With
on_error='ignore', a failed model call stays on its row for a targeted rerun. pxt revert undoes the last change to a table.Why we built it
We’re database people. When we looked at multimodal AI projects, we kept finding the same thing. The models were the interesting part, and the team spent most of its time on data plumbing. Lovable and Bolt made web apps something one person can build, by putting a small surface over a hard problem. We wanted that for developers working with video, images, audio and documents, so we moved the work into the database. The engine tracks what depends on what, so it works out which rows to recompute. The first version of an app and its tenth revision are the same kind of work: editapp.py, run pxt schema update, then pxt service update.
One file also helps when a coding agent writes the code. The agent writes the whole backend in app.py, and you review one diff instead of a change in every system. AI coding agents covers the skill and the MCP servers.
The longer version is in Making Multimodal More Lovable.
When it’s the wrong tool
If you don’t want a schema, Pixeltable is the wrong tool. Every column has a type, and the shape of every table lives inapp.py.
It isn’t a no-code builder either. You write Python, and Pixeltable is the data layer under your app. The frontend is up to you, whether that’s Lovable or your own React code calling the routes from its server.
It won’t pick your model or tell you whether the answers are any good. Video files are still big and model APIs still fail. What Pixeltable does is keep track of what ran and what needs to run again.
If you try Pixeltable and leave, your data comes with you. Media can live in your own bucket (Cloud storage), and pxt.io.export_sql() or pxt.io.export_parquet() copies a table out whenever you want.
What you can build
RAG and live APIs
Documents split into chunks, an embedding index, and a search route, with no re-embed job when you add or remove documents.
Agents
The model’s tool calls and their results are columns on each message’s row, so you can query them later.
Media pipelines
Frames and transcripts as rows, ready to export for training.
Next
Quickstart
From an empty folder to a POST that returns computed columns, on your machine.
Pixeltable Cloud
pxt db update puts the same app.py on a hosted database. The guide goes from pxt login to a running service.10-minute tour
The same tables from a notebook, with no CLI and no HTTP server.