Getting started

From first detection to a real controlled tab and your first useful DOM read, without skipping the safety model.
Product model Safe tab control RTO_helpers guidance
Want the quickest setup?
Start with the RTO SDK Lite. It is the simplest public starting point and already includes RTO.min.js, quick start notes, and beginner-friendly examples.
What makes RTO practical
RTO can drive a real browser tab on another explicitly allow-listed domain through the browser extension model. That gives you cross-domain orchestration on visible tabs, locally, without a server or proxy.
What you will achieve

Detect the extension, open a real controlled tab, and finish with a first trustworthy success you can build on.

Best companion pages

Then move to Tab control API, DOM automation API, and the RTO_helpers hub.

Setup checklist

  1. Choose one loading style: individual helpers, helper packs, or the all-in-one bundle (see Downloads). If you use packs, load RTO.core.min.js first.
  2. Serve your page from a normal web origin (https://… or http://…).
  3. Make sure the RTO extension is installed and enabled.
  4. Open the target host you want to control. If it is not authorized, RTO automatically presents its consent panel on the controller tab.
No secrets in logs
Avoid printing passwords, tokens, or personal data into the console or your page logs.

Two simple starting examples

Both examples are aligned with 8.6.0. The controller page itself does not need target-domain authorization.

<!-- Example A: helper pack mode -->
<script src="../RTO_helper_packs/RTO.core.min.js"></script>
<script>
(function () {
  var tabKey = "demo";

  RTOconnectOnce(1500).then(function (connected) {
    if (!connected || !window.RTOconnected) {
      console.warn("RTO extension not detected");
      return;
    }

    return RTOForm.openTab(
      { "tabKey": tabKey, "url": "https://example.com", "focus": true, "newTab": true },
      { "timeoutMs": 130000 }
    ).then(function () {
      return RTOForm.focusTab({ "tabKey": tabKey }, { "timeoutMs": 5000 });
    });
  }).catch(function (err) {
    console.warn("RTO error:", err && err.code, err && err.message);
  });
})();
</script>
<!-- Example B: all-in-one bundle -->
<script src="../RTO_helpers.min/RTO.min.js"></script>
<script>
(function () {
  var tabKey = "demo";

  RTOconnectOnce(1500).then(function (connected) {
    if (!connected || !window.RTOconnected) {
      console.warn("RTO extension not detected");
      return;
    }

    return RTOForm.openTab(
      { "tabKey": tabKey, "url": "https://example.com", "focus": true, "newTab": true },
      { "timeoutMs": 130000 }
    );
  }).then(function () {
    return RTOForm.listTabs({}, { "timeoutMs": 8000 });
  }).then(function (data) {
    if (data) console.log("Controlled tabs:", data.items || (data.data && data.data.items) || data);
  }).catch(function (err) {
    console.warn("RTO error:", err && err.code, err && err.message);
  });
})();
</script>
About RTOconnectOnce()
RTOconnectOnce() is the simple gate for helper-based pages. It updates window.RTOconnected. UI helpers and helper packs use that flag to know when they can safely talk to the extension.

Run it

  • Load one format only: individual helpers, packs, or RTO.min.js. Do not mix them on the same page.
  • Call RTOconnectOnce(1500) before your first action.
  • If the target host is not authorized, RTO automatically asks for consent in extension-controlled UI; do not attempt to automate that decision.
  • Reuse the same tabKey for the same workflow. In 8.5.0, openTab now reuses that key cleanly instead of racing into duplicate tabs.

Next