PixeltablePixeltable Logo
  • Pricing
K
GitHubDiscord
Video Intelligence Pipeline in 20 MinutesBuild a complete video pipeline in one sitting

Make Building MultimodalAI Data Apps Dead Simple

Make Building Multimodal AI Data Apps Dead Simple

Declare once, run locally, deploy to cloud.

Talk to Us
From the creators of Apache Parquet and Impala and engineers who worked at:
Apple
Google
Amazon
Facebook
Airbnb
Cloudera
MapR
Dremio
Oracle
IBM
Apple
Google
Amazon
Facebook
Airbnb
Cloudera
MapR
Dremio
Oracle
IBM
Apple
Google
Amazon
Facebook
Airbnb
Cloudera
MapR
Dremio
Oracle
IBM

The product loop

Declare → Local → Cloud

Same app logic everywhere — local for speed, cloud for the target.

1Declare

Declare the app in Python

Schema, computed columns, indexes, and HTTP routes in one declarative Python file. Same logic for local and cloud.

2Local

Run locally for fast iteration

pip install and iterate on your laptop. Tables, pipelines, and endpoints without stitching five services.

3Cloud

Deploy the same app to cloud

Bind the same app to a hosted database and Deploy endpoints. No rewrite between environments.

What you declare

One Table to Rule Them All.

Seven primitives unified in one declarative Python table. One import to find them.

Storage
pxt.create_table()

Multimodal Tables

Store images, video, audio, and documents as first-class citizens. No opaque blobs, no external blob storage required.

Image
Video
Audio
Document
Json
Array
Binary
String
Float
100% local-firstBuilt-in versioning and time travelLineage to every cell
Orchestration
add_computed_column()

Computed Columns

Declarative IVM. Change a model or UDF, only the affected cells recompute. No DAG file, no orchestrator.

ReplacesAirflow · Prefect · Celery
Retrieval
add_embedding_index()

Embedding Indexes

Vector search built in. Indexes self-maintain as data and models change.

ReplacesPinecone · Weaviate · Qdrant
Storage
create_view()

Views & Iterators

Chunk documents, extract video frames, split audio, slice strings. All declarative.

Replacescustom ETL + chunking scripts
Open source
$pip installpixeltable
Orchestration
@pxt.udf · @pxt.query · pixeltable.functions.*

UDFs, Transforms, and 25+ Providers

Custom functions, built-in transforms, and first-party AI providers in one layer. Batching, retries, rate limits, and caching handled for you.

OpenAIAnthropicGeminiBedrockMistralGroqDeepSeekHugging FaceCLIPWhisperVoyageJinaTogetherFireworksOllamaReplicatefal.aiRunwayMLBFL FLUXTwelve Labs+ more
Serving
pxt.tools() · invoke_tools()

Tool-Calling Agents

Tables as agents. UDFs and @pxt.query as tools. Persistent memory and reasoning traces.

ReplacesLangChain · custom agent glue
Serving
FastAPIRouter · pxt serve

FastAPI Serving

Tables and @pxt.query become HTTP endpoints. Background jobs included.

Replaceshand-written FastAPI + Pydantic
Full API reference

Declarative and incremental

Declare It Once. It Stays Correct.

Computed columns recompute only what changed — your feedback loop never breaks.

01

Your data is scattered.

Ingest

You need to know where your data is, where it came from, and where it goes, as you build and as you grow. That requires integrity, not more glue.

What you get

The only system where video, audio, images, and documents are first-class column types, not opaque blobs. Schema, versioning, and lineage from the moment data enters. Your files stay where they are.

Replaces
boto3 upload scriptsMetadata DBSync glue code
Learn more
Tables & Data Type System Cloud Storage
1media = pxt.create_table('app.media', {
2 'video': pxt.Video,
3 'doc': pxt.Document,
4 'meta': pxt.Json
5})
6
7media.insert([
8 {'video': 's3://bucket/demo.mp4'},
9 {'doc': '/local/report.pdf'}
10])

Insert a row → every downstream step triggers automatically. One system of record for all modalities.

02

Your feedback loop breaks.

Process

Every change means re-running pipelines by hand, re-checking drift, and hoping nothing broke. The iteration speed that should be your advantage becomes your bottleneck.

