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

GrafloriaJointJS / JointJS+
License / priceMIT — everything, $0MPL-2.0 core; JointJS+ ≈ $2,990/developer perpetual, updates ≈ $1,490/yr
Editor chrome (minimap, snap, toolbar…)IncludedJointJS+ tier
Exports (SVG/PNG/PDF)Included — PDF stays vectorJointJS+ tier
Smart routing + hand-editingThe avoid router re-routes around your waypoints instead of discarding themManhattan router recomputes the path; the segment tool's vertices fight it
Command manager / undoIncluded, ⌘Z zero-wiringJointJS+ tier
CollaborationCRDT in the engine, any transportDIY

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
}]

How the concepts map

JointJSGrafloria
dia.Graph + dia.Paperone component (or createDiagram(container, spec)) — model and view wired for you
elementView markup / dia.Element subclassesframework templates or HTML custom nodes — no subclassing, full DI in Angular
manhattan router + vertices tool (JointJS+)obstacle-avoiding router + waypoint and endpoint editing, MIT
ui.Stencil (JointJS+)drag-in stencil palette, MIT
graph.toJSON()toJSON() — plus a Mermaid-compatible text format with a lossless sidecar

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.