oneshotlm
Compare all models on this prompt →

Flow-field particles · grok-build-0.1

Using the pre-provided p5.min.js (global p5, instance or global mode), create a full-screen flow-field particle animation: thousands of particles advected by Perlin-noise vectors, leaving fading trails, with colors shifting over time.

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

Using the pre-provided p5.min.js (global p5, instance or global mode), create a full-screen flow-field particle animation: thousands of particles advected by Perlin-noise vectors, leaving fading trails, with colors shifting over time.

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"}
toolResult

total 1012 drwxr-sr-x. 2 node node 23 Aug 1 20:24 . drwxrwsrwx. 3 root node 16 Aug 1 20:24 .. -rw-r--r--. 1 node node 1034532 Aug 1 20:24 p5.min.js

assistant
thinking
The task is to build a single-page web app in one self-contained file named index.html. It must include CSS in a <style> tag, JS in a <script> tag, all inline. No external resources, CDNs, or network ...First, the HTML structure:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Flow Field Particle Animation</title>
    <style>
        body, html {
            margin: 0;
            padding: 0;
            overflow: hidden;
            background: black;
        }
        canvas {
            display: block;
        }
    </style>
</head>
<body>
    <script src="p5.min.js"></script>
    <script>
        // p 5 sketch code
        let particles = [];
        const NUM_PARTICLES = 5000;
        let time = 0;
        let scale = 0.05; // adjust for field density

        function setup() {
            createCanvas(windowWidth, windowHeight);
            noStroke();
            for (let i = 0; i < NUM_PARTICLES; i++) {
                particles.push(new Particle());
            }
        }

        function draw() {
            time += 0.01;
            // Fading background for trails
            fill(0, 20);
            rect(0, 0, width, height);

 // Update and show particles
            for (let p of particles) {
                p.update();
                p.show();
            }
        }

        class Particle {
            constructor() {
                this.pos = createVector(random(width), random(height));
                this.vel = createVector(0, 0);
            }

            update() {
                // Flow field using Perlin noise
                let x = this.pos.x * scale;
                let y = this.pos.y * scale;
                let z = time * 0.5; // time evolution
                let angleX = noise(x, y, z) * TWO_PI * 2;
 let angleY = noise(x + 100, y, z + 100) * TWO_PI * 2; // wait, better way for vector field

                // Better: use two noise for vx, vy
                let vx = noise(x, y, z) * 2 - 1;
                let vy = noise(x + 50, y + 50, z) * 2 - 1;
                let force = createVector(vx, vy);
                force.mult(0.5); // strength
                this.vel.add(force);
                this.vel.limit(2); // max speed
                this .pos.add(this.vel);
                // Respawn if out
                if (this.pos.x < 0 || this.pos.x > width || this.pos.y < 0 || this.pos.y > height) {
                    this.pos = createVector(random(width), random(height));
                    this.vel = createVector(0, 0);
                }
            }

            show() {
                // Color shifting with time and position
                let hue = (frameCount * 0.2 + noise(this.pos.x * 0.1, this.pos.y * 0.1) * 60) % 360;
                stroke(hue, 80, 90, 150);
                strokeWeight(1.5);
                point(this.pos.x, this.pos.y);
            }
        }

        function windowResized() {
            resizeCanvas(windowWidth, windowHeight);
        }
    </script>
</body>
</html>

I fixed the code: used 2D noise for vx vy by offset.

But in code above, I have noise for vx, vy with offset.

Yes, noise(x, y, z) for vx, noise(x+50, y+50, z) for vy.

Also, used point for show, with fade for trails.

Colors H 360, S80, B90, A150.

NUM 5000, scale 0.05, strength 0.5, max2.

This should work.

Confidence: fairly high, but may need tuning for perf, but 5000 with points should be ok.

\confidence{60}

To make 2D flow: yes, force = createVector(noise(x,y,z)*2-1, noise(x+100,y+100,z)*2-1); *strength.

Yes.

I think this is good. 

The final is the html code. 

So, the answer is the index.html content. 

 Since the task is to create the file, the response is the code. 

Yes. 

To report, I will output the full html. 

Adjust: in update, use proper force.
write index.html (4371 bytes)
toolResult

Successfully wrote 4371 bytes to index.html

assistant
thinking
The file is created. I should verify it's there and perhaps check if p5.min.js is usable.
bash {"command":"ls -la index.html && head -c 200 index.html"}
toolResult

-rw-r--r--. 1 node node 4375 Aug 1 20:25 index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Flow Field</title> <style> html, body { m

assistant
thinking
The file is created. To verify it works, I should test it in a headless way or at least check syntax. Since it's a browser thing, I can use a simple check. But the instructions say "End with index.htm...
bash {"command":"wc -l index.html && tail -c 120 index.html"}
toolResult

164 index.html } } </script> <div class="info">flow field • perlin • click or press R to reseed</div> </body> </html>

assistant
thinking
The file is created. It uses p5.min.js with a <script src="p5.min.js"></script> as instructed, everything is self-contained in one index.html. 
bash {"command":"grep -E \"(p5\\.min\\.js|NUM_PARTICLES|noise|createCanvas)\" index.html | head -6"}
toolResult

<script src="p5.min.js"></script> const NUM_PARTICLES = 4200; // Sample 3D Perlin noise for a smooth evolving flow field const n = noise(nx, ny, nz); createCanvas(windowWidth, windowHeight); noiseDetail(4, 0.55);

assistant
thinking
The file is complete and self-contained. It uses the provided p5.min.js correctly via <script src="p5.min.js"></script>, everything is inline, no external resources. It has thousands of particles (420...
bash {"command":"node -e \"\nconst fs = require('fs');\nconst html = fs.readFileSync('index.html', 'utf8');\nconsole.log('HTML length:', html.len
toolResult

HTML length: 4371 Contains p5 script tag: true Contains NUM_PARTICLES: true No external CDNs: true Has style + script tags: true

assistant
thinking
The index.html is complete, self-contained, uses the local p5.min.js, has thousands of particles (4200), Perlin noise flow field, fading trails, and time-shifting colors. All requirements are met, no ...

Done. `index.html` is a complete self-contained full-screen flow-field animation: - 4200 particles advected by 3D Perlin noise - Fading trails via low-alpha background overlay - Hue shifts over time + position variation - Click or press `R` to reseed particles - Fully sandboxed (no external resources, uses the provided `p5.min.js`) Run by opening `index.html` in a browser.

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

Flow-field particle animation with fading colored trails, animates continuously and shifts color/pattern with any input.

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 motion36.0%
on click40.3%
on drag26.5%
on wheel29.9%
on enter + space39.6%
on arrow keys41.6%
on w/a/s/d38.8%
frame spread25.4 / 255
console errors0
js errors none

METRICS

runtime52.4s
tokens in4.9k
tokens out7.2k
cached14k
cost / run$0.0221