03

Your infrastructure doesn't compound.

Ship

Shipping is easy. Evolving is hard. Every iteration should make your system smarter. That's the competitive advantage glue code can never provide.

Get StartedContact UsGitHub

Free & open source · Apache 2.0 · No account required

Your Backend for Multimodal AI Data Apps

One system to store, transform, index, serve, and version — declare locally, deploy to cloud.

Instead of stitching togetherPixeltable gives you
PostgreSQL / MySQLpxt.create_table()schema is Python, versioned automatically
Pinecone / Weaviate / Qdrantadd_embedding_index()one line, stays in sync
S3 / boto3 / blob storagepxt.Image / Video / Audio / Documentnative types with caching
Airflow / Prefect / CeleryComputed columnstrigger on insert, no orchestrator needed
LangChain / LlamaIndex (RAG)@pxt.query + .similarity()computed column chaining
Hand-written FastAPI + PydanticFastAPIRouter / pxt servequeries become endpoints in one line
pandas / polars (multimodal).sample(), add_computed_column()prototype to production
DVC / MLflow / W&Bhistory(), revert(), time travelbuilt-in snapshots
Custom retry / rate-limit / cachingBuilt into every AI integrationresults cached, only new rows recomputed

One pip install, one Python API, not a stack of services to wire together.

See It In Action

Declare schema and AI workflow as computed columns — run locally or deploy to cloud.

ColabColabGitHubStarter Kit
Quick Start▶ Demo
Transactional, incremental, fully versioned: multimodal AI workloads that run themselves
1# Video intelligence: ingest, extract, enrich, index, query
2import pixeltable as pxt
3from pixeltable.functions.video import frame_iterator
4from pixeltable.functions import yolox, gemini, whisper, twelvelabs
5from pixeltable.functions.huggingface import clip, sentence_transformer
6
7# 01 Ingest: native multimodal types
8videos = pxt.create_table('app.videos', {
9 'video': pxt.Video,
10 'title': pxt.String,
11})
12
13# 02 Extract: frames, audio, transcript (automatic on insert)
14frames = pxt.create_view('app.frames', videos,
15 iterator=frame_iterator(video=videos.video, fps=1)
16)
17videos.add_computed_column(audio=videos.video.extract_audio())
18videos.add_computed_column(
19 transcript=whisper.transcribe(videos.audio, model='base')
20)
21
22# 03 Enrich: Gemini multimodal + YOLOX + custom UDF
23@pxt.udf
24def label_scene(detections: list[dict], description: str) -> str:
25 objects = [d['class'] for d in detections[:5]]
26 return f"{description} | objects: {', '.join(objects)}"
27
28videos.add_computed_column(
29 description=gemini.generate_content(
30 [videos.video, 'Describe this video in one sentence.'],
31 model='gemini-2.5-flash'
32 )
33)
34frames.add_computed_column(
35 detections=yolox(frames.frame, model_id='yolox_s')
36)
37frames.add_computed_column(
38 label=label_scene(frames.detections, videos.description)
39)
40
41# 04 Index: CLIP, MiniLM, Twelve Labs, always in sync
42frames.add_embedding_index('frame',
43 image_embed=clip.using(model_id='openai/clip-vit-base-patch32'))
44frames.add_embedding_index('label',
45 string_embed=sentence_transformer.using(model_id='all-MiniLM-L6-v2'))
46videos.add_embedding_index('video',
47 embedding=twelvelabs.embed.using(model_name='marengo3.0'))
48
49# 05 Query: similarity + metadata filtering in one expression
50@pxt.query
51def find_scenes(query_text: str, ref_image: pxt.Image, title: str):
52 text_sim = frames.label.similarity(string=query_text)
53 img_sim = frames.frame.similarity(ref_image)
54 return (frames
55 .where(videos.title.contains(title))
56 .order_by(text_sim + img_sim, asc=False)
57 .limit(10)
58 .select(frames.frame, frames.label)
59 )
app.videostable
ColumnTypeComputed With
videoVideo
titleString
audioAudioextract_audio()
transcriptJsonwhisper(base)
descriptionStringgemini(video)
embedding_indexTwelve Labs (video)
app.framesview → videos
ColumnTypeComputed With
frameImageframe_iterator
detectionsJsonyolox(frame)
labelString@pxt.udf
embedding_indexCLIP (image)
embedding_indexMiniLM (text)
FastAPIserve
POST/api/videos→ insert
GET/api/search→ find_scenes()
GET/api/frames→ .select().collect()

