A JointJS alternative where the “+” tier is MIT
JointJS's MPL-2.0 core is genuinely capable — all routers included — and JointJS+ is a mature commercial product. Teams reach for Grafloria when the features they need (editor chrome, SVG/PNG/PDF export, tree layout, command manager, stencils) sit in the ≈ $2,990-per-developer tier, with ≈ $1,490/year for updates.
When to stay with JointJS
You want a commercial vendor with support contracts and enterprise depth, or the MPL core already covers you and per-developer licensing is acceptable. It is the most mature codebase in this field — first released in 2010.
Why teams switch
| Grafloria | JointJS / JointJS+ | |
|---|---|---|
| License / price | MIT — everything, $0 | MPL-2.0 core; JointJS+ ≈ $2,990/developer perpetual, updates ≈ $1,490/yr |
| Editor chrome (minimap, snap, toolbar…) | Included | JointJS+ tier |
| Exports (SVG/PNG/PDF) | Included — PDF stays vector | JointJS+ tier |
| Smart routing + hand-editing | The avoid router re-routes around your waypoints instead of discarding them | Manhattan router recomputes the path; the segment tool's vertices fight it |
| Command manager / undo | Included, ⌘Z zero-wiring | JointJS+ tier |
| Collaboration | CRDT in the engine, any transport | DIY |
The CAD-tool test
The question that sends JointJS evaluators here: can a smart orthogonal router coexist with hand-edited wire segments? In Grafloria a user-dragged bend becomes a persistent waypoint on the edge — serialized, undoable, and treated by the router as a constraint, not a casualty:
edges: [{
source: 'r1', target: 'c1',
type: 'orthogonal', router: 'avoid',
points: [{ x: 340, y: 90 }], // the user's bend — survives re-routing
}]
Pricing and feature cells reflect vendor pages and shipped type definitions as of July–August 2026 — always confirm on the vendor's site. Corrections welcome on GitHub; this page aims to stay honest, not to win.