feat(recoverbull): show Tor connection state with a mascot - #2587
Merged
Conversation
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 10, 2026 20:10
e77abd0 to
c59a5f6
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 10, 2026 21:02
c59a5f6 to
62aab4e
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 10, 2026 21:46
62aab4e to
a416721
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
2 times, most recently
from
August 11, 2026 01:59
7ed189c to
d77dc9e
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 11, 2026 03:04
d77dc9e to
c579d1d
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 17, 2026 17:08
c579d1d to
85287c1
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 17, 2026 18:28
85287c1 to
51ab949
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 18, 2026 15:05
51ab949 to
04b49b7
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 18, 2026 15:07
04b49b7 to
a1b7773
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 18, 2026 15:36
a1b7773 to
63ee192
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 18, 2026 15:37
63ee192 to
bd66092
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 18, 2026 19:44
bd66092 to
c3e8ba8
Compare
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 18, 2026 19:44
c3e8ba8 to
0d34cb2
Compare
The screen reported arti's bootstrap fraction as a percentage and a progress bar. That number is not user-facing progress: it is 85% directory completeness, the directory is cached on disk, and arti documents it as explicitly non-monotonic. A device run went 30% -> 85% -> ready -> 93% -> 37%, so the bar made a healthy bootstrap look broken, while a warm cache made a disconnected client read 85% from the first frame. Five illustrated states replace it, each mapped to a fact the data can actually carry: searching while connecting, filtered when a censorship-suggesting blockage outlives the grace period, snowflake when that transport is in use, ready once Tor is usable, failed on a terminal outcome. The elapsed timer stays, because during the 40s+ directory phase it is the only element on screen that keeps moving. Tor readiness alone drives the ready pose. Requiring the key server as well held the mascot on "searching" for the whole gap between the two, measured at 17-24s on a Pixel 5, which is precisely the moment the user needs to see that something advanced. The narrative line still says the key server is being contacted, so the two facts stay distinguishable. Provenance of the five PNGs: generated with OpenAI GPT-Image through the Codex CLI, prompted from this repository's own Bull assets; no third-party artwork was used as a reference. They are placeholders that have not been through design review, and may need replacing with official Bull artwork before release.
ethicnology
force-pushed
the
feat/tor-mascot
branch
from
August 18, 2026 19:44
0d34cb2 to
2d622fd
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on the
chore/tor-translationsPR. Review that one first.The connecting screen reported arti's bootstrap fraction as a percentage and a progress bar. That number is not user-facing progress: it is directory completeness, the directory is cached on disk, and arti documents it as explicitly non-monotonic. A device run went 30% → 85% → ready → 93% → 37%, so the bar made a healthy bootstrap look broken, while a warm cache made a still-disconnected client read 85% from the first frame. Both readings are worse than showing nothing.
Five illustrated states replace it, each mapped to a fact the data can actually carry: searching while connecting, filtered when a censorship-suggesting blockage outlives the grace period, snowflake when that transport is in use, ready once Tor is usable, failed on a terminal outcome. The elapsed timer stays, because during the long directory phase it is the only thing on screen that keeps moving.
Tor readiness alone drives the ready pose. Requiring the key server as well held the mascot on "searching" for the entire gap between the two, measured at 17-24s on a Pixel 5, which is exactly the moment the user needs to see that something advanced. The narrative line still says the key server is being contacted, so the two facts stay distinguishable.
Asset provenance. The five PNGs were generated with OpenAI GPT-Image through the Codex CLI, prompted from this repository's own Bull assets; no third-party artwork was used as a reference. They are placeholders that have not been through design review and may need replacing with official Bull artwork before release. Flagging explicitly so the decision is made deliberately rather than inherited.
Not addressed here, and accepted for now: in automatic mode a censored user can wait up to 120s before Snowflake is attempted, because the fallback is wired to a terminal failure rather than to the stream diagnostic this screen already displays. That means the screen can say "this looks filtered" while the transport switch has not yet been triggered. See the limitation section in the
feat/bull-tor-packagePR.Verified on device (Pixel 5, debug arm64) and in tests: whole-project analyze clean,
dart fix --dry-runnothing to fix,dart formatno changes,make unit-testgreen, and the connecting-page widget tests cover the direct pose, the ready-while-server-is-checked window, the filtered explanation, the retry affordance and the single-navigation guarantee. The device run resolved theonionpackage through a local path override at the same revision now pinned frommain, so the behaviour observed is the behaviour this stack ships; the git-resolved build itself has not been re-run on hardware since the repin.