1<!doctype html> 2<html lang="en"> 3 <head> 4 <meta charset="UTF-8" /> 5 <!-- Google tag (gtag.js) â GA4 property G-G53584FK59. 6 Here rather than in a React component so it lands on EVERY page, in 7 both the SPA and the prerendered crawler snapshots, per Google's "one 8 tag, every page, immediately after <head>" rule. charset stays the 9 first tag so it remains within the first 1024 bytes. SPA navigation is 10 covered by GA4 Enhanced Measurement, so no extra page_view call. 11 Gated on the production hostnames â dev.onetransform.ai and localhost 12 fetch nothing and report nothing. Hostname, not VITE_APP_ENV_TYPE: a 13 mis-set build arg fails silently either way, and the legacy bundled- 14 frontend target in backend/api/Dockerfile pins that var to 15 "development". Match hostnames exactly; a suffix test catches dev too. 16 The dataLayer/gtag shim is defined in every environment so a future 17 gtag("event", ...) is a harmless queue push off production. --> 18
18<script> 19 window.dataLayer = window.dataLayer || []; 20 window.gtag = function () { 21 dataLayer.push(arguments); 22 }; 23 (function () { 24 var GA_ID = "G-G53584FK59"; 25 var GA_HOSTS = ["onetransform.ai", "www.onetransform.ai"]; 26 if (GA_HOSTS.indexOf(location.hostname) === -1) return; 27 var s = document.createElement("script"); 28 s.async = true; 29 s.src = "https://www.googletagmanager.com/gtag/js?id=" + GA_ID; 30 document.head.appendChild(s); 31 gtag("js", new Date()); 32 gtag("config", GA_ID); 33 })(); 34 </script>
34 35 36 <!-- LinkedIn Insight Tag â powers conversion tracking and retargeting 37 audiences in LinkedIn Campaign Manager. Gated on the same production 38 hostnames as the GA tag above, for the same reasons. 39 40 â ï¸ INERT until LI_PARTNER_ID is filled in with the Partner ID from 41 Campaign Manager (Account Assets â Insight Tag). Left empty on purpose: 42 loading the tag with a wrong id records against nothing while looking 43 exactly like it works, which is the worst failure mode for analytics. 44 45 Deliberately no noscript tracking pixel: it could not be 46 hostname-gated (so dev traffic would reach LinkedIn), and a visitor 47 with JS disabled cannot use this SPA anyway. 48 49 WARNING: never write that fallback tag name with angle brackets in 50 this file, not even inside a comment. scripts/prerender.mjs strips 51 everything between the opening and closing form of it from every 52 snapshot, so one stray opening tag in a comment matches through to 53 the real closing tag further down and silently deletes the title and 54 meta description from all 8 crawler snapshots. 55 56 window.lintrk is LinkedIn's own queue shim, defined in every 57 environment so trackLead() never throws. --> 58
58<script> 59 if (!window.lintrk) { 60 window.lintrk = function (a, b) { 61 window.lintrk.q.push([a, b]); 62 }; 63 window.lintrk.q = []; 64 } 65 (function () { 66 var LI_PARTNER_ID = ""; 67 var LI_HOSTS = ["onetransform.ai", "www.onetransform.ai"]; 68 if (!LI_PARTNER_ID || LI_HOSTS.indexOf(location.hostname) === -1) return; 69 window._linkedin_partner_id = LI_PARTNER_ID; 70 window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || []; 71 window._linkedin_data_partner_ids.push(LI_PARTNER_ID); 72 var s = document.createElement("script"); 73 s.async = true; 74 s.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; 75 document.head.appendChild(s); 76 })(); 77 </script>
77 78 79 <!-- X (Twitter) Pixel â the "uwt" website tag, for conversion tracking and 80 retargeting audiences in X Ads. Same production-hostname gate as the GA 81 and LinkedIn tags above, for the same reasons. 82 83 INERT until X_PIXEL_ID is filled in with the pixel id from X Ads 84 Manager (Tools -> Events Manager -> the base pixel, a short id like 85 "o1abc"). Left empty on purpose: firing twq with a wrong id records 86 against nothing while looking exactly like it works. 87 88 window.twq keeps X's own queue semantics (exe / queue / version), so 89 uwt.js drains anything queued before it loaded, and trackLead() can 90 call it safely in every environment. No email_address enhanced 91 matching is sent â that would hand a lead's address to X, which is a 92 separate consent question from loading the tag at all. --> 93
93<script> 94 if (!window.twq) { 95 var otTwq = (window.twq = function () { 96 otTwq.exe ? otTwq.exe.apply(otTwq, arguments) : otTwq.queue.push(arguments); 97 }); 98 otTwq.version = "1.1"; 99 otTwq.queue = []; 100 } 101 (function () { 102 var X_PIXEL_ID = ""; 103 var X_HOSTS = ["onetransform.ai", "www.onetransform.ai"]; 104 if (!X_PIXEL_ID || X_HOSTS.indexOf(location.hostname) === -1) return; 105 var u = document.createElement("script"); 106 u.async = true; 107 u.src = "https://static.ads-twitter.com/uwt.js"; 108 document.head.appendChild(u); 109 window.twq("config", X_PIXEL_ID); 110 })(); 111 </script>
111 112 <link rel="icon" type="image/svg+xml" href="/1T.svg" /> 113 <link rel="apple-touch-icon" href="/1T.svg" /> 114 <link rel="manifest" href="/site.webmanifest" /> 115 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 116 <meta name="theme-color" content="#ffffff" /> 117 <meta name="author" content="One Transform, Inc." /> 118 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> 119 <link rel="preconnect" href="https://challenges.cloudflare.com" /> 120 <link rel="preconnect" href="https://onetransform-media.s3.amazonaws.com" crossorigin /> 121 <link 122 href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Fraunces:opsz,[email protected],400..700&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" 123 rel="stylesheet" 124 /> 125 <!-- Default title (the per-route <title>/meta/canonical/OG-text are owned by 126 react-helmet-async via the <Seo> component, which replaces this on each 127 route â see components/Seo/Seo.tsx). The tags below are the non-varying 128 card essentials kept here so non-JS social scrapers still get a ric
128h 129 preview without producing duplicate tags. --> 130 <title>One Transform</title> 131 <!-- Fallback description for non-JS crawlers only. Marked data-static and 132 REMOVED by the inline script below the moment JS runs, so the per-route 133 Helmet description never coexists with it (see the duplicate-tag 134 ownership split note above â two descriptions would be ambiguous to 135 Google). Do NOT add other per-route meta here. --> 136 <meta 137 name="description" 138 data-static="true" 139 content="One Transform is an AI research platform for IP professionals. Run nine search types, from infringement and prior art to freedom to operate and patent landscape, and get results you can verify: every score is tied to claim-level evidence." 140 /> 141
141<script> 142 /* JS runs â react-helmet-async owns the description; drop the static 143 fallback so exactly one description exists in either mode. */ 144 (function () { 145 var el = document.querySelector("meta[data-static]"); 146 if (el && el.parentNode) el.parentNode.removeChild(el); 147 })(); 148 </script>
148 149 <meta property="og:type" content="website" /> 150 <meta property="og:site_name" content="One Transform" /> 151 <meta 152 property="og:image" 153 content="https://onetransform-media.s3.amazonaws.com/Open_Graph_Banner_OTI.jpg" 154 /> 155 <meta property="og:image:alt" content="One Transform â AI patent intelligence" /> 156 <meta property="twitter:card" content="summary_large_image" /> 157 <meta 158 property="twitter:image" 159 content="https://onetransform-media.s3.amazonaws.com/Open_Graph_Banner_OTI.jpg" 160 /> 161 <!-- Site-wide structured data (non-varying, so it lives here where non-JS 162 crawlers can read it on every route). Page-specific JSON-LD 163 (SoftwareApplication, FAQPage, Product/Offer) stays with the pages via 164 <Seo jsonLd>. --> 165
165<script type="application/ld+json"> 166 { 167 "@context": "https://schema.org", 168 "@type": "Organization", 169 "name": "One Transform, Inc.", 170 "url": "https://onetransform.ai", 171 "logo": "https://onetransform.ai/1T.svg", 172 "description": "One Transform is an AI research platform for IP professionals. Run nine search types, from infringement and prior art to freedom to operate and patent landscape, and get results you can verify: every score is tied to claim-level evidence.", 173 "email": "[email protected]", 174 "address": { 175 "@type": "PostalAddress", 176 "streetAddress": "3790 El Camino Real, Unit #712", 177 "addressLocality": "Palo Alto", 178 "addressRegion": "CA", 179 "postalCode": "94306", 180 "addressCountry": "US" 181 } 182 } 183 </script>
183 184
184<script type="application/ld+json"> 185 { 186 "@context": "https://schema.org", 187 "@type": "WebSite", 188 "name": "One Transform", 189 "url": "https://onetransform.ai" 190 } 191 </script>
191 192
192<script type="module" crossorigin src="/static/index-C3e19Sj7.js"></script>
192 193 <link rel="stylesheet" crossorigin href="/static/index-BT7PLhpR.css"> 194 </head> 195 <body> 196
196<script> 197 /* Zoom-model probe â must run before the app's zoom CSS paints (hence 198 inline, ahead of #root). styles/index.css scales the whole UI with 199 `body { zoom: .9 }` and over-sizes the body by 1/0.9 so it still fills 200 the window. That compensation is only correct on engines that DON'T 201 scale viewport units by `zoom` (modern Blink, Safari 26+). On older 202 WebKit / Safari < 26, `zoom` DOES scale viewport units, so the 203 compensation double-applies and the entire app overflows the window 204 and scrolls. Detect that legacy behavior and flag <html> so the CSS can 205 drop the compensation (see `html[data-zoom-legacy] body` there). */ 206 (function () { 207 try { 208 var p = document.createElement("div"); 209 p.style.cssText = 210 "position:fixed;top:0;left:0;width:1px;height:100vh;zoom:0.5;visibility:hidden;pointer-events:none"; 211 document.body.appendChild(p); 212 var measured = p.offsetHeight; /* legacy: ~2x innerHeight; modern: ~innerHeight */ 213 document.body.removeChild(p); 214 if (measured > window.innerHeight * 1.4) { 215 document.documentElement.setAttribute("data-zoom-legacy", ""); 216 } 217 } catch (e) { 218 /* On any failure leave it unflagged: the default (compensated) path 219 is correct for modern engines, the common case. */ 220 } 221 })(); 222 </script>
222 223 <div id="root"></div> 224 <noscript> 225 <div style="max-width: 720px; margin: 80px auto; padding: 0 24px; color: #030712; font-family: Inter, system-ui, sans-serif;"> 226 <h1>One Transform â AI patent intelligence for IP experts</h1> 227 <p> 228 One Transform is an AI research platform for intellectual-property 229 professionals. Every result is tied to claim-level evidence, so you 230 can verify exactly why a finding ranked where it did. Searches cover 231 patents, academic literature and the open web, with results available 232 in 8 languages. Please enable JavaScript to use the application. 233 </p> 234 <h2>Nine search types, one subscription</h2> 235 <ul> 236 <li><strong>Infringement</strong> â find products that may practice your patent's claims.</li> 237 <li><strong>Prior Art</strong> â find the references that could invalidate or narrow a patent.</li> 238 <li><strong>Validity</strong> â grade how well a patent would survive a challenge.</li> 239 <li><strong>Similar Patents</strong> â find the patents closest to a reference patent or an idea.</li> 240 <li><strong>Technology Landscape</strong> â map a technology field: clusters, players, trends and gaps.</li> 241 <li><strong>Competitive Intelligence</strong> â analyze a competitor's patent portfolio in depth.</li> 242 <li><strong>White Space Analysis</strong> â locate the under-patented areas of a technology domain.</li> 243 <li><strong>Acquisition Targets</strong> â shortlist patents and portfolios worth licensing or buying.</li> 244 <li><strong>Freedom to Operate</strong> â check what could block a product launch.</li> 245 </ul> 246 <p> 247 Plans: $399/month on One Transform's built-in AI models (7-day free 248 trial with 5 searches), or $299/month bringing your own AI keys. See 249 <a href="/pricing" style="color: #2563eb;">pricing</a> for details. 250 </p> 251 <p> 252 <a href="/pricing" style="color: #2563eb;">Pricing</a> · 253 <a href="/about-us" style="color: #2563eb;">About us</a> · 254 <a href="/contact" style="color: #2563eb;">Contact</a> · 255 <a href="/login" style="color: #2563eb;">Sign in</a> · 256 <a href="/waiting-list" style="color: #2563eb;">Join the waiting list</a> · 257 <a href="/privacy-policy" style="color: #2563eb;">Privacy Policy</a> · 258 <a href="/terms" style="color: #2563eb;">Terms of Service</a> 259 </p> 260 </div> 261 </noscript> 262 <div id="app-modal"></div> 263 <div id="app-tooltip"></div> 264 <style> body { 265 background-color: #fff; 266 } 267 </style> 268 </body> 269</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.