Pixeltable icon

Pixeltable

Declarative multimodal AI data engine for tables, computed columns, embedding search, agents, and FastAPI services.

pixeltable/pixeltable · v2.11.3 · Development & Workflow

Pixeltablesafe

Trust Score

92

Security

100

Surfaces

1

What is Pixeltable?

Pixeltable is a published development & workflow plugin for AI coding agents in the codex ecosystem, developed by Pixeltable and distributed through the HOL AI plugin registry. Declarative multimodal AI data engine for tables, computed columns, embedding search, agents, and FastAPI services.

Canonical slug
pixeltable/pixeltable
Version
v2.11.3 · updated Sep 24, 2026

Trust & Reputation

HOL Trust Score
92

Factor Analysis

Per-metric points (0–100 each) combined via a weighted average into the overall score.

Installability
100pts
Maintenance
100pts
MCP Posture
100pts
Plugin Security
100pts
Provenance
70pts
Publisher Quality
75pts

Registry Snapshot

Publisher verification
No
Marketplace source
Unknown
Scanner
Broker fallback
Safety label
safe
Digest verified
Yes
1 bundled skill — copy or download SKILL.mdOpen skills

Trust & reputation

Trust & Reputation

HOL Trust Score
92

Factor Analysis

Per-metric points (0–100 each) combined via a weighted average into the overall score.

Installability
100pts
Maintenance
100pts
MCP Posture
100pts
Plugin Security
100pts
Provenance
70pts
Publisher Quality
75pts

Provenance

Plugin root
.
Source repo
https://github.com/pixeltable/pixeltable-skill
Source commit
5500c88cc625…
Publisher verified
No
Owner verified
Not owner verified

Continuous scanner CI detected

No action is required. This plugin receives the full trust score.

Verified badge not detected

Add the HOL verified badge to the repository README to score +2% trust. Plugin owners can open that pull request from Guard Plugins.

Security Posture

safe
Safety label
100
Security score
0
High findings
Provider
registry-broker-fallback
Grade
A · safe
Version
Unknown
cisco-skill-scanner: unknown

Findings

infoskill-securityskill-scan.unavailable

Cisco skill scanner timed out after 60000 ms

Pixeltable — Frequently asked questions

What is Pixeltable?
Pixeltable is an AI plugin in the HOL registry. Declarative multimodal AI data engine for tables, computed columns, embedding search, agents, and FastAPI services.
How do I install Pixeltable?
Install Pixeltable in your harness: Codex — codex plugin marketplace add pixeltable/pixeltable-skill; Claude Code — /plugin marketplace add pixeltable/pixeltable-skill; Cursor — npx skills add pixeltable/pixeltable-skill. Full step-by-step guidance is on the HOL plugin page.
How do I install Pixeltable in Codex?
To install Pixeltable in Codex, start with codex plugin marketplace add pixeltable/pixeltable-skill. The complete step-by-step install guide for Codex is on the HOL plugin page.
How do I install Pixeltable in Claude Code?
To install Pixeltable in Claude Code, start with /plugin marketplace add pixeltable/pixeltable-skill. The complete step-by-step install guide for Claude Code is on the HOL plugin page.
How do I install Pixeltable in Cursor?
To install Pixeltable in Cursor, start with npx skills add pixeltable/pixeltable-skill. The complete step-by-step install guide for Cursor is on the HOL plugin page.
Is Pixeltable free?
Pricing for Pixeltable is published on its HOL plugin page when the maker schedules a launch.
Who publishes Pixeltable?
Pixeltable is published by Pixeltable and listed on HOL.
Is Pixeltable available now?
Pixeltable availability is listed on its HOL plugin page.

Install Guidance

Install in Claude Code

Install through the Claude Code plugin marketplace.

Claude Code plugin docs
  1. 1

    Add the marketplace

    Run this inside a Claude Code session.

    claude code
  2. 2

    Install the plugin

    Use the plugin name and the marketplace name shown by the previous command.

    claude code
  3. 3

    Scripted alternative

    Non-interactive equivalent for scripts and CI pipelines. Add --scope project to pin the install to one repository.

    shell

Plugin Manifest

