Backtrack explores Atlas-like back navigation across tabs in Brave and other Chromium browsers on macOS.
When a link opens a child tab, the intended final behavior is:
Child tab has meaningful internal back history
→ navigate back inside the child tab first
Child tab is back at its original entry point
→ close the child tab and focus its opener
False positives are considered much worse than a missed transition. Any unclear state must result in no special action.
Repository documentation, user-visible development text, tests, and GitHub planning are maintained in English.
Phase 2, four bounded components complete.
Development version 0.6.6 fixes a missed recovery in the redirected-Back
path: Brave can report the confirmed return as traverse, not only push
or replace. The loop marker now survives that snapshot and subsequent
same-entry updates, allowing the next deliberate gesture to return to the
validated opener. All existing closure guards, gesture thresholds, the
1.8-second cooldown and diagnostic retention remain unchanged. Automated
coverage: 222 passed, 0 failed. A fresh-child physical-trackpad retest
after reloading this version is still pending; see the
regression matrix.
Version 0.6.5 handles a confirmed redirected-Back loop. When Backtrack asks
the browser to traverse internal history, the committed navigation is both a
Back/Forward traversal and a redirect, and it returns to the exact same page,
the next live snapshot can mark that page as the effective return boundary.
The next deliberate Back gesture may then return to the still-valid opener.
Exact URL comparison exists only for the pending attempt in volatile worker
memory; no full address is persisted or logged. Ambiguous and changed-page
cases keep using internal history.
Version 0.6.4 adds conservative handling for automatic opening redirects.
A child may first load a redirect wrapper before reaching the linked page.
Browser-confirmed, unattended client redirects can now establish that landing
page as the effective child entry. Subsequent deliberate navigation remains
internal history. Automated coverage passes; the updated real-trackpad
sequence still needs confirmation in Brave after reloading the extension and
opening a fresh child tab. See the regression matrix.
This development build also records the latest 400 Backtrack action attempts plus 1,600 context events automatically in local storage. You can keep browsing after an incident and inspect the evidence later; no open console or running Codex session is needed. See development event log.
The Phase 1 gesture proof of concept remains available. A Manifest V3 service
worker now validates whether a newly opened tab has a still-existing,
unambiguous opener in the same browser window. It prefers Chromium's
openerTabId and, since version 0.5.1, supplements a missing value only when
the browser's webNavigation.onCreatedNavigationTarget event provides the
exact source-tab and child-tab IDs. Backtrack also
distinguishes meaningful internal history from the captured child-tab entry
point across full-document navigation and single-page applications that use
history.pushState() or history.replaceState(). A guarded action layer can
now activate a freshly revalidated opener and close its child tab at the
tracked entry point.
Version 0.5.0 added the first conservative physical-gesture orchestration.
Automatic actions are disabled by default and remain disabled until the local
back direction is explicitly calibrated. Version 0.5.2 no longer waits for
the full macOS momentum tail: a stronger early policy must remain eligible for
90 ms before it requests the guarded history or opener action. Ambiguous,
vertical, or page-owned horizontal movement still fails closed. A window-wide
cooldown prevents the remainder of the same physical movement from acting in
the newly active document or opener tab.
Version 0.6.0 adds local visual feedback without changing that action gate.
Once a calibrated back movement is already clear, a small arrow appears in the
middle of the page and its ring follows gesture progress. It becomes blue when
the stronger early-action threshold is armed, then moves toward the back
direction and fades on commit.
Rejected or incomplete movement simply fades the arrow away. The indicator is
an isolated, non-interactive overlay: it neither reads page content nor delays
the guarded navigation request, and reduced-motion preferences are respected.
Version 0.6.1 restores ordinary back navigation in tabs without a safe opener
or a tracked child entry. Previously, root overscroll containment suppressed
native Back there, but the action layer supplied no replacement. A confirmed
gesture now requests normal browser history traversal in the freshly checked
active tab unless the tab qualifies for the separately guarded opener action.
Missing closure evidence never authorizes a close. Momentum, in-progress
navigation, inactive senders, and action failures still block further action.
Version 0.6.2 leaves normal navigation in verified root tabs to Brave itself.
When neither openerTabId nor the browser's exact navigation-target fallback
provides an opener, Backtrack restores the page's original overscroll style
and does not classify or animate its wheel input. These tabs no longer pass
through Backtrack's 1.8-second action gate. Child tabs retain the existing
gesture, history, and closure guards. Ownership changes wait until any active
Backtrack sequence and action have ended. This is a bounded root-tab fix, not
a claim that rapid consecutive gestures in nested child tabs are solved.
Real trackpad measurements produced a Conditional Go for a bounded Phase 2 prototype:
- DOM
preventDefault()did not stop Brave's native back gesture. overscroll-behavior-x: containon the root element did stop it in the controlled test.- Slow and fast vertical scrolling produced no horizontal candidate.
- The local horizontal scroll area remained usable and was correctly blocked as a navigation candidate.
- Real tables, carousels, Kanban boards, and complex web applications still belong to the open extended compatibility matrix.
See gesture-research.md for the evidence and the exact Phase 1 decision.
manifest.json
package.json
src/
├── background/
│ ├── back-decision.js
│ ├── gesture-action-gate.js
│ ├── navigation-message-handler.js
│ ├── navigation-target-handler.js
│ ├── navigation-tracker.js
│ ├── opener-message-handler.js
│ ├── opener-resolver.js
│ ├── service-worker.js
│ └── tab-action.js
├── content/
│ ├── gesture-debug.js
│ ├── gesture-indicator.js
│ └── navigation-state.js
└── shared/
├── gesture-commit-policy.js
├── gesture-classifier.js
├── gesture-visual-policy.js
├── messages.js
└── navigation-snapshot.js
docs/
├── gesture-fixture.html
├── indicator-fixture.html
├── gesture-research.md
├── gesture-safety.md
├── internal-history.md
├── navigation-fixture.html
├── opener-safety.md
└── tab-action.md
tests/
├── back-decision.test.js
├── back-navigation-regression.test.js
├── gesture-action-gate.test.js
├── gesture-classifier.test.js
├── gesture-commit-policy.test.js
├── gesture-visual-policy.test.js
├── navigation-message-handler.test.js
├── navigation-target-handler.test.js
├── navigation-snapshot.test.js
├── navigation-tracker.test.js
├── native-root-back.test.js
├── opener-message-handler.test.js
├── opener-resolver.test.js
└── tab-action.test.js
There is deliberately no build step and no external dependency. Brave can
load this directory directly as an unpacked extension. package.json contains
only the local test command.
- Open
brave://extensions. - Enable Developer mode in the upper-right corner.
- Select Load unpacked.
- Select the repository directory.
- Reload any test pages that were already open.
Local repository path used during development:
/Users/bodhi/Documents/Codex/Backtrack
The extension is also expected to load in Google Chrome and other Chromium browsers, but Brave on macOS is the primary target.
src/content/gesture-debug.js observes horizontal wheel sequences at
document_start. It records normalized deltas, axis dominance, cancelability,
scroll context, preliminary thresholds, and sequence boundaries. The pure
classifier rejects vertical movement, short or inconsistent input, synthetic
events, modifiers, non-pixel wheel input, page-canceled events, and horizontal
scroll areas that may own the interaction.
If and only if the direction was calibrated and automatic actions were
enabled and the tab is not a verified root, the content layer applies root
overscroll containment, confirms that the CSS took effect, and sends one
semantic BACK_GESTURE request. It can send
that request before the diagnostic sequence ends only after the stronger
early-commit thresholds remain valid for 90 ms. A session-only background gate
enforces one action per gesture ID and a 1.8-second cooldown across the whole
window against split or retargeted momentum tails. See
gesture-safety.md.
In a verified root tab, Brave owns ordinary Back, Forward, and momentum
handling, including its own native feedback. Backtrack shows its custom arrow
only on the extension-controlled path. BacktrackGestureDebug.getStatus()
reports navigationOwner: "BROWSER" or "BACKTRACK" for local diagnosis.
src/shared/gesture-visual-policy.js permits feedback earlier than an action,
but reuses all direction, page-ownership, scroll-area, modifier, trust, and
calibration blockers. The indicator begins at 80 horizontal pixels and never
performs navigation itself. src/content/gesture-indicator.js renders only a
fixed, pointer-transparent overlay inside a closed Shadow DOM, so site styles
cannot normally alter it and it cannot intercept clicks or scrolling.
The ring shows progress toward the stricter 720-pixel early-commit distance. The action thresholds and 90 ms confirmation remain unchanged. If the gesture does not reach an action, the arrow fades out without changing the page. The visual itself stays centered in the viewport so it is not missed at the edge.
The background process prefers openerTabId without requesting the broad
tabs permission. Some link-created tabs do not expose that property. For
those tabs only, Backtrack accepts Chromium's dedicated
onCreatedNavigationTarget event as a session-only source-to-child mapping.
It rejects missing, conflicting, closed, moved, discarded, pinned-child, or
cross-context relationships. The same exact relationship is validated again
immediately before activation and immediately before child-tab closure.
See opener-safety.md.
The content script reads opaque NavigationHistoryEntry.key values from the
Navigation API. The background process remembers the captured child entry key
and compares it with the current entry key:
current key differs from child entry key
→ USE_INTERNAL_HISTORY
current key equals child entry key and opener is still safe
→ RETURN_TO_OPENER_ELIGIBLE
missing or contradictory evidence
→ NO_SPECIAL_ACTION
history.length is logged for diagnostics only and is never used as the sole
decision signal. See internal-history.md.
An initial redirect may move the captured entry only when the browser reports a client redirect from the known entry and no user interaction has been observed in that opening chain. This prevents a redirect wrapper from trapping the child one step before the intended opener return. Normal link navigation, later script-driven navigation after user input, and ambiguous states do not qualify. Decisions inspect passive history state without rewriting it.
A later internal Back that is redirected to the exact page it started from is
handled separately. Backtrack correlates one automatic internal-Back request
with the next top-level browser commit. It accepts a loop boundary only when
the commit is browser-labeled forward_back plus server_redirect or
client_redirect, the exact address is unchanged, the attempted opaque entry
still matches, the new Navigation API entry is push/replace, and no
same-origin Back entry remains. The opener is still revalidated by the normal
closure path. Losing any evidence becomes a no-op or another ordinary Back.
These are child-closure decisions, not permission to disable ordinary Back.
When closure is ineligible, the action layer can return USE_BROWSER_HISTORY:
the content script requests history.back() without assuming that the
Navigation API exposes every earlier entry. At the start of browser history,
that request does nothing and the tab stays open.
src/background/tab-action.js consumes only a confirmed semantic back request.
It takes control only when the decision layer reports the exact tracked entry
point and a live, same-window opener. It activates the opener first, validates
the relationship once more, and only then closes the child. If closing fails,
it attempts to restore focus to the still-open child.
The gesture layer can call this action only after either the stronger confirmed early classification or the completed-sequence fallback succeeds. See tab-action.md.
- Open an ordinary
https://page. - Open DevTools (
⌥⌘I). - Enable Preserve log.
- Enable the Verbose log level. Individual events use
console.debug; sequence start, end, and threshold crossings are also highlighted. - Filter for
[Backtrack:Gesture]or[Backtrack:Navigation].
For real navigation tests, close DevTools before performing the physical gesture. In the tested Brave version, DevTools docked on the right prevented native two-finger back navigation by itself. DevTools is useful for capturing events but cannot alone prove that Backtrack suppressed browser navigation.
The development build automatically retains the latest 400 action attempts and 1,600 context events in separate bounded groups. These include rejected actions, relevant gesture summaries, passive navigation state, browser commits/redirects, opener relationships, focus/close/move events, and runtime version/start markers. Repeated identical passive snapshots are omitted. Stored records survive page/tab closure and worker, extension, or browser restart. Each group overwrites its own oldest records when full; context noise cannot evict the 400 actions. No console or Codex session needs to remain open. This is a local development aid, not telemetry: nothing is sent anywhere.
On any ordinary http:// or https:// page, choose Backtrack Development
in DevTools' JavaScript context and run:
await BacktrackGestureDebug.getPersistentDiagnosticLog()For later investigation, the report includes the entries, retention limits, coverage dates, storage status and automatically derived investigation hints:
await BacktrackGestureDebug.getPersistentDiagnosticReport()An early BACK_ACTION can precede its GESTURE_SESSION end, or close the page
before that summary can be sent. NAVIGATION_STATE, NAVIGATION_COMMIT and
TAB_EVENT show subsequent observable outcomes. NAVIGATION_RESULT reports
whether the content script called ordinary Back, not whether traversal
actually completed. GESTURE_OWNERSHIP explains browser-owned root input.
The review flags missing closure evidence, slow action responses, action
errors, redirected-Back loops, and repeated Back requests without observed
progress as hints, not proven bugs. A reported loop may already have been
recovered successfully. The review cannot infer your intent from a
successful-looking action.
Clear the ring after we have inspected an incident:
await BacktrackGestureDebug.clearPersistentDiagnosticLog()With the developer user's explicit permission, version 0.6.5 adds website
origins (scheme, host, port), opaque entry/document UUIDs, entry-baseline flags,
history counts, redirect qualifiers and timing metadata. Credentials, URL
paths/queries/fragments, page titles/text, cookies, form input, and raw wheel
events are excluded. This is a bounded browsing-event trail for local
development, not a product analytics feature. The production logging policy
must be decided separately. See the full contract.
- Open
brave://extensions. - Select the service-worker link for Backtrack Development.
- Open a link from an existing tab in a new tab.
- Filter for
[Backtrack:Opener].
An ok: true result confirms only the current opener relationship. It performs
no action. The diagnostic object contains no URL, title, favicon, or page
content.
On an ordinary page, choose Backtrack Development from the JavaScript context menu in DevTools, then run:
BacktrackNavigationState.requestBackDecision()Possible results:
USE_INTERNAL_HISTORY: the child still has an internal back step;RETURN_TO_OPENER_ELIGIBLE: the child is back at its captured entry point and its opener is still safe;NO_SPECIAL_ACTION: evidence is missing or contradictory, or the opener is no longer safe.
This method remains diagnostic-only.
The manual Brave 152.1.94.117 smoke test on August 30, 2026 covered:
child entry
→ two SPA push steps
→ one back step, still internal
→ second back step, entry reached
→ full-document navigation
→ tab without opener
The decision changed from USE_INTERNAL_HISTORY to
RETURN_TO_OPENER_ELIGIBLE only when the real child entry was reached.
For a controlled smoke test, open a fresh child tab from an
ordinary http:// or https:// page. In the child tab's isolated Backtrack
Development DevTools context, run:
BacktrackNavigationState.performConfirmedBackAction()This command can close the current child tab. It returns one of:
RETURNED_TO_OPENER: the opener was activated and the child was closed;USE_INTERNAL_HISTORY: the child still has internal back history, so no tab action occurred;USE_BROWSER_HISTORY: no safe child-close decision; ordinary browser Back is available to automatic gesture orchestration;NO_SPECIAL_ACTION: the sender is no longer eligible, navigation is in progress, or an API step failed.
The manual development command only reports either history result; unlike an
automatic gesture request, it does not call history.back().
This development command bypasses gesture classification but not the opener or
history safety checks. The provisional threshold-crossed signal never calls
it.
The successful controlled run used Brave 152.1.94.117 on macOS 26.6.2: a
fresh fixture child closed and its exact opener became the visibly selected
tab. See tab-action.md for the action order and failure
behavior.
Each structured object has a kind field:
wheel: one raw and normalizedwheelevent;session-start: start of one related event sequence;threshold-crossed: the preliminary base threshold, never an action by itself;early-commit-armed: the stronger fast-path threshold became eligible;early-commit-disarmed: a safety condition changed during confirmation;gesture-committed: the stronger evidence remained eligible for 90 ms and an action request is about to be considered;gesture-indicator-shown: the safe visual-only preview threshold was met;gesture-indicator-phase: the stronger action threshold became armed;gesture-indicator-hidden: later evidence invalidated the visual preview;session-end: summary and conservative classification;post-dispatch-default-prevented: the page probably canceled the event after Backtrack's capture listener.
Completed measurements are also emitted as one compact
[Backtrack:Gesture:SessionJSON] line. Threshold crossings are preserved as
[Backtrack:Gesture:ThresholdJSON], keeping the last scroll context visible
with Preserve log even if Brave destroys the old page during navigation.
POSITIVE_X and NEGATIVE_X do not inherently mean back or forward. The
mapping depends on hardware, macOS settings, and browser behavior. Backtrack
stores the explicitly calibrated mapping locally.
The content script runs in an isolated JavaScript world. Choose Backtrack Gesture Research or Backtrack Development from the DevTools context menu before using these commands.
Show status:
BacktrackGestureDebug.getStatus()Preview the visual states without performing navigation:
BacktrackGestureDebug.previewIndicator(0.55, "tracking")
BacktrackGestureDebug.previewIndicator(1, "armed")
BacktrackGestureDebug.hideIndicator()These development commands only display or hide the overlay. They neither simulate a trusted trackpad event nor request any history or tab action.
Enable automatic actions only after observing which sign the normal physical back swipe produces on this Mac:
await BacktrackGestureDebug.calibrateBackDirection("NEGATIVE_X")
// or "POSITIVE_X" on a configuration that reports the opposite signDisable actions while keeping the measured direction:
await BacktrackGestureDebug.disableAutomaticActions()Remove the calibration completely:
await BacktrackGestureDebug.clearCalibration()Calibration stores only the direction and enabled/disabled state in local
extension storage. The separate development event log retains origins and
opaque navigation metadata, not full addresses, page content or raw wheel
events. Automatic actions require computed root
overscroll-behavior-x: contain; a failed containment check becomes a no-op.
Clear the measurement buffer:
BacktrackGestureDebug.clearLog()Finish and summarize the current sequence:
BacktrackGestureDebug.finishSession()Export measurements as JSON:
copy(BacktrackGestureDebug.exportJson())Raw gesture measurements remain only in the memory of the current page frame. Reloading or closing the page removes them. They are never transmitted or stored persistently. The direction calibration and the separate compact diagnostic ring described above survive a reload.
The PoC observes only by default:
BacktrackGestureDebug.getConfig().preventDefaultMode
// "off"Temporarily cancel horizontally dominant events for test case D:
BacktrackGestureDebug.configure({ preventDefaultMode: "horizontal" })Disable the experiment afterwards:
BacktrackGestureDebug.configure({ preventDefaultMode: "off" })The horizontal mode may interfere with horizontal scrolling. The stronger
all mode cancels every cancelable wheel event and must not remain active
during ordinary browsing.
Test root overscroll containment separately:
BacktrackGestureDebug.setRootOverscrollBehavior("contain")
BacktrackGestureDebug.setRootOverscrollBehavior("unchanged")This is also a research switch only. unchanged restores the previous inline
value.
Before every case, clear the buffer, perform exactly one gesture, wait briefly, and save the JSON export. Record the browser version, macOS version, trackpad model, and the Natural scrolling setting.
Start the local fixture server from the repository root:
python3 -m http.server 8765 --bind 127.0.0.1Open:
http://127.0.0.1:8765/docs/gesture-fixture.html
The page loads no external resources. Its blue horizontal area starts in a middle position so both directions can be tested.
- Use a simple ordinary page.
- Swipe right once, then left in a separate measurement.
- Record sign, event count, total distance, and native browser behavior.
- Scroll up and down normally several times.
- Expected:
session-end.evaluation.classificationremainsNO_CANDIDATE, usually because horizontal dominance is too low.
- Swipe over a large table, carousel, or horizontal code area.
- Check whether
horizontalScrollContextis detected. - The PoC blocks a candidate whenever a detectable horizontal scroll area is involved, even if that area is currently at an edge.
- Navigate to a second page in the same tab.
- Perform native back with
preventDefaultModeoff. - Compare the visible
wheelstream with actual browser navigation. - Repeat with
preventDefaultMode: "horizontal". - Optionally run a separate comparison with root containment enabled.
- Reset every research switch after the test.
- Perform a short fast movement and lift both fingers.
- Inspect how many decaying events follow.
DECAY_TAIL_ONLYis explicitly a heuristic. StandardWheelEventexposes no reliable momentum phase.
The complete evidence matrix is in
gesture-research.md. Automated suites through
version 0.6.0 and calibrated physical end-to-end results are recorded separately in
regression-matrix.md.
The completed diagnostic sequence is classified as a horizontal candidate when:
- net horizontal distance is at least 240 CSS pixels;
- accumulated horizontal movement is at least 4 times vertical movement;
- at least 90% of horizontal movement keeps the same direction;
- at least 8 pixel-mode events are present and one reaches 8 horizontal pixels;
- no horizontal scroll area can consume the movement;
- an inner horizontal scroll area is rejected even at its boundary;
- no modifier key is pressed;
- the page did not observably cancel the default behavior itself.
threshold-crossed remains a provisional research log and never requests an
action by itself. Version 0.6.0 may show the non-interactive arrow after 80
horizontal pixels, 3:1 dominance, 85% direction consistency, four pixel-mode
events, and a 6-pixel peak, but only when every ordinary safety blocker passes.
Visual eligibility is not action eligibility. To avoid waiting several seconds
for macOS momentum, version 0.5.2 added a stricter early action path: at least
720 horizontal pixels, 5:1
dominance, 95% direction consistency, 12 pixel events, a 12-pixel peak, every
normal safety check, and a further 90 ms confirmation period. If that path is
not conclusive, Backtrack retains the completed-sequence fallback. The policy
and its conservative tradeoffs are documented in
gesture-safety.md.
| Access | Why needed? | Can it be avoided? | Theoretical data access |
|---|---|---|---|
storage |
storage.session keeps child-entry/cooldown state. storage.local keeps calibration and the development event log: 400 actions plus 1,600 context events. |
Entry/cooldown state must survive worker suspension; deferred incident investigation needs persistence beyond tab closure. | The API could store arbitrary extension data. The development schema allows origins, opaque entry/document UUIDs, tab IDs, history counts, timings and reason codes. It excludes full addresses, titles, page content, credentials and raw input. These records are never used to reconstruct live closure eligibility. |
webNavigation |
onCreatedNavigationTarget supplies exact source/child IDs when Brave omits openerTabId. Top-level onCommitted metadata identifies confirmed opening redirects and redirected-Back loops, and provides diagnostic context. |
Without it, missing opener relationships, redirect wrappers and a browser-confirmed return loop cannot be distinguished safely using page-side history alone. | The API can expose navigation events and URLs. For loop detection, the pending source and committed destination are compared for exact equality only in volatile worker memory and are immediately discarded; no full address enters storage or diagnostics. The development log retains only the origin plus transition metadata. No server is contacted. |
No tabs permission |
The background uses tab lifecycle events plus chrome.tabs.get(), chrome.tabs.update(), and chrome.tabs.remove() for IDs, state validation, activation, and exact child closure. These operations do not require the broad permission. |
Already avoided. | Without tabs, the API does not expose privileged URL, title, or favicon fields to Backtrack. |
Automatic content script on http://*/* and https://*/* |
Gesture and history changes must be observed early across ordinary websites. | An activeTab research build would need a toolbar action on every page. Reassess before production. |
A content script could read or alter page DOM. Backtrack processes event, geometry, scroll-context and opaque navigation-entry data. The development log adds sender origins, not full page addresses or contents. No server is contacted. |
Backtrack does not run on brave://, chrome://, the Chrome Web Store, or
other protected browser pages. This also includes Chromium's internal
chrome-error://chromewebdata/ document: when an https:// navigation fails
because of TLS, DNS, or another network error, the address bar may still show
the requested site while the actual document is a protected browser error
page. Backtrack cannot receive trackpad events there. file:// is not matched.
Subframes are included only when their own address matches http:// or
https://.
- Web content does not necessarily receive the same information as Brave's native macOS gesture machinery.
- Standard
WheelEventcannot reliably identify trackpad versus mouse and exposes no standardized gesture or momentum phase. - Browser-generated network and certificate error pages are protected pages; the ordinary two-finger gesture cannot be detected there by a content script.
- Sites with custom JavaScript gesture logic may look like ordinary scroll areas or evade DOM scroll detection entirely.
- DevTools Preserve log is still useful for the raw per-page research log. The separate persistent diagnostic ring is available after real navigation and tab closure.
- Measurement buffers in embedded frames are separate.
- Direction calibration currently uses the isolated development API; there is no user-facing calibration screen yet.
- Automatic behavior is intentionally off until calibration succeeds.
- Inner horizontal scroll areas are blocked even at their edge, which prefers a missed back action over an accidental tab closure.
- Tabs open before the extension is loaded or reloaded receive no invented entry point.
- Tabs created by browser UI, extensions, restored sessions, or other paths
that provide neither
openerTabIdnor an exact navigation-target event stay open. - Browser or extension restart clears volatile history state; affected tabs are never automatically closed. Ordinary Back remains available after the current content scripts have loaded; refresh pages open before an update.
- Protected pages provide no content-script history evidence and therefore trigger no special action.
- Chrome: content scripts
- Chrome: Tabs API
- Chrome: Web Navigation API
- Chrome: Navigation API
- WHATWG: Navigation API
- Chrome: Storage API
- Chrome: extension service workers
- W3C UI Events
- Chromium: macOS HistorySwiper
- Chromium: OverscrollController
- Chrome: overscroll behavior
- automatic tab action before explicit direction calibration;
- restoration of a tab tree or live navigation state from persistent records;
- an options page;
- telemetry, server access, or a complete browsing-history archive. The bounded local development event trail is explicitly documented above.