UI elements (canvas, TMP,...) are at different location depending on OS build. Why?

I have a game that uses Canvases and Text (TextMeshPro). When I try it in the editor, everything is fine.

When I build it for Android, everything is different.
When built for Linux, everything is different again.

I’ve set the (or tried to) game size to 800x600, to prevent different resolutions from distorting everything.
The canvases are set to scale with screen size and expand - I’m told this should cause a minimum of disruption.

It seems I can set the UI for one system, but not for all - shouldn’t the position of the UI elements be the same everywhere?

Not sure if this explains my issue enough - perhaps my thinking is faulty, and it’s normal that the screen elements move around depending on OS? Seems weird though.

Here are the official docs on how to make your UI handle various resolutions and aspect ratios cleanly:

Here are some notes on UI Anchoring, Scaling, CanvasScaler, etc:

Usually you need to choose a suitable ScaleMode and MatchMode in the Canvas Scaler and stick with it 100%. Generally if you change those settings you will often need to redo your UI entirely.

I also use this CanvasScalerOrientationDriver utility to make sharing UI for Landscape / Portrait easier. Read what it does carefully.