1<!DOCTYPE html><html lang="en" data-theme="green"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><!-- Google Consent Mode v2 (default-deny) â must precede GTM -->
1<script>(function(){const storageKey = "lc-consent"; 2const waitForUpdate = 500; 3 4 window.dataLayer = window.dataLayer || []; 5 function gtag() { 6 window.dataLayer.push(arguments); 7 } 8 window.gtag = window.gtag || gtag; 9 10 gtag("consent", "default", { 11 ad_storage: "denied", 12 ad_user_data: "denied", 13 ad_personalization: "denied", 14 analytics_storage: "denied", 15 personalization_storage: "denied", 16 functionality_storage: "granted", 17 security_storage: "granted", 18 wait_for_update: waitForUpdate, 19 }); 20 21 // Recover signal while denied: pass gclid via URL, redact ad data. 22 gtag("set", "url_passthrough", true); 23 gtag("set", "ads_data_redaction", true); 24 25 // Returning visitor who already granted â lift consent before tags evaluate. 26 try { 27 var stored = localStorage.getItem(storageKey); 28 if (stored) { 29 var choice = JSON.parse(stored); 30 if (choice && choice.granted) { 31 gtag("consent", "update", { 32 ad_storage: "granted", 33 ad_user_data: "granted", 34 ad_personalization: "granted", 35 analytics_storage: "granted", 36 personalization_storage: "granted", 37 }); 38 } 39 } 40 } catch (_) { 41 /* localStorage blocked (private mode) â stay denied. */ 42 } 43})();</script>
43 <!-- End Google Consent Mode v2 --><!-- Google Tag Manager -->
43<script>(function(){const gtmId = "GTM-PWSRXGFW"; 44 45 (function (w, d, s, l, i) { 46 w[l] = w[l] || []; 47 w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' }); 48 const f = d.getElementsByTagName(s)[0]; 49 const j = d.createElement(s); 50 const dl = l !== 'dataLayer' ? '&l=' + l : ''; 51 j.async = true; 52 j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 53 f.parentNode.insertBefore(j, f); 54 })(window, document, 'script', 'dataLayer', gtmId); 55})();</script>
55 <!-- End Google Tag Manager --><title>Contact Sam Petrenko | Fruitful Code</title><meta name="description" content="Contact Sam Petrenko about fractional CTO support for AI products, AI product audits, LeadCognition, or Fruitful Code product strategy work."><link rel="canonical" href="https://www.fruitfulcode.com/contact/"><link rel="sitemap" href="/sitemap-index.xml"><meta property="og:site_name" content="Fruitful Code"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta property="og:title" content="Contact Sam Petrenko | Fruitful Code"><meta property="og:description" content="Contact Sam Petrenko about fractional CTO support for AI products, AI product audits, LeadCognition, or Fruitful Code product strategy work."><meta property="og:url" content="https://www.fruitfulcode.com/contact/"><meta property="og:image" content="https://www.fruitfulcode.com/assets/images/bg/hero-home.jpg"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Contact Sam Petrenko | Fruitful Code"><meta name="twitter:description" content="Contact Sam Petrenko about fractional CTO support for AI products, AI product audits, LeadCognition, or Fruitful Code product strategy work."><meta name="twitter:image" content="https://www.fruitfulcode.com/assets/images/bg/hero-home.jpg"><link rel="alternate" type="text/plain" href="/llms.txt" title="LLMs text summary"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><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="manifest" href="/site.webmanifest"><link rel="mask-icon" href="/safari-pinned-tab.svg" color="#5bbad5"><meta name="msapplication-TileColor" content="#ffc40d"><meta name="theme-color" content="#ffffff"><link rel="stylesheet" href="/assets/css/vendor.min.css">
55<script>(function(){const phKey = "phc_BLDyFh6GBaKX44mKwECnLMzBwYeAAgTeFbb962fw8hkq"; 56const phHost = "https://us.i.posthog.com"; 57 58 !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].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.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="init capture register register_once register_for_session unregister unregister_for_session getFeatureFlag getFeatureFlagPayload isFeatureEnabled reloadFeatureFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSessionId getSurveys getActiveMatchingSurveys renderSurvey canRenderSurvey getNextSurveyStep identify setPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException loadToolbar get_property getSessionProperty createPersonProfile opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing debug".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]); 59 posthog.init(phKey, { 60 api_host: phHost, 61 defaults: '2025-05-24', 62 autocapture: true, 63 capture_pageview: true, 64 capture_pageleave: true, 65 }); 66 })();</script>
66<script type="application/ld+json">[{"@context":"https://schema.org","@type":"Organization","name":"Fruitful Code","url":"https://www.fruitfulcode.com","description":"Fractional CTO, AI product strategy, and technical GTM support for founders building AI and SaaS products.","logo":"https://www.fruitfulcode.com/assets/images/logo.svg","foundingDate":"2011","founder":{"@type":"Person","name":"Sam Petrenko","url":"https://petrenko.cv/","sameAs":["https://petrenko.cv/","https://www.linkedin.com/in/wiselancer/","https://github.com/wiselancer","https://www.instagram.com/wiselancer/","https://leadcognition.io/"]},"knowsAbout":["fractional CTO for AI products","fractional CTO for AI startups","fractional CTO for SaaS","CTO as a Service for startups","AI product audit","AI MVP architecture","AI GTM consultant","fractional RevOps for AI SaaS","GitHub intent data","GitHub signal intelligence for DevTool GTM","DevTool go-to-market","software development partner for SaaS founders"],"areaServed":["United States","United Kingdom","European Union"],"sameAs":["https://www.linkedin.com/company/fruitful-code/","https://www.facebook.com/fruitfulc0de","https://clutch.co/profile/fruitful-code"]},{"@context":"https://schema.org","@type":"Person","name":"Sam Petrenko","url":"https://petrenko.cv/","email":"[email protected]","jobTitle":"Founder of Fruitful Code and LeadCognition","sameAs":["https://petrenko.cv/","https://www.linkedin.com/in/wiselancer/","https://github.com/wiselancer","https://www.instagram.com/wiselancer/","https://leadcognition.io/"],"worksFor":{"@type":"Organization","name":"Fruitful Code","url":"https://www.fruitfulcode.com"},"knowsAbout":["MVP development","custom web development","software outsourcing","developer signal intelligence","GitHub intent data","DevTool go-to-market","real estate software development"]},{"@context":"https://schema.org","@type":"ContactPage","name":"Contact Sam Petrenko | Fruitful Code","description":"Contact Sam Petrenko about fractional CTO support for AI products, AI product audits, LeadCognition, or Fruitful Code product strategy work.","url":"https://www.fruitfulcode.com/contact/","mainEntity":{"@type":"Person","name":"Sam Petrenko","email":"[email protected]","sameAs":["https://petrenko.cv/","https://www.linkedin.com/in/wiselancer/","https://github.com/wiselancer","https://www.instagram.com/wiselancer/","https://leadcognition.io/"]}},{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://www.fruitfulcode.com"},{"@type":"ListItem","position":2,"name":"Contact","item":"https://www.fruitfulcode.com/contact/"}]}]</script>
66<link rel="stylesheet" href="/_astro/AstroBaseLayout.tNsmgnOB.css"></head> <body> <!-- Google Tag Manager (noscript) -->
vendor: 67 bytes, line 66
66<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
66GTM-PWSRXGFW
vendor: 82 bytes, line 66
66" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
66<!-- End Google Tag Manager (noscript) --> <header class="fc-header animate-header-drop"> <div class="fc-container"> <nav class="fc-nav" aria-label="Main navigation"> <a class="fc-brand" href="/" aria-label="Fruitful Code"> <span class="fc-brand-mark"> <img src="/assets/images/logo-symbol.jpg" alt="" width="28" height="28"> </span> <span>Fruitful Code</span> </a> <div class="fc-nav-links"> <a href="/">Home</a><a href="/services/">Services</a><a href="/fractional-cto-ai/">AI CTO</a><a href="/ai-gtm-consultant/">AI GTM</a><a href="/cases/">Cases</a><a href="/blog/">Blog</a> </div> <div class="fc-actions"> <a class="fc-button" href="/contact/">Contact Sam</a> <button class="fc-menu-button" type="button" aria-controls="site-mobile-menu" aria-expanded="false" aria-label="Open navigation" data-site-menu-toggle> <span></span> </button> </div> </nav> <div id="site-mobile-menu" class="fc-mobile-menu" hidden> <nav aria-label="Mobile navigation"> <ul class="fc-mobile-menu__list"> <li><a href="/">Home</a></li><li><a href="/services/">Services</a></li><li><a href="/fractional-cto-ai/">AI CTO</a></li><li><a href="/ai-gtm-consultant/">AI GTM</a></li><li><a href="/cases/">Cases</a></li><li><a href="/blog/">Blog</a></li> </ul> <a class="fc-button" href="/contact/">Contact Sam</a> </nav> </div> </div> </header> <main id="content" class="fc-main"> <section class="container space-top-3 space-bottom-2"> <nav aria-label="breadcrumb"> <ol class="breadcrumb px-0"> <li class="breadcrumb-item"><a class="breadcrumb-link" href="/">Home</a></li> <li class="breadcrumb-item active" aria-current="page">Contact</li> </ol> </nav> <div class="w-lg-80"> <p class="eyebrow">Contact Sam Petrenko</p> <h1 class="display-5">Talk about AI product strategy, fractional CTO support, or LeadCognition.</h1> <p class="lead"> 67The fastest path is email. Send the product, workflow, or GTM problem and Sam will point you toward the most practical next step. 68</p> <div class="mt-4"> <a class="btn btn-primary mr-3 mb-3" href="/cdn-cgi/l/email-protection#5c2f3d311c3a2e2935283a29303f333839723f3331">Email Sam</a> <a class="btn btn-soft-primary mb-3" href="https://petrenko.cv/">View petrenko.cv</a> </div> </div> </section> <section class="container space-2"> <div class="row"> <div class="col-md-6 mb-5"> <a class="card h-100 shadow-soft transition-3d-hover" href="/cdn-cgi/l/email-protection#4734262a072135322e3321322b242823226924282a"> <div class="card-body"> <p class="eyebrow mb-2">Email</p> <h2 class="h4 mb-0"><span class="__cf_email__" data-cfemail="90e3f1fdd0f6e2e5f9e4f6e5fcf3fff4f5bef3fffd">[email protected]</span></h2> </div> </a> </div><div class="col-md-6 mb-5"> <a class="card h-100 shadow-soft transition-3d-hover" href="https://www.linkedin.com/in/wiselancer/"> <div class="card-body"> <p class="eyebrow mb-2">LinkedIn</p> <h2 class="h4 mb-0">linkedin.com/in/wiselancer</h2> </div> </a> </div><div class="col-md-6 mb-5"> <a class="card h-100 shadow-soft transition-3d-hover" href="https://github.com/wiselancer"> <div class="card-body"> <p class="eyebrow mb-2">GitHub</p> <h2 class="h4 mb-0">github.com/wiselancer</h2> </div> </a> </div><div class="col-md-6 mb-5"> <a class="card h-100 shadow-soft transition-3d-hover" href="https://www.instagram.com/wiselancer/"> <div class="card-body"> <p class="eyebrow mb-2">Instagram</p> <h2 class="h4 mb-0">instagram.com/wiselancer</h2> </div> </a> </div> </div> </section> <section class="container space-2"> <div class="row"> <div class="col-lg-7 mb-6 mb-lg-0"> <h2>Best reasons to reach out</h2> <ul> <li>Fractional CTO support for an AI startup or SaaS product</li> <li>AI product audit before a bigger build or rebuild</li> <li>LeadCognition and GitHub intent data for DevTool GTM</li> <li>Product strategy for a technical workflow that could become software</li> </ul> </div> <div class="col-lg-5"> <div class="card shadow-soft"> <div class="card-body"> <h2 class="h4">Useful context to include</h2> <p>What you are building, who it is for, what is blocked, and whether you need strategy, architecture, audit, or delivery help.</p> <a href="/fractional-cto-ai/">See fractional CTO focus</a> </div> </div> </div> </div> </section> </main> <footer class="fc-footer"> <div class="fc-container"> <div class="fc-footer-grid"> <div> <a href="/" class="fc-brand" aria-label="Fruitful Code"> <img class="fc-footer-logo" src="/assets/images/logo.svg" alt="Fruitful Code"> </a> <p class="mt-4 max-w-xl text-white/70">Fractional CTO, AI product strategy, and technical GTM support from Sam Petrenko.</p> <p class="mt-4 text-sm text-white/45">Copyright 2026 Fruitful Code. All rights reserved.</p> </div> <div class="fc-footer-links"> <a href="/services/">Services</a> <a href="/fractional-cto-ai/">AI CTO</a> <a href="/ai-gtm-consultant/">AI GTM</a> <a href="/cases/">Cases</a> <a href="/blog/">Blog</a> <a href="/contact/">Contact</a> <a href="/privacy-policy/">Privacy</a> </div> </div> </div> </footer>
vendor: 109 bytes, line 68
68 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
68<script> 69 (() => { 70 const toggle = document.querySelector('[data-site-menu-toggle]'); 71 const menu = document.getElementById('site-mobile-menu'); 72 if (!toggle || !menu) return; 73 74 const setOpen = (open) => { 75 toggle.setAttribute('aria-expanded', String(open)); 76 toggle.setAttribute('aria-label', open ? 'Close navigation' : 'Open navigation'); 77 toggle.classList.toggle('is-open', open); 78 menu.hidden = !open; 79 document.body.classList.toggle('site-menu-open', open); 80 }; 81 82 toggle.addEventListener('click', () => setOpen(toggle.getAttribute('aria-expanded') !== 'true')); 83 menu.querySelectorAll('a').forEach((link) => link.addEventListener('click', () => setOpen(false))); 84 document.addEventListener('keydown', (event) => { 85 if (event.key === 'Escape') setOpen(false); 86 }); 87 })(); 88 </script>
88
88<script> 89 (() => { 90 function initReveal() { 91 const els = Array.from(document.querySelectorAll('[data-reveal]:not(.is-visible), [data-reveal-children]:not(.is-visible)')); 92 93 document.querySelectorAll('[data-reveal-content]').forEach((container) => { 94 Array.from(container.children).forEach((child) => { 95 if (!child.classList.contains('is-visible')) els.push(child); 96 }); 97 }); 98 99 if (!els.length) return; 100 101 const fold = window.innerHeight * 0.75; 102 const aboveFold = []; 103 const belowFold = []; 104 105 els.forEach((el) => { 106 const rect = el.getBoundingClientRect(); 107 if (rect.top < fold && rect.bottom > 0) aboveFold.push(el); 108 else belowFold.push(el); 109 }); 110 111 aboveFold.forEach((el, index) => { 112 setTimeout(() => el.classList.add('is-visible'), 250 + index * 80); 113 }); 114 115 if (!belowFold.length) return; 116 117 const observer = new IntersectionObserver((entries) => { 118 entries.forEach((entry) => { 119 if (!entry.isIntersecting) return; 120 entry.target.classList.add('is-visible'); 121 observer.unobserve(entry.target); 122 }); 123 }, { threshold: 0.15, rootMargin: '0px 0px -10% 0px' }); 124 125 belowFold.forEach((el) => observer.observe(el)); 126 } 127 128 const start = () => requestAnimationFrame(initReveal); 129 if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start); 130 else start(); 131 })(); 132 </script>
132
132<script src="/assets/js/vendor.min.js"></script>
132
132<script src="/assets/js/theme.min.js"></script>
132 <div id="lc-consent-banner" class="lc-consent" role="dialog" aria-label="Cookie consent" aria-live="polite" hidden data-astro-cid-i6xszmyj style="--accentColor: #125445;"> <p class="lc-consent__text" data-astro-cid-i6xszmyj style="--accentColor: #125445;"> 133We use cookies for analytics and to measure our ads. You can accept or 134 decline non-essential cookies. <a class="lc-consent__link" href="/privacy-policy/" data-astro-cid-i6xszmyj style="--accentColor: #125445;"> 135Learn more 136</a> 137. 138 </p> <div class="lc-consent__actions" data-astro-cid-i6xszmyj style="--accentColor: #125445;"> <button type="button" id="lc-consent-reject" class="lc-consent__btn lc-consent__btn--ghost" data-astro-cid-i6xszmyj style="--accentColor: #125445;"> 139Decline 140</button> <button type="button" id="lc-consent-accept" class="lc-consent__btn lc-consent__btn--primary" data-astro-cid-i6xszmyj style="--accentColor: #125445;"> 141Accept 142</button> </div> </div>
142<script>(function(){const storageKey = "lc-consent"; 143 144 function lcConsentInit() { 145 var banner = document.getElementById("lc-consent-banner"); 146 // Idempotent: skip if this exact banner element was already wired. After an 147 // Astro view-transition swap the element is fresh (no flag) â we re-init. 148 if (!banner || banner.dataset.lcInit) return; 149 banner.dataset.lcInit = "1"; 150 151 function gtag() { 152 window.dataLayer = window.dataLayer || []; 153 window.dataLayer.push(arguments); 154 } 155 156 function persist(granted) { 157 try { 158 localStorage.setItem( 159 storageKey, 160 JSON.stringify({ granted: granted, ts: Date.now() }), 161 ); 162 } catch (_) { 163 /* storage blocked â choice lives only for this page load. */ 164 } 165 } 166 167 function apply(granted) { 168 var state = granted ? "granted" : "denied"; 169 gtag("consent", "update", { 170 ad_storage: state, 171 ad_user_data: state, 172 ad_personalization: state, 173 analytics_storage: state, 174 personalization_storage: state, 175 }); 176 // Let GTM (re)fire consent-gated tags on the same page. 177 window.dataLayer.push({ event: "consent_update", consent_granted: granted }); 178 } 179 180 function decide(granted) { 181 persist(granted); 182 apply(granted); 183 banner.hidden = true; 184 } 185 186 // Only surface the banner when no prior choice is stored. 187 var hasChoice = false; 188 try { 189 hasChoice = !!localStorage.getItem(storageKey); 190 } catch (_) { 191 hasChoice = false; 192 } 193 if (!hasChoice) banner.hidden = false; 194 195 var accept = document.getElementById("lc-consent-accept"); 196 var reject = document.getElementById("lc-consent-reject"); 197 if (accept) accept.addEventListener("click", function () { decide(true); }); 198 if (reject) reject.addEventListener("click", function () { decide(false); }); 199 } 200 201 lcConsentInit(); 202 // Re-wire after Astro ClientRouter view-transition navigations (body is 203 // swapped, so the previous banner's listeners are gone). This document-level 204 // listener is registered once and survives transitions; no-op on sites 205 // without ClientRouter (the event never fires). 206 document.addEventListener("astro:page-load", lcConsentInit); 207})();</script>
207
207<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"974b9f7b996349f6820bd15dcf46baf4","r":1,"spa":2}' crossorigin="anonymous"></script>
207 208</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.