Why bulk.run exists

AI is good at reasoning.
Computers are good at structure.

What's missing is a reliable way to apply one to the other.

Today, AI mostly runs:

  • one prompt at a time
  • inside chats
  • behind opaque workflows

But real work doesn't happen in prompts.
It happens in datasets.

Spreadsheets. Tables. Lists. Logs.
At scale, everything becomes rows.

The gap

When people try to apply AI to real datasets today, they end up with:

  • copy-paste loops
  • brittle workflow graphs
  • hidden logic
  • outputs that can't be reproduced

These systems are impressive to demo and painful to maintain.

They optimize for interaction, not execution.

The missing primitive

What's missing is a simple execution layer:

  • take a dataset
  • define a transformation or enrichment
  • run it deterministically per row
  • return structured results

No workflows.
No hidden state.
No ceremony.

Just jobs that run and finish.

What bulk.run is

bulk.run is the execution layer for LLMs on tabular data.

It treats datasets as the unit of work.

You give it:

  • structured input
  • an explicit operation
  • optional external data (web search, context)

It gives you:

  • predictable outputs
  • repeatable runs
  • data you can reuse and share

CSV is the first interface. Not the point.

The three non-negotiables

A true execution layer has three requirements:

1. Reliability

Structured outputs. Validation. Automatic retries. When something fails, it fails loudly—no silent errors.

2. Traceability

Know exactly how each cell was produced: which model, which prompt, which sources, when it ran.

3. Composability

Works with anything. CSV today. Sheets, Airtable, Notion tomorrow. API and SDK so other products can call it.

Build those three, and you stop being "a tool." You become infrastructure.

How we think about this long-term

We're not building an app.
We're building infrastructure.

That means:

  • behavior over magic
  • consistency over cleverness
  • formats that can be shared
  • execution you can trust

Some parts will be hosted.
Some parts will be open.

What matters is that the primitive exists.

bulk.run exists because AI needs to work on the real world—not just talk about it.