Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.pixeltable.com/llms.txt

Use this file to discover all available pages before exploring further.

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 / DjangoStandard CRUD endpoints can use built-in HTTP serving; custom logic still needs a framework
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.
Simpler alternative for standard endpoints: If your endpoints are straightforward insert, query, or delete operations, consider built-in HTTP serving with FastAPIRouter or a TOML config. It auto-generates request/response schemas, handles media serving, and supports background jobs.

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

HTTP Serving

Expose tables and queries as HTTP endpoints with TOML or Python

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 May 9, 2026