Fabric.js gives Canvas objects an editor interaction model
Fabric.js version 7.4.0 wraps the browser's immediate-mode Canvas API in objects that retain position, scale, angle, styles, and relationships. A rectangle can be selected, dragged, rotated, grouped, serialized to JSON, restored, and exported without an application rebuilding all of that behavior. Built-in shapes, text, images, filters, gradients, patterns, brushes, animations, and controls cover much of the machinery behind a design surface. The library also reads and writes SVG, though an SVG round trip should be tested with the exact documents a product accepts.
The current package split matters. New browser applications use @fabricjs/browser; server rendering uses @fabricjs/node; the old fabric package remains a compatibility facade. Advanced consumers can import @fabricjs/core and individual extensions. The README warns that these packages must have matching versions because a mismatch can load separate runtime copies with different class identities. That is an unusual failure mode, and it deserves a package-manager constraint in a monorepo rather than a comment in onboarding notes.
Node.js 20 support still depends on native canvas libraries
Node.js 20 is the documented minimum, and @fabricjs/node depends on node-canvas for the canvas implementation plus jsdom for a window. The project links directly to the native installation instructions and warns that node-canvas bugs and limits apply. Rendering a scene to PNG on a server is useful, especially when the browser and backend share object JSON, but deployment now includes system libraries and native-module compatibility that browser-only teams never see.
Browser setup is easier: install the browser package, create a Canvas, and attach it to an HTML canvas element. The public API supplies selection and transformation behavior that would otherwise require pointer tracking, hit testing, coordinate conversions, and redraw logic. Supported environments include current Chromium-based browsers, Firefox, and Safari, while IE11 and legacy Edge are explicitly out. If an application still serves those older engines, Fabric.js is already ruled out.
What happened when we ran it
Our measurement setup was a fresh unprivileged sandbox, where pnpm installed commit 9752ff4 in 31 seconds. It added 843 packages and occupied 544 MB on disk, on top of a 61.3 MB checkout containing 1,963 files and about 109,490 source lines. The build passed in 23 seconds on 3 CPUs with 8 GB of RAM. Those figures make a local evaluation easy enough, while the installed size is substantial for a library whose browser import can look deceptively small.
We could not run a test suite because the repository exposed no test script or target to our runner, so the test step was skipped. That finding does not mean the project has no tests: our scan found a tests directory and 11 CI workflow files. It means the same checkout that built cleanly did not present a runnable test command through the lab's discovery path. The repository had no Dockerfile, leaving adopters to define any repeatable container build themselves.
Versions 6.3 through 7.4 have an open group reload report
Versions 6.3 through 7.4 are named in issue 11016, where grouped items reportedly return with the wrong display or position after a JSON reload and subsequent ungrouping. Serialization is central to editors that save user work. The report does not include a reproduction link, so it is evidence of an unresolved user case rather than proof that every group fails. Test nested groups, custom properties, and upgrade migrations against real saved documents before changing the package version.
Effects can interact in less ordinary combinations. Issue 10855 includes a reproduction where grouped text with a shadow and a clip path throws while exporting a data URL in version 6.6.4. Another open report, issue 11074, says image-loading failures do not expose the HTTP status and response body the user needs. A basic canvas demo will not exercise either path. An editor should keep a small corpus of troublesome documents and verify exports, image failures, copy and paste, and undo behavior around each release.
Version 7.4.0 fixes security while migration work continues
The latest GitHub release is version 7.4.0, published May 18, 2026. Its notes lead with a fix for CVE-2026-44311 and also mention viewport rotation corrections. The repository was pushed again on September 12, 2026, and a same-day issue about hardening build-stat handling received immediate project attention. That combination is stronger evidence of maintenance than the release date alone. GitHub listed 467 open issues and pull requests, including 428 issues and 39 pull requests in separate searches, so activity comes with a large triage queue.
The project has also changed how new applications consume it. Browser and Node packages now make the environment boundary clearer, while compatibility imports remain for existing applications. That transition reduces unwanted Node dependencies in browser work, but it creates another upgrade detail: extension packages and the facade must stay aligned. Teams moving from version 5 or 6 should budget for document fixtures, TypeScript checks, and visual comparisons instead of treating a major update as a package-name substitution.
Fabric.js earns its place when the product is an editor
A diagram editor, label designer, image annotator, or product customizer benefits from Fabric.js because object selection and manipulation are the product, not an incidental animation. JSON persistence and SVG exchange make its scene graph useful beyond one render. The 31-second install and successful 23-second build lower the cost of a trial, and the browser package requires no service account or remote backend. Start with a real workflow that includes loading, editing, saving, reopening, and exporting the same document.
For games, particle fields, or draw-heavy visualizations, PixiJS is a more direct renderer. Konva is worth comparing for a smaller retained Canvas layer, while Paper.js suits path construction and vector geometry. Fabric.js asks for more dependency weight and more care around package versions because it solves a broader editor problem. Pick it when those editor behaviors remove months of application code, then own the regression suite the repository did not expose to our sandbox.

