Skip to content

feat: Add real progress visibility to replace spinner-only sideload UX#381

Open
Zi-kiki wants to merge 3 commits intonab138:mainfrom
Zi-kiki:main
Open

feat: Add real progress visibility to replace spinner-only sideload UX#381
Zi-kiki wants to merge 3 commits intonab138:mainfrom
Zi-kiki:main

Conversation

@Zi-kiki
Copy link
Copy Markdown

@Zi-kiki Zi-kiki commented Apr 9, 2026

Summary

  • Replace the spinner-only install experience with real progress visibility.
  • Add backend-driven operation progress events and frontend progress state handling.
  • Introduce weighted stage progression so long phases (especially transfer) contribute proportionally.
  • Add byte-level transfer tracking (uploaded / total) for accurate large-file progress.
  • Improve signing-phase progression behavior for long-running large IPA signing.

Why

In the original implementation, users only saw a loading spinner during installation with no indication of actual progress. For large IPA packages, this creates long periods of uncertainty and a poor installation experience.

Desktop Screenshot 2026 04 09 - 19 30 06 62 Desktop Screenshot 2026 04 09 - 19 38 09 44 Desktop Screenshot 2026 04 09 - 19 37 37 85 Desktop Screenshot 2026 04 09 - 19 37 24 30 Desktop Screenshot 2026 04 09 - 19 33 22 98

@nab138
Copy link
Copy Markdown
Owner

nab138 commented Apr 10, 2026

I like the concept, but I tested this out and it seems to be a little rough around the edges still, at least for the SideStore operations.

Here, it says completed and triggeres the operation completed screen before its actually finished:
image

Also here, it says "Please wait..." and "Preparing..." even though everything is done.
image

@Zi-kiki
Copy link
Copy Markdown
Author

Zi-kiki commented Apr 10, 2026

Thanks for the report — root cause was on my side.

The progress system was originally designed mainly for the Import IPA path. During that work, I optimized heavily for large-package sideload UX, but I didn’t fully validate all other operation flows, which caused completion-state inconsistencies (e.g. showing “Preparing” after done) and extra indicator behavior in some scenarios.

I've addressed the issues mentioned in the previous review.

Additionally, I've added a cancel button (currently hidden).
It is debug-only and intended for QA/testing in China, where Apple ID login can be very slow. It allows quickly dismissing the operation modal without restarting the app and re-logging in.
Desktop Screenshot 2026 04 10 - 13 26 20 04

@nab138
Copy link
Copy Markdown
Owner

nab138 commented Apr 10, 2026

I don't mean to be nitpicky but there are several things I noticed:

For me, installing sidestore hangs here now. It worked before this PR.
image

If I unplug my device during the download, I would expect it to fail during the sign & install step, but it instead skips straight to place pairing file and shows the error there. Additionally, the error suggestions added in the previous update of iloader aren't shown.
image

In addition, the sidestore operation doesn't seem to actually take into account the progress during the sign and install step, which I think would be the most beneficial to show progress for. Also, I'd prefer if all three steps of the operation would be shown at the same time, like the old operation screen, instead of showing only the progress bar and the current step.

Based on the writing in this PR, I'm assuming this code was mostly ai generated, I don't have time to keep testing and giving feedback on ai generated code, so please manually make sure everything works before I look at this again.

@Zi-kiki
Copy link
Copy Markdown
Author

Zi-kiki commented Apr 11, 2026

Thanks for the feedback!

The UI issues you mentioned have been fixed.
Desktop Screenshot 2026 04 11 - 16 50 01 89
Desktop Screenshot 2026 04 11 - 16 04 35 25

Regarding the first issue — installing SideStore getting stuck at "Place pairing file":
I tested extensively on iOS 26.3 and 26.4.1 using iPhone 17 Pro and iPad Pro. I could not reproduce the hang, neither with plain SideStore nor SideStore + LiveContainer.

I also deliberately tested various failure scenarios (download phase, transfer phase, install phase, and Place pairing file phase). Error handling and display now work correctly in all cases.

Most of the code (especially the UI part) was generated with Claude 4.6 Opus. Since I'm a high school student and my English isn't very strong, I asked AI to help translate messages.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants