Neon Functions vs Pixeltable Computed Columns
All Stories
2026-08-186 min read
NeonServerless FunctionsComputed ColumnsMultimodal AIPostgresPixeltableIncremental ComputationAgents

Neon Functions vs Pixeltable Computed Columns

Neon Functions put Node.js next to Postgres. An HTTP handler is not a multimodal table. Pixeltable computed columns run on insert—video, frames, embeddings.

Pierre Brunelle

Pierre Brunelle

Pixeltable Team

Summary: On August 12, 2026, Neon announced Functions: Node.js 24 fetch(request) on the same region and branch as their Lakebase Postgres (Neon’s database—not Databricks Lakebase), with DATABASE_URL injected. That is colocation for SELECT. It is not a multimodal data table. A function is always requested and always returns a web response. Insert a video and nothing runs until someone hits the HTTPS URL. Pixeltable’s unit of work is a computed column: insert → frames, transcripts, embeddings stay consistent. pip install pixeltable.

What Neon Announced#

Functions are serverless Node compute you deploy onto a Neon branch. Fair, and useful if your problem is “my Lambda talks to Postgres over the public internet”:

  • Same region as the branch; DATABASE_URL (and Object Storage / AI Gateway creds) land in process.env.
  • Isolates stay up across requests, so you keep a module-scope pg Pool instead of opening a connection per invoke.
  • Long-running enough for agent streams, WebSockets, and SSE.
  • Declared in neon.ts; a child branch gets its own function ID and URL.

Neon is explicit about the limits. Functions are not frontend hosting. They are not a background job runner—pair with something like Inngest for queued work. Cron, storage events, and other triggers are still WIP. That last sentence is the product: request/response next to SQL, not a pipeline that runs because data arrived.

The fetch() Problem#

What happens to the data when nobody calls fetch()? Nothing. Colocation cuts a network hop. It does not extract frames, transcribe audio, or keep an embedding index in sync. Agents and SSE are serving problems. Insert / recompute / search is a data problem.

Microsoft’s pg_durable put durable SQL steps inside Postgres. Neon Functions put a Node handler next to Postgres. Same “compute close to data” slogan; still SQL-shaped; still you write the pipeline. Pixeltable’s version of that slogan is a typed table plus computed columns—the engine owns the work when a row lands. See who owns the multimodal data plane.

HTTP Handler vs Computed Column#

CapabilityNeon Functions (beta)Pixeltable
Unit of workfetch(request)ResponseComputed column / iterator view
When compute runsOn HTTP invokeOn insert / source change
Data typesPostgres rows + env creds to files/modelsVideo / Image / Audio / Document
Incremental derived columnsYou write it (or Inngest)Engine; only new or changed rows
Embedding / similarityDIY in the handleradd_embedding_index + .similarity()
Branch / preview isolationNeon branch_id copies function + DBTable history / snapshots—not Neon copy-on-write
WebSockets / SSEFirst-class isolateNot that product; optional FastAPIRouter for HTTP
Local pip install loopNeon project / neon deployYes

Same Pitch, Both Ways#

Neon’s demo shape is a handler that reads Postgres (their published hello-world):

typescript

That is a fast SELECT version(). Their fuller pitch—read a row, pull an attachment from Object Storage, stream a model through AI Gateway—is still three calls you orchestrate inside fetch. New files do not chunk themselves. Indexes do not catch up unless the handler runs again.

Pixeltable starts at insert. Documents (or video) are types; splitters and indexes are columns:

python

No HTTPS invoke. New PDFs only split and embed new rows. Swap video for documents and the same pattern is frame_iterator + YOLOX—see the video intelligence pipeline. Serving HTTP from the catalog, if you need it, is FastAPIRouter—optional, not the engine.

Triggers “Coming Soon”#

Neon’s roadmap—native cron while the database sleeps, then object created/deleted, then auth and platform events—is the admission that request-only compute is not a pipeline. Pixeltable already treats insert as the trigger. Change a model and only affected cells recompute. That is the incremental cost model, not an external scheduler glued to fetch.

When to Use Pixeltable#

Use Pixeltable to build search, VideoRAG, agents with media memory, or training-set curation: typed media, iterators, computed model columns, embedding indexes, local Python loop. If Postgres OLTP already lives somewhere, leave it. Do not start the AI graph in fetch().

FAQ#

Is a function next to Postgres a multimodal table?#

No. It is an HTTP handler with a connection string. A multimodal data table has typed media columns, computed transforms, and indexes on the same schema.

Does Pixeltable replace Neon?#

No. Pixeltable does not copy Neon branches, host WebSockets, or inject DATABASE_URL. It owns the insert → derive → search graph for video, images, audio, and documents.

Do computed columns need an HTTP call?#

No. They run when you insert or when a source column changes. You can expose queries over HTTP later; that is serving, not orchestration.

Can files stay in object storage?#

Yes. Pixeltable media columns accept local paths, s3://, and HTTPS URLs. The catalog stores typed pointers, not gigabytes of video in a row store. Same idea as not stuffing blobs into a generic FILE column.

Get Started#

See Also#

Ready to Build?

Declarative. Multimodal. Incremental.

Focus on innovation, not infrastructure.