Insert a video → Gemini, YOLOX, Whisper + custom @pxt.udf as computed columns → CLIP, MiniLM, Twelve Labs indexes → query via @pxt.query. Experiment to production.

Use cases

What Can You Build?

Three paths from day one on the same table abstraction — same pip install.

Data Wrangling for ML

Curate, augment, and export training datasets. Auto-annotate with AI, version everything, export to Parquet or PyTorch.

frames = pxt.create_view('ml.frames', videos,
iterator=frame_iterator(video=v.video, fps=1))
frames.add_computed_column(detections=yolox(frames.frame))
export_parquet(frames, 'training_data/')
Multimodal IngestAuto-Annotate with AIVersion & SnapshotExport Parquet / Pandas
Learn more

Agents & MCP

Tool calling, persistent memory, and decision traces, not stateless glue. UDFs as LLM tools, MCP servers, semantic recall.

tools = pxt.tools(get_weather, search_docs)
agent.add_computed_column(response=chat_completions(
messages=msgs, tools=tools))
memory.add_embedding_index('content', string_embed=embed_fn)
@pxt.udf as ToolsMCP Server IntegrationPersistent MemorySemantic Recall
Learn more

End-to-End Multimodal

Video in, finished product out. RAG, semantic search, multimodal APIs: one table, same primitives.

videos.add_computed_column(transcript=whisper.transcribe(audio))
videos.add_computed_column(hook_video=gemini.generate_videos(...))
videos.add_computed_column(final=with_audio(hook_video, tts_audio),
destination='s3://bucket/output/')
Video / Audio / Image / TextWhisper + Gemini + VeoAuto-assemble PipelineS3 / Cloud Delivery
Learn more
Get Started in 5 MinutesExplore Examples

From Raw Data to Production

Deploy as a full backend or a sidecar to your existing stack.

Loading architecture diagram...

Watch & Learn

Tutorials, conference talks, and deep-dives from the Pixeltable team.

Image Editing with Rev
10 min
Image Editing with Rev
Pixeltable Overview
15 min
Pixeltable Overview
Data Council Talk
32 min
Data Council Talk
DB School Podcast
32 min
DB School Podcast
More on YouTube
For developers

Agents Across Declare → Local → Cloud

Install the Pixeltable Skill — agents declare schema and endpoints, run locally, and maintain a cloud deploy. No glue logic, no orchestrator configs.

Building with LLMsWhy vibe-coded apps break
llms.txt
Concise documentation for LLMs
llms-full.txt
Complete API reference for LLMs
MCP Server
Interactive Pixeltable exploration: tables, queries, Python REPL
Pixeltable Skill
Install in any AI coding assistant: Cursor, Claude Code, Codex, Windsurf
Starter Kit
Production-ready template with FastAPI, Pixeltable, and Docker
AGENTS.md
Architecture guide for AI agents working with your codebase

Everything You Need to Know

Common questions about building with Pixeltable

Make Multimodal AI Data AppsDead Simple

Declare once. Run locally. Deploy to cloud. One pip install.

Start Building with Pixeltable10-Min Quickstart
PixeltablePixeltable Logo

Make building multimodal AI data apps dead simple. Declare once, run locally, deploy to cloud — one Python backend for store, transform, index, serve, and version.

GitHubXDiscordYouTubeLinkedIn

Product

  • Blog
  • Pricing
  • Free Tools
  • Changelog
  • GitHubOpen Source

Resources

  • Use Cases
  • Integrations
  • Tutorials
  • API Reference

Company

  • About
  • CareersHiring
  • Partners
  • Contact
  • Privacy

Get Started

  • Pixelbot
  • Starter Kit
  • Deployment Guide
  • AI Skill

© 2026 Pixeltable, Inc. All rights reserved.

Terms of ServicePrivacy PolicySecurity