Skip to content

feat(recoverbull): show Tor connection state with a mascot - #2587

Merged
ethicnology merged 1 commit into
developfrom
feat/tor-mascot
Aug 18, 2026
Merged

feat(recoverbull): show Tor connection state with a mascot#2587
ethicnology merged 1 commit into
developfrom
feat/tor-mascot

Conversation

@ethicnology

Copy link
Copy Markdown
Member

Stacked on the chore/tor-translations PR. 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-package PR.

Verified on device (Pixel 5, debug arm64) and in tests: whole-project analyze clean, dart fix --dry-run nothing to fix, dart format no changes, make unit-test green, 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 the onion package through a local path override at the same revision now pinned from main, 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.

@ethicnology ethicnology self-assigned this Aug 10, 2026
@ethicnology
ethicnology force-pushed the feat/tor-mascot branch 2 times, most recently from 7ed189c to d77dc9e Compare August 11, 2026 01:59
Base automatically changed from chore/tor-translations to develop August 18, 2026 19:44
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
ethicnology merged commit ccb5be0 into develop Aug 18, 2026
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.

1 participant