oneshotlm
Compare all models on this prompt →

Mandelbrot explorer · grok-build-0.1

Render the Mandelbrot set with a smooth color gradient on a full-screen canvas, with click-and-drag to pan and mouse-wheel to zoom.

⛨ sandboxed Open in new tab ↗
transcript · 10 messages
user

Render the Mandelbrot set with a smooth color gradient on a full-screen canvas, with click-and-drag to pan and mouse-wheel to zoom.

assistant
thinking
The task is: "Build a single-page web app and write it ALL into one self-contained file named index.html in the current directory: CSS in a <style> tag, JS in a <script> tag, inline — do not create se...
bash {"command":"ls -la /tmp/ws"}
toolResult

total 0 drwxr-sr-x. 2 node node 6 Aug 1 20:15 . drwxrwsrwx. 3 root node 16 Aug 1 20:15 ..

assistant
thinking
The task is: "Build a single-page web app and write it ALL into one self-contained file named index.html in the current directory: CSS in a <style> tag, JS in a <script> tag, inline — do not create se...The task is to build a single-page web app in one index.html file with HTML, CSS in <style>, JS in <script>. It needs to render the Mandelbrot set on a full-screen canvas with smooth color gradient, click-and-drag to pan, mouse-wheel to zoom. No external resources.

I need to write the entire code for index.html.

First, structure:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Mandelbrot Set</title>

<style>

body { margin: 0; overflow: hidden; }

canvas { display: block; }

</style>

 </head>

<body>

<canvas id="mandelbrot"></canvas>

<script>

// JS code here

</script>

</body>

</html>

For JS:

Use canvas, get context.

Handle resize: set canvas size to window size, use devicePixelRatio for high DPI.

To make it simple, ignore retina 2x, just use 1:1, but for full screen it's ok, but blurry, better handle.

For perf, let's use:

let canvas = document.getElementById('mandelbrot');

let ctx = canvas.getContext('2d');

function resize() {

  canvas.width = window.innerWidth * 1; // * devicePixelRatio

  canvas.height = window.innerHeight * 1;

  // for retina: let dpr = window.devicePixelRatio; canvas.width = innerWidth*dpr; etc, ctx.scale(dpr,dpr);

  To keep simple, no dpr first.

}

window.addEvent resize event.

Then variables:

let cx = -0.5, cy = 0;

let scale = 2.0; // initial scale, width = 4/scale or something.

Better: let zoom = 1; // zoom factor, higher more zoomed.

let minX, minY, max but compute on fly.

For mouse:

let dragging = false;

let lastX, lastY;

canvas.addEventListener('mousedown', e => {

  dragging = true;

  lastX = e.clientX;

  lastY = e.clientY;

});

canvas.addEventListener('mousemove', e => {

  if (dragging) {

    let dx = (e.clientX - lastX) / canvas.width * rangeX;

    let dy = (e.clientY - lastY) / canvas.height * rangeY;

    cx -= dx; // direction: if drag right, cx decreases to move view left? Let's think .

    // If I drag the mouse to the right, the image should move to the left, so center moves left, cx -= positive.

    cy -= dy;

    lastX = e.clientX;

    lastY = e.clientY;

    render();

  }

});

For wheel:

canvas.addEventListener(' wheel', e => {

  e.preventDefault();

  let factor = e.deltaY > 0 ? 0.8 : 1.25; // zoom in if deltaY negative? e.deltaY positive for scroll down, zoom out.

  zoom *= factor;

  // adjust center to mouse pos

  let rect = canvas.getBoundingClientRect();

  let mx = e.clientX - rect.left;

  let my = e.clientY - rect.top;

  let mouseX = cx + (mx / canvas.width - 0.5) * rangeX; // wait define range.

Let's define properly.

Let the view width in complex plane be W = 3.5 / zoom; // initial zoom=1, W=3.5 covering -2 to 1.5 approx.

let W = 3.5 / zoom;

let H = W * canvas.height / canvas.width;

Then minRe = cx - W /2;

minIm = cy - H /2;

Then for screen to complex:

re = minRe + (px / width) * W;

im = minIm + (py / height) * H;

For pan:

if drag dx screen, deltaRe = dx / width * W;

cx -= delta (yes)

For wheel:

zoom *= factor;

W new = 3.5 / zoom;

H new = Wnew * aspect

Then to keep mouse fixed:

mouseRe = minRe + (mx / width) * W

Then new minRe = mouseRe - (mx / width) * Wnew wait.

minRe_new = mouseRe - (mx / width) * Wnew

Yes, because mouseRe = minRe + (mx/width)*W , so minRe = mouseRe - (mx/width)*W

So same for new.

Yes.
write /tmp/ws/index.html (7835 bytes)
toolResult

Successfully wrote 7835 bytes to /tmp/ws/index.html

assistant
thinking
The file has been written. I need to verify it exists and perhaps do a quick test, but since it's a web app, I can use bash to check it and maybe confirm the size or something. The instruction is to e...
bash {"command":"ls -la /tmp/ws/index.html && wc -c /tmp/ws/index.html"}
toolResult

-rw-r--r--. 1 node node 7839 Aug 1 20:16 /tmp/ws/index.html 7839 /tmp/ws/index.html

assistant
thinking
The file is written and exists. It's a single self-contained HTML file with embedded CSS and JS. It renders the Mandelbrot set using canvas pixel manipulation, has smooth coloring via HSV + escape tim...
bash {"command":"head -n 30 /tmp/ws/index.html && echo \"...\" && tail -n 5 /tmp/ws/index.html"}
toolResult

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Mandelbrot</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } html, body { width: 100%; height: 100%; overflow: hidden; background: #000; font-family: system-ui, -apple-system, sans-serif; } canvas { display: block; cursor: grab; touch-action: none; } #info { position: absolute; top: 12px; left: 12px; background: rgba(0, 0, 0, 0.65); color: #fff; padding: 8px 14px; border-radius: 6px; font-size: 12px; line-height: 1.4; pointer-events: none; ... init(); </script> </body> </html>

assistant
thinking
The index.html file has been created successfully as a single self-contained file. It includes:

Done. Created `/tmp/ws/index.html` — a fully self-contained single-file Mandelbrot explorer. **Features:** - Smooth gradient coloring via continuous iteration count (log-smoothed) - Full-screen canvas, adaptive max iterations with zoom - Click + drag to pan - Mouse wheel to zoom (centered under cursor) - Double-click to reset view - Keyboard: arrows to pan, +/- to zoom, R to reset No external dependencies or network access. Open in a browser to use.

TAKE IT TO CODE

A single self-contained HTML file — copy it and open in any browser, or reuse the prompt with your own pi-agent run.

RUN

modelgrok-build-0.1
vendorxAI · Grok
harnesspi-agent
generated2026-08-01

EVALUATION

4/5 working

Mandelbrot set with smooth gradient coloring; drag pans and wheel zooms correctly, click/keys have no effect as expected.

Vision grade · anthropic/claude-sonnet-5

MEASUREMENTS

Raw readings from the capture, not a verdict — the grade above is the only judgement. Percentages are how much of the screen changed; the measure under-reports sparse motion on a dark background.

idle motion0.0%
on click0.0%
on drag74.9%
on wheel11.4%
on enter + space0.0%
on arrow keys0.0%
on w/a/s/d0.0%
frame spread68.2 / 255
console errors0
js errors none

METRICS

runtime60.6s
tokens in7.7k
tokens out9.0k
cached8.0k
cost / run$0.0273