1<!DOCTYPE html><html lang="en"> <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>AI Product Manager Agent Kit for Hosted OpenClaw</title><meta name="description" content="Launch a hosted OpenClaw product manager agent for PRDs, interview synthesis, competitive research, backlog slicing, and launch planning."><link rel="canonical" href="https://lobsterland.ing/agents/product-manager/"><!-- AI agent discovery surface (RFC 8288). Emitted as <link> elements 2 in addition to the HTTP Link header from nginx, because some 3 reverse proxies (Traefik in this cluster) strip the Link header 4 on HTTP/2 responses. Both forms are valid RFC 8288 signalling. --><link rel="api-catalog" href="/.well-known/api-catalog"><link rel="agent-skills" href="/.well-known/agent-skills/index.json"><link rel="auth.md" href="/auth.md"><link rel="llms-txt" href="/llms.txt"><!-- Auto-select locale from the browser's language preference. 5 STRICTLY ONE-WAY (en page â zh alternate) for SEO: Googlebot renders 6 with an en-US locale, so a zhâen redirect here would make every 7 /zh-cn/ page look like a JS (soft) redirect to its EN alternate and 8 risk deindexing the localized content. Visitors on a zh page who want 9 English use the header language picker. 10 Runs at most once per browser (localStorage KEY); the picker sets the 11 same KEY on a manual pick, so an explicit choice permanently disables 12 this auto-redirect. -->
12<script> 13 (function() { 14 try { 15 var KEY = "openclaw_landing_lang_redirected"; 16 if (localStorage.getItem(KEY)) return; 17 18 var path = window.location.pathname; 19 var isZhPage = path.indexOf("/zh-cn/") === 0 || path === "/zh-cn"; 20 if (isZhPage) { 21 // Never redirect away from a localized page (SEO + user intent: 22 // they followed a zh link on purpose). 23 localStorage.setItem(KEY, "1"); 24 return; 25 } 26 27 var langs = (navigator.languages && navigator.languages.length) 28 ? navigator.languages 29 : [navigator.language || navigator.userLanguage || ""]; 30 var prefersZh = langs.some(function(l) { 31 return typeof l === "string" && l.toLowerCase().indexOf("zh") === 0; 32 }); 33 if (!prefersZh) { 34 localStorage.setItem(KEY, "1"); 35 return; 36 } 37 38 var alt = document.querySelector('link[rel="alternate"][hreflang="zh-CN"]'); 39 var href = alt && alt.getAttribute("href"); 40 if (!href) return; // no localized version of this page â try again on a page that has one 41 42 var target = new URL(href, window.location.origin); 43 if (target.pathname === path) { 44 localStorage.setItem(KEY, "1"); 45 return; 46 } 47 48 localStorage.setItem(KEY, "1"); 49 window.location.replace(target.pathname + window.location.search + window.location.hash); 50 } catch (_) {} 51 })(); 52 </script>
52<meta name="yandex-verification" content="ea4653346eac898a"><meta property="og:title" content="AI Product Manager Agent Kit for Hosted OpenClaw"><meta property="og:description" content="Launch a hosted OpenClaw product manager agent for PRDs, interview synthesis, competitive research, backlog slicing, and launch planning."><meta property="og:type" content="website"><meta property="og:url" content="https://lobsterland.ing/agents/product-manager/"><meta property="og:image" content="https://lobsterland.ing/og.png"><meta property="og:image:width" content="1200"><meta property="og:image:height" content="630"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="AI Product Manager Agent Kit for Hosted OpenClaw"><meta name="twitter:description" content="Launch a hosted OpenClaw product manager agent for PRDs, interview synthesis, competitive research, backlog slicing, and launch planning."><meta name="twitter:image" content="https://lobsterland.ing/og.png"><meta name="theme-color" content="#FBF6EC">
52<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","@id":"https://lobsterland.ing#organization","name":"Lobsterland","alternateName":["OpenClaw Setup"],"url":"https://lobsterland.ing","logo":{"@type":"ImageObject","url":"https://lobsterland.ing/logo.png","width":512,"height":512},"description":"Managed OpenClaw hosting platform with isolated runtime, encrypted credentials, and per-model usage visibility.","sameAs":["https://lobsterland.ing","https://fazier.com/launches/openclaw-setup"],"contactPoint":{"@type":"ContactPoint","email":"[email protected]","contactType":"customer service"}}</script>
52<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","@id":"https://lobsterland.ing#website","name":"Lobsterland","url":"https://lobsterland.ing","publisher":{"@id":"https://lobsterland.ing#organization"},"potentialAction":{"@type":"SearchAction","target":"https://lobsterland.ing/blog/?q={search_term_string}","query-input":"required name=search_term_string"}}</script>
52<script> 53 (function() { 54 try { 55 var url = new URL(window.location.href); 56 if (!url.searchParams.has("ref")) return; 57 url.searchParams.delete("ref"); 58 window.history.replaceState(window.history.state, "", url.toString()); 59 } catch (_) {} 60 })(); 61 </script>
61<script> 62 (function() { 63 try { 64 var savedThemePreference = localStorage.getItem("openclaw_landing_theme"); 65 var themePreference = 66 savedThemePreference === "light" || 67 savedThemePreference === "dark" || 68 savedThemePreference === "system" 69 ? savedThemePreference 70 : "light"; 71 var resolvedTheme = themePreference; 72 if (themePreference === "system") { 73 resolvedTheme = 74 typeof window.matchMedia === "function" && window.matchMedia("(prefers-color-scheme: dark)").matches 75 ? "dark" 76 : "light"; 77 } 78 if (resolvedTheme === "dark") { 79 document.documentElement.setAttribute("data-theme", "dark"); 80 } else { 81 document.documentElement.removeAttribute("data-theme"); 82 } 83 } catch (_) {} 84 })(); 85 </script>
85<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><!-- Non-blocking font CSS (SEO audit 2026-06-17 H5): preload-as-style then 86 flip to stylesheet so the Google Fonts request is not render-blocking. 87 display=swap avoids invisible text during the swap period. --><link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,500;0,9..144,600;0,9..144,700;1,9..144,400&family=Schibsted+Grotesk:wght@400;500;600;700;800;900&family=Hanken+Grotesk:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" onload="this.onload=null;this.rel='stylesheet'"><noscript><link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,500;0,9..144,600;0,9..144,700;1,9..144,400&family=Schibsted+Grotesk:wght@400;500;600;700;800;900&family=Hanken+Grotesk:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet"></noscript><link rel="icon" href="/favicon.ico"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="manifest" href="/site.webmanifest"><!-- GA4 with Advanced Consent Mode â fires before consent (cookieless pings), full analytics after consent -->
87<script> 88 (function() { 89 var CONSENT_KEY = "openclaw_landing_analytics_consent"; 90 var GA_ID = "G-DBWHT7TWV3"; 91 window.dataLayer = window.dataLayer || []; 92 function gtag(){ dataLayer.push(arguments); } 93 gtag("consent", "default", { 94 ad_storage: "denied", 95 ad_user_data: "denied", 96 ad_personalization: "denied", 97 analytics_storage: "denied" 98 }); 99 var stored = localStorage.getItem(CONSENT_KEY); 100 if (stored === "accepted") { 101 gtag("consent", "update", { 102 ad_storage: "granted", 103 ad_user_data: "granted", 104 ad_personalization: "granted", 105 analytics_storage: "granted" 106 }); 107 } 108 gtag("js", new Date()); 109 gtag("config", GA_ID); 110 window.gtag = gtag; 111 })(); 112 </script>
vendor: 63 bytes, line 112
112<script async src="https://www.googletagmanager.com/gtag/js?id=
112G-DBWHT7TWV3
vendor: 11 bytes, line 112
112"></script>
112<script defer data-website-id="dfid_5oSzfbTMLjPkCVUxwkqRe" data-domain="lobsterland.ing" src="https://datafa.st/js/script.js"> 113 </script>
113<script>(function(){const posthogHost = "https://us.i.posthog.com"; 114const posthogKey = "phc_5E6cXpZfjtSX3xDui5maNE6j7ozBjvPy77DQswg5ZI7"; 115 116 (function() { 117 var CONSENT_KEY = "openclaw_landing_analytics_consent"; 118 !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,u){var c=u.split(".");2==c.length&&(t=t[c[0]],u=c[1]),t[u]=function(){t.push([u].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var l=e;for(void 0!==a?l=e[a]=[]:a="posthog",l.people=l.people||[],l.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},l.people.toString=function(){return l.toString(1)+".people (stub)"},o="capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys getNextSurveyStep onSessionId".split(" "),n=0;n<o.length;n++)g(l,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]); 119 120 var stored = localStorage.getItem(CONSENT_KEY); 121 posthog.init(posthogKey, { 122 // First-party reverse proxy (see nginx `location /rly/`) so adblockers 123 // don't drop ingestion. ui_host keeps toolbar/links pointed at the real app. 124 api_host: window.location.origin + "/rly", 125 ui_host: "https://us.posthog.com", 126 defaults: "2025-11-30", 127 disable_surveys_automatic_display: true, 128 persistence: "memory", 129 // identified_only behaves like "never" for anonymous visitors (no profile, 130 // no extra storage), but lets the app's cross-domain alias resolve a 131 // consented visitor's landing journey into their person. Non-consenters 132 // stay on memory persistence â no cookies, ephemeral id â unchanged. 133 person_profiles: "identified_only", 134 opt_out_capturing_by_default: stored === "rejected" 135 }); 136 137 if (stored === "accepted") { 138 posthog.opt_in_capturing(); 139 posthog.set_config({ persistence: "localStorage+cookie" }); 140 } else if (stored === "rejected") { 141 posthog.opt_out_capturing(); 142 } 143 144 var pageLocale = window.location.pathname.indexOf("/zh-cn/") === 0 || window.location.pathname === "/zh-cn" ? "zh-CN" : "en"; 145 posthog.register({ page_locale: pageLocale, language: pageLocale }); 146 })(); 147 })();</script>
147<link rel="stylesheet" href="/_astro/about.CUkGhm2j.css"> 148<link rel="stylesheet" href="/_astro/_slug_.m0TVm5ED.css"></head> <body class="theme-ink"> <div class="bg-ambient" aria-hidden="true"></div> <div class="bg-grid" aria-hidden="true"></div> <div class="v2-grain" aria-hidden="true"></div> <div class="page">
148<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Agent Kits","item":"https://lobsterland.ing/agents/"},{"@type":"ListItem","position":2,"name":"Product Manager","item":"https://lobsterland.ing/agents/product-manager/"}]}</script>
148
148<script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"AI Product Manager Agent Kit","applicationCategory":"BusinessApplication","operatingSystem":"Web","description":"Launch a hosted OpenClaw product manager agent for PRDs, interview synthesis, competitive research, backlog slicing, and launch planning.","url":"https://lobsterland.ing/agents/product-manager/","offers":{"@type":"Offer","availability":"https://schema.org/InStock"}}</script>
148 <div class="site-header-sticky" data-astro-cid-ctg3m53h> <header class="container" data-astro-cid-ctg3m53h> <nav class="nav" data-astro-cid-ctg3m53h> <a class="brand" href="/" data-astro-cid-ctg3m53h> <img class="brand-mark" src="/lobsterland-mark.png" width="30" height="30" alt="" aria-hidden="true" loading="eager" decoding="async" data-astro-cid-ctg3m53h> <span class="brand-lockup" data-astro-cid-ctg3m53h> <span class="brand-text" data-astro-cid-ctg3m53h>Lobsterland</span> </span> </a> <div class="nav-links" id="nav-links" data-astro-cid-ctg3m53h> <a href="/openclaw/" data-astro-cid-ctg3m53h>OpenClaw</a><a href="/hermes/" data-astro-cid-ctg3m53h>Hermes<span class="nav-badge" data-astro-cid-ctg3m53h>New</span></a><a href="/#pricing" data-astro-cid-ctg3m53h>Pricing</a><a href="/security/" data-astro-cid-ctg3m53h>Security</a><a href="/compare/" data-astro-cid-ctg3m53h>Compare</a><a href="/#faq" data-astro-cid-ctg3m53h>FAQ</a> </div> <div class="nav-actions" data-astro-cid-ctg3m53h> <div class="lang-picker" id="lang-picker" data-astro-cid-ctg3m53h> <button class="lang-picker__trigger" type="button" id="lang-trigger" aria-expanded="false" aria-haspopup="true" aria-controls="lang-menu" aria-label="Change language (current: English)" data-astro-cid-ctg3m53h> <svg class="lang-picker__globe" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-ctg3m53h> <circle cx="12" cy="12" r="9" data-astro-cid-ctg3m53h></circle> <path d="M3 12h18" data-astro-cid-ctg3m53h></path> <path d="M12 3a15.3 15.3 0 0 1 4 9 15.3 15.3 0 0 1-4 9 15.3 15.3 0 0 1-4-9 15.3 15.3 0 0 1 4-9z" data-astro-cid-ctg3m53h></path> </svg> <span class="lang-picker__current" data-astro-cid-ctg3m53h>EN</span> <svg class="lang-picker__caret" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-ctg3m53h> <polyline points="6 9 12 15 18 9" data-astro-cid-ctg3m53h></polyline> </svg> </button> <div class="lang-picker__menu" id="lang-menu" data-astro-cid-ctg3m53h> <span class="lang-picker__option lang-picker__option--current" lang="en" aria-current="true" data-astro-cid-ctg3m53h>
148 English <svg class="lang-picker__check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-ctg3m53h> <polyline points="20 6 9 17 4 12" data-astro-cid-ctg3m53h></polyline> </svg> </span><a class="lang-picker__option" href="/zh-cn/" hreflang="zh-CN" lang="zh-CN" data-lang-pick data-astro-cid-ctg3m53h>ç®ä½ä¸æ</a> </div> </div> <a class="v2-btn nav-cta" href="https://app.lobsterland.ing/login" data-astro-cid-ctg3m53h>Start hosted OpenClaw</a> <button class="hamburger" type="button" id="hamburger" aria-label="Open menu" aria-expanded="false" data-astro-cid-ctg3m53h> <svg class="hamburger__icon hamburger__icon--open" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true" data-astro-cid-ctg3m53h> <line x1="3" y1="6" x2="21" y2="6" data-astro-cid-ctg3m53h></line> <line x1="3" y1="12" x2="21" y2="12" data-astro-cid-ctg3m53h></line> <line x1="3" y1="18" x2="21" y2="18" data-astro-cid-ctg3m53h></line> </svg> <svg class="hamburger__icon hamburger__icon--close" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true" data-astro-cid-ctg3m53h> <line x1="18" y1="6" x2="6" y2="18" data-astro-cid-ctg3m53h></line> <line x1="6" y1="6" x2="18" y2="18" data-astro-cid-ctg3m53h></line> </svg> </button> </div> </nav> <div class="mobile-menu" id="mobile-menu" data-astro-cid-ctg3m53h> <a href="/openclaw/" class="mobile-menu__link" data-astro-cid-ctg3m53h>OpenClaw</a><a href="/hermes/" class="mobile-menu__link" data-astro-cid-ctg3m53h>Hermes<span class="nav-badge" data-astro-cid-ctg3m53h>New</span></a><a href="/#pricing" class="mobile-menu__link" data-astro-cid-ctg3m53h>Pricing</a><a href="/security/" class="mobile-menu__link" data-astro-cid-ctg3m53h>Security</a><a href="/compare/" class="mobile-menu__link" data-astro-cid-ctg3m53h>Compare</a><a href="/#faq" class="mobile-menu__link" data-astro-cid-ctg3m53h>FAQ</a><a href="https://app.lobsterland.ing/login" class="mobile-menu__link" data-astro-cid-ctg3m53h>Login</a> <div class="mobile-menu__langs" aria-label="Change language" data-astro-cid-ctg3m53h> <span class="mobile-menu__lang mobile-menu__lang--current" lang="en" aria-current="true" data-astro-cid-ctg3m53h>
148 English <svg class="lang-picker__check" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-astro-cid-ctg3m53h> <polyline points="20 6 9 17 4 12" data-astro-cid-ctg3m53h></polyline> </svg> </span><a class="mobile-menu__lang" href="/zh-cn/" hreflang="zh-CN" lang="zh-CN" data-lang-pick data-astro-cid-ctg3m53h>ç®ä½ä¸æ</a> </div> </div> </header> </div>
148<script> 149 (function() { 150 var hamburger = document.getElementById('hamburger'); 151 var mobileMenu = document.getElementById('mobile-menu'); 152 if (!hamburger || !mobileMenu) return; 153 154 hamburger.addEventListener('click', function() { 155 var isOpen = mobileMenu.classList.toggle('mobile-menu--open'); 156 hamburger.setAttribute('aria-expanded', String(isOpen)); 157 hamburger.classList.toggle('hamburger--active', isOpen); 158 }); 159 160 // Close menu when a link is clicked 161 mobileMenu.addEventListener('click', function(e) { 162 if (e.target.closest('a')) { 163 mobileMenu.classList.remove('mobile-menu--open'); 164 hamburger.setAttribute('aria-expanded', 'false'); 165 hamburger.classList.remove('hamburger--active'); 166 } 167 }); 168 })(); 169 170 (function() { 171 var picker = document.getElementById('lang-picker'); 172 var trigger = document.getElementById('lang-trigger'); 173 if (!picker || !trigger) return; 174 175 function closePicker() { 176 picker.classList.remove('lang-picker--open'); 177 trigger.setAttribute('aria-expanded', 'false'); 178 } 179 180 trigger.addEventListener('click', function() { 181 var isOpen = picker.classList.toggle('lang-picker--open'); 182 trigger.setAttribute('aria-expanded', String(isOpen)); 183 }); 184 185 document.addEventListener('click', function(e) { 186 if (!picker.contains(e.target)) closePicker(); 187 }); 188 189 document.addEventListener('keydown', function(e) { 190 if (e.key === 'Escape' && picker.classList.contains('lang-picker--open')) { 191 closePicker(); 192 trigger.focus(); 193 } 194 }); 195 196 // A manual language pick must win over the browser-language auto-redirect 197 // (BaseLayout). Mark it as already-run so it never bounces the user back. 198 document.addEventListener('click', function(e) { 199 if (e.target.closest('[data-lang-pick]')) { 200 try { localStorage.setItem('openclaw_landing_lang_redirected', '1'); } catch (_) {} 201 } 202 }); 203 })(); 204</script>
204 <main class="editorial" data-astro-cid-2q6sx75q> <section class="kit-hero" data-astro-cid-2q6sx75q> <div class="container kit-hero__inner" data-astro-cid-2q6sx75q> <div data-astro-cid-2q6sx75q> <a class="back-link" href="/agents/" data-astro-cid-2q6sx75q>Agent Kits</a> <div class="eyebrow" data-astro-cid-2q6sx75q>Product work · medium tier</div> <h1 data-astro-cid-2q6sx75q>AI Product Manager Agent Kit</h1> <p class="lead" data-astro-cid-2q6sx75q>Convert research, feedback, and product context into PRDs, roadmaps, and buildable tickets.</p> <p class="kit-summary" data-astro-cid-2q6sx75q>Use this kit to structure discovery, synthesize interviews, draft product briefs, slice scope, and prepare Jira, Linear, or GitHub tickets once integrations are connected.</p> <div class="kit-actions" data-astro-cid-2q6sx75q> <a class="button" href="https://app.lobsterland.ing/app/instances?intent=agent-kit&agent_kit=product-manager&entry=agent-kit-product-manager" data-astro-cid-2q6sx75q>Create this agent</a> <a class="button button-secondary" href="/agents/" data-astro-cid-2q6sx75q>Browse all kits</a> </div> </div> <aside class="kit-panel" aria-label="Product Manager kit summary" data-astro-cid-2q6sx75q> <div class="kit-panel__top" data-astro-cid-2q6sx75q> <span data-astro-cid-2q6sx75q>Product PM</span> <strong data-astro-cid-2q6sx75q>product-manager</strong> </div> <div class="kit-panel__body" data-astro-cid-2q6sx75q> <h2 data-astro-cid-2q6sx75q>Launches with</h2> <ul data-astro-cid-2q6sx75q> <li data-astro-cid-2q6sx75q>AGENTS.md</li><li data-astro-cid-2q6sx75q>IDENTITY.md</li><li data-astro-cid-2q6sx75q>RUNBOOK.md</li><li data-astro-cid-2q6sx75q>SETUP.md</li><li data-astro-cid-2q6sx75q>TOOLS.md</li> </ul> <h2 class="kit-panel__subhead" data-astro-cid-2q6sx75q>Managed toolbelt</h2> <ul data-astro-cid-2q6sx75q> <li data-astro-cid-2q6sx75q>PyGithub</li><li data-astro-cid-2q6sx75q>jira</li><li data-astro-cid-2q6sx75q>python-dateutil</li><li data-astro-cid-2q6sx75q>markdownify</li> </ul> </div> <div class="kit-panel__footer" data-astro-cid-2q6sx75q> <span data-astro-cid-2q6sx75q>Model policy</span> <strong data-astro-cid-2q6sx75q>inherit instance</strong> </div> </aside> </div> </section> <section class="section-tight" data-astro-cid-2q6sx75q> <div class="container kit-grid-two" data-astro-cid-2q6sx75q> <div data-astro-cid-2q6sx75q> <div class="eyebrow" data-astro-cid-2q6sx75q>What it does</div> <h2 data-astro-cid-2q6sx75q>Useful before any auth, better with the right tools</h2> <p data-astro-cid-2q6sx75q> 205The kit starts by installing editable operating files into the agent workspace. It can work from pasted 206 context immediately, then ask for tool access only when the current job benefits from it. 207</p> <ul class="check-list" data-astro-cid-2q6sx75q> <li data-astro-cid-2q6sx75q>PRD and discovery runbooks</li><li data-astro-cid-2q6sx75q>Backlog slicing and ticket prep workflow</li><li data-astro-cid-2q6sx75q>Competitive research and persona review prompts</li> </ul> </div> <div class="prompt-list" data-astro-cid-2q6sx75q> <div class="eyebrow" data-astro-cid-2q6sx75q>Starter prompts</div> <blockquote data-astro-cid-2q6sx75q>Interview me about this idea and turn it into a product brief.</blockquote><blockquote data-astro-cid-2q6sx75q>Synthesize these user interviews into themes, pain points, and product opportunities.</blockquote><blockquote data-astro-cid-2q6sx75q>Slice this PRD into buildable tickets with acceptance criteria.</blockquote> </div> </div> </section> <section class="section-tight" data-astro-cid-2q6sx75q> <div class="container" data-astro-cid-2q6sx75q> <div class="section-head" data-astro-cid-2q6sx75q> <div data-astro-cid-2q6sx75q> <div class="eyebrow" data-astro-cid-2q6sx75q>Toolbelt</div> <h2 data-astro-cid-2q6sx75q>Not a naked prompt. A prepared working environment.</h2> </div> <p data-astro-cid-2q6sx75q>Product work libraries for issue-tracker APIs, repository context, structured docs, and competitive research notes.</p> </div> <div class="toolbelt-grid" data-astro-cid-2q6sx75q> <article data-astro-cid-2q6sx75q> <span data-astro-cid-2q6sx75q>python</span> <h3 data-astro-cid-2q6sx75q>PyGithub</h3> <p data-astro-cid-2q6sx75q>Inspect GitHub issues, repositories, and PR metadata when the user provides approved access.</p> </article><article data-astro-cid-2q6sx75q> <span data-astro-cid-2q6sx75q>python</span> <h3 data-astro-cid-2q6sx75q>jira</h3> <p data-astro-cid-2q6sx75q>Prepare Jira issue creation and backlog update workflows after user approval.</p> </article><article data-astro-cid-2q6sx75q> <span data-astro-cid-2q6sx75q>python</span> <h3 data-astro-cid-2q6sx75q>python-dateutil</h3> <p data-astro-cid-2q6sx75q>Normalize roadmap dates, launch windows, and milestone notes.</p> </article><article data-astro-cid-2q6sx75q> <span data-astro-cid-2q6sx75q>python</span> <h3 data-astro-cid-2q6sx75q>markdownify</h3> <p data-astro-cid-2q6sx75q>Turn copied docs and web research into clean PRD-ready Markdown.</p> </article> </div> </div> </section> <section class="section-tight" data-astro-cid-2q6sx75q> <div class="container" data-astro-cid-2q6sx75q> <div class="section-head" data-astro-cid-2q6sx75q> <div data-astro-cid-2q6sx75q> <div class="eyebrow" data-astro-cid-2q6sx75q>Recommended connections</div> <h2 data-astro-cid-2q6sx75q>Proactive, permission-aware setup</h2> </div> <p data-astro-cid-2q6sx75q>
208OpenClaw Setup records what the agent should ask for and why. Native OAuth and API-key installers can 209 attach to this surface later without changing the kit contract. 210</p> </div> <div class="integration-grid" data-astro-cid-2q6sx75q> <article data-astro-cid-2q6sx75q> <span data-astro-cid-2q6sx75q>recommended</span> <h3 data-astro-cid-2q6sx75q>Jira or Linear</h3> <p data-astro-cid-2q6sx75q>Issue tracker access lets the agent turn approved scope into tickets and keep ticket references linked to the source doc.</p> <strong data-astro-cid-2q6sx75q>PRD-to-ticket workflows.</strong> </article><article data-astro-cid-2q6sx75q> <span data-astro-cid-2q6sx75q>recommended</span> <h3 data-astro-cid-2q6sx75q>GitHub</h3> <p data-astro-cid-2q6sx75q>Repository context helps the agent produce technically grounded scope and implementation notes.</p> <strong data-astro-cid-2q6sx75q>Code-aware product specs and issue updates.</strong> </article> </div> </div> </section> <section class="section-tight" data-astro-cid-2q6sx75q> <div class="container safety-band" data-astro-cid-2q6sx75q> <div data-astro-cid-2q6sx75q> <div class="eyebrow" data-astro-cid-2q6sx75q>Safety model</div> <h2 data-astro-cid-2q6sx75q>External actions stay behind approval</h2> </div> <div class="safety-columns" data-astro-cid-2q6sx75q> <div data-astro-cid-2q6sx75q> <h3 data-astro-cid-2q6sx75q>Approval required</h3> <ul data-astro-cid-2q6sx75q> <li data-astro-cid-2q6sx75q>creating tickets</li><li data-astro-cid-2q6sx75q>updating tickets</li><li data-astro-cid-2q6sx75q>posting launch notes</li><li data-astro-cid-2q6sx75q>messaging stakeholders</li> </ul> </div> <div data-astro-cid-2q6sx75q> <h3 data-astro-cid-2q6sx75q>Blocked claims</h3> <ul data-astro-cid-2q6sx75q> <li data-astro-cid-2q6sx75q>replaces product judgment</li><li data-astro-cid-2q6sx75q>can validate demand without user evidence</li> </ul> </div> </div> </div> </section> </main> <footer class="footer" data-astro-cid-sz7xmlte> <div class="container footer__inner" data-astro-cid-sz7xmlte> <div class="footer__row" data-astro-cid-sz7xmlte> <div class="footer__brand" data-astro-cid-sz7xmlte> <span class="footer__brand-name" data-astro-cid-sz7xmlte>lobsterland.ing</span> <span class="footer__brand-year" data-astro-cid-sz7xmlte>© 2026</span> </div> <nav class="footer__links" aria-label="Footer navigation" data-astro-cid-sz7xmlte> <a href="/features/" data-astro-cid-sz7xmlte>Features</a><a href="/agents/" data-astro-cid-sz7xmlte>Agents</a><a href="/openclaw/" data-astro-cid-sz7xmlte>OpenClaw</a><a href="/hermes/" data-astro-cid-sz7xmlte>Hermes</a><a href="/openclaw-vs-hermes/" data-astro-cid-sz7xmlte>OpenClaw vs Hermes</a><a href="/compare/" data-astro-cid-sz7xmlte>Compare</a><a href="/managed-openclaw-hosting/" data-astro-cid-sz7xmlte>Managed Hosting</a><a href="/openclaw-cloud-hosting/" data-astro-cid-sz7xmlte>Cloud Hosting</a><a href="/openclaw-browser-agent-hosting/" data-astro-cid-sz7xmlte>Browser Hosting</a><a href="/managed-openclaw-hosting-non-technical-users/" data-astro-cid-sz7xmlte>Non-Technical Setup</a><a href="/hosted-ai-agent-workspace/" data-astro-cid-sz7xmlte>Agent Workspace</a><a href="/always-on-ai-agent-telegram-slack/" data-astro-cid-sz7xmlte>Always-On Agents</a><a href="/openclaw-with-browser/" data-astro-cid-sz7xmlte>Hosted Browser</a><a href="/for/self-hosters/" data-astro-cid-sz7xmlte>For Self-Hosters</a><a href="/for/founders/" data-astro-cid-sz7xmlte>For Founders</a><a href="/for/engineering-teams/" data-astro-cid-sz7xmlte>For Teams</a><a href="/developers/" data-astro-cid-sz7xmlte>Developers</a><a href="/blog/tutorials/" data-astro-cid-sz7xmlte>Tutorials</a><a href="/blog/" data-astro-cid-sz7xmlte>Blog</a><a href="/answer-hub/" data-astro-cid-sz7xmlte>Answer Hub</a><a href="/about/" data-astro-cid-sz7xmlte>About</a><a href="/security/" data-astro-cid-sz7xmlte>Security</a><a href="/privacy/" data-astro-cid-sz7xmlte>Privacy</a><a href="/terms/" data-astro-cid-sz7xmlte>Terms</a><a href="/contact/" data-astro-cid-sz7xmlte>Contact</a> </nav> </div> <div class="footer__bottom" data-astro-cid-sz7xmlte> <p class="footer__attribution" data-astro-cid-sz7xmlte> Built by Gregory Potemkin â <a href="https://www.linkedin.com/in/gregory-potemkin/" target="_blank" rel="noopener noreferrer" data-astro-cid-sz7xmlte>LinkedIn</a> <span aria-hidden="true" data-astro-cid-sz7xmlte> · </span> <a href="https://x.com/gregpotem" target="_blank" rel="noopener noreferrer" data-astro-cid-sz7xmlte>X</a> </p> <p class="footer__legal" data-astro-cid-sz7xmlte>Managed hosting for <a href="https://github.com/openclaw/openclaw" target="_blank" rel="noopener noreferrer" data-astro-cid-sz7xmlte>OpenClaw</a>. Hetzner K8s cluster, EU-based.</p> <button class="theme-toggle footer__theme-toggle" type="button" data-theme-toggle aria-pressed="false" aria-label="Switch theme" data-astro-cid-sz7xmlte>
210 <svg class="theme-toggle__icon theme-toggle__icon--moon" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-sz7xmlte> <path d="M21 12.79A9 9 0 1 1 11.21 3A7 7 0 0 0 21 12.79Z" data-astro-cid-sz7xmlte></path> </svg> <svg class="theme-toggle__icon theme-toggle__icon--sun" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-sz7xmlte> <circle cx="12" cy="12" r="4" data-astro-cid-sz7xmlte></circle> <line x1="12" y1="2" x2="12" y2="5" data-astro-cid-sz7xmlte></line> <line x1="12" y1="19" x2="12" y2="22" data-astro-cid-sz7xmlte></line> <line x1="2" y1="12" x2="5" y2="12" data-astro-cid-sz7xmlte></line> <line x1="19" y1="12" x2="22" y2="12" data-astro-cid-sz7xmlte></line> <line x1="4.93" y1="4.93" x2="7.05" y2="7.05" data-astro-cid-sz7xmlte></line> <line x1="16.95" y1="16.95" x2="19.07" y2="19.07" data-astro-cid-sz7xmlte></line> <line x1="4.93" y1="19.07" x2="7.05" y2="16.95" data-astro-cid-sz7xmlte></line> <line x1="16.95" y1="7.05" x2="19.07" y2="4.93" data-astro-cid-sz7xmlte></line> </svg> <svg class="theme-toggle__icon theme-toggle__icon--system" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-sz7xmlte> <rect x="3" y="4" width="18" height="12" rx="2" data-astro-cid-sz7xmlte></rect> <path d="M8 20h8" data-astro-cid-sz7xmlte></path> <path d="M12 16v4" data-astro-cid-sz7xmlte></path> </svg> <span class="sr-only" data-astro-cid-sz7xmlte>Toggle theme</span> </button> <a class="footer__badge" href="https://fazier.com/launches/openclaw-setup" target="_blank" rel="noopener noreferrer" aria-label="OpenClaw Setup on Fazier" data-astro-cid-sz7xmlte> <img src="https://fazier.com/api/v1/public/badges/embed_image.svg?launch_id=7530&badge_type=daily&theme=light" width="270" alt="Fazier badge" loading="lazy" decoding="async" data-astro-cid-sz7xmlte> </a> </div> </div> </footer> </div> <a href="#" class="consent-prefs-link" id="cookie-preferences" aria-label="Manage cookie preferences"> Cookie preferences </a> <!-- GDPR/CCPA consent banner â GA uses Advanced Consent Mode (cookieless until consent) --> <div id="consent-banner" class="consent-banner" role="dialog" aria-label="Cookie consent"> <div class="consent-banner__content"> <p class="consent-banner__text"> We use cookies and analytics to improve our site. Your data is not sold. <a href="/privacy/">Privacy policy</a> </p> <div class="consent-banner__actions"> <button type="button" class="consent-banner__btn consent-banner__btn--reject" data-consent="reject"> Reject </button> <button type="button" class="consent-banner__btn consent-banner__btn--accept" data-consent="accept"> Accept </button> </div> </div> </div>
210<script> 211 (function() { 212 var CONSENT_KEY = "openclaw_landing_analytics_consent"; 213 function applyGaConsent(value) { 214 if (typeof window.gtag !== "function") return; 215 if (value === "accepted") { 216 window.gtag("consent", "update", { 217 ad_storage: "granted", 218 ad_user_data: "granted", 219 ad_personalization: "granted", 220 analytics_storage: "granted" 221 }); 222 } else { 223 window.gtag("consent", "update", { 224 ad_storage: "denied", 225 ad_user_data: "denied", 226 ad_personalization: "denied", 227 analytics_storage: "denied" 228 }); 229 } 230 } 231 232 function applyPosthogConsent(value) { 233 if (!window.posthog) return; 234 if (value === "accepted") { 235 window.posthog.opt_in_capturing(); 236 window.posthog.set_config({ persistence: "localStorage+cookie" }); 237 } else if (value === "rejected") { 238 window.posthog.set_config({ persistence: "memory" }); 239 window.posthog.opt_out_capturing(); 240 } else { 241 window.posthog.set_config({ persistence: "memory" }); 242 window.posthog.opt_in_capturing(); 243 } 244 } 245 246 function hideBanner() { 247 var b = document.getElementById("consent-banner"); 248 if (b) b.style.display = "none"; 249 var pref = document.getElementById("cookie-preferences"); 250 if (pref) pref.style.display = ""; 251 } 252 253 function showBanner() { 254 var b = document.getElementById("consent-banner"); 255 if (b) b.style.display = ""; 256 var pref = document.getElementById("cookie-preferences"); 257 if (pref) pref.style.display = "none"; 258 } 259 260 function setConsent(value) { 261 try { localStorage.setItem(CONSENT_KEY, value); } catch (_) {} 262 hideBanner(); 263 applyGaConsent(value); 264 applyPosthogConsent(value); 265 } 266 267 function resetConsent() { 268 try { localStorage.removeItem(CONSENT_KEY); } catch (_) {} 269 applyGaConsent("rejected"); 270 applyPosthogConsent("undecided"); 271 showBanner(); 272 } 273 window.openClawResetConsent = resetConsent; 274 275 var stored = localStorage.getItem(CONSENT_KEY); 276 if (stored === "accepted") { 277 hideBanner(); 278 } else if (stored === "rejected") { 279 hideBanner(); 280 } else { 281 showBanner(); 282 } 283 284 document.addEventListener("click", function(e) { 285 if (e.target.closest("#cookie-preferences")) { 286 e.preventDefault(); 287 resetConsent(); 288 return; 289 } 290 var btn = e.target.closest("[data-consent]"); 291 if (!btn) return; 292 var consent = btn.getAttribute("data-consent"); 293 if (consent === "accept" || consent === "reject") setConsent(consent === "accept" ? "accepted" : "rejected"); 294 }); 295 })(); 296 </script>
296
296<script> 297 (function() { 298 var THEME_KEY = "openclaw_landing_theme"; 299 var root = document.documentElement; 300 var THEME_ORDER = ["light", "dark", "system"]; 301 var themePreference = normalizeThemePreference(localStorage.getItem(THEME_KEY)); 302 var mediaQuery = typeof window.matchMedia === "function" 303 ? window.matchMedia("(prefers-color-scheme: dark)") 304 : null; 305 306 function normalizeThemePreference(value) { 307 return value === "light" || value === "dark" || value === "system" ? value : "light"; 308 } 309 310 function resolveTheme(preference) { 311 if (preference !== "system") return preference; 312 if (!mediaQuery) return "light"; 313 return mediaQuery.matches ? "dark" : "light"; 314 } 315 316 function nextThemePreference(current) { 317 var index = THEME_ORDER.indexOf(current); 318 return THEME_ORDER[(index + 1) % THEME_ORDER.length]; 319 } 320 321 function applyResolvedTheme(theme) { 322 if (theme === "dark") { 323 root.setAttribute("data-theme", "dark"); 324 } else { 325 root.removeAttribute("data-theme"); 326 } 327 } 328 329 function applyThemePreference(preference, persist) { 330 themePreference = normalizeThemePreference(preference); 331 var resolvedTheme = resolveTheme(themePreference); 332 applyResolvedTheme(resolvedTheme); 333 if (persist) { 334 try { localStorage.setItem(THEME_KEY, themePreference); } catch (_) {} 335 } 336 var toggles = document.querySelectorAll("[data-theme-toggle]"); 337 toggles.forEach(function(toggle) { 338 var nextPreference = nextThemePreference(themePreference); 339 toggle.setAttribute("aria-pressed", String(resolvedTheme === "dark")); 340 toggle.setAttribute("aria-label", "Theme: " + themePreference + ". Switch to " + nextPreference + "."); 341 toggle.setAttribute("data-theme-state", themePreference); 342 }); 343 } 344 345 document.addEventListener("click", function(e) { 346 var toggle = e.target.closest("[data-theme-toggle]"); 347 if (!toggle) return; 348 e.preventDefault(); 349 applyThemePreference(nextThemePreference(themePreference), true); 350 }); 351 352 if (mediaQuery) { 353 var onSystemThemeChange = function() { 354 if (themePreference === "system") { 355 applyThemePreference("system", false); 356 } 357 }; 358 if (typeof mediaQuery.addEventListener === "function") { 359 mediaQuery.addEventListener("change", onSystemThemeChange); 360 } else { 361 mediaQuery.addListener(onSystemThemeChange); 362 } 363 } 364 365 applyThemePreference(themePreference, false); 366 })(); 367 </script>
367
367<script> 368 (function() { 369 var MANAGED_EXPERIMENT_ID = "managed_setup_support_traffic_2026_06"; 370 var MANAGED_DEFAULT_SCOPE_VERSION = "managed_setup_199_v1"; 371 372 function isSignupLink(href) { 373 if (!href) return false; 374 try { 375 var url = new URL(href, window.location.origin); 376 return url.hostname === "app.lobsterland.ing" && url.pathname === "/login"; 377 } catch (_) { 378 return false; 379 } 380 } 381 382 function managedOfferBaseProps(source, extra) { 383 var dataset = source && source.dataset ? source.dataset : {}; 384 var props = { 385 source_page: window.location.pathname, 386 source_page_type: dataset.sourcePageType || new URLSearchParams(window.location.search).get("entry_type") || "unknown", 387 article_slug: dataset.articleSlug || window.location.pathname.replace(/^\//, "").replace(/\/$/, ""), 388 pain_point: dataset.painPoint || new URLSearchParams(window.location.search).get("pain_point") || "general_setup", 389 cta_slot: dataset.ctaSlot || new URLSearchParams(window.location.search).get("cta") || "unknown", 390 cta_variant: dataset.ctaVariant || new URLSearchParams(window.location.search).get("variant") || "managed_setup_v1", 391 intent: dataset.intent || new URLSearchParams(window.location.search).get("intent") || "demo", 392 offer_scope_version: dataset.offerScopeVersion || MANAGED_DEFAULT_SCOPE_VERSION, 393 experiment_id: dataset.experimentId || new URLSearchParams(window.location.search).get("experiment") || MANAGED_EXPERIMENT_ID, 394 }; 395 if (extra) { 396 Object.keys(extra).forEach(function(key) { props[key] = extra[key]; }); 397 } 398 return props; 399 } 400 401 function captureManagedOfferEvent(eventName, props) { 402 if (typeof window.gtag === "function") { 403 window.gtag("event", eventName, Object.assign({ event_category: "managed_setup_offer" }, props)); 404 } 405 if (window.posthog) { 406 window.posthog.capture(eventName, props); 407 } 408 } 409 410 function inferIntent(link, url) { 411 var fromQuery = url.searchParams.get("intent"); 412 if (fromQuery) return fromQuery; 413 var linkText = (link.textContent || "").toLowerCase(); 414 if (linkText.includes("import")) return "import"; 415 if (linkText.includes("demo") || linkText.includes("book") || linkText.includes("setup")) return "demo"; 416 return "launch"; 417 } 418 419 function decorateSignupUrl(url, link) { 420 var current = new URL(window.location.href); 421 var params = current.searchParams; 422 var utmKeys = ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"]; 423 var consent = null; 424 425 try { 426 consent = localStorage.getItem("openclaw_landing_analytics_consent"); 427 } catch (_) { 428 consent = null; 429 } 430 431 url.searchParams.set("src", "landing"); 432 url.searchParams.set("entry_path", current.pathname); 433 url.searchParams.set("entry_url", current.origin + current.pathname); 434 url.searchParams.set("referrer", document.referrer || ""); 435 url.searchParams.set("intent", inferIntent(link, url)); 436 437 var managedKeys = ["entry", "entry_type", "cta", "variant", "experiment", "pain_point"]; 438 for (var m = 0; m < managedKeys.length; m++) { 439 var managedKey = managedKeys[m]; 440 var managedValue = params.get(managedKey); 441 if (managedValue && !url.searchParams.get(managedKey)) { 442 url.searchParams.set(managedKey, managedValue); 443 } 444 } 445 446 // Pass PostHog distinct_id for cross-domain identity linking 447 if (window.posthog && typeof window.posthog.get_distinct_id === "function") { 448 var distinctId = window.posthog.get_distinct_id(); 449 if (distinctId) { 450 url.searchParams.set("ph_distinct_id", distinctId); 451 } 452 } 453 454 if (consent === "accepted" || consent === "rejected") { 455 url.searchParams.set("analytics_consent", consent); 456 } 457 458 for (var i = 0; i < utmKeys.length; i++) { 459 var key = utmKeys[i]; 460 var value = params.get(key); 461 if (value && !url.searchParams.get(key)) { 462 url.searchParams.set(key, value); 463 } 464 } 465 return url; 466 } 467 468 function wireSignupLinks() { 469 var links = document.querySelectorAll("a[href]"); 470 links.forEach(function(link) { 471 var href = link.getAttribute("href"); 472 if (!isSignupLink(href)) return; 473 var decorated = decorateSignupUrl(new URL(href, window.location.origin), link); 474 link.setAttribute("href", decorated.toString()); 475 }); 476 } 477 478 wireSignupLinks(); 479 480 var managedLandingParams = new URLSearchParams(window.location.search); 481 if (managedLandingParams.get("experiment") === MANAGED_EXPERIMENT_ID) { 482 captureManagedOfferEvent("managed_offer_landing_view", managedOfferBaseProps(null, { 483 landing_path: window.location.pathname, 484 })); 485 } 486 487 var observedManagedOffers = typeof WeakSet === "function" ? new WeakSet() : null; 488 function markManagedOfferViewed(offer) { 489 if (!offer) return; 490 if (observedManagedOffers && observedManagedOffers.has(offer)) return; 491 if (observedManagedOffers) observedManagedOffers.add(offer); 492 captureManagedOfferEvent("managed_offer_view", managedOfferBaseProps(offer)); 493 } 494 495 var managedOffers = document.querySelectorAll("[data-managed-offer]"); 496 if ("IntersectionObserver" in window) { 497 var offerObserver = new IntersectionObserver(function(entries) {
498 entries.forEach(function(entry) { 499 if (entry.isIntersecting) { 500 markManagedOfferViewed(entry.target); 501 offerObserver.unobserve(entry.target); 502 } 503 }); 504 }, { threshold: 0.45 }); 505 managedOffers.forEach(function(offer) { offerObserver.observe(offer); }); 506 } else { 507 managedOffers.forEach(markManagedOfferViewed); 508 } 509 510 document.addEventListener("click", function(e) { 511 var managedLink = e.target.closest("[data-managed-offer] a[href]"); 512 if (!managedLink) return; 513 var offer = managedLink.closest("[data-managed-offer]"); 514 captureManagedOfferEvent("managed_offer_click", managedOfferBaseProps(offer, { 515 cta_slot: offer && offer.dataset.ctaSlot ? offer.dataset.ctaSlot : "unknown", 516 cta_position: managedLink.getAttribute("data-managed-offer-cta") || "link", 517 target_url: managedLink.href, 518 })); 519 }); 520 521 document.addEventListener("click", function(e) { 522 var intentLink = e.target.closest("[data-managed-offer-intent]"); 523 if (!intentLink) return; 524 var offer = intentLink.closest("[data-managed-offer]"); 525 captureManagedOfferEvent("managed_offer_intent", managedOfferBaseProps(offer || intentLink, { 526 intent: intentLink.getAttribute("data-managed-offer-intent") || "contact", 527 cta_position: intentLink.getAttribute("data-managed-offer-cta") || "link", 528 target_url: intentLink.href, 529 })); 530 }); 531 532 document.addEventListener("click", function(e) { 533 var link = e.target.closest("a[href]"); 534 if (!link) return; 535 var href = link.getAttribute("href"); 536 if (!isSignupLink(href)) return; 537 538 var targetUrl = decorateSignupUrl(new URL(href, window.location.origin), link); 539 link.setAttribute("href", targetUrl.toString()); 540 541 var intent = targetUrl.searchParams.get("intent") || "launch"; 542 var sourcePath = window.location.pathname; 543 var pageLocale = sourcePath.indexOf("/zh-cn/") === 0 || sourcePath === "/zh-cn" ? "zh-CN" : "en"; 544 var isManagedOfferSignup = targetUrl.searchParams.get("experiment") === MANAGED_EXPERIMENT_ID || new URLSearchParams(window.location.search).get("experiment") === MANAGED_EXPERIMENT_ID; 545 if (isManagedOfferSignup) { 546 captureManagedOfferEvent("managed_offer_signup_start", managedOfferBaseProps(link, { 547 intent: intent, 548 target_url: targetUrl.toString(), 549 })); 550 } 551 if (typeof window.gtag === "function") { 552 window.gtag("event", "click_signup", { 553 event_category: "engagement", 554 event_label: targetUrl.toString(), 555 transport_type: "beacon", 556 intent: intent, 557 source_path: sourcePath, 558 page_locale: pageLocale, 559 language: pageLocale, 560 }); 561 } 562 if (window.posthog) { 563 window.posthog.capture("click_signup", { 564 target_url: targetUrl.toString(), 565 source_path: sourcePath, 566 intent: intent, 567 page_locale: pageLocale, 568 language: pageLocale, 569 entry_path: sourcePath, 570 entry_url: window.location.origin + sourcePath, 571 referrer: document.referrer || null, 572 utm_source: targetUrl.searchParams.get("utm_source"), 573 utm_medium: targetUrl.searchParams.get("utm_medium"), 574 utm_campaign: targetUrl.searchParams.get("utm_campaign"), 575 utm_term: targetUrl.searchParams.get("utm_term"), 576 utm_content: targetUrl.searchParams.get("utm_content"), 577 }); 578 } 579 }); 580 })(); 581 </script>
581 <!-- Blog article back link -->
581<script> 582 (function() { 583 var path = window.location.pathname; 584 if (!path.includes('/blog/') || path === '/blog/') return; 585 586 var backUrl = '/blog/'; 587 var backText = 'All articles'; 588 589 if (path.includes('/blog/tutorials/')) { 590 backUrl = '/blog/tutorials/'; 591 backText = 'All tutorials'; 592 } else if (path.includes('/use-cases/')) { 593 backUrl = '/blog/use-cases/'; 594 backText = 'All use cases'; 595 } else if (path.includes('/openclaw-internals/')) { 596 backUrl = '/blog/openclaw-internals/'; 597 backText = 'All internals'; 598 } else if (path.includes('/product-updates/')) { 599 backUrl = '/blog/product-updates/'; 600 backText = 'All updates'; 601 } else if (path.includes('/usage-tips/')) { 602 backUrl = '/blog/usage-tips/'; 603 backText = 'All tips'; 604 } 605 606 var main = document.querySelector('main section .container'); 607 if (main) { 608 var backLink = document.createElement('p'); 609 backLink.style.cssText = 'margin-top: var(--space-5);'; 610 backLink.innerHTML = '<a href="' + backUrl + '">← ' + backText + '</a>'; 611 main.appendChild(backLink); 612 } 613 })(); 614 </script>
614 </body> </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.