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
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
Jetty provisions a sandbox
An isolated container is spun up with Python, the
mlcroissantlibrary, and a coding agent (currently Claude Code). The agent has full autonomy inside the sandbox: shell, network, file system. - 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
Results come back
The agent writes
croissant.json,summary.md, andvalidation_report.jsonto the sandbox. Jetty persists every artifact to cloud storage and records a full execution trajectory so you can inspect each step. - 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.
| Section | Purpose |
|---|---|
| Frontmatter | YAML with version, evaluation strategy, agent, model, and sandbox snapshot |
| Objective | What the agent is doing, what it's producing, and for whom |
| Required output files | Every file the agent must write — the task isn't complete until they all exist |
| Parameters | Template variables injected at runtime (e.g. {{pdf_filename}}) |
| Steps | Sequential instructions — each step can run code, call tools, or write files |
| Evaluation | Programmatic validation or rubric-based scoring to decide if the output passes |
| Iteration | If outputs fail evaluation, the agent reads the error, applies a fix, and retries (bounded, typically 3 rounds) |
| Final checklist | Imperative 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.Copy the runbook from the Runbook page and save it as
RUNBOOK.md - 2.Place your PDF in the same directory
- 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
| Agent | Default model | API key needed |
|---|---|---|
| Claude Code | claude-sonnet-4-6 | ANTHROPIC_API_KEY |
| Codex | gpt-5.4 | OPENAI_API_KEY |
| Gemini CLI | gemini-3.1-pro-preview | GOOGLE_API_KEY |
Any MCP-compatible agent (Cursor, VS Code Copilot, Windsurf, Zed) can also connect to Jetty via the MCP server.
Learn more
- Jetty documentation — full platform docs, guides, and API reference
- Writing runbooks — how to write your own runbooks from scratch
- Try Jetty — sign up and get your API token