How this works

This app is powered by Jetty, managed infrastructure for agentic AI workflows. When you upload a PDF, Jetty provisions an isolated sandbox, runs an AI agent with a detailed set of instructions called a runbook, and returns the results — all through a single API call.

What happens when you upload a paper

  1. 1

    Your PDF is uploaded to cloud storage

    The file goes directly to Jetty's sandbox storage via a presigned URL — it never touches an intermediate server.

  2. 2

    Jetty provisions a sandbox

    An isolated container is spun up with Python, the mlcroissant library, and a coding agent (currently Claude Code). The agent has full autonomy inside the sandbox: shell, network, file system.

  3. 3

    The agent follows the runbook

    The runbook tells the agent exactly what to do: read the paper, extract dataset metadata (name, description, splits, features, license, citation), build a Croissant JSON-LD file, validate it against the MLCommons schema, and iterate up to 3 times if validation fails.

  4. 4

    Results come back

    The agent writes croissant.json, summary.md, and validation_report.json to the sandbox. Jetty persists every artifact to cloud storage and records a full execution trajectory so you can inspect each step.

  5. 5

    The sandbox is destroyed

    Once the run completes, the container is torn down. Only the output files and trajectory remain.

What is a runbook?

A runbook is a structured Markdown document that tells a coding agent how to accomplish a complex, multi-step task end-to-end. Think of it as a recipe: it defines the objective, the exact files the agent must produce, the steps to follow, and the evaluation criteria that determine whether the output is good enough.

SectionPurpose
FrontmatterYAML with version, evaluation strategy, agent, model, and sandbox snapshot
ObjectiveWhat the agent is doing, what it's producing, and for whom
Required output filesEvery file the agent must write — the task isn't complete until they all exist
ParametersTemplate variables injected at runtime (e.g. {{pdf_filename}})
StepsSequential instructions — each step can run code, call tools, or write files
EvaluationProgrammatic validation or rubric-based scoring to decide if the output passes
IterationIf outputs fail evaluation, the agent reads the error, applies a fix, and retries (bounded, typically 3 rounds)
Final checklistImperative verification to ensure all outputs exist before the run ends

You can view this app's runbook to see exactly what the agent does when it processes your paper.

Run it yourself

You don't need this web app. The runbook is portable — you can run it locally with your own agent or through Jetty's API with any supported agent.

Option A: Run locally with your own agent

  1. 1.Copy the runbook from the Runbook page and save it as RUNBOOK.md
  2. 2.Place your PDF in the same directory
  3. 3.Run with your preferred agent:

Claude Code

claude --system-prompt RUNBOOK.md \
  "Generate a Croissant file for the dataset in paper.pdf"

Codex

codex --system-prompt RUNBOOK.md \
  "Generate a Croissant file for the dataset in paper.pdf"

Gemini CLI

gemini --system-prompt RUNBOOK.md \
  "Generate a Croissant file for the dataset in paper.pdf"

The agent will install dependencies, read the PDF, build the Croissant file, validate it, and iterate until it passes — all on your machine.

Option B: Install the Jetty skill

The Jetty skill connects your coding agent to Jetty's infrastructure. Workflows run in isolated sandboxes with full persistence — no local setup required.

Claude Code

claude mcp add jetty -- npx -y jetty-mcp-server

Cursor / VS Code / Windsurf / Zed

// Add to your editor's MCP config:
{
  "mcpServers": {
    "jetty": {
      "command": "npx",
      "args": ["-y", "jetty-mcp-server"],
      "env": {
        "JETTY_API_TOKEN": "mlc_your_token_here"
      }
    }
  }
}

Once installed, run /jetty-setup in Claude Code to walk through account creation and API key configuration.

Option C: Call the Jetty API directly

Jetty exposes an OpenAI-compatible /v1/chat/completions endpoint. Send a runbook as the system prompt with a jetty block, and Jetty handles sandbox provisioning, agent execution, and artifact persistence.

curl -X POST https://flows-api.jetty.io/v1/chat/completions \
  -H "Authorization: Bearer $JETTY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "claude-sonnet-4-6",
    "messages": [
      {"role": "system", "content": "<your runbook>"},
      {"role": "user", "content": "Generate a Croissant file for paper.pdf"}
    ],
    "jetty": {
      "runbook": true,
      "collection": "my-collection",
      "task": "pdf2mlcroissant",
      "snapshot": "python312-uv",
      "file_paths": ["path/to/paper.pdf"]
    }
  }'

Sign up at dock.jetty.io to get your API token. Choose any supported agent: Claude Code, Codex, or Gemini CLI.

Supported agents

AgentDefault modelAPI key needed
Claude Codeclaude-sonnet-4-6ANTHROPIC_API_KEY
Codexgpt-5.4OPENAI_API_KEY
Gemini CLIgemini-3.1-pro-previewGOOGLE_API_KEY

Any MCP-compatible agent (Cursor, VS Code Copilot, Windsurf, Zed) can also connect to Jetty via the MCP server.

Learn more