1<!DOCTYPE html> 2<html lang="en"> 3<head> 4
4<script nonce="HaJOpnz/XFRoukCmmAEuUQ==" src="/theme-preference.js?v=2"></script>
4 5 <link rel="preconnect" href="https://fonts.googleapis.com"> 6 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 7 <!-- Fonts load NON-render-blocking. Previously this <link rel="stylesheet"> 8 blocked first paint on a third-party (fonts.googleapis.com) round trip â 9 a real LCP cost on mobile. Now: preload the CSS, then swap it from 10 media="print" (ignored for screen) to "all" once it loads. `display=swap` 11 already shows fallback text immediately (no FOIT), so the page paints 12 without ever waiting on Google Fonts. <noscript> preserves fonts with JS 13 disabled. --> 14 <link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Caveat:wght@600&family=Manrope:[email protected]&family=IBM+Plex+Mono:wght@400;500;600&display=swap"> 15 <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Caveat:wght@600&family=Manrope:[email protected]&family=IBM+Plex+Mono:wght@400;500;600&display=swap" media="print" onload="this.media='all'"> 16 <noscript> 17 <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Caveat:wght@600&family=Manrope:[email protected]&family=IBM+Plex+Mono:wght@400;500;600&display=swap"> 18 </noscript> 19 <link rel="stylesheet" href="/gateway/signature-motion.css?v=7"> 20
20<script nonce="HaJOpnz/XFRoukCmmAEuUQ==" data-signature-navigation> 21(function (win) { 22 var root = win.document.documentElement; 23 var locales = ["en","es","fr","de","it","pt","nl","ru","ja","ko","zh","ar","hi","bn","pa","te","ta","mr","gu","kn","ml","or","ur","th","vi","id","ms","tl","tr","pl","uk","ro","cs","sk","hu","el","bg","hr","sr","sl","lt","lv","et","fi","sv","nb","da","is","ga","cy","gd","eu","ca","gl","af","sw","zu","xh","st","tn","sn","ha","yo","ig","am","so","rw","mg","he","fa","ps","sd","ku","az","uz","kk","ky","tk","tg","mn","ka","hy","sq","mk","bs","mt","lb","my","km","lo","si","ne","bo","dz","eo","la","jv","su","mi","sm","to","fj","haw","yi","dv","ht","ny","lg","wo","om","ti","ln","rn","ts","ss","ve","nr","nd","as","sa","tt","be","fy","co","oc","sc","an","gn","qu"]; 24 var service = /^\/(?:api|auth|login|logout|signup)(?:\/|$)/i; 25 var sequence = 0; 26 var pending = null; 27 var nativeHold = null; 28 var nativePresentation = null; 29 var presentedPath = null; 30 var presentedShellPath = null; 31 var revealed = false; 32 function isFilm(path) { 33 var parts = path.toLowerCase().replace(/^\/|\/$/g, '').split('/'); 34 if (parts.length === 1 && (parts[0] === '' || parts[0] === 'experience')) return true; 35 return locales.indexOf(parts[0]) !== -1 && 36 (parts.length === 1 || parts.length === 2 && parts[1] === 'experience'); 37 } 38 function isServiceNavigation(url) { 39 // The two public account entry pages participate in the Experience cut. 40 // Redirect-bearing URLs and authentication/service endpoints stay excluded. 41 if (url.pathname === '/login' && !url.hash && 42 (url.search === '' || url.search === '?mode=register')) return false; 43 return service.test(url.pathname); 44 } 45 function clear() { root.removeAttribute('data-signature-motion'); root.removeAttribute('data-signature-document'); } 46 function result(value, reason) { 47 root.setAttribute('data-signature-result', value); 48 if (reason) root.setAttribute('data-signature-reason', reason); 49 else root.removeAttribute('data-signature-reason'); 50 } 51 function clearEntry() { 52 pending = null; 53 root.removeAttribute('data-signature-entry-pending'); 54 root.removeAttribute('data-signature-entry'); 55 } 56 function clock() { return win.performance && win.performance.now ? win.performance.now() : Date.now(); } 57 function prefersReducedMotion() { return !!(win.matchMedia && win.matchMedia('(prefers-reduced-motion: reduce)').matches); } 58 function clearNativeHold() { 59 if (nativeHold) win.clearTimeout(nativeHold.timer); 60 nativeHold = null; 61 root.removeAttribute('data-signature-wait'); 62 } 63 function clearNativePresentation(transition) { 64 if (nativePresentation && nativePresentation.transition === transition) nativePresentation = null; 65 } 66 function cancelNativeHold(reason) { 67 if (!nativeHold) return; 68 var hold = nativeHold; 69 hold.cancelled = true; 70 clearNativeHold(); 71 clearNativePresentation(hold.transition); 72 hold.transition.skipTransition(); 73 root.removeAttribute('data-signature-document'); 74 if (root.hasAttribute('data-route-vt')) return; 75 clear(); 76 result('skipped', reason); 77 } 78 function cancelNativePresentation(reason) { 79 if (nativeHold) { cancelNativeHold(reason); return; } 80 if (!nativePresentation) return; 81 var presentation = nativePresentation; 82 nativePresentation = null; 83 presentation.cancel(reason); 84 } 85 function releaseNativeHold() { 86 if (!nativeHold) return; 87 var hold = nativeHold; 88 if (!isPendingDestination(hold.href) || root.hasAttribute('data-route-vt')) { 89 cancelNativeHold('destination-changed'); 90 } else if (clock() >= hold.deadline) { 91 // A busy main thread may deliver the route commit before an overdue timer. 92 cancelNativeHold('destination-readiness-timeout'); 93 } else if (prefersReducedMotion()) { 94 cancelNativeHold('reduced-motion'); 95 } else { 96 clearNativeHold(); 97 result(hold.ready ? 'native-ready' : 'native-requested'); 98 } 99 } 100 function isPendingDestination(href) { 101 if (href === win.location.href) return true; 102 try { 103 var expected = new URL(href); 104 var actual = new URL(win.location.href); 105 // Beacon resolves its saved workspace after authentication. This exact 106 // default expansion is the same requested page, not a second navigation. 107 // Never carry a snapshot across a company, view, source or hash change. 108 if (expected.origin === actual.origin && expected.pathname === '/beacon' && actual.pathname === '/beacon' && 109 expected.hash === actual.hash && !expected.searchParams.has('workspace') && 110 Array.from(expected.searchParams.keys()).every(function (key) { return key === 'view' || key === 'source'; }) && 111 Array.from(actual.searchParams.keys()).every(function (key) { return key === 'workspace' || key === 'view' || key === 'source'; }) && 112 /^[a-zA-Z0-9_-]+$/.test(actual.searchParams.get('workspace') || '') && 113 actual.searchParams.getAll('workspace').length === 1 && actual.searchParams.getAll('view').length === 1 && 114 actual.searchParams.getAll('source').length === 1 && 115 actual.searchParams.get('view') === (expected.searchParams.get('view') || 'overview') && 116 actual.searchParams.get('source') === (expected.searchParams.get('source') || 'consumer')) return true; 117 // Create resolves a saved workspace preference after authentication. 118 // This one known redirect belongs to the same requested destination. 119 return expected.origin === actual.origin && expected.pathname === '/create' && 120 actual.pathname === '/create-agent' && expected.search === actual.search && expected.hash === actual.hash; 121 } catch (error) { return false; } 122 } 123 function playEntry() { 124 if (!pending) return; 125 if (!isPendingDestination(pending.href) || root.hasAttribute('data-route-vt')) { 126 clearEntry(); 127 result('skipped', 'destination-changed'); 128 return; 129 } 130 if (root.hasAttribute('data-hydrated')) { 131 // React has already revealed a loading/auth frame and its persistent 132 // chrome. Fading the whole body now would blink that visible shell. 133 // Only the first real commit, before the outer hydration marker, enters. 134 clearEntry(); 135 result('skipped', 'application-shell-already-presented'); 136 return; 137 } 138 if (pending.overlayActive) { 139 // The destination is committing now. If the skipped browser snapshot 140 // still owns presentation, let the page appear normally; never rewind 141 // it into a second entry after that overlay eventually disappears. 142 clearEntry(); 143 result('skipped', 'destination-presented-before-overlay-end'); 144 return; 145 } 146 var direction = pending.direction; 147 pending = null; 148 root.removeAttribute('data-signature-entry-pending'); 149 root.setAttribute('data-signature-entry', direction); 150 result('fallback-requested', root.getAttribute('data-signature-reason')); 151 } 152 function entryFallback(direction, reason, overlayActive) { 153 var appRoot = win.document.getElementById('root'); 154 // Only an unpresented client route has a reliable pre-paint commit hook. 155 // SSR/film may already be visible, especially at DOMContentLoaded in older 156 // engines. Do not clip readable content merely to replay a missed cut. 157 if (presentedPath === new URL(win.location.href).pathname || presentedShellPath
157=== new URL(win.location.href).pathname || !appRoot || 158 !root.hasAttribute('data-hydrated') && appRoot.hasChildNodes() && 159 win.getComputedStyle(appRoot).visibility !== 'hidden') { 160 result('skipped', 'destination-already-presented'); 161 return; 162 } 163 pending = { href: win.location.href, direction: direction, overlayActive: !!overlayActive }; 164 root.setAttribute('data-signature-entry-pending', direction); 165 result('fallback-pending', reason); 166 return pending; 167 } 168 function observeReady(transition) { 169 var ready = transition && transition.ready; 170 // Skipping or unloading a snapshot rejects ready. This is a presentation 171 // outcome, not a failed navigation; attach before either event can skip. 172 if (ready && typeof ready.catch === 'function') ready.catch(function () {}); 173 } 174 win.addEventListener('pageswap', function (event) { 175 observeReady(event.viewTransition); 176 cancelNativePresentation('superseded-navigation'); 177 sequence += 1; 178 clear(); 179 clearEntry(); 180 root.removeAttribute('data-signature-compact'); 181 revealed = false; 182 // Capture cross-document chrome inside the root sheet. Independent logo 183 // geometry otherwise slides/resizes while the diagonal edge passes it. 184 if (event.viewTransition) root.setAttribute('data-signature-document', ''); 185 }); 186 function reveal(event) { 187 cancelNativePresentation('superseded-navigation'); 188 revealed = true; 189 var run = ++sequence; 190 clear(); 191 clearEntry(); 192 root.removeAttribute('data-signature-native-error'); 193 root.removeAttribute('data-signature-native-error-message'); 194 var transition = event.viewTransition; 195 observeReady(transition); 196 var activation = win.navigation && win.navigation.activation; 197 var from = activation && activation.from; 198 var timing = win.performance && win.performance.getEntriesByType && win.performance.getEntriesByType('navigation')[0]; 199 var navigationType = activation ? activation.navigationType : timing && timing.type; 200 var previous; 201 var current; 202 try { 203 current = new URL(win.location.href); 204 var previousUrl = activation ? from && from.url : win.document.referrer; 205 previous = previousUrl ? new URL(previousUrl, current.href) : null; 206 } catch (error) { previous = null; } 207 if (!previous || !current || previous.origin !== current.origin || 208 navigationType === 'reload' || 209 previous.pathname === current.pathname && previous.search === current.search || 210 isServiceNavigation(previous) || isServiceNavigation(current)) { 211 if (transition) transition.skipTransition(); 212 result('skipped', 'ineligible-navigation'); 213 return; 214 } 215 var arrivingAtFilm = isFilm(current.pathname); 216 var leavingFilm = isFilm(previous.pathname); 217 if (arrivingAtFilm === leavingFilm) { 218 if (transition) transition.skipTransition(); 219 result('skipped', 'unrelated-surfaces'); 220 return; 221 } 222 var direction = arrivingAtFilm ? 'back' : 'forward'; 223 if (!transition) { 224 entryFallback(direction, 'native-unavailable'); 225 return; 226 } 227 // A native incoming root is live. Keep its old snapshot still and its new 228 // view fully clipped until the real client route commits, so an SEO 229 // scaffold or auth loader never becomes a separate animated destination. 230 // The deadline and user input always release the browser's presentation. 231 var appRoot = win.document.getElementById('root'); 232 // The public Beacon document already includes its real content and header. 233 // Present that server paint immediately; hydration removes only the static 234 // chrome and must never hold this cross-document cut behind a JS bundle. 235 var publicBeaconPaint = false; 236 if (current.pathname === '/ai-visibility' && current.searchParams.get('view') === 'website') { 237 var publicHeader = '#aeo-ssr-surface[data-aeo-view="website"] > header[data-aeo-chrome="header"]'; 238 // Startup may have moved the complete SSR page into its isolated shadow 239 // surface before pagereveal. Both representations are ready to present. 240 var preparedSurface = win.document.querySelector('[data-aeo-surface]'); 241 publicBeaconPaint = !!win.document.querySelector(publicHeader) || 242 !!(preparedSurface && preparedSurface.shadowRoot && preparedSurface.shadowRoot.querySelector(publicHeader)); 243 } 244 var needsClientCommit = appRoot && !publicBeaconPaint && presentedPath !== current.pathname && presentedShellPath !== current.pathname; 245 var hold = null; 246 if (needsClientCommit && !prefersReducedMotion() && transition.ready && typeof transition.ready.then === 'function' && 247 transition.finished && typeof transition.finished.then === 'function') { 248 var commitBudget = current.pathname === '/beacon' ? 1600 : 800; 249 hold = { href: current.href, transition: transition, deadline: clock() + commitBudget, ready: false, cancelled: false, timer: null }; 250 nativeHold = hold; 251 root.setAttribute('data-signature-wait', ''); 252 hold.timer = win.setTimeout(function () { 253 if (nativeHold === hold) cancelNativeHold('destination-readiness-timeout'); 254 }, commitBudget); 255 } else if (needsClientCommit) { 256 var hasFinished = transition.finished && typeof transition.finished.then === 'function'; 257 // Arm before skipping, while the client destination is still unpresented. 258 // The completion promise may release this guard but cannot start motion. 259 var entry = entryFallback(direction, 'destination-not-presented', hasFinished); 260 transition.skipTransition();
261 var afterSkippedOverlay = function () { 262 if (run !== sequence || !entry || pending !== entry) return; 263 if (!isPendingDestination(current.href)) { 264 clearEntry(); 265 result('skipped', 'destination-changed'); 266 } else entry.overlayActive = false; 267 }; 268 if (hasFinished) { 269 transition.finished.then(afterSkippedOverlay, afterSkippedOverlay); 270 } 271 return; 272 } 273 root.setAttribute('data-signature-document', ''); 274 root.setAttribute('data-signature-motion', direction); 275 result('native-requested'); 276 var ready = false; 277 var rejected = false; 278 var superseded = false; 279 function ownsPresentation() { 280 if (run !== sequence || superseded || hold && hold.cancelled) return false; 281 if (!root.hasAttribute('data-route-vt')) return true; 282 // A newer in-app cut owns the shared motion/result markers. Retire this 283 // native lifecycle even if its next callback runs after that cut ends. 284 superseded = true; 285 if (nativeHold === hold && hold) cancelNativeHold('destination-changed'); 286 else root.removeAttribute('data-signature-document'); 287 return false; 288 } 289 // Keep the handle after readiness releases a client hold, and for SSR 290 // destinations such as Experience which never needed a hold at all. 291 nativePresentation = { transition: transition, ready: false, cancel: function (reason) { 292 var owns = ownsPresentation(); 293 superseded = true; 294 transition.skipTransition(); 295 if (!owns) return; 296 clear(); 297 result('skipped', reason); 298 } }; 299 if (transition.ready && typeof transition.ready.then === 'function') { 300 transition.ready.then(function () { 301 ready = true; 302 if (nativePresentation && nativePresentation.transition === transition) nativePresentation.ready = true; 303 if (hold) hold.ready = true; 304 if (ownsPresentation()) result(nativeHold === hold && hold ? 'native-waiting' : 'native-ready'); 305 }, function (error) { 306 rejected = true; 307 clearNativePresentation(transition); 308 if (ownsPresentation()) { 309 if (nativeHold === hold && hold) clearNativeHold(); 310 clear(); 311 root.setAttribute('data-signature-native-error', error && error.name || 'Error'); 312 // InvalidStateError covers several browser capture failures. Keep 313 // its concrete reason available without console noise or telemetry. 314 if (error && typeof error.message === 'string') root.setAttribute('data-signature-native-error-message', error.message.slice(0, 300)); 315 result('skipped', 'native-ready-rejected'); 316 } 317 }); 318 } 319 if (transition.finished && typeof transition.finished.then === 'function') { 320 var finish = function (failed) { 321 clearNativePresentation(transition); 322 if (!ownsPresentation()) return; 323 var endedBeforeCommit = nativeHold === hold && hold; 324 if (endedBeforeCommit) clearNativeHold(); 325 clear(); 326 if (endedBeforeCommit && !rejected && !failed) { 327 result('skipped', 'destination-not-presented'); 328 return; 329 } 330 if (ready && !failed && !rejected) result('native-finished'); 331 else if (failed || rejected) { 332 // Native presentation already owned this frame. A rejected snapshot 333 // must not replay an entry over content the user can already see. 334 if (!isPendingDestination(current.href)) result('skipped', 'destination-changed'); 335 else result('skipped', rejected ? 'native-ready-rejected' : 'native-finished-rejected'); 336 } else result('skipped', 'native-not-ready'); 337 }; 338 transition.finished.then(function () { finish(false); }, function () { finish(true); }); 339 } 340 } 341 win.addEventListener('pagereveal', reveal); 342 win.document.addEventListener('prompeteer:route-presented', function () { 343 presentedPath = new URL(win.location.href).pathname; 344 releaseNativeHold(); 345 playEntry(); 346 }); 347 win.document.addEventListener('prompeteer:workspace-shell-presented', function () { 348 var path = new URL(win.location.href).pathname; 349 // Only Create has a locale-safe, visible header/rail and a contained 350 // pending panel. This signal releases document presentation, never the 351 // separate in-app route commit or a late fallback over a visible shell. 352 if (!/^\/create(?:-agent)?\/?$/.test(path)) return;
353 presentedShellPath = path; 354 root.setAttribute('data-signature-shell-presented', 'create'); 355 releaseNativeHold(); 356 if (pending) { 357 clearEntry(); 358 result('skipped', 'application-shell-already-presented'); 359 } 360 }); 361 // Neither the waiting screenshot nor the running sheet may trap input. 362 win.addEventListener('keydown', function () { cancelNativePresentation('user-interaction'); }, true); 363 win.addEventListener('pointerdown', function () { cancelNativePresentation('user-interaction'); }, true); 364 win.addEventListener('wheel', function () { cancelNativePresentation('user-interaction'); }, { capture: true, passive: true }); 365 // End an already running sheet while a pointer approaches its next target, 366 // before the press is hit-tested. Hover must not expose an unready client. 367 win.addEventListener('pointermove', function () { 368 if (!nativeHold && nativePresentation && nativePresentation.ready) cancelNativePresentation('user-interaction'); 369 }, { capture: true, passive: true }); 370 // History can change before a lazy destination commits. Retire its old 371 // screenshot immediately, while allowing the known Beacon/Create defaults. 372 // Wouter publishes pushState/replaceState; the browser owns the other events. 373 function destinationChanged() { 374 if (nativeHold && (!isPendingDestination(nativeHold.href) || root.hasAttribute('data-route-vt'))) { 375 cancelNativeHold('destination-changed'); 376 } 377 } 378 ['popstate', 'pushState', 'replaceState', 'hashchange'].forEach(function (event) { 379 win.addEventListener(event, destinationChanged); 380 }); 381 function entryAnimation(event) { 382 if (event.target !== win.document.body || !root.hasAttribute('data-signature-entry') || 383 !/^signature-(?:cut-in(?:-back)?|fade-in)$/.test(event.animationName)) return; 384 if (event.type === 'animationstart') result('fallback-running', root.getAttribute('data-signature-reason')); 385 else { 386 root.removeAttribute('data-signature-entry'); 387 result(event.type === 'animationend' ? 'fallback-finished' : 'skipped', 388 event.type === 'animationend' ? root.getAttribute('data-signature-reason') : 'fallback-cancelled'); 389 } 390 } 391 win.document.addEventListener('animationstart', entryAnimation); 392 win.document.addEventListener('animationend', entryAnimation); 393 win.document.addEventListener('animationcancel', entryAnimation); 394 // Older engines can still arm a cold client entry. DOMContentLoaded is not 395 // a first-paint boundary: readable SSR/film content never replays an entry. 396 if (!('onpagereveal' in win)) win.document.addEventListener('DOMContentLoaded', function () { 397 if (!revealed) reveal({ viewTransition: null }); 398 }); 399})(window); 400</script>
400 401
401<script nonce="HaJOpnz/XFRoukCmmAEuUQ=="> 402 (function() { 403 var RealWebSocket = window.WebSocket; 404 var NOOP_WS_PROTO = { 405 close: function(){}, 406 send: function(){}, 407 addEventListener: function(){}, 408 removeEventListener: function(){} 409 }; 410 window.WebSocket = function(url, protocols) { 411 if (typeof url === 'string' && (url.indexOf('localhost:undefined') !== -1 || url.indexOf('undefined/?token') !== -1)) { 412 var noop = Object.create(NOOP_WS_PROTO); 413 noop.readyState = 3; 414 noop.url = ''; 415 noop.protocol = ''; 416 noop.extensions = ''; 417 noop.bufferedAmount = 0; 418 noop.binaryType = 'blob'; 419 noop.onopen = null; 420 noop.onclose = null; 421 noop.onmessage = null; 422 noop.onerror = null; 423 setTimeout(function() { 424 if (typeof noop.onclose === 'function') { 425 noop.onclose({ code: 1006, reason: 'suppressed', wasClean: false }); 426 } 427 }, 50); 428 return noop; 429 } 430 if (protocols !== undefined) { 431 return new RealWebSocket(url, protocols); 432 } 433 return new RealWebSocket(url); 434 }; 435 window.WebSocket.prototype = RealWebSocket.prototype; 436 window.WebSocket.CONNECTING = 0; 437 window.WebSocket.OPEN = 1; 438 window.WebSocket.CLOSING = 2; 439 window.WebSocket.CLOSED = 3; 440 441 function isWebSocketError(msg) { 442 return msg.indexOf("wss://localhost:undefined") !== -1 || msg.indexOf("Failed to construct 'WebSocket'") !== -1; 443 } 444 window.addEventListener("unhandledrejection", function(event) { 445 var msg = event.reason && event.reason.message ? event.reason.message : ""; 446 if (isWebSocketError(msg)) { 447 event.preventDefault(); 448 event.stopImmediatePropagation(); 449 } 450 }, true); 451 window.addEventListener("error", function(event) { 452 var msg = (event.error && event.error.message) || event.message || ""; 453 if (isWebSocketError(msg)) { 454 event.preventDefault(); 455 event.stopImmediatePropagation(); 456 } 457 }, true); 458 })(); 459 </script>
459 460 <meta charset="UTF-8" /> 461 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 462 <!-- Paint the app ground under #root before any CSS loads, so the first frame 463 on a cold load / reload is on-brand instead of a white flash (dark mode 464 especially). Values mirror --public-ground (light #FFFFFF / dark #0C0C0C) 465 and --public-ink-2 (light #57534E / dark #A8A49E), which colours the 466 startup status in main.tsx; the app's own theme takes over the instant 467 its CSS mounts (:where() keeps the ink values below variables.css). --> 468 <style> 469 html { color-scheme: light; } 470 html.dark { color-scheme: dark; } 471 html, body, #root { background-color: var(--public-ground, #FFFFFF); } 472 html.dark { --public-ground: #0C0C0C; } 473 :where(html) { --public-ink-2: #57534E; } 474 :where(html.dark) { --public-ink-2: #A8A49E; } 475 </style> 476<!-- Open Graph defaults (overridden by react-helmet-async per page) --> 477<!-- Twitter Card defaults --> 478<!-- SPA shell entity graph. 479 480 This block is what EVERY human browser and every bot on an unregistered 481 SPA route receives, so the base entities live here, not in Tier C. It is 482 a byte-for-byte mirror of ORGANIZATION / WEBSITE / PERSON_MANAV in 483 shared/seo-entity-graph.ts â the shell and the module must never define 484 the same @id two different ways (docs/seo-aeo-agent-v2.md §3.2). 485 486 Organization.sameAs carries verified brand-owned profiles only. The 487 personal /in/ LinkedIn profile that used to sit here is a Person 488 identifier, not an Organization identifier, and no /company/ URL has been 489 verified â neither belongs in this list. 490 491 Because the shell already defines #organization, #website and 492 #person-manav on every route, client/src/components/SEO.tsx (Tier C) 493 emits page-level nodes ONLY and references these by @id. --> 494<!-- Optional analytics are initialized by the app after a saved consent choice. --> 495 496 <!-- Favicons --> 497 <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png?v=copper-1" /> 498 <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png?v=copper-1" /> 499 <link rel="apple-touch-icon" href="/apple-touch-icon.png?v=copper-1" /> 500
500<script nonce="HaJOpnz/XFRoukCmmAEuUQ==" defer src="/webmcp-tools.js"></script>
500 501
501<script nonce="HaJOpnz/XFRoukCmmAEuUQ==" type="module" crossorigin src="/assets/index-CaH9w3gZ.js"></script>
501 502<style>body{margin:0}html.dark #root{--prerender-ink:#F7F6F4;--prerender-muted:#A8A49E;--prerender-link:#7FA6D0}#root>main{box-sizing:border-box;max-width:46rem;margin:0 auto;padding:3rem 1.25rem;font:400 1rem/1.65 system-ui,-apple-system,sans-serif;color:var(--public-ink,var(--prerender-ink,#1b1b1f))}#root>main :is(h1,h2,h3,h4,h5,h6){color:inherit}#root>main h1{font-size:1.9rem;line-height:1.2;margin:0 0 1rem}#root>main h2{font-size:1.4rem;margin:2.25rem 0 .75rem}#root>main h3{font-size:1.1rem;margin:1.75rem 0 .5rem}#root>main [data-tldr]{font-size:1.05rem;color:var(--public-ink-2,var(--prerender-muted,#3f3f46))}#root>main a,#root>[data-public-navigation] a{color:var(--public-second,var(--prerender-link,#3A6EA5))}#root>main ul{padding-left:1.15rem}#root>main li{margin:.35rem 0}</style><style>html:not([data-hydrated]) #root{visibility:hidden}</style><style>#app-startup-status{position:fixed;inset:0;display:grid;place-items:center;margin:0;padding:24px;background:var(--public-ground,#fff);color:var(--public-ink-2,#57534e);font:14px/1.6 system-ui,sans-serif;text-align:center}html[data-hydrated] #app-startup-status{display:none}</style><noscript><style>#root{visibility:visible!important}</style></noscript><noscript><style>#app-startup-status{display:none!important}</style></noscript> 503 <title>Sign In to Prompeteer.ai â Access Your PromptDrive</title> 504 <meta name="description" content="Sign in to Prompeteer.ai to open your PromptDrive vault, resume saved prompts and agent skills, and pick up your work on any connected AI platform."> 505 <meta name="keywords" content="Prompeteer login, sign in AI prompts"> 506 <meta name="robots" content="noindex, follow"> 507 <link rel="canonical" href="https://prompeteer.ai/login"> 508 509 <link rel="alternate" hreflang="en" href="https://prompeteer.ai/login"> 510 <link rel="alternate" hreflang="x-default" href="https://prompeteer.ai/login"> 511 512 <meta property="og:type" content="website"> 513 <meta property="og:site_name" content="Prompeteer.ai"> 514 <meta property="og:title" content="Sign In to Prompeteer.ai â Access Your PromptDrive"> 515 <meta property="og:description" content="Sign in to Prompeteer.ai to open your PromptDrive vault, resume saved prompts and agent skills, and pick up your work on any connected AI platform."> 516 <meta property="og:url" content="https://prompeteer.ai/login"> 517 <meta property="og:image" content="https://prompeteer.ai/brand-assets/prompeteer/card-1200x630.png?v=copper-1"> 518 <meta property="og:image:secure_url" content="https://prompeteer.ai/brand-assets/prompeteer/card-1200x630.png?v=copper-1"> 519 <meta property="og:image:type" content="image/png"> 520 <meta property="og:image:width" content="1200"> 521 <meta property="og:image:height" content="630"> 522 <meta property="og:image:alt" content="Prompeteer.ai"> 523 <meta property="og:locale" content="en_US"> 524 525 <meta name="twitter:card" content="summary_large_image"> 526 <meta name="twitter:title" content="Sign In to Prompeteer.ai â Access Your PromptDrive"> 527 <meta name="twitter:description" content="Sign in to Prompeteer.ai to open your PromptDrive vault, resume saved prompts and agent skills, and pick up your work on any connected AI platform."> 528 <meta name="twitter:image" content="https://prompeteer.ai/brand-assets/prompeteer/card-1200x630.png?v=copper-1"> 529 530
530<script nonce="HaJOpnz/XFRoukCmmAEuUQ==" type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://prompeteer.ai/#organization","name":"Prompeteer","alternateName":"Prompeteer.ai","description":"Prompeteer.ai helps individuals and teams create contextual agent skills, refine toward an A+ Skill Score, and explore 5,000+ professional agent workflows and skills.","url":"https://prompeteer.ai","logo":{"@type":"ImageObject","url":"https://prompeteer.ai/press/prompeteer-icon-1024.png?v=copper-1","width":1024,"height":1024},"founder":{"@id":"https://prompeteer.ai/#person-manav"},"sameAs":["https://x.com/prompeteerai","https://www.instagram.com/prompeteer.ai/","https://www.linkedin.com/company/prompeteer"]},{"@type":"WebSite","@id":"https://prompeteer.ai/#website","url":"https://prompeteer.ai","name":"Prompeteer","alternateName":"Prompeteer.ai","description":"Prompeteer.ai helps individuals and teams create contextual agent skills, refine toward an A+ Skill Score, and explore 5,000+ professional agent workflows and skills.","publisher":{"@id":"https://prompeteer.ai/#organization"},"inLanguage":"en"},{"@type":"Person","@id":"https://prompeteer.ai/#person-manav","name":"Manav Mishra","url":"https://prompeteer.ai/about","jobTitle":"Builder","sameAs":["https://www.linkedin.com/in/manavmishra/","https://scholar.google.com/citations?user=gVwKHJIAAAAJ"],"affiliation":{"@id":"https://prompeteer.ai/#organization"},"knowsAbout":["Agentic AI","Context engineering","Prompt operations","Enterprise AI adoption","AI evaluation","Cloud-native platforms"]},{"@type":"WebPage","@id":"https://prompeteer.ai/login#webpage","url":"https://prompeteer.ai/login","name":"Sign In to Prompeteer.ai â Access Your PromptDrive","description":"Sign in to Prompeteer.ai to open your PromptDrive vault, resume saved prompts and agent skills, and pick up your work on any connected AI platform.","isPartOf":{"@id":"https://prompeteer.ai/#website"},"inLanguage":"en","primaryImageOfPage":{"@type":"ImageObject","url":"https://prompeteer.ai/brand-assets/prompeteer/card-1200x630.png?v=copper-1"},"datePublished":"2026-06-29T00:00:00-07:00","dateModified":"2026-08-25T00:00:00-07:00"}]}</script>
530 531</head> 532<body> 533 <div id="root"> 534 <nav class="seo-header seo-nav" aria-label="Primary navigation" data-public-navigation><a href="/">Prompeteer.ai</a><a href="/welcome">AI Skilling</a><a href="/ai-prompt-generator">Prompt generator</a><a href="/bundles">Skill bundles</a><a href="/skills-hub">Skills Hub</a><a href="/models">Models</a><a href="/techniques">Techniques</a><a href="/glossary">Glossary</a><a href="/guides">Guides</a><a href="/signal">SIGNAL</a><a href="/ai-visibility">AI Visibility</a><a href="/pricing">Pricing</a><a href="/connect">Connect</a></nav> 535 <main> 536 <h1>Sign in to your Prompeteer.ai account</h1> 537 <p data-tldr>Signing in to Prompeteer.ai opens the PromptDrive vault, where saved prompts, agent skills, and generation history are stored for the account.</p> 538 <p>Sign in to Prompeteer.ai to open your PromptDrive vault, resume saved prompts and agent skills, and pick up your work on any connected AI platform.</p> 539 </main> 540 </div><p id="app-startup-status" role="status" aria-live="polite">Opening your workspaceâ¦</p> 541</body> 542</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.