Method
A static scan for go.* usage, panel types, link routing and
shape figures, run over every one of the 156 sample applications shipped
in the gojs npm package, and separately over our own
application as it stood the day before we migrated it. Nothing was
executed; the numbers below are counts of source sites. You can run the
same scan on your own code — it is at the bottom of this page.
The short answer: most GoJS applications will not port cleanly
go.* symbolsEighty percent of Northwoods' own samples use something HydroDiagram does not have. We would rather you learn that here than after you have swapped the script tag. HydroDiagram is a small engine built for directed infrastructure networks — treatment trains, storm sewer systems, notification chains. It is not a reimplementation of GoJS, and the compatibility layer covers the surface an application like ours actually touches.
1. Not implemented — these throw
Absent from the namespace: undefined on read, an exception on
new. Ranked by how often they appear in real GoJS code, because
that is a better guide to your risk than an alphabetical list.
| Symbol | Uses | What to do instead |
|---|---|---|
go.Brush | 71 | Fills and strokes take CSS colour strings. No gradients or patterns. |
go.Group | 59 | Grouping is modelled in data (isGroup) with commands on the diagram, not a Group class with its own template. |
go.PathSegment | 50 | No custom geometry. figure selects from a fixed set. |
go.Placeholder | 45 | Belongs to group templates, which are not modelled. |
go.Part | 35 | Node, Link and Adornment exist; the shared base class is not exposed. |
go.RowColumnDefinition | 33 | Table panels are not implemented, so there is nothing to configure. |
go.TreeModel | 33 | Use GraphLinksModel — it is the only model shape implemented. |
go.Geometry | 31 | See PathSegment. |
go.Set | 27 | go.Map and go.List exist; a plain JS Set covers most uses. |
go.PathFigure | 26 | See PathSegment. |
go.Picture | 21 | No images inside nodes. We use emoji in a TextBlock. |
go.Animation | 20 | No animation layer; layout and scroll changes are immediate. |
go.ChangedEvent | 15 | Listeners receive a plain object. |
go.Overview | 5 | No minimap. Nothing equivalent ships today. |
Nineteen more appear less often, including TextEditingTool, ContextMenuTool, Layer, RotatingTool and DragSelectingTool.
2. Accepted and silently ignored — the expensive category
These do not throw. Your code sets them, HydroDiagram accepts them, and then never reads them. The diagram renders something plausible and wrong, which is why we put them above the figure list and not in a footnote.
| Property | Uses | Effect |
|---|---|---|
locationSpot, fromSpot, toSpot | 214 | Cosmetic. The renderer chooses link attachment points itself. |
corner, curve, toShortLength | 84 | Cosmetic. Links are drawn orthogonally with our own corner logic. |
selectable, movable, deletable, copyable, fromLinkable, toLinkable set to false | 72 | Behavioural. A part you meant to lock is fully selectable, movable, deletable and linkable. |
go.Panel types other than Auto, Horizontal and Vertical — Table, TableRow, TableColumn, Spot, Grid, Position, Graduated, Cascading, Viewbox | 83 | Structural. All nine fall back to 'Auto'. Table cells stack; spot placement centres. |
routing on a link | 23 | Never read. 18 of these ask for AvoidsNodes; links cut across nodes instead of routing around them. |
One honest note in our favour: setting these flags to true is fine
and we do not report it, because HydroDiagram's defaults are already
permissive. And routing: go.Link.Orthogonal works — not because
it is implemented, but because orthogonal is what the renderer does anyway.
3. Figures
Thirteen figures are drawn: Rectangle, RoundedRectangle, Square, Ellipse,
Circle, Diamond, the four Triangles, TriangleUp/Down, LineH and LineV.
GoJS ships roughly 180. Anything else becomes a RoundedRectangle without
complaint — in the samples that caught Decision,
Hexagon, Database, Gear,
Octagon and fifteen others. Figure names are also
case-sensitive here, so 'triangle' does not match
'Triangle'.
The case where it did work
The same scan over HydroComplete's own source, the day before we migrated it: 54 files, 21 distinct GoJS APIs in use, zero unsupported, zero behavioural divergences. Thirty-two cosmetic properties that turned out to be safely deletable — we have since deleted them. That migration needed no application rewrite, which is the entire basis for us offering this at all.
The difference between that result and the 125-of-156 above is not luck. It is that our diagrams are directed flow networks with simple node templates, and the compatibility layer was built by making exactly that application work. If your diagrams look like ours, this is a short job. If you are building an org-chart editor with table panels, custom geometry and animated group expansion, it is not a job at all.
Do not migrate if you rely on
- Group templates, subgraph collapse, or
Placeholder-based nesting - Table panels for tabular content inside nodes
- Custom geometry, gradients, or images inside nodes
- A minimap /
Overview - In-place text editing or built-in context menus
- Link routing that avoids nodes, or non-orthogonal link shapes
- Locking parts down with
selectable: falseand friends
Check your own codebase
Thirty seconds, and it reads your code rather than running it — no network,
no dependencies, nothing executed. It reports the three categories above
with file and line numbers, and exits non-zero under --strict
if you want it in CI.
node gojs-compat-check.cjs ./src
↓ Download the compatibility checker
Its API table is generated from the engine and pinned by tests that read the engine source, so it fails our build if it starts claiming support we removed — or listing as missing something we have since implemented. If it tells you something untrue, that is a bug and we want to hear about it.
What this costs
HydroDiagram is $299 once, per domain, perpetual, with no per-developer seat. It runs unlicensed with an evaluation mark, so you can complete the whole integration — and run the checker, and decide it is wrong for you — before paying anything.