Repository navigation
Conversation
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>
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
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.
Release v1.7.0
Closes #72.
Features
docs/sync-protocol.md. (Cloud sync of profiles and preferences through byte.vet #71)Fixes
Translations
Other
identityfor the sign-in window, which shows no warning at install or update.build/README.md).npm run build:preview/build:preview:firefox, against the preview server (northernlight.byte.vet).Changes
Testing
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.Before tagging
b735956to live byte.vet. It acceptspref:ui.failureBadgeand is on preview only; without it, live rejects the setting and the Sync section shows an item that couldn't sync.proxyverse-extensionclient: the Chrome Web Store and Edge Add-ons IDs, plus the Firefox one inbuild/README.md.🤖 Generated with Claude Code