Skip to main content

What Pixeltable Replaces

Most multimodal AI stacks look like this: blob storage for media, a relational database for metadata, a vector database for embeddings, an orchestrator for scheduling, and custom glue code holding it all together.
5+ services to deploy and maintain: blob storage, orchestrator, relational DB, vector DB, cache — plus custom retry logic, rate limiting, sync scripts, and error handling to wire them together.

Systems Pixeltable Replaces

You don’t install, configure, or manage these — Pixeltable handles them natively.
Instead of …With Pixeltable …
PostgreSQL / MySQLpxt.create_table() — schema is Python, versioned automatically
Pinecone / Weaviate / Qdrantadd_embedding_index() — one line, auto-maintained on insert/update/delete
S3 / boto3 / blob storagepxt.Image / Video / Audio / Document types with transparent caching; destination='s3://…' for cloud routing
Airflow / Prefect / CeleryComputed columns trigger on insert — no orchestrator, no workers, no DAGs
LangChain / LlamaIndex (RAG)@pxt.query + .similarity() + computed column chaining
pandas / polars (multimodal).sample(), ephemeral UDFs, then add_computed_column() to commit — same code, prototype to production
DVC / MLflow / W&BBuilt-in history(), revert(), time travel (table:N), snapshots — zero config
Custom retry / rate-limit / cachingBuilt into every AI integration; results cached, only new rows recomputed
Custom ETL / glue codeDeclarative schema — Pixeltable handles execution, caching, incremental updates

Tools Pixeltable Abstracts

These tools run under the hood, but you interact through a cleaner interface. This is a sample — Pixeltable wraps 30+ AI providers, dozens of built-in functions for media and data processing, and supports any Python library via @pxt.udf.
ToolRaw usageThrough Pixeltable
FFmpegInstall binary, subprocess calls, format conversion, frame seekingextract_audio(video, format='mp3') for audio; frame_iterator(video, fps=1) for frame extraction via pxt.create_view()
Pillow/PILImage.open(), resize, convert, encode, save, handle formatspixeltable.functions.image module: resize(), crop(), thumbnail(), b64_encode(), rotate(), blend(), plus width(), height(), get_metadata()
spaCypip install spacy, download model, load pipeline, parse documentsdocument_splitter(doc, separators='sentence') — spaCy runs under the hood (configurable via spacy_model parameter). Also supports 'heading', 'paragraph', 'page', 'token_limit', 'char_limit' separators
sentence-transformersLoad model, tokenize, encode batches, normalize vectorssentence_transformer.using(model_id='intfloat/e5-large-v2') passed to add_embedding_index(). Pixeltable handles model loading, batching, and index maintenance
OpenAI CLIPLoad model, preprocess images/text differently, encode, handle multimodal alignmentclip.using(model_id='openai/clip-vit-base-patch32') — multimodal embedding index that accepts both image and text queries for cross-modal search
OpenAI WhisperAPI key setup, audio format handling, chunking long files, parsing responsesopenai.transcriptions(audio=table.audio_col, model='whisper-1') as a computed column — automatic rate limiting, caching. Also supports local Whisper via whisper.transcribe()
Anthropic Claude tool callingConstruct messages, define tool schemas as JSON, parse tool_use blocks, execute tools, re-call with resultsanthropic.messages() + anthropic.invoke_tools() + pxt.tools() — all as chained computed columns. Tool schemas derived automatically from @pxt.udf function signatures
+ many moreSee the full SDK Reference, AI Integrations, Cookbooks, and Cheat Sheet

What Pixeltable Doesn’t Replace

You still need these — Pixeltable is a data layer, not a full application framework.
ToolWhy you still need it
FastAPI / Flask / DjangoPixeltable is a data layer, not a web server — you need an HTTP framework to serve your API
PydanticRequest/response validation for your API endpoints (Pixeltable’s .to_pydantic() bridges the two)
React / Vue / frontendUI layer — Pixeltable has no frontend
Docker / Kubernetes / TerraformDeployment infrastructure — Pixeltable runs inside your containers, it doesn’t provision them
Authentication / authorizationUser management, API keys, OAuth — outside Pixeltable’s scope
Domain-specific UDFsBusiness logic you write as @pxt.udf functions (e.g., web search, custom scoring) — Pixeltable provides the framework, you provide the logic
Migrating from a specific stack? See the step-by-step migration guides with side-by-side code comparisons:

Deployment Decision Guide

Pixeltable supports two production deployment patterns. Choose based on your constraints:
QuestionAnswerRecommendation
Existing production DB that must stay?YesOrchestration Layer
Building new multimodal app?YesFull Backend
Need semantic search (RAG)?YesFull Backend
Only ETL/transformation?YesOrchestration Layer
Expose Pixeltable as MCP server for LLM tools?YesFull Backend + MCP Server

Technical Capabilities (Both)

Regardless of deployment mode, you get:

Use Case Comparison

CapabilityML Data WranglingAI Applications
Multimodal Types✅ Video, Audio, Image, Document✅ Video, Audio, Image, Document
Computed Columns✅ Enrichment & pre-annotation✅ Pipeline orchestration
Embedding Indexes✅ Curation & similarity search✅ RAG & retrieval
Versioning✅ Dataset snapshots✅ Data lineage
Data Sharing✅ Publish datasets✅ Team collaboration

Deployment Strategies

Approach 1: Pixeltable as Orchestration Layer

