Skip to content

Troubleshooting

DooDesch edited this page Jul 27, 2026 · 1 revision

Troubleshooting

🛟 Need help or found a bug? Get support at support.doodesch.de/sideload.

Symptom first. Every entry here has actually happened.

Nothing appears at all

No icon on the phone. Check the log for app registered: <id>. If it is missing, Apps.Register never ran - usually because the mod threw earlier. If it is there but no icon follows, look for spawned on the phone.

The app opens but the page is blank, and the log says index.html not found in bundle or override. The LogicalName in your csproj does not match the bundlePrefix you passed to Apps.Register. Without an explicit LogicalName, MSBuild mangles folder names into the resource name. They must agree exactly.

No page builds and the log says runtime dependency not found in UserLibs or next to the mod. AngleSharp, Jint or Esprima did not get installed. See Installation.

It renders, but wrong

Everything is stacked vertically when it should be side by side. Every box is a flex column by default. Add flex-direction: row.

A list will not scroll, and it pushes everything else off screen. Add min-height: 0 next to its flex: 1. A flex item's automatic minimum is its content height, so without it the box is as tall as its contents. The single most common mistake.

A property does nothing. It is almost certainly not on the supported list, and unsupported properties are dropped silently. Check CSS and Layout rather than debugging.

margin: 0 auto does not centre. Auto margins are zero. Use justify-content or align-self.

A :hover rule that changes size does nothing. State rules repaint, they do not re-lay-out. Colours work, geometry does not.

A character renders as an empty box. The game's font atlases carry Latin text and little else. Arrows, checkmarks, dingbats and all come out as tofu. Write the word; use three full stops.

Every word breaks after one character, one letter per line. The page was laid out while its panel was hidden. Text is measured by a TextMeshPro probe, TMP initialises in Awake, and Awake never runs on an inactive object - so measurements come back about ten times too short. Sideload refuses to build off screen, so you should never see this; if you do, something is forcing a render on a hidden view.

The list jumps to the bottom while the player is reading further up. scrollToEnd() was called on a render that changed nothing they care about. The host restores scroll offsets across a rebuild by itself - call it only when the thing being read actually grew.

Input

Typing into a field swallows characters. This is fixed in the engine - a rebuild used to destroy the control and with it the caret and the half-typed word. If you see it, file it.

Typing in the app moves the player. Focus sets the game's IsTyping. If it leaks, the field is not a real input/textarea.

addEventListener('change', ...) never fires. Only click, input, keydown (Enter), back and orientationchange exist.

A click never arrives. A hit target is only wired on elements that a state rule targets, that are button/a/input/textarea, or that the script has a click listener on. A mousedown listener does not count.

Behaviour

The app cannot be closed with right-click any more. Your back handler is taking the event unconditionally. In landscape a two-pane app has nothing to step back from, so check s1.orientation first - see JavaScript, DOM and Events.

Turning the phone lands on the wrong pane. @media cannot decide that. Listen for orientationchange and pick the pane your player was just looking at.

Editing a file changes nothing. Either the watcher never started - the folder must exist before the first launch - or the opposite: a stale Mods/<appId>/ folder is overriding your freshly built bundle. The overlay says which.

Hard failures

The game freezes solid the moment the app opens, and only Task Manager gets you out. Something wrote await on a promise the host settles later, almost always await fetch(...). Jint blocks the main thread inside await, so the frame that would deliver the answer never runs. Rewrite as .then() / .catch(). Sideload logs a warning at load if it spots the pattern in your source.

s1.call returns an empty string. Either no handler is registered under that app id and name - a warning is logged - or the handler threw, which logs the exception. Both look identical from the page, so handle "" as a real answer.

A page refuses to render and says it is too large. Over 20000 elements or 200 nesting levels. Both are generous; hitting them means a loop is building nodes without clearing.

Getting help

Include the MelonLoader log. [Sideload] lines carry the app id, and a script error carries file:line. If the problem is visual, an F9 overlay screenshot plus the [Sideload/layout] dump for the box in question says more than a description.

support.doodesch.de/sideload

Clone this wiki locally