Skip to content

v1.7.0: cloud sync through byte.vet, proxy auth and badge fixes - #73

Merged
SYM01 merged 22 commits into
mainfrom
develop
Oct 29, 2026
Merged

SYM01 merged 22 commits into
mainfrom
develop

Conversation

@SYM01

@SYM01 SYM01 commented Oct 29, 2026

Copy link
Copy Markdown
Collaborator

Release v1.7.0

Closes #72.

Features

  • Cloud sync through byte.vet: sign in on the Preference page to sync profiles and four preferences (theme, language, toolbar icon, failure badge) across browsers and devices. It syncs at browser start, after sign-in, 2 s after a local change, every 15 min and on "Sync now". On first sign-in you choose to merge, use the account's data, or upload this device's. Profiles can be kept on "This device only", and earlier snapshots can be restored. The protocol is in docs/sync-protocol.md. (Cloud sync of profiles and preferences through byte.vet #71)
  • Preference → Interface → Failed resources on the icon: turns off the failed-resources count on the toolbar badge. On by default. (option to disable the Failed-resources alerts #72)

Fixes

  • Proxy password prompts in Chrome: Chrome no longer asks for the password of a proxy whose profile has it.
    • A proxy host typed with capitals now gets its credentials: Chrome reports the host lower-cased.
    • Chrome never asks extensions for credentials on its own pages' requests (e.g. the new tab page's). The background now sends one request through the active proxy at browser start and on every proxy change, so Chrome has the credentials cached. Under an auto-switch profile it takes the default route, so a proxy reached only through rules isn't covered.
  • Badge after a profile switch: switching profiles (e.g. to System) used to leave each tab showing the old profile until it loaded a page. Every open tab now updates, with the sub-profile its page uses under an auto-switch profile.
  • No failure flashing under System: the failed-resources count no longer flashes under System or while another extension controls the proxy. Failures are still listed in the popup.
  • Deleting the active profile (here or by sync) switches to Direct instead of keeping the deleted proxy applied.
  • Profile writes from different extension pages no longer overwrite each other.

Translations

Other

  • New required permission identity for the sign-in window, which shows no warning at install or update.
  • Chrome dev and e2e builds carry a fixed extension key, so their ID and OAuth redirect URI are stable. Store builds don't (build/README.md).
  • New npm run build:preview / build:preview:firefox, against the preview server (northernlight.byte.vet).

Changes

Testing

  • 418 unit tests and 117 Chromium e2e tests pass.
  • pac.e2e.ts "schedules a refresh alarm, removed when disabled" is flaky: it fails about 1 run in 3, on the code before these changes too.
  • Not run: the Firefox smoke suite (couldn't start Firefox in the agent's sandbox) and the live two-device sync test, which needs a person to sign in twice.

Before tagging

  • Deploy bytevet/webapp b735956 to live byte.vet. It accepts pref:ui.failureBadge and is on preview only; without it, live rejects the setting and the Sync section shows an item that couldn't sync.
  • Register the store redirect URIs on byte.vet's live proxyverse-extension client: the Chrome Web Store and Edge Add-ons IDs, plus the Firefox one in build/README.md.
  • CI green, including the Firefox smoke suite.
  • Check by hand in Chrome and Firefox against live byte.vet: sign in, sync between two browsers, sign out.

🤖 Generated with Claude Code

transifex-integration Bot and others added 22 commits October 19, 2026 15:44
100% reviewed source file: 'messages.json'
on 'ar'.
100% reviewed source file: 'messages.json'
on 'zh_CN'.
100% reviewed source file: 'messages.json'
on 'zh_TW'.
100% reviewed source file: 'messages.json'
on 'pt_BR'.
92% of minimum 100% reviewed source file: 'messages.json'
on 'zh_CN'.
94% of minimum 100% reviewed source file: 'messages.json'
on 'zh_TW'.
Register the Arabic catalog (and Arco's ar-EG strings) and lay pages out
right to left when the messages shown are Arabic, whether chosen in
Preference or picked by the browser. Arco mirrors only a few components,
so mirror the spacing of the ones we use; inputs show each value in its
own direction, and URLs, the PAC editor and the English footer stay left
to right.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
100% reviewed source file: 'messages.json'
on 'zh_CN'.
100% reviewed source file: 'messages.json'
on 'zh_TW'.
…087e7f341ccc

[i18n] Updates for file public/_locales/en/messages.json
Draft v1 of the profile/preference sync protocol: OAuth 2.1 + PKCE with
byte.vet as authorization server, per-record last-writer-wins by hybrid
logical clock, push on change plus periodic pull, server snapshots for
restore, and per-device opt-out. Design only; nothing is implemented.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sync profiles and preferences (theme, language, toolbar action) across
browsers and devices with a byte.vet account, per docs/sync-protocol.md.

- Sign-in: OAuth 2.1 code + PKCE via identity.launchWebAuthFlow, run from
  the Preference page. Refresh tokens rotate under a cross-context lock;
  requests never send byte.vet cookies (its auth server refuses
  cookie-bearing POSTs).
- Engine: per-record last-writer-wins by hybrid logical clock, tombstones,
  full resync after cursor_expired, held records of unknown schemas,
  per-device "This device only" profiles, first-sign-in choice (merge,
  use cloud, upload). No outbox: pending changes survive service worker
  restarts.
- Background: sync at start, after sign-in, 2 s after a local change and
  every 15 min; typed sync:* messages for the UI.
- UI: Sync section on the Preference page, first-sync modal, snapshot
  restore, and the "This device only" switch in the profile editor.
- Build: PROXYVERSE_ENV (production, northernlight, e2e) picks the server
  and OAuth client; Chrome dev builds carry a dev key for a fixed ID.
  New scripts: build:preview, build:preview:firefox, sync:api-types,
  test:e2e:live. identity is a required permission (no warning).
- Contract: docs/sync-api.openapi.yaml vendored from the byte.vet webapp,
  client types generated from it, with a drift test.
- Fixes: deleting the active profile now falls back to Direct; profile
  writes are serialized across extension contexts.
- Tests: unit tests for every sync module, two-device engine tests against
  a fake byte.vet, Chromium e2e for sign-in, push/pull, alarms, restarts,
  local-only and restore, a Firefox smoke test, and an opt-in live smoke
  against northernlight.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
UX
- Preference page: one shared label column across sections; Import and
  Export as labeled rows; the signed-out Sync section as an Account row;
  Sign out as a text button.
- Last sync shown as relative time ("a few seconds ago", "5 minutes ago"),
  with the exact time on hover.
- Popup Config button opens Preference when no custom profile is active.
- Sync privacy note reworded: data is stored encrypted and used only to
  keep devices in sync (byte.vet holds the keys; not end-to-end).

Behavior
- A service worker wake (most page loads) no longer reaches the server
  when nothing is pending and the last sync is recent; the poll alarm
  pulls the rest.
- One cookie-free fetch for every byte.vet request (syncFetch); the fake
  byte.vet sets a session cookie and refuses cookie-bearing POSTs, so e2e
  catches a regression.
- Sync settings written under a lock; sign-out removes its keys
  (Host.remove) instead of writing null.

Simplification
- needsFirstChoice flag instead of a three-state phase; fewer state
  writes per run; one decodeRemote; pref defaults owned by their modules;
  shared identity implementation in BaseAdapter; build settings from one
  source; dead API surface removed.
- Shared unit-test fixtures (tests/helpers.ts) and e2e helpers
  (signedInStorage, popconfirmOK); the fake server uses the generated
  contract types.

Build
- build:preview:firefox writes to dist-firefox/, so it no longer replaces
  the Chrome preview in dist/.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Match the proxy host case-insensitively (and with or without IPv6
  brackets): Chrome reports the challenger host lower-cased, so a host
  typed with capitals never matched and Chrome prompted.
- Chrome never asks extensions for credentials on requests they can't
  see, like the new tab page's, and prompts instead. warmUpProxyAuth
  sends one request of ours through the active proxy (to
  proxyverse-auth.invalid, which never resolves) at browser start and on
  every proxy change, when the active profile tree has credentials, so
  Chrome caches them first.
- e2e: the warm-up caches credentials; host case; the retry order is now
  asserted on the warm-up request, the first one through the proxy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…shing

- A tab's own badge wins over the global one, so a profile switch now
  repaints every open tab with the profile predicted for its page (the
  sub-profile under an auto profile). Before, switching (e.g. to System)
  left each tab showing the old profile until it loaded a page. A worker
  start leaves tab badges alone.
- The failure count no longer alternates under System or while another
  extension controls the proxy: Proxyverse isn't routing traffic then.
  Failures are still recorded, and show again once a profile is active.
- Preference > Interface: "Failed resources on the icon" switch
  (ui.failureBadge, on by default), synced through byte.vet. The server
  must accept pref:ui.failureBadge before this ships; vendored contract
  updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
060930f adds Preference > Interface > "Failed resources on the icon", a
switch to turn off the failed-resources count on the toolbar badge.

Closes #72

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cloud sync of profiles and preferences through byte.vet
100% reviewed source file: 'messages.json'
on 'ar'.
100% reviewed source file: 'messages.json'
on 'zh_CN'.
100% reviewed source file: 'messages.json'
on 'zh_TW'.
100% reviewed source file: 'messages.json'
on 'pt_BR'.
…087e7f341ccc

[i18n] Updates for file public/_locales/en/messages.json
@SYM01
SYM01 merged commit 97f7191 into main Oct 29, 2026
8 checks passed
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.

option to disable the Failed-resources alerts

1 participant