Use Pixeltable for multimodal data orchestration while retaining your existing data infrastructure.
  • Existing RDBMS (PostgreSQL, MySQL) and blob storage (S3, GCS, Azure Blob) must remain
  • Application already queries a separate data layer
  • Incremental adoption required with minimal stack changes
  • Deploy Pixeltable in Docker container or dedicated compute instance
  • Define tables, views, computed columns, and UDFs for multimodal processing
  • Process videos, documents, audio, images within Pixeltable
  • Export structured outputs (embeddings, metadata, classifications) to RDBMS
  • Export generated media to blob storage
  • Application queries existing data layer, not Pixeltable
  • Native multimodal type system (Video, Document, Audio, Image, JSON)
  • Declarative computed columns eliminate orchestration boilerplate
  • Incremental computation automatically handles new data
  • UDFs encapsulate transformation logic
  • LLM call orchestration with automatic rate limiting
  • Iterators for chunking documents, extracting frames, splitting audio
# Example: Orchestrate in Pixeltable, export to external systems
import pixeltable as pxt
from pixeltable.functions.video import extract_audio
from pixeltable.functions.openai import transcriptions
from pixeltable.functions.video import frame_iterator
import psycopg2
from datetime import datetime

# Setup: Define Pixeltable orchestration pipeline
pxt.create_dir('video_processing', if_exists='ignore')

videos = pxt.create_table(
    'video_processing/videos',
    {'video': pxt.Video, 'uploaded_at': pxt.Timestamp}
)

# Computed columns for orchestration
videos.add_computed_column(
    audio=extract_audio(videos.video, format='mp3')
)
videos.add_computed_column(
    transcript=transcriptions(audio=videos.audio, model='whisper-1')
)

# Optional: Add LLM-based summary
from pixeltable.functions.openai import chat_completions
videos.add_computed_column(
    summary=chat_completions(
        messages=[{'role': 'user', 'content': f"Summarize: {videos.transcript.text}"}],
        model='gpt-4o-mini'
    )
)

# Extract frames for analysis
frames = pxt.create_view(
    'video_processing/frames',
    videos,
    iterator=frame_iterator(video=videos.video, fps=1.0)
)

# Insert video for processing
videos.insert([{'video': 's3://bucket/video.mp4', 'uploaded_at': datetime.now()}])

# Export structured results to external RDBMS
conn = psycopg2.connect("postgresql://...")
cursor = conn.cursor()

for row in videos.select(videos.video, videos.transcript).collect():
    cursor.execute(
        "INSERT INTO video_metadata (video_url, transcript_json) VALUES (%s, %s)",
        (row['video'], row['transcript'])
    )
conn.commit()

Approach 2: Pixeltable as Full Backend

Use Pixeltable for both orchestration and storage as your primary data backend.
  • Building new multimodal AI application
  • Semantic search and vector similarity required
  • Storage and ML pipeline need tight integration
  • Stack consolidation preferred over separate storage/orchestration layers
  • Deploy Pixeltable on persistent instance (EC2 with EBS, EKS with persistent volumes, VM)
  • Build API endpoints (FastAPI, Flask, Django) that interact with Pixeltable tables
  • Frontend calls endpoints to insert data and retrieve results
  • Query using Pixeltable’s semantic search, filters, joins, and aggregations
  • All data stored in Pixeltable: metadata, media references, computed column results
  • Unified storage, computation, and retrieval in single system
  • Native semantic search via embedding indexes (pgvector)
  • No synchronization layer between storage and orchestration
  • Automatic versioning and lineage tracking
  • Incremental computation propagates through views
  • LLM/agent orchestration
  • Data export to PyTorch, Parquet, LanceDB
# Example: FastAPI endpoints backed by Pixeltable
from pydantic import BaseModel
from fastapi import FastAPI, UploadFile
from datetime import datetime
import pixeltable as pxt

app = FastAPI()
docs_table = pxt.get_table('myapp/documents')  # Has computed columns: embedding, summary

class SearchResult(BaseModel):
    document: str
    summary: str | None
    similarity: float

@app.post("/documents/upload")
def upload_document(file: UploadFile):
    status = docs_table.insert([{
        'document': file.filename,
        'uploaded_at': datetime.now()
    }])
    return {"rows_inserted": status.num_rows}

@app.get("/documents/search")
def search_documents(query: str, limit: int = 10) -> list[SearchResult]:
    sim = docs_table.embedding.similarity(string=query)
    results = docs_table.select(
        docs_table.document,
        docs_table.summary,
        similarity=sim
    ).order_by(sim, asc=False).limit(limit).collect()

    return list(results.to_pydantic(SearchResult))

@app.get("/documents/{doc_id}")
def get_document(doc_id: int):
    result = docs_table.where(docs_table._rowid == doc_id).collect()
    return result[0] if len(result) > 0 else {"error": "Not found"}
Use sync (def) endpoints, not async def. FastAPI dispatches sync endpoints to a thread pool, giving each request its own thread. Pixeltable is thread-safe and handles concurrent requests automatically. Using async def would block the event loop and serialize all requests. See Production Operations for details.

Get Started

Pixeltable Starter Kit

A production-ready starter app with a FastAPI backend and React frontend — multimodal upload, cross-modal search, and a tool-calling agent, all wired through Pixeltable computed columns. Includes deployment configs for Docker Compose, Helm, Terraform (EKS/GKE/AKS), and AWS CDK.
The starter kit contains two reference architectures matching the deployment strategies above:
ArchitecturePatternWhat it demonstrates
Starter Kit (main app)Pixeltable as full backendFastAPI + React with persistent storage, multimodal upload, cross-modal search, tool-calling agent
Orchestration PipelinePixeltable as ephemeral processing engineBatch ingest, computed column processing, export_sql to serving DB, media routing to cloud buckets

Next Steps

Infrastructure Setup

Code organization and storage architecture

Production Operations

Concurrency, error handling, and schema evolution

Security & Backup

Backup strategies and security best practices
Last modified on March 15, 2026