{
  "name": "pixeltable",
  "version": "2.11.3",
  "description": "Build multimodal AI applications with Pixeltable.",
  "author": {
    "name": "Pixeltable",
    "url": "https://github.com/pixeltable"
  },
  "homepage": "https://docs.pixeltable.com/",
  "repository": "https://github.com/pixeltable/pixeltable-skill",
  "license": "Apache-2.0",
  "keywords": [
    "pixeltable",
    "multimodal",
    "rag",
    "embeddings",
    "agents",
    "computed-columns"
  ],
  "skills": "./",
  "interface": {
    "displayName": "Pixeltable",
    "developerName": "Pixeltable",
    "composerIcon": "./assets/icon.png",
    "logo": "./assets/icon.png",
    "screenshots": [
      "./assets/icon.png"
    ],
    "shortDescription": "Build Pixeltable apps with declarative tables, pxt CLI, RAG, agents, and serving",
    "longDescription": "Use Pixeltable to build multimodal AI applications with declarative tables, computed columns, embeddings, retrieval, provider integrations, the pxt CLI (schema, service, inspect), and production workflow patterns.",
    "category": "Developer Tools",
    "capabilities": [
      "Read",
      "Write"
    ],
    "websiteURL": "https://docs.pixeltable.com/",
    "privacyPolicyURL": "https://github.com/pixeltable/pixeltable-skill/blob/main/SECURITY.md",
    "termsOfServiceURL": "https://github.com/pixeltable/pixeltable-skill/blob/main/LICENSE",
    "brandColor": "#2563EB",
    "defaultPrompt": [
      "Start a Pixeltable project with pxt service example",
      "Build a RAG pipeline with the pixeltable skill",
      "Debug this Pixeltable workflow with pxt errors"
    ]
  },
  "registryIndexVersion": 5
}

Marketplace Source

Repo URL
https://github.com/pixeltable/pixeltable-skill
Marketplace path
Unknown
Source path
plugins/pixeltable/pixeltable-skill
Install policy
AVAILABLE

Skills

Copy or download the SKILL.md files this plugin ships, then install them with the Skills CLI.

Share
skills-cli

pixeltable

skills/pixeltable-skill/SKILL.md

>

Raw SKILL.md
---
name: pixeltable
description: >
  Build multimodal AI apps with Pixeltable. One application file (app.py)
  declares TableModel tables and FastAPIRouter routes. Create tables with
  pxt schema update. Start HTTP with pxt service update. Insert a row or
  POST to try the app. Use computed columns instead of LangChain,
  pandas-as-store, or a separate vector DB. Use when building RAG,
  processing images/video/audio/documents, or serving an API. Do NOT use for
  general Python or direct PostgreSQL administration.
license: Apache-2.0
allowed-tools: []
metadata:
  author: Pixeltable
  version: 2.11.3
  type: documentation
  executes-code: false
  category: data-infrastructure
  tags: [multimodal, ai, data, tables, embeddings, rag, udf, video, audio, images, documents, agents, tools, fastapi, declarative, computed-columns, vector-search]
  documentation: https://docs.pixeltable.com/
  support: https://github.com/pixeltable/pixeltable/discussions
  priority: 6
  pathPatterns: ["**/*.py"]
  importPatterns: ["pixeltable", "import pixeltable as pxt", "from pixeltable"]
  bashPatterns: ['^\s*pxt(?:\s|$)']
  promptSignals:
    phrases: ["pixeltable", "computed column", "embedding index", "add_embedding_index", "TableModel", "create_view", "document_splitter", "invoke_tools", "pxt schema", "pxt service", "pxt shell", "pxt errors", "pxt dashboard"]
    minScore: 6
---

## STOP

If you find yourself importing any of these, you are off-path:

1. **Do not use LangChain / LlamaIndex / Haystack / LangGraph.** Chunking is `document_splitter`. Search is `.similarity()`. Tools are `pxt.tools()` + `invoke_tools()`.
2. **Do not use pandas as a working store.** Tables are the store. `.collect().to_pandas()` is export only.
3. **Do not write `for row in ...:` loops calling models.** Wrap the call in a computed column.
4. **Do not install a separate vector database.** In an app, `__indexes__ = [pxt.EmbeddingIndex(...)]` on the model. In a notebook, `t.add_embedding_index(col, embedding=fn)`. Search with `.similarity(string=query)`.
5. **Do not write `while not done:` agent loops.** Insert a row. The computed-column chain runs.

See [anti-patterns.md](references/anti-patterns.md) (6 macros).

## What is Pixeltable?

One application file (`app.py`) is the backend.

