-
Notifications
You must be signed in to change notification settings - Fork 0
Troubleshooting
🛟 Need help or found a bug? Get support at support.doodesch.de/sideload.
Symptom first. Every entry here has actually happened.
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.
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.
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.
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.
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.
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.