Repository navigation
Settings window, appearance, onboarding and updates - #15
Conversation
- One Settings window (pseudo window id w-settings), opened with ⌘, / Ctrl+,
from any window, brought to the front when already open. It reopens at its
last section and size, also after a restart (settings.settingsSection,
settings.settingsWindowSize, normalized on load).
- Changes apply at once through settings.update, which checks each key and
value (src/main/settings/validate.ts); there is no Save button.
- Section registry: any *.settings.tsx under src/renderer/src exports
{ id, label, icon, order, component, keywords } (src/renderer/src/settings/registry.ts).
Sections so far: General, Appearance, About Orbit.
- Search in Settings (⌘F) filters rows by their text; ⌘W closes only
Settings; ⌘T and other "open something" shortcuts act in the browser window.
- Settings left open behind the browser window is throttled and does no work.
On Linux/Windows it closes with the last browser window so Orbit still quits.
- Appearance: Light / Dark / Match system applies live to the shell, command
bar, native menus (nativeTheme.themeSource), web pages and Settings.
- About Orbit: version, engine, OS, copy build info, release notes, licence.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-06)
- Each persistent profile has its own default search engine (Profile.searchEngine):
a built-in engine or one of the site searches ("site:<id>"). Unset, it uses the
Default profile's, then settings.searchEngine, then Google. The global setting
follows the Default profile's built-in choice, so code that has no profile to go
by (selection search in menus) still matches it.
- Queries typed in the command bar, a Mini Window, a pasted URL or a link dropped
in the sidebar go to the engine of the profile of the Space they were typed in
(engineFor / engineForWindow / engineForSpace in src/shared/url.ts).
- Built-in list: Google, Bing, DuckDuckGo, Brave Search, Ecosia, Startpage, Kagi,
Perplexity (Startpage and Perplexity are new).
- Settings → Search: an engine picker per profile, labelled with the profile;
the command bar's suggestion and first-result switches; the site search list
with Add, Edit, Make default and Remove. Main checks each engine (a name, a
unique keyword without spaces, an http(s) address with %s) and says which field
is wrong. Removing an engine sends profiles that used it back to the fallback.
- Loading state drops engines that no longer exist.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rst run (OB-02) Audit: nothing in Orbit asks for an account, e-mail or password, at first run or later; there is no account menu, action or state. The tests keep it that way: - e2e: a fresh install reaches a usable browser window with nothing typed. No control, heading or field in the window, the command bar, any Settings section or the app menu asks to sign in, and the whole run makes no network request (Chromium's net log), except Chromium's own spell-check dictionary download on Linux, which carries no user data. - unit: no action offers to sign in or manage an account; the initial state has no account, user, e-mail, token or password field. tests/e2e/helpers.ts: evaluateBetweenTasks and checkQuit are exported, for a launcher that doesn't wait for a browser window (first run; onboarding next). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…in General (ST-03) - Settings sections and common settings are actions (SETTINGS_ACTIONS in src/shared/commands/settings.ts, spread at the end of ACTIONS): General, Search Engine, Site Search, Appearance, About Orbit and Set as Default Browser. Choosing one opens Settings there and scrolls to the setting (a row or a group). Pressed in Settings, they act in Settings. - General → Default browser: whether Orbit is the default, and a button to make it so (macOS confirms; Windows opens its default-apps page). A development build never registers itself, and e2e runs use a stand-in that never touches the OS. Settings reads the status again when it comes to the front. - General → Import: shown when the import lane registers `import.open` (IM-01). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…timing per profile (ST-04, ST-05, ST-20) Profiles lists Default first, then by age, with the Spaces each one uses. Any profile can be renamed in place. New Profile… creates an empty one. Delete asks first, and is off (saying why) while a Space uses the profile. Archive Today tabs after: 12 hours (default), 24 hours, 7 days or 30 days. There is no Never. Other profiles follow Default until set. settings.setArchiveAfter accepts only those choices. Each per-profile row is labelled with its profile. Settings gets a modal Dialog and a link-style button for row descriptions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…regenerate FEATURES.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Typing "orbit" in the command bar listed "About Orbit" next to the user's own tabs. That broke the CB-15 suggestions test, which expects only the open tab and the web search. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…Peek options (ST-09) "Open links from other apps in": a Mini Window (default), the most recent Space, or one Space. Link routing rules: "address contains" or "address is exactly", each sent to a Space. Rules can be added, edited, reordered and removed; the first match wins. settings.setLinkRules cleans the list and drops rules whose Space is gone. Peek: links from pinned tabs and Favorites, and Shift-click. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Advanced: - Put inactive tabs to sleep after: 15 or 30 minutes, 1 or 2 hours, Never. - Picture in picture for videos. - Use graphics acceleration when available. It takes effect at the next start, through a marker file that is read before the app is ready (applyStartupSwitches in src/main/index.ts). Settings says when a restart is needed and can restart Orbit, except in test runs. Privacy & Security: - What Orbit sends: nothing. - Clear browsing data per profile, also with Cmd+Shift+Backspace or Ctrl+Shift+Delete. History clears for the chosen range. Cookies, site data and the cache clear for all time, the only range the engine offers. - Secure DNS: Automatic (the engine default), Off, Cloudflare, Google or Quad9. New settings hardwareAcceleration and secureDns have defaults and are normalized when loaded. settings.update also takes sleepAfterMs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…3–OB-05, OB-07–OB-09, OB-14) A first run (settings.onboarded false, no window to restore) opens a window of its own: welcome with Orbit's logo in motion, import (a placeholder until the import lane registers import.open), the first Space's colours with the Space theme picker and Light / Dark / Match system, Favorites from 16 web apps (nothing preselected, at most 12, added unloaded), default browser with Not now at the same weight, and a Done summary with the Default profile's search engine. Enter continues and Esc goes back; every step's title takes focus. Skip setup is on every step; the step is saved so a quit resumes there; Reset Onboarding in the command bar runs it again over the open windows and deletes nothing. Browser keys rest while onboarding has focus; ⌘W closes it. e2e runs skip it unless ORBIT_ONBOARDING=1. The Settings and onboarding windows share guardOwnWindow (no navigation away, no popups, reload after a crash). ENGINE_ORDER moves to the shared commands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s new and Help (UP-01–UP-03, UP-06, UP-07, UP-10, UP-12, OB-13, ST-03, ST-17) - Update checks read a release feed (Orbit's JSON, or a GitHub releases answer) whose address is set in Settings → General. It is empty by default, so nothing is checked until someone sets one, and test and development builds accept only a feed on this computer. Checks run at launch and about every 4 h through an in-memory session that sends only the version, system and processor type. - A newer version shows in the sidebar above the Space switcher as a pill that opens on hover and opens the release page in a tab (UP-10's stub for unsigned builds); ✕ puts it off for a day. A release marked [security] says "Important security update". After a version change, "Updated to Orbit X" links that version's release notes until opened, dismissed or 3 days old. - Check for Updates (command bar, macOS app menu) opens Settings → About, which now shows the logo, a version that copies on click, the build date and the check's progress or failure. - Help, Report a Bug (a new issue on the public tracker, build info filled in), What's New and Copy Build Info in the command bar and the macOS Help menu. - Orbit's version comes from package.json at build time: app.getVersion() depends on how Electron was started (a Playwright run reports "0.0"). Shared files: state.ts, defaults.ts and persist.ts (update status is runtime only), menu.ts, Sidebar.tsx (mounts the banner), electron.vite.config.ts (version and build date). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-03, ST-11, ST-17); regenerate FEATURES.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 85e12fd7-0c6e-4fac-9266-ebf5e980913e) |
Conflicts: - Sidebar.tsx: the update banner and media's tray both sit above the Space switcher, the banner first. - rpc.ts: RendererView takes both 'pip' and 'onboarding'. - FEATURES.md: regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 935dd9ed-ff05-4832-bcc9-6176e5fb0489) |
…irst run records its step at once (settings review M1) Nothing before onboarding set `settings.onboarded`, so every existing state file has it false with no step. Opened with no window (a macOS Dock click after closing the last one, or a start with no saved window), Orbit showed "Welcome to Orbit" instead of the user's window. - start(): a state file that isn't a first run, with onboarded false and no step, counts as onboarded (index.ts, using loadState's firstRun). - Onboarding.open() records the welcome step, so a first run that quits on it still resumes. Tests: [OB-01] an existing install never gets onboarding (launch, then close-all and activate as on macOS); the OB-14 resume test now quits on the welcome step first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: bfb83c9f-376b-4a92-a132-d0215dc914f1) |
… wherever it goes (settings review F1) The feed address must be https or on this computer (this computer only in test and dev builds), but session.fetch followed redirects, so those rules applied only to the address typed in. The check now uses redirect: 'error' (Electron's 'manual' rejects without the target) and says the feed moved: "The feed redirects elsewhere; set the address it moved to." Test: [UP-01] a check follows no redirect: a feed that redirects to a loopback address offering a newer version is not followed, and nothing past the feed is asked for. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: c5e5a3ac-b143-4df7-a15e-4907e3ca1b1e) |
…s, not only on a change event (settings review F3) useSystemDark learnt the mode only from prefers-color-scheme's change event, which Chromium fires with the page's next frame. A closed command bar can draw one frame a second, or none, so after Match system it kept the forced mode (the AP-01 flake: commandBar 'dark', settings true for 10 s). It now reads matches on every render (useSyncExternalStore), keeping the event for changes of the system's own mode. A change of Orbit's appearance reaches the page before the state patch that re-renders it: main sets nativeTheme.themeSource in a store listener and patches go out a microtask later, and an Electron probe read the new mode in 40 of 40 IPCs sent right after a themeSource change. Test: [AP-01] Match system takes the system mode at once in the closed command bar. It is a race: without the fix it failed when the closed bar was throttled (stayed 'dark' for 3 s, 1 run in 3) and passed when it kept drawing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: ec4fddb0-9017-425e-9552-6e8dfb571d72) |
…rs from the first frame (settings review F4) The page started with no opener until settings.context answered, so its first render, which the window shows at ready-to-show, used the first Space's theme. Main now puts the reveal (opener, target, nonce) in the page's address when it creates the window, and the first render reads it. Test: [ST-01] Settings opened from a second Space paints in that Space's colours from its first frame (the accent of its first committed render). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 55ade653-c9ed-4c3c-9cf3-26f0aab49b68) |
…for All time (settings review F5) Both always clear all time, but they were ticked by default under "Last hour", so the default clear signed you out of every site in the profile. They now follow the range (ticked only for All time) until you tick or untick them. Test: [ST-12][KS-12] the boxes start unticked at Last hour, tick for All time, untick again, and a box ticked by hand stays ticked when the range changes; ticked site data is deleted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 27b49afa-f58e-4911-a596-d4deeee7b0e4) |
…s it forward (settings review F11) A second launch with no link, while another app had focus, fell through to windows.open() and opened a browser window beside onboarding. The second-instance handler now brings onboarding forward when it is open (focusOnboarding); onboarding opens the first window itself when done. This is a small edit to base's src/main/external-links.ts. Test: [OB-01] launching Orbit again while onboarding is open brings onboarding forward, with no browser window beside it (a plain window has focus, then second-instance fires). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: abd33eb8-0991-4a79-8ad7-1d82699e0ebd) |
…b's profile (settings review F6) It read the global settings.searchEngine, so a Work-profile tab searched with the Default profile's built-in engine and a custom default engine was never used. It now resolves engineFor(state, tab.profileId), as a search typed in the tab's Space does. This is a small edit to base's src/main/tabs/context-menu.ts. The chrome lane's searchLabel (src/main/nav/page-menu.ts) has the same issue: whichever lane merges second fixes it. Test: [ST-06] Search for a selection, from the page's menu, uses the engine of the tab's profile. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 12a8ccf4-acba-47e7-b62a-9c82f6a73784) |
…cks survive a quit (settings review F7, D44) OB-14 says Skip setup "jumps straight to a default first window: default theme, no Favorites, no import". Skip kept the colours and mode the theme step had applied, and Favorites lived only in React state, so quitting on the Favorites step lost them. - The theme step's changes go through onboarding.setTheme, which keeps the first Space's colours and the mode from before the first change (settings.onboardingThemeBefore). - Favorites are kept as they're picked (settings.onboardingFavorites) and come back on resume. - onboarding.skip puts the colours and mode back and adds no Favorites; finishing, skipping and Reset Onboarding clear the kept picks. Loading drops picks that make no sense or outlive onboarding; settings.update can't set them. Tests: the [OB-14][OB-01] resume test now changes the colours and mode, picks two Favorites, quits on the Favorites step (they come back), then skips (default colours and mode, no Favorites); unit tests for the kept picks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 93c6ac58-a2e7-4304-b949-7a980c868d96) |
…n (settings review F9)
SETTINGS_ACTIONS is a static list, and the registry's doc didn't say a section needs an entry
there. It now shows the entry (an ActionDef plus settings: { section }), which main registers to
open Settings at that section, and the by-hand route for a lane with its own action list.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: fece2e4b-bc25-4b41-9df1-da54ecec02db) |
…hat comes with Orbit (settings review F2, D43) About's Licence and Open-source credits opened GitHub pages, which need network and, while the repository is private, access to it. They now open credits.html, which the renderer build makes (scripts/credits.ts) and Orbit opens in a tab from its own files: Orbit's licence (at #orbit), Electron's, a link to Chromium's licences (the LICENSES.chromium.html Electron ships, which main finds beside the program, or in Resources on a Mac: electron-builder.yml now puts it there, as electron-builder drops it from Mac apps) and the licence of every npm package whose code ships (the ones the renderer bundle took code from, and package.json's dependencies with what they need). The page has no network access (CSP default-src 'none'). The development server serves it too. Help, Report a Bug, Release notes and What's New keep their GitHub links; the comment in src/shared/project.ts no longer calls the repository public, and the unused LICENSE_URL is gone. Test: [ST-17][UP-07] Licence and Open-source credits open the credits that come with Orbit; unit tests for the page builder. Without the fix: Expected pattern: /^file:\/\/.*\/credits\.html\?chromium=file[^#]*#orbit$/ Received string: "https://github.com/CIYAhq/orbit-browser/blob/main/LICENSE" Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 03058ed3-bd05-4e2f-931d-51f009023c54) |
…bundled credits page §11 still called the updater a stub that "checks a release feed". It now says what was built: no feed by default and no check without one, the feed formats, when checks run, how a check keeps to itself (own in-memory session, a version-only user agent, no redirects, 20 s, 1 MB) and what the banner, Settings and What's new show. It also says where credits.html comes from (D43). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 1cf0315e-09df-4eff-bce3-8c69e4a50230) |
Conflicts, both sides kept: - src/shared/state.ts, src/shared/defaults.ts: the settings lane's hardwareAcceleration, secureDns, updateFeedUrl, updateChecks (and lastRunVersion, whatsNew) beside the archive's librarySection and archiveKeepDays. - src/shared/rpc.ts: RendererView has 'library' and 'onboarding'. - src/main/menu.ts: Help keeps Orbit Help, Report a Bug…, Release Notes and Troubleshooting ▸ Copy Build Info, and gains Restore Data… (AR-11) as a direct item, where archive.spec looks. - FEATURES.md: regenerated with scripts/features.mjs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ta now do Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: eb364503-cf9a-44ff-87c4-edb75c4ff9a1) |
…tern comment Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 40a1329f-d6ed-460f-9c55-0235c771d423) |
Conflicts: - docs/ARCHITECTURE.md §11: main's "on a Mac (npm run package:mac)" in place of "in CI", with this lane's account of the credits page and the update checks in place of the stub sentence. - FEATURES.md: regenerated with scripts/features.mjs (475 features, D41/D45). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: 8790531b-934f-4f15-9dd4-73b75d6ca687) |
No conflicts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Conflicts, each kept both sides: - src/shared/rpc.ts: RendererView has both 'onboarding' and 'internal'. - src/main/persist.ts: normalizeDownloads (which already turns running downloads into interrupted ones) and normalizeSettingsPrefs. - src/renderer/src/shell/sidebar/Sidebar.tsx: the update banner and the downloads tray. - FEATURES.md regenerated from the merged docs/feature-status.json. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The settings lane: the Settings window, appearance, onboarding and updates. Its base is
main, merged in three times (below). It stopped at about 9.6k lines (D30), with its P0s built and its P1s listed below for a later lane.Built
credits.html): Orbit's licence, Electron's, the npm packages the bundle ships, and a link to Chromium's licences file beside the program.finish-settingslane takes ST-03, ST-11, ST-12, ST-13, ST-16 and ST-20, the onboarding P1s (OB-03, OB-06, OB-09 to OB-11, OB-13) and the update flow (UP-01 to UP-06, then the P2s). Thelooklane takes the Appearance P1s (AP-02 to AP-16). OB-06 has no ad blocker to switch on yet.Decisions where the spec was open
{version, url, summary?, security?}, or a GitHub releases answer (drafts and pre-releases skipped). No electron-updater: unsigned builds can't install themselves.package.jsonat build time (app.getVersion()reports "0.0" under Playwright).Review first
src/main/updates/index.ts, the only new code that goes online: its own in-memory session, no credentials, no cache, all permissions denied; 20 s timeout, 1 MB cap; https only, or http to this computer, with no user name or password.normalize.ts(drops an unusable feed on load) and the runtime-onlyupdatesinpersist.ts.scripts/credits.ts(a Vite plugin that lists what the bundle ships),src/main/settings/credits.tsand thesettings.openCreditscommand.state.ts,defaults.ts,persist.ts,menu.ts(About, Check for Updates…, Set as Default Browser…, a Help submenu),Sidebar.tsx(the banner),electron.vite.config.ts(version and build date), and the newsrc/shared/updates.ts.Tests
tests/e2e/settings.spec.tsandonboarding.spec.ts, and ten unit files (settings-*.test.ts,credits.test.ts). At 1024×768, settings and onboarding pass 36/36.Merging
mainwas merged in three times, keeping both sides each time;FEATURES.mdwas regenerated withnode scripts/features.mjseach time:de25b45:Sidebar.tsxhas the update banner above the media tray;rpc.tshas both sides' views plus'onboarding'.94fadf9, archive (PR Archive, Library, history and sidebar backups #12):state.tsanddefaults.tskeep both lanes' settings;rpc.tshas'library'and'onboarding'; the Help menu keeps Help, Report a Bug, Release Notes and Copy Build Info, and Restore Data… stays a direct item.374a16c, PR Docs: out-of-scope rows apart (D41); the local merge gate (D42) #14: ARCHITECTURE §11 keepsmain's Mac packaging line and adds the update checks and credits.searchLabelinsrc/main/nav/page-menu.tsreads the global search engine, the bug F6 fixed here intabs/context-menu.ts. Chrome merges after this PR, and its merge carries the fix, with a test that fails without it.Review
311c666): approve with 1 must-fix. M1: an existing user who reopened Orbit with no window open (a Dock click) got first-run onboarding instead of a window. 11 follow-ups.374a16c): M1, F1 to F7, F9 and F11 fixed, each code fix with a test that fails without it. F8 (a fresh install downloads the spell-check dictionary, Electron's default) moves to ST-14 in the finish-settings lane; F10 was merge notes.374a16c): approve, nothing to fix.[AP-01][ST-11]test is the guard: 4 failures in 24 runs without the fix, 24/24 with it.finish-settingslane: the credits page's dead Chromium link when the licence file isn't found, F3's test, and crediting Vite's preload helper.main, older than this PR: the page menu opensfile:links from web pages. That goes to the chrome lane (PR Sidebar chrome, navigation, windows and permissions #18), which rewrites the menu.Merge gate (D42)
Run locally on the Linux VPS on this PR's head,
374a16c, which containsmain(32b8894):test.fixmeframe tests (MD-01, MD-09).lead/chrome-settings): settings' and onboarding's e2e tests pass on it, 36/36.LICENSES.chromium.html, which the credits page links to; the app menu's new items (About, Check for Updates…, Set as Default Browser…); and setting Orbit as the default browser.🤖 Generated with Claude Code
Note
Medium Risk
Large cross-cutting surface (first-run gating, privacy/DNS/clear-data, and outbound update feed fetches), though updates are stub-only and feed checks are gated and sandboxed.
Overview
Delivers the settings lane: a dedicated Settings window (registry-driven sections, search, opener Space theming) and a first-run onboarding flow that runs before the first browser window, with skip/resume/reset and live theme/Favorites picks.
Settings & appearance: Per-profile default/custom search engines now drive the command bar, Mini Window navigation, paste-as-tab, and page “search selection” (replacing a single global engine). Light / Dark / Match system applies in Settings and onboarding with cross-fade. New main-process coverage includes profiles (rename/delete, archive timing), link routing rules, Secure DNS, graphics-acceleration marker + relaunch, clear browsing data, default-browser stub/real impl, About/build info, and command-bar/menu Help actions.
Updates (UP-10 stub): Background/manual checks against an opt-in feed (empty by default; isolated session, no redirects), sidebar update / What’s new banners, security-release labeling, and Settings/About UI—download is opening the release page in a tab, not install.
Packaging/docs: Build injects version/build date;
credits.htmlis generated at build time andLICENSES.chromium.htmlis bundled on macOS;FEATURES.md/feature-status.jsontotals are refreshed for the new tested/built IDs.Reviewed by Cursor Bugbot for commit 374a16c. Bugbot is set up for automated code reviews on this repo. Configure here.