Why modern Power Apps controls can make your Canvas App surprisingly large
26 MB screen. 17 MB Git limit. Not a single large image in sight.
I dug into a Canvas App's internal files and found that dozens of modern controls had a surprisingly large effect on the source-control footprint.
First, the error itself.
Azure DevOps itself handles larger files just fine. But the native Power Platform Git integration works with generated per-screen files — and has a much lower practical limit there: around 17 MB.
Our generated screen file Controls/2176.json was 26.4 MB. No commit gets through that.
My first suspect: assets.
Large files in a Canvas App? You immediately think of media. So I unpacked the .msapp and walked through the usual suspects.
The problem wasn't in what the app shows — but in what Power Apps writes away per control.
Modern controls look better. They're also bigger.
Two controls, the same job. This is the difference in this app's generated screen files:
One container, almost 2 MB
A concrete example from the screen:
≈ 2 MB of generated screen file — for one screen section.
5 lines of YAML become much more under the hood.
The readable YAML you see in source control is only half the story. Power Apps also writes generated control definitions: metadata, bindings and properties, per control. And modern controls take up considerably more room there than classic controls.
Control: Text Text: ="Welkom" X: =Parent.Width / 2 Y: =Parent.Height / 2 Width: =Parent.Width * 0.5
Different control, same screen.
The same functionality, built lighter — in this app these replacements were enough:
Control: Text@0.0.51
Control: Label@2.5.1
Control: Radio@0.0.25
Control: Classic/Radio@2.3.0
Control: TextInput@0.0.54
Control: Classic/TextInput@2.3.2
The user sees virtually the same thing. The underlying app can be built much lighter.
Buttons that weren't really buttons.
Another pattern: five modern Buttons in a gallery, doing nothing but displaying data.
Control: Button@0.0.45 Appearance: Transparent OnSelect: (empty) Text: =ThisItem.Name
These 'buttons' weren't buttons: no OnSelect, no click behaviour. Just text. A classic Label does that job for a fraction of the metadata — and if you do need clickable behaviour somewhere, one real button as an overlay is enough.
When Controls/*.json gets too big, check:
Modern controls are not 'bad'.
They have their advantages and they're Microsoft's current design direction. The lesson of this analysis isn't 'replace every modern control', but: in large enterprise Canvas Apps, consciously choose which control the functionality really needs.
Use complex controls where their functionality adds value. Use the lightest possible control for simple presentation.
A Canvas App that's slow, too large or inexplicably complex?
Problems like this often sit a layer deeper than the visible Power Fx. I help organisations analyse and restructure existing Canvas Apps.