PageSourceSearch

https://tabmend.com/terms

html tabmend.com collected 2026-10-02 01:45:05 UTC 8,137 bytes, 174 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3 <head>
4  <meta charset="utf-8"/>
5  <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
6  <title>
7   Terms | TabMend
8  </title>
9  <meta content="Terms on TabMend. The ultimate productivity workspace that replaces your browser's new tab page." name="description"/>
10  <meta content="Terms | TabMend" property="og:title"/>
11  <meta content="Terms on TabMend. The ultimate productivity workspace that replaces your browser's new tab page." property="og:description"/>
12  <link href="/manifest.json" rel="manifest"/>
13  
13<script crossorigin="" src="/assets/index-Bo_iwY_l.js" type="module">
14  </script>
14
15  <link crossorigin="" href="/assets/index-0NSrl_Pd.css" rel="stylesheet"/>
16  
16<script type="module">
17   if (window.self === window.top) {
18  let lastPath = "";
19  function getPageNameFromPath(path) {
20    const segments = path.split("/").filter(Boolean);
21    return segments[0] || null;
22  }
23  function trackPageView() {
24    const path = window.location.pathname;
25    if (path === lastPath) return;
26    lastPath = path;
27    const pageName = getPageNameFromPath(path) || "home";
28    const appId = "6a16b019d6f8088500e42be6";
29    if (!appId) return;
30    fetch(`/api/app-logs/${appId}/log-user-in-app/${pageName}`, {
31      method: "POST",
32    }).catch(() => {});
33  }
34  const originalPushState = history.pushState.bind(history);
35  history.pushState = function (...args) {
36    originalPushState(...args);
37    trackPageView();
38  };
39  const originalReplaceState = history.replaceState.bind(history);
40  history.replaceState = function (...args) {
41    originalReplaceState(...args);
42    trackPageView();
43  };
44  window.addEventListener("popstate", trackPageView);
45  trackPageView();
46}
47  </script>
47
48  <meta content="https://media.base44.com/images/public/6a16b019d6f8088500e42be6/1dfd5f8dd_logo.png/v1/fill/w_1200,h_630/1dfd5f8dd_logo.png" property="og:image"/>
49  <meta content="https://tabmend.com/terms" property="og:url"/>
50  <meta content="website" property="og:type"/>
51  <meta content="TabMend" property="og:site_name"/>
52  <meta content="Terms | TabMend" name="twitter:title"/>
53  <meta content="Terms on TabMend. The ultimate productivity workspace that replaces your browser's new tab page." name="twitter:description"/>
54  <meta content="https://media.base44.com/images/public/6a16b019d6f8088500e42be6/1dfd5f8dd_logo.png/v1/fill/w_1200,h_630/1dfd5f8dd_logo.png" name="twitter:image"/>
55  <meta content="summary_large_image" name="twitter:card"/>
56  <meta content="https://tabmend.com/terms" name="twitter:url"/>
57  
57<script>
58   (function () {
59  var titles = {"/": "TabMend", "/privacy": "Privacy | TabMend", "/terms": "Terms | TabMend", "/activate": "Activate | TabMend", "/landing": "TabMend"};
60  // PascalCase boundaries -> "-", mirroring _PASCAL_BOUNDARY_RE without lookbehind
61  // (old Safari fails to PARSE a lookbehind, taking the whole script down).
62  var dashed = function (s) {
63    return s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").replace(/([A-Z])([A-Z][a-z])/g, "$1-$2");
64  };
65  var decode = function (s) {
66    // A %2F inside ONE segment must not become a structural separator: /blog/foo%2Fbar is a
67    // dynamic slug, and letting it split would match a static /blog/foo/bar and write ITS title.
68    try { var d = decodeURIComponent(s); return d.indexOf("/") < 0 ? d : s; } catch (e) { return s; }
69  };
70  var segments = function (path) { return path.split("/").filter(Boolean).map(decode); };
71  var norm = function (path) {
72    var parts = segments(path).map(function (s) { return dashed(s).toLowerCase(); });
73    return parts.length ? "/" + parts.join("/") : "/";
74  };
75  var lastPath = location.pathname, written = document.title, on = true;
76  var sync = function () {
77    // Path only: a hash/query change is the same page, and the SDK strips its own auth
78    // params with replaceState -- neither must clobber a server-rendered title in place.
79    if (!on || location.pathname === lastPath) return;
80    lastPath = location.pathname;
81    if (document.title !== written) { on = false; return; }
82    // Write ONLY a title the map proves. An unmapped path is a dynamic route (/blog/:slug) the
83    // map cannot carry, and writing a placeholder there is destructive, not merely vague: the
84    // prerender worker runs no setUserAgent, so its capture browser reads as human and executes
85    // this script, and coordinator.js's settle wait explicitly tolerates a full navigation --
86    // a redirect landing on an unmapped path would bake the placeholder into the stored
87    // snapshot. Leaving the title alone degrades to today's behavior instead.
88    // Exact lookup only. A dash-stripped retry here would let a genuinely different /set-up
89    // claim /setup: the map carries a dash-free key only where a PascalCase boundary put the
90    // dashes there, and the client cannot tell the two apart. The map emits every reachable
91    // shape per segment instead (_client_url_variants).
92    var title = titles[norm(location.pathname)];
93    if (title === undefined) return;
94    document.title = title;
95    // Re-read: the setter stores verbatim but the getter strips and collapses whitespace, so
96    // keeping the assigned string would make the next sync() read our own write as the app's.
97    written = document.title;
98  };
99  var wrap = function (fn) {
100    // The history entry is already pushed by the time sync() runs, so a throw here would
101    // surface inside the host app's router and break navigation. This is injected into apps
102    // we cannot test, so it swallows rather than trusting the trace.
103    return function () {
104      var r = fn.apply(this, arguments);
105      try { sync(); } catch (e) {}
106      return r;
107    };
108  };
109  history.pushState = wrap(history.pushState);
110  history.replaceState = wrap(history.replaceState);
111  window.addEventListener("popstate", sync);
112})();
113  </script>
113
114  <meta content="yes" name="mobile-web-app-capable"/>
115  <meta content="black" name="apple-mobile-web-app-status-bar-style"/>
116  <meta content="TabMend" name="apple-mobile-web-app-title"/>
117  <link href="https://tabmend.com/terms" rel="canonical"/>
118  
118<script data-seo-source="builder" type="application/ld+json">
119   {"name": "TabMend", "@context": "https://schema.org", "@type": "WebSite", "url": "https://tabmend.com"}
120  </script>
120
121  
121<script data-seo-source="builder" type="application/ld+json">
122   {"name": "TabMend", "logo": "https://media.base44.com/images/public/6a16b019d6f8088500e42be6/1dfd5f8dd_logo.png", "@context": "https://schema.org", "@type": "Organization", "url": "https://tabmend.com"}
123  </script>
123
124  
124<script data-seo-source="builder" type="application/ld+json">
125   {"@context": "https://schema.org", "@type": "BreadcrumbList", "itemListElement": [{"@type": "ListItem", "position": 1, "name": "Home", "item": "https://tabmend.com/"}, {"@type": "ListItem", "position": 2, "name": "Terms | TabMend", "item": "https://tabmend.com/terms"}]}
126  </script>
126
127 </head>
128 <body>
129  <div id="root">
130   <div data-seo-source="builder" id="seo-snapshot" style="position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;">
131    <main>
132     <header>
133      <h1>
134       Terms | TabMend
135      </h1>
136      <p>
137       Terms on TabMend. The ultimate productivity workspace that replaces your browser's new tab page.
138      </p>
139     </header>
140     <nav aria-label="Pages">
141      <h2>
142       Pages
143      </h2>
144      <ul>
145       <li>
146        <a href="/">
147         Landing
148        </a>
149       </li>
150       <li>
151        <a href="/privacy">
152         Privacy
153        </a>
154        — Privacy on TabMend. The ultimate productivity workspace that replaces your browser's new tab page.
155       </li>
156       <li>
157        <a href="/terms">
158         Terms
159        </a>
160        — Terms on TabMend. The ultimate productivity workspace that replaces your browser's new tab page.
161       </li>
162       <li>
163        <a href="/activate">
164         Activate
165        </a>
166        — Activate on TabMend. The ultimate productivity workspace that replaces your browser's new tab page.
167       </li>
168      </ul>
169     </nav>
170    </main>
171   </div>
172  </div>
173 </body>
174</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.