PageSourceSearch

https://prompeteer.ai/login

html prompeteer.ai collected 2026-10-05 12:26:01 UTC 32,807 bytes, 542 lines download raw bytes

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.