Make Building Multimodal AI Data Apps Dead Simple
The unified multimodal backend for AI data apps in one Python file.
Declare → Experiment → Serve
Pixeltable is the database, orchestration, and serving layers.
pxt schema updateDeclare
Creates the tables app.py declares. Media and structured columns live together.
pxt service updateServe
Starts the FastAPIRouter services app.py declares. Local dir or pxt://. pxt service list prints the URL. pxt service run is local only.
From the creators of Apache Parquet and Impala and engineers who worked at:
From the creators of Apache Parquet and Impala.
Insert a row, the rest follows
RAG that stays in sync
class Chunks(TableModel, iterator=document_splitter(Docs.document))Insert a document. Chunks, embeddings, and answers update. Retrieval is an @pxt.query on that view.
Media that processes on insert
class Frames(TableModel, iterator=frame_iterator(video=Videos.video, fps=1))Insert a video or image. Frames, thumbnails, and captions are the view.
Agents you can query later
tool_output = invoke_tools(tools, response)Insert a message. Tool calls and the answer are assignments, not a loop in memory.
HTTP without writing handlers
api.add_insert_route(Docs, path='/docs', inputs=[Docs.document])add_insert_route is the insert URL. Keep @router.post for multi-table work or side effects.
One app.py
No extra blob store, vector database, orchestrator, or glue. The walkthrough is the receipt.
Subclass TableModel. Every annotation becomes a stored column.
import pixeltable as pxtTableModel = pxt.model_base()class Videos(TableModel, name='videos'):video: pxt.Video # also pxt.Image, pxt.Audio, pxt.Document, pxt.Jsontitle: pxt.String
After this step
videos table
After launch, the same app.py
Only new rows recompute
label = label_scene(detections, Videos.description)Adding a hundred videos costs a hundred videos of work, not the whole table.
Schema changes ship as a reviewed plan
pxt schema diff app.py my_appDropping a column or an index needs --allow-destructive. In CI, a pending change exits 2.
Failed rows stay in the table
pxt errors my_app/frames --col labelThe cell is None plus errortype and errormsg. Fix the cause and recompute those rows.
Any version is recoverable
pxt revert my_app/frames --steps 3pxt history shows what a revert would undo before you run it.
Production operationsVersion control and lineageBrowse media and errors with pxt dashboard
Frequently asked questions
The questions we get first.
What is Pixeltable?
- Pixeltable is the unified multimodal backend for AI data apps: the database, orchestration, and serving layers in one Python file. You declare tables, computed columns, and HTTP routes; apply it locally, serve it, then publish the same file to Pixeltable Cloud. Insert a row. Computed columns run. Indexes stay current. No extra vector database, queue, or cache to keep in sync.
Is Pixeltable open source and free?
- Yes. Pixeltable is Apache 2.0 licensed and free forever when self-hosted (pip install pixeltable). Declare and run locally, then deploy the same app to Pixeltable Cloud: free Community, $29/mo Pro, or custom Enterprise.
How is Pixeltable different from a vector database or LangChain?
- A vector database stores embeddings and LangChain orchestrates calls, but you still wire storage, ETL, and serving yourself. Pixeltable is the database, orchestration, and serving layers in one Python file: computed columns run on insert, indexes stay current, and HTTP comes from the same schema. No extra vector database, queue, or cache to keep in sync.
What data types does Pixeltable support?
- Pixeltable natively handles images, video, audio, documents, and structured data, with built-in chunking, frame extraction, embedding, object detection, and LLM inference across 25+ AI providers.
How do AI agents use Pixeltable?
- Agents can follow https://pixeltable.com/get-started.md (install pxt, the Pixeltable Skill, and MCP), run `pxt init` then `pxt service example --out app.py`, read /llms.txt, and use MCP to create and maintain multimodal AI data apps across the Declare → Experiment → Serve loop. The /developers page lists OpenAPI, MCP, auth.md, and the pxt CLI.
Where are the public API, OpenAPI, and MCP surfaces?
- Onboard at /get-started.md. The OpenAPI spec is /openapi.json (public /ask, /mcp, /health; also /v1/ask, /v1/mcp, /v1/health). The read-only WebMCP server is /mcp and /.well-known/mcp. Discovery catalogs are /.well-known/ard.json and /.well-known/api-catalog. Ask questions at /ask (NLWeb). The Python SDK is the PyPI package pixeltable; the pxt CLI ships with pixeltable[serve]. Human hub: /developers.
Do I need a Pixeltable account to start?
- No. Local use is `pip install 'pixeltable[serve]'`, then `pxt init` and `pxt service example --out app.py`. Self-hosting stays Apache 2.0 with no account. Cloud API keys are only for hosted databases and Deploy endpoints after you sign in; Community cloud is free. See /developers for the API, OpenAPI, and MCP hub.
Build and maintain are the same job
The backend is one schema you keep, not a stack you assemble.
Video, image, audio, and documents are column types, not paths. See solutions