- `pxt schema update`: creates tables from `TableModel` classes. Does not start HTTP.
- Insert a sample, `.select()`, `pxt dashboard`, or `pxt schema diff`. Compute runs on insert. After `pxt service update`, curl POST.
- `pxt service update`: starts HTTP (local or `pxt://`). `pxt service list` prints the URL. This is the serving command; do not reach for `pxt service run`.

`pxt db update` uploads the project files and sets the hosted image and workers. It does not set secrets (`pxt secret` does), insert rows, or start app HTTP.

First run: [Quickstart](https://docs.pixeltable.com/overview/quick-start). Why: [Why Pixeltable](https://docs.pixeltable.com/overview/pixeltable).

## Starting a new project

```bash
pip install 'pixeltable[serve]'   # Python 3.11+
pxt init
pxt service example --out app.py
pxt schema check app.py           # validates the file; warns if 'app' is shadowed
pxt schema update app.py my_app
pxt service update app.py my_app
pxt service list                  # assigned port; do not hard-code :8000
```

`pxt service example` writes models plus a `FastAPIRouter`. Schema only (no HTTP): `pxt schema example --brief --out app.py`. Then edit `app.py` and run `pxt schema update` again. After a schema change, run `pxt service update` again if routes exist. Do not `python app.py`. Full flags: [cli.md](references/cli.md).

The last argument (`my_app`, or `pxt://org:db` on Cloud) is a catalog directory, not a folder on disk. `pxt init` marks the project root. Schema does not start HTTP. Service does not create tables. Non-interactive: `pxt service update ... -f`. Local handle: `pxt.get_table('my_app.docs')`, or bind the models: `import app; app.TableModel.bind_all('my_app')`, then `app.Docs.insert(...)` / `app.Docs.select(...).collect()`.

Same file on Cloud: set `PIXELTABLE_API_KEY`, add `[[pixeltable.database]]` with `name = 'pxt://org:db'`, then `pxt db update pxt://org:db -f`, then `pxt schema update app.py pxt://org:db -f`, then `pxt service update app.py pxt://org:db -f`. Cloud handle: `pxt.get_table('pxt://org:db/docs')`. Cloud databases store media in their managed home bucket by default; set a column `destination=` only to override it. On Cloud, try the app with dashboard insert plus `pxt schema diff`, and inspect failures with `pxt service logs` / `pxt db logs`. [Cloud](https://docs.pixeltable.com/howto/deployment/cloud).

## The application file

`pxt service example --out app.py` writes this shape. Edit it. Then `pxt schema update app.py my_app`.

```python
import pixeltable as pxt
import pixeltable.functions as pxtf
from pixeltable.serving import FastAPIRouter

TableModel = pxt.model_base()


@pxt.udf
def excerpt(text: str, n: int = 12) -> str:
    return text if len(text) <= n else f'{text[:n]}...'


class Docs(TableModel, name='docs'):
    id = pxt.Column(value=pxtf.uuid.uuid7(), primary_key=True)
    title: pxt.String
    body: pxt.String | None
    title_upper = pxtf.string.upper(title)
    summary = excerpt(title)


ingest = FastAPIRouter(name='ingest')
ingest.add_insert_route(
    Docs, path='/docs', inputs=[Docs.title, Docs.body],
    outputs=[Docs.id, Docs.title_upper, Docs.summary],
)
ingest.add_update_route(
    Docs, path='/docs/update', inputs=[Docs.title],
    outputs=[Docs.id, Docs.title_upper],
)
ingest.add_compute_route(Docs, path='/titles', inputs=[Docs.title], outputs=[Docs.title_upper])
```

Annotation is a stored column. Assignment is a computed column. Optional is `T | None`. Primary key is `pxt.Column(..., primary_key=True)`; `add_update_route` matches rows by it, so the request body carries `id` even though `inputs` does not list it. Indexes on the model: `__indexes__ = [pxt.EmbeddingIndex(...)]`. `from pixeltable.serving import FastAPIRouter`.

Already have FastAPI: after schema update, `ingest.bind('my_app')` then `app.include_router(ingest)`. Or define the `fastapi.FastAPI` object in `app.py` and `include_router()` each router there; `pxt service update` then serves that one application. Call `pxt.get_table()` inside custom handlers. [workflows.md](references/workflows.md).

RAG, views, and search: [workflows.md](references/workflows.md). Do not add Hugging Face or spaCy unless the user asked.

## Apps vs notebooks

- **Apps:** `app.py` + `pxt schema update` + `pxt service update`. Indexes on the model.
- **Notebooks / REPL:** `pxt.create_table()`, `add_computed_column()`, `add_embedding_index()`. The appendix below uses that form.

## Where to look

| Need | Open |
|------|------|
| `pxt schema`, `pxt service`, inspect | [cli.md](references/cli.md) |
| Types, views, UDFs, UDAs | [core-api.md](references/core-api.md) |
| Provider import and output shape | [providers.md](references/providers.md) |
| Serving, FastAPIRouter, routes | [workflows.md](references/workflows.md) |
| Wrong stack | [anti-patterns.md](references/anti-patterns.md) |

Add video, audio, agents, or a UI by editing `app.py`. A view is either a filter (`base=Docs.where(...)`) or an iterator (`frame_iterator`, `audio_splitter`, `document_splitter`, `video_splitter`, `string_splitter`, `list_iterator`, `tile_iterator`). Check `pixeltable.functions` before writing a UDF. Start from `pxt service example` or `pxt schema example`. Do not invent a second `pxt schema update` path.

## API traps

| Wrong | Correct |
|-------|---------|
| `openai.vision(...)` | Deprecated (the only deprecated function in `pixeltable.functions`). Use `chat_completions` with `image_url`, or `responses` |
| `from pixeltable.iterators import ...` | The whole `pixeltable.iterators` package is a deprecated shim (`FrameIterator`, `VideoSplitter`, `DocumentSplitter`, `StringSplitter`, `AudioSplitter`, `TileIterator`). Import the function from `pixeltable.functions.*` -- e.g. `from pixeltable.functions.video import frame_iterator` |
| `similarity(query)` | `similarity(string=query)`. Also `image=` / `audio=` / `video=` / `document=` / `vector=`; `idx=` picks among several indexes on one column |
| Re-run with `if_exists='ignore'` to fix logic | Notebook: `add_computed_column(..., if_exists='replace')`. App: **rename** the column, then `pxt schema update --allow-destructive` |
| Edit a computed column's expression in place, then `--allow-destructive` | Editing an existing column's expression is `UNSUPPORTED`; the flag does not help and the whole update applies nothing. Rename the column |
| `t.summary_errortype` | `t.summary.errortype` / `t.summary.errormsg`, on stored computed or media columns. `t.<col>.fileurl` / `.localpath` for media |
| `pxt.Required[pxt.String]` | Non-nullable by default. Optional: `T \| None` |
| `@pxt.udf def f(x: str)` fed a nullable column | A non-nullable parameter that receives `None` **skips the call**: the cell is `None` and `errormsg` is empty. Annotate `x: str \| None` and handle `None` in the body |
| `whisper.load_model(...)` inside a UDF body | Weights reload on every row. Use the shipped wrapper (`pxtf.whisper.transcribe`, `clip.using(...)`), or a module-scope cached loader |
| `recompute_columns(columns=['summary'])` | `t.recompute_columns('summary', errors_only=True)` |
| TOML routes or a retired serve CLI | `FastAPIRouter` + `pxt schema update` + `pxt service update` |
| `add_embedding_index()` in `app.py` | `__indexes__` on the TableModel. Note the DSL names an index `name=`, the SDK `idx_name=` |
| `make_video(order_by=...)` / `stitch_tiles(order_by=...)` | Both are `requires_order_by` UDAs: the ordering expression is the **first positional** argument -- `make_video(t.pos, t.frame, fps=25)`. `order_by=` raises |
| `pxt.create_table()` / `get_table()` at import in `app.py` | `TableModel` + `pxt schema update`. Import must not mutate the catalog |
| `EmbeddingIndex(frame, image_embed=clip)` | `embedding=clip` (covers text and image). Or both `string_embed=` and `image_embed=`. `image_embed=` alone cannot answer `similarity(string=...)` |
| `uuid.astype(pxt.String)` | `uuid.to_string()` (`from pixeltable.functions.uuid import to_string`). `astype` does not cast UUID to String |

Extract the field (`.text`, `.choices[0].message.content`). Cast Json with `.astype(pxt.String)` only before embedding or concatenating.

## Notebook / REPL appendix

```python
import pixeltable as pxt

pxt.create_dir('my_project', if_exists='ignore')
t = pxt.create_table('my_project.documents', {
    'title': pxt.String,
    'content': pxt.String,
    'image': pxt.Image,
    'video': pxt.Video,
    'audio': pxt.Audio,
    'doc': pxt.Document,
}, if_exists='ignore')
```

Types are non-nullable by default. Optional is `T | None`. Do not use `pxt.Required`.

```python
from pixeltable.functions.uuid import uuid7

t = pxt.create_table('my_project.items', {
    'content': pxt.String,
    'uuid': uuid7(),
}, primary_key=['uuid'], if_exists='ignore')
```

Insert: `t.insert([{...}])`. Computed column:

```python
from pixeltable.functions.openai import chat_completions

t.add_computed_column(
    summary=chat_completions(
        messages=[{'role': 'user', 'content': t.content}],
        model='gpt-4o-mini',
    ).choices[0].message.content,
    if_exists='ignore',
)
```

Views: `document_splitter`, `frame_iterator` (from `pixeltable.functions.video`), `string_splitter`, `audio_splitter`. Notebook indexes: `t.add_embedding_index('content', embedding=embed_fn, if_exists='ignore')`.

Query: `t.where(...).select(...).collect()`. Similarity: `t.content.similarity(string=query)`. In `@pxt.query`, alias as `score=sim`.

UDFs are recorded as a module path relative to the project root (`app.excerpt`).

Always `if_exists='ignore'` on notebook `create_*` / `add_*`. Failed cells: `t.recompute_columns('summary', errors_only=True)`. `string_splitter` / `document_splitter(..., separators='sentence')` need spaCy. Embedding indexes need `.using(...)`.

## pxt CLI

```bash
pxt init
pxt service example --out app.py
pxt schema check app.py
pxt schema update app.py my_app
pxt service update app.py my_app
pxt service list
pxt ls -l
pxt errors my_app/docs
pxt recompute my_app/docs summary --errors-only -f
pxt dashboard
```

[cli.md](references/cli.md).

## Resources

- [Quickstart](https://docs.pixeltable.com/overview/quick-start)
- [CLI](https://docs.pixeltable.com/platform/cli)
- [MCP Server](https://github.com/pixeltable/mcp-server-pixeltable-developer)
- [Docs](https://docs.pixeltable.com/llms-full.txt)

File Inventory

.codex-plugin/plugin.json

plugin-manifest

1,406 bytes

469df7aca216bdc5…

README.md

file

2,843 bytes

9a1f669e355919a5…

.claude-plugin/plugin.json

file

660 bytes

9e845adbc614bf75…

.cursor-plugin/plugin.json

file

678 bytes

489123d765749ad3…

package-lock.json

file

228 bytes

6bbf802a471cbe25…

package.json

file

632 bytes

190d6f902ae95fb8…

AGENTS.md

file

2,404 bytes

c29c27353c01d67e…

SECURITY.md

file

749 bytes

c25b94cef39aaa77…

plugin.json

file

1,901 bytes

a83b5933049b5ae1…

hooks/session_orientation.py

file

2,747 bytes

3077447c9a915b48…

commands/add-provider.md

file

1,740 bytes

2af163b81640c8f2…

agents/pixeltable-pipeline-architect.md

file

2,123 bytes

a2c07ab584ba8198…

agents/pixeltable-debugger.md

file

1,787 bytes

cc0eec7781369a36…

commands/scaffold.md

file

978 bytes

b3218ed2bf2c9614…

hooks/hooks.json

file

1,074 bytes

97da5bf87851824d…

skills/pixeltable-skill/agents/openai.yaml

skill

203 bytes

882f58a89e23a818…

skills/pixeltable-skill/SKILL.md

skill

12,647 bytes

da3cf6930d73c3fd…

hooks/validate_antipatterns.py

file

9,298 bytes

ce05ef86bb199608…

skills/pixeltable-skill/references/cli.md

skill

16,371 bytes

2c7acde669b82ca8…

skills/pixeltable-skill/references/anti-patterns.md

skill

3,149 bytes

4ab77cd4e8c549ac…

skills/pixeltable-skill/references/core-api.md

skill

16,593 bytes

407758a48604b3a7…

skills/pixeltable-skill/references/providers.md

skill

4,951 bytes

4a3911018976d118…

skills/pixeltable-skill/references/workflows.md

skill

4,133 bytes

abeda5b94a76ec2e…

assets/icon.png

asset

40,100 bytes

bee1ead7219c0e94…