Pixeltable and Daft

Daft, from Eventual, is an open-source multimodal dataframe: native image, video, audio, and embedding types, laptop to cluster. Pixeltable is a live application schema: insert a row and computed columns, indexes, and HTTP follow. Batch vs the app. Often and, not or.

pip install 'pixeltable[serve]'
See how it works

Dataframe vs the application schema

SidePixeltableDaft
At a glance
  • Typed Image, Video, Audio, Document columns in a catalog
  • Computed columns run on insert; unchanged rows stay cached
  • EmbeddingIndex and FastAPIRouter in the same file
  • Not a Spark-shaped dataframe over petabytes
  • Multimodal dataframe: tables, images, text, embeddings in one Python API
  • download().decode_image().resize() on URL columns; UDFs and GPU models
  • Local or distributed; Rust engine, no JVM
  • Write results to a lake, warehouse, or vector DB you add; not an app catalog

Scan a lake vs insert a row

Daft wins distributed batch over images and video. Pixeltable wins incremental pipelines and serving. Last reviewed: Oct 2026. Sources: docs.daft.ai (images: download, decode_image, resize), docs.pixeltable.com.

FeaturePixeltableDaft
What it is
Application schema: store, transform, index, serve
Multimodal dataframe for batch AI workloads
Execution model
Insert or edit a row; dependents of that row recompute
Load, transform, write a dataframe; scale the job
Cluster-scale media scans
Not a distributed dataframe over a lake
The product: laptop to cluster without changing the API
Durable catalog
Tables, history, and indexes you query later
A job that reads and writes; persistence is the sink you choose
Vector index
EmbeddingIndex declared on the column
Compute embeddings, then write to a vector DB or lake
HTTP serving
FastAPIRouter declared next to the tables
Not a web framework; put FastAPI or a notebook in front

Images: insert vs scan

Pixeltable: an Image column and a CLIP index; insert embeds that row. Daft: from_pydict, download, decode_image, resize — then collect. Last reviewed: Oct 2026. Daft docs: https://docs.daft.ai/en/stable/modalities/images/

Pixeltable

import pixeltable as pxt
from pixeltable.functions.huggingface import clip
TableModel = pxt.model_base()
clip_embed = clip.using(model_id='openai/clip-vit-base-patch32')
class Frames(TableModel, name='frames'):
image: pxt.Image
caption: pxt.String | None
__indexes__ = [pxt.EmbeddingIndex(image, embedding=clip_embed)]
if __name__ == '__main__':
# After: pxt schema update app.py vision
frames = pxt.get_table('vision.frames')
frames.insert([{'image': 'https://example.com/frame.jpg', 'caption': None}])
sim = frames.image.similarity(string='whiteboard diagram')
frames.order_by(sim, asc=False).limit(5).select(frames.image, frames.caption)

Daft

import daft
from daft import col
df = daft.from_pydict({
'urls': ['https://example.com/frame.jpg'],
})
df = df.with_column(
'image',
col('urls').download(on_error='null').decode_image().resize(224, 224),
)
df.collect()
# Write to a lake or vector store you add. HTTP is still yours.

When each belongs

Use Pixeltable when

  • The pipeline is the schema

    Insert a row; transforms, indexes, and HTTP follow. A coding agent writes one file. Cloud is Limited Beta.

  • You still want Daft for backfills

    Scan a lake with Daft, then insert into Pixeltable when the live app should own the rows.

Use Daft when

  • The job is a cluster scan

    Petabytes of images or video, GPU UDFs, write to Iceberg or a vector DB. Pixeltable is extra.

  • You already think in dataframes

    Pandas- or Spark-shaped API, no application catalog required. Docs: https://docs.daft.ai/en/stable/

Making the right choice

  • And, not or

    • Daft is not a Pixeltable competitor for serving HTTP. It is a batch engine. Ray Data is the same aisle.
    • Do not pick Pixeltable as a Daft replacement for distributed scans.
    • Last reviewed: Oct 2026. Daft: docs.daft.ai. Roundup: /learn/best-multimodal-data-platforms

Frequently asked questions

Batch in Daft. Live app in Pixeltable.

Declare tables in app.py. Apply with pxt schema update. Run Daft when the job is a cluster scan over a lake.

pip install 'pixeltable[serve]'
See how it worksGet expert guidance