A 400 by 400 canvas can start with two short functions
The p5.js README introduces the library with setup() creating a 400 by 400 canvas and draw() placing a circle at the mouse position. Drawing state, animation frames, pointer input, color, images, typography, and sound share one approachable vocabulary. The same library can move into WebGL or optional WebGPU when a sketch needs 3D work.
The friendliness sits on a substantial project. Our checkout contained 2,069 files, about 190,437 lines of source, and used 35.4 MB before dependencies. The scope includes rendering, math, media, input, accessibility work, error messages, documentation generation, and browser tests. Beginners do not have to understand that machinery to draw a shape.
One script tag is easy, while repository work installs 1,666 packages
Using the released library can be as small as a script tag. The v2.3.3 release publishes a jsDelivr URL for the standard build and another script for the optional WebGPU renderer. The project website links a browser editor, tutorials, examples, a reference, and community libraries.
Contributor setup is another scale. Our Node 22 container installed 1,666 npm packages in 56 seconds and ended with 333 MB of dependencies. The package scripts use Rolldown for builds, Vite for local preview, Vitest for tests, and Playwright with Chromium for browser execution. That is heavy for a small contribution.
What happened when we ran it
Our npm install succeeded in 56 seconds, and npm audit found 0 known vulnerabilities across the installed tree. The production build then completed successfully in 19 seconds. Those results show that commit ab97a16 could be installed and bundled in our unprivileged Debian sandbox with 3 CPUs and 8 GB of RAM. They do not measure sketch frame rate, browser compatibility, or visual correctness.
The test step failed with exit code 1 after 120 seconds. Its summary listed 2 failed, 2,347 passed, 12 skipped, and 216 todo out of 2,577 tests. At file level, 2 failed, 73 passed, and 4 were skipped out of 79. The log tail says Test timed out in 5000ms; it does not identify a system package, browser defect, or application cause. The defensible result is simply that the full command did not pass in our sandbox.
Version 2.3.3 caps GIF loads at 16,000,000 pixels
The September 7, 2026 patch release added a default MAX_GIF_PIXELS limit of 16,000,000 pixels to reduce the browser-memory risk from GIF decompression bombs. It also fixed quaternion multiplication and Friendly Error System parameter validation, then documented the newer Decorators API for addon authors. The patch addresses concrete input and error-reporting problems.
The repository also carries 9 CI workflow files and a tests directory, but no Dockerfile. That shape fits a client-side library whose important environment is the browser. Containerizing a static sketch will not settle differences in GPU support, pixel density, media permissions, or canvas output. Our 2 timed-out tests reinforce the need to run the specific Chromium, Firefox, Safari, WebGL, or WebGPU paths a published piece depends on.
Seeded randomness and high-DPI images still have open 2.x bugs
Issue 9130 reports that randomGaussian() keeps one cached value at module scope, so calls from a second p5 instance can change the first instance's seeded sequence. That matters for classrooms comparing outputs, generative editions, and tests that expect identical results from a fixed seed. The report targets the 2.x main branch and was still open when fetched. Teams using several sketches on one page should add a regression case around their random path.
Issue 9152 describes repeated pixelDensity(2) calls shrinking logical image dimensions and resize() losing the high-DPI backing size. The report says later get() and set() operations can address the wrong range. These open reports are more actionable than our 120-second timeout because they name reproducible library behavior. A plausible canvas does not prove that pixel operations are correct.
A September 11 push and v2.3.3 show active maintenance
GitHub listed 23,983 stars, 517 open issues and pull requests, and a last push on September 11, 2026. The latest release, v2.3.3, had shipped four days earlier. The combined open count is large, though it covers both pull requests and issues across a broad graphics API. Fresh patches and same-week issue discussion point to an active volunteer project, while the queue warns adopters to search for regressions in the exact renderer and browser they use.
Maturity does not make every 2.x edge predictable. Our run got 2,347 tests through before the command ended, yet 2 failures still made the suite red. The project openly routes different areas to named stewards and says maintainers are mostly volunteers. For teams shipping paid work, that means owning browser matrices and workarounds instead of treating community responsiveness as a service guarantee.
Choose p5.js for sketches and teaching, not conventional app structure
p5.js is a good first choice when the artifact is a sketch: generative art, a classroom exercise, an installation, or a small interactive explanation. Its API and web editor remove much of the ceremony between an idea and visible output. The cost appears later, when a piece depends on exact pixels, deterministic randomness, several browser engines, or sustained frame performance. The 333 MB contributor install is also far larger than the script-tag experience suggests.
Choose PixiJS when the center of the work is a fast 2D renderer, three.js for a deeper 3D scene stack, or Paper.js for vector geometry. Stay with p5.js when readable creative code is the priority and you can test the finished sketch on its real devices. Our successful 19-second build earns it a serious trial; the failed browser suite says that trial should include the behavior users will actually see.

