HydroComplete
Compatibility analysis

What actually breaks when you move from GoJS to HydroDiagram

HydroDiagram ships a compatibility layer that assigns window.go, and it is genuinely how we moved our own application without rewriting it. That is a much smaller claim than "drop-in replacement", and the difference is worth several days of somebody's time. So we measured it instead of describing it.

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

125 / 156Sample apps using at least one API we do not implement
33Distinct unsupported go.* symbols
491Sites accepted and then silently ignored

Eighty 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.

SymbolUsesWhat to do instead
go.Brush71Fills and strokes take CSS colour strings. No gradients or patterns.
go.Group59Grouping is modelled in data (isGroup) with commands on the diagram, not a Group class with its own template.
go.PathSegment50No custom geometry. figure selects from a fixed set.
go.Placeholder45Belongs to group templates, which are not modelled.
go.Part35Node, Link and Adornment exist; the shared base class is not exposed.
go.RowColumnDefinition33Table panels are not implemented, so there is nothing to configure.
go.TreeModel33Use GraphLinksModel — it is the only model shape implemented.
go.Geometry31See PathSegment.
go.Set27go.Map and go.List exist; a plain JS Set covers most uses.
go.PathFigure26See PathSegment.
go.Picture21No images inside nodes. We use emoji in a TextBlock.
go.Animation20No animation layer; layout and scroll changes are immediate.
go.ChangedEvent15Listeners receive a plain object.
go.Overview5No 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.

PropertyUsesEffect
locationSpot, fromSpot, toSpot214Cosmetic. The renderer chooses link attachment points itself.
corner, curve, toShortLength84Cosmetic. Links are drawn orthogonally with our own corner logic.
selectable, movable, deletable, copyable, fromLinkable, toLinkable set to false72Behavioural. 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, Viewbox83Structural. All nine fall back to 'Auto'. Table cells stack; spot placement centres.
routing on a link23Never 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

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.