PageSourceSearch

https://fruitfulcode.com/contact/

html fruitfulcode.com collected 2026-10-02 03:43:56 UTC 20,209 bytes, 208 lines download raw bytes

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&#160;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.