<!DOCTYPE html><html lang="en" data-astro-cid-37fxchfa> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Andrew Heins — Personal Website</title><meta name="description" content="I've been on the internet since MUDs and Geocities, and I'm still trying to figure out what we built. President of Cantilever, a digital agency."><link rel="canonical" href="https://andrewheins.ca/"><link rel="icon" href="/favicon.ico" sizes="48x48"><!-- Open Graph --><meta property="og:type" content="website"><meta property="og:title" content="Andrew Heins — Personal Website"><meta property="og:description" content="I've been on the internet since MUDs and Geocities, and I'm still trying to figure out what we built. President of Cantilever, a digital agency."><meta property="og:image" content="https://assets.andrewheins.ca/images/og-default.jpg"><meta property="og:image:width" content="1280"><meta property="og:image:height" content="720"><meta property="og:image:type" content="image/jpeg"><meta property="og:url" content="https://andrewheins.ca/"><meta property="og:site_name" content="Andrew Heins"><!-- Twitter card --><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Andrew Heins — Personal Website"><meta name="twitter:description" content="I've been on the internet since MUDs and Geocities, and I'm still trying to figure out what we built. President of Cantilever, a digital agency."><meta name="twitter:image" content="https://assets.andrewheins.ca/images/og-default.jpg"><!-- RSS --><link rel="alternate" type="application/rss+xml" title="Andrew Heins — Writing" href="/rss.xml"><!-- Analytics + consent — production only.
         CookieYes and GA4 are never loaded on localhost or staging (*.pages.dev).
         Consent defaults run everywhere so gtag() calls are safe in all envs. --><script>(function(){const ga4MeasurementId = "G-6WZKFS71EW";
const cookieYesScriptId = "f8847f756445572b60545a2524b350a4";
const productionHost = "andrewheins.ca";

      window.dataLayer = window.dataLayer || [];
      function gtag() { dataLayer.push(arguments); }

      // Consent defaults run on every environment — must precede any gtag.js load
      gtag('consent', 'default', {
        analytics_storage:              'denied',
        ad_storage:                     'denied',
        ad_user_data:                   'denied',
        ad_personalization:             'denied',
        functionality_storage:          'denied',
        personalization_storage:        'denied',
        security_storage:               'granted',
        wait_for_update:                500,
      });

      // Only load third-party scripts on the real domain
      var host = window.location.hostname;
      var isProduction = host === productionHost || host === 'www.' + productionHost;

      if (isProduction) {
        // Inject CookieYes
        var cy = document.createElement('script');
        cy.id    = 'cookieyes';
        cy.async = true;
        cy.src   = 'https://cdn-cookieyes.com/client_data/' + cookieYesScriptId + '/script.js';
        document.head.appendChild(cy);

        function loadGA4() {
          if (document.getElementById('ga4-script')) return;
          gtag('consent', 'update', {
            analytics_storage:       'granted',
            functionality_storage:   'granted',
            personalization_storage: 'granted',
          });
          var s   = document.createElement('script');
          s.id    = 'ga4-script';
          s.async = true;
          s.src   = 'https://www.googletagmanager.com/gtag/js?id=' + ga4MeasurementId;
          document.head.appendChild(s);
          gtag('js', new Date());
          gtag('config', ga4MeasurementId, {
            allow_google_signals:             false,
            allow_ad_personalization_signals: false,
            restricted_data_processing:       true,
            send_page_view:                   false, // we fire it explicitly below
          });
          // Explicit page_view so it fires reliably when GA4 loads mid-session
          // (e.g. new visitor consenting after the page has already rendered)
          gtag('event', 'page_view', {
            page_title:    document.title,
            page_location: window.location.href,
          });
        }

        // CookieYes dispatches on both document and window depending on version —
        // listen on both to be safe
        function onConsentUpdate(event) {
          var detail = (event && event.detail) || {};
          if (detail.analytics === 'yes') loadGA4();
        }
        document.addEventListener('cookieyes-consent-update', onConsentUpdate);
        window.addEventListener('cookieyes-consent-update', onConsentUpdate);

        // Fallback: read the consent cookie directly once the DOM is ready.
        // Handles returning visitors where CookieYes fires before our listeners attach.
        // Cookie format: "consentid:xxx,consent:yes,analytics:yes,..."
        document.addEventListener('DOMContentLoaded', function () {
          var match = document.cookie.match(/(?:^|;\s*)cookieyes-consent=([^;]*)/);
          if (match && decodeURIComponent(match[1]).includes('analytics:yes')) loadGA4();
        });
      }
    })();</script><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><!-- Async font loading — eliminates render-blocking; noscript fallback for non-JS environments --><link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=DM+Mono:ital,wght@0,400;0,500;1,400&family=DM+Sans:ital,wght@0,400;0,500;0,600;1,400&family=Rock+Salt&display=swap" onload="this.onload=null;this.rel='stylesheet'"><noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=DM+Mono:ital,wght@0,400;0,500;1,400&family=DM+Sans:ital,wght@0,400;0,500;0,600;1,400&family=Rock+Salt&display=swap"></noscript><script type="application/ld+json">{"@context":"https://schema.org","@type":"Person","name":"Andrew Heins","url":"https://andrewheins.ca","image":"https://assets.andrewheins.ca/images/andrew-photo.jpg","jobTitle":"President","worksFor":{"@type":"Organization","name":"Cantilever","url":"https://cantilever.co"},"sameAs":["https://www.linkedin.com/in/andrew-heins-08093017/","https://cantilever.co/team/andrew-heins"]}</script><link rel="stylesheet" href="/_astro/index.C1iGHhqq.css">
<style>.site-nav[data-astro-cid-rxxavq4o]{position:relative;z-index:60;display:flex;align-items:center;justify-content:space-between;padding:0 1.5rem;height:3.5rem}.site-nav-name[data-astro-cid-rxxavq4o],.site-nav-link[data-astro-cid-rxxavq4o]{display:inline-block;position:relative;padding:.35rem 1.1rem;font-size:.875rem;font-weight:600;text-decoration:none;color:#2a1f0e;letter-spacing:.01em;transition:opacity .15s}.site-nav-name[data-astro-cid-rxxavq4o]:before,.site-nav-link[data-astro-cid-rxxavq4o]:before{content:"";position:absolute;inset:0;z-index:-1;background:linear-gradient(to bottom,#ffffffbf,#ffffffeb 25% 75%,#ffffffbf);border-left:1px solid rgba(200,200,200,.6);border-right:1px solid rgba(200,200,200,.6);box-shadow:0 2px 5px #0000001f,0 1px 2px #00000014;filter:url(#tape-fray)}.site-nav-name[data-astro-cid-rxxavq4o]{transform:rotate(-1.8deg)}.site-nav-link[data-astro-cid-rxxavq4o]{transform:rotate(1.2deg);font-weight:500}.site-nav-name[data-astro-cid-rxxavq4o]:hover,.site-nav-link[data-astro-cid-rxxavq4o]:not(.is-current):hover{opacity:.8}.site-nav-link[data-astro-cid-rxxavq4o].is-current{cursor:default;pointer-events:none}.site-nav-link[data-astro-cid-rxxavq4o].is-current:before{background:linear-gradient(to bottom,#ffffffd9,#fffffff7 25% 75%,#ffffffd9)}.site-nav-links[data-astro-cid-rxxavq4o]{display:flex;align-items:center;gap:2rem;list-style:none;margin:0;padding:0}html{font-size:18px}h2,h3,h4{font-family:Rock Salt,cursive}body{min-height:100dvh;display:flex;flex-direction:column}body>*:not(footer){flex-shrink:0}body>footer{margin-top:auto}
</style>
<link rel="stylesheet" href="/_astro/index.CWv7SpDA.css"></head> <body class="text-gray-900 font-sans antialiased overflow-x-hidden" style="background-color: #f8f5f0; background-image: radial-gradient(ellipse at 50% -5%, #e4ddd2 0%, #f8f5f0 60%);" data-astro-cid-37fxchfa> <div class="relative" data-astro-cid-37fxchfa> <div class="absolute top-0 left-0 right-0 z-60 pointer-events-none" data-astro-cid-37fxchfa> <div class="pointer-events-auto" data-astro-cid-37fxchfa> <!-- Hidden SVG filter — frays the tape edges via turbulence displacement --><svg aria-hidden="true" style="position:absolute;width:0;height:0;overflow:hidden" data-astro-cid-rxxavq4o> <defs data-astro-cid-rxxavq4o> <filter id="tape-fray" x="-4%" y="-10%" width="108%" height="120%" data-astro-cid-rxxavq4o> <feTurbulence type="fractalNoise" baseFrequency="0.065 0.12" numOctaves="3" seed="4" result="noise" data-astro-cid-rxxavq4o></feTurbulence> <feDisplacementMap in="SourceGraphic" in2="noise" scale="4" xChannelSelector="R" yChannelSelector="G" data-astro-cid-rxxavq4o></feDisplacementMap> </filter> </defs> </svg> <nav class="site-nav site-nav--dark" aria-label="Site navigation" data-astro-cid-rxxavq4o> <a href="/" class="site-nav-name" data-astro-cid-rxxavq4o> Andrew Heins </a> <ul class="site-nav-links" role="list" data-astro-cid-rxxavq4o> <li data-astro-cid-rxxavq4o> <a href="/writing" class="site-nav-link" data-astro-cid-rxxavq4o>
Writing
</a> </li> </ul> </nav>  </div> </div> <main data-astro-cid-37fxchfa>  <!-- intro-frame provides the positioning context for the overflowing photo --><div class="intro-frame" data-astro-cid-6eqrljnt> <!-- intro-shadow-wrap carries the drop-shadow so it casts onto content below the torn edge --> <div class="intro-shadow-wrap" data-astro-cid-6eqrljnt> <!-- Inner div gets the clip-path; filter on a parent sees the clipped shape --> <div class="intro-outer" style="clip-path: polygon(0.000% calc(0% + 29.93px), 1.382% calc(0% + 29.38px), 2.183% calc(0% + 30.57px), 3.327% calc(0% + 31.07px), 4.490% calc(0% + 30.69px), 5.703% calc(0% + 31.88px), 6.548% calc(0% + 37.08px), 7.398% calc(0% + 39.91px), 8.712% calc(0% + 40.99px), 10.080% calc(0% + 41.97px), 11.378% calc(0% + 40.25px), 12.668% calc(0% + 37.25px), 14.028% calc(0% + 35.43px), 15.200% calc(0% + 34.47px), 16.368% calc(0% + 33.26px), 17.418% calc(0% + 31.39px), 18.462% calc(0% + 29.64px), 19.688% calc(0% + 29.14px), 20.925% calc(0% + 29.41px), 22.088% calc(0% + 29.06px), 23.237% calc(0% + 29.35px), 24.263% calc(0% + 31.73px), 25.297% calc(0% + 34.26px), 27.800% calc(0% + 34.05px), 30.302% calc(0% + 31.91px), 31.407% calc(0% + 32.28px), 32.493% calc(0% + 32.02px), 33.335% calc(0% + 30.65px), 35.800% calc(0% + 31.06px), 38.257% calc(0% + 31.96px), 39.725% calc(0% + 29.38px), 41.663% calc(0% + 29.70px), 43.595% calc(0% + 31.01px), 46.540% calc(0% + 32.84px), 49.550% calc(0% + 33.78px), 52.513% calc(0% + 32.96px), 54.775% calc(0% + 31.35px), 57.025% calc(0% + 29.25px), 58.957% calc(0% + 28.16px), 60.888% calc(0% + 28.14px), 61.937% calc(0% + 27.82px), 62.947% calc(0% + 28.08px), 63.703% calc(0% + 30.72px), 64.730% calc(0% + 32.25px), 65.053% calc(0% + 33.33px), 66.833% calc(0% + 32.34px), 68.440% calc(0% + 30.51px), 70.063% calc(0% + 29.32px), 71.383% calc(0% + 28.88px), 72.692% calc(0% + 28.08px), 73.893% calc(0% + 28.27px), 75.087% calc(0% + 29.25px), 76.197% calc(0% + 29.98px), 77.305% calc(0% + 30.65px), 78.990% calc(0% + 32.50px), 80.677% calc(0% + 34.29px), 83.178% calc(0% + 34.73px), 85.685% calc(0% + 34.50px), 87.050% calc(0% + 34.56px), 88.377% calc(0% + 33.26px), 90.360% calc(0% + 31.04px), 92.373% calc(0% + 29.95px), 94.657% calc(0% + 27.32px), 96.958% calc(0% + 24.39px), 99.257% calc(0% + 23.04px), 100.000% calc(0% + 22.00px),100.000% calc(100% - 34.68px), 99.967% calc(100% - 34.71px), 98.235% calc(100% - 34.85px), 96.515% calc(100% - 35.80px), 94.560% calc(100% - 37.65px), 92.578% calc(100% - 38.44px), 91.237% calc(100% - 39.02px), 89.907% calc(100% - 39.73px), 88.648% calc(100% - 42.16px), 86.623% calc(100% - 48.13px), 84.507% calc(100% - 52.70px), 82.358% calc(100% - 55.74px), 80.188% calc(100% - 58.38px), 78.713% calc(100% - 59.96px), 77.230% calc(100% - 61.34px), 75.695% calc(100% - 63.16px), 74.172% calc(100% - 65.17px), 72.952% calc(100% - 66.05px), 71.780% calc(100% - 64.22px), 70.965% calc(100% - 59.20px), 70.257% calc(100% - 53.49px), 69.488% calc(100% - 48.66px), 68.707% calc(100% - 43.97px), 67.867% calc(100% - 40.88px), 66.885% calc(100% - 42.24px), 65.340% calc(100% - 41.51px), 63.827% calc(100% - 39.23px), 62.413% calc(100% - 37.41px), 61.057% calc(100% - 34.46px), 60.005% calc(100% - 30.78px), 58.975% calc(100% - 26.87px), 58.025% calc(100% - 23.55px), 56.982% calc(100% - 22.25px), 54.737% calc(100% - 22.28px), 52.488% calc(100% - 22.25px), 50.265% calc(100% - 22.76px), 48.045% calc(100% - 23.46px), 46.210% calc(100% - 24.73px), 44.370% calc(100% - 25.95px), 42.548% calc(100% - 27.32px), 40.765% calc(100% - 29.62px), 39.815% calc(100% - 29.73px), 38.572% calc(100% - 29.94px), 37.323% calc(100% - 30.63px), 34.883% calc(100% - 32.16px), 32.427% calc(100% - 33.16px), 29.972% calc(100% - 33.48px), 27.748% calc(100% - 33.43px), 25.525% calc(100% - 33.50px), 24.135% calc(100% - 32.90px), 22.748% calc(100% - 32.15px), 21.528% calc(100% - 32.03px), 20.313% calc(100% - 31.60px), 17.858% calc(100% - 30.87px), 15.450% calc(100% - 28.48px), 12.928% calc(100% - 24.66px), 10.343% calc(100% - 23.50px), 8.155% calc(100% - 23.68px), 5.985% calc(100% - 25.08px), 4.013% calc(100% - 27.17px), 2.032% calc(100% - 28.54px), 0.628% calc(100% - 28.75px), 0.000% calc(100% - 30.89px));" data-astro-cid-6eqrljnt>   <section class="intro-section" data-astro-cid-6eqrljnt> <div class="intro-text" data-astro-cid-6eqrljnt> <h1 class="intro-title" data-astro-cid-6eqrljnt>Andrew Heins</h1> <p class="intro-body" data-astro-cid-6eqrljnt>When I was a kid, the Internet was going to change everything. It has - just not in the ways we were hoping. Twenty years in, I&#39;m reckoning with the decisions we made, and the culture we built. Can we still deliver on the promise? Welcome to my website. Don&#39;t forget to sign the guestbook.</p> </div> </section> </div> </div> <!-- Photo lives outside the clip-path so it can bleed past the torn edges --> <div class="intro-photo-outer" data-astro-cid-6eqrljnt> <div class="intro-photo-wrap" data-astro-cid-6eqrljnt> <img src="/_astro/andrew-kid-computer_Z1Ck6wM.webp" alt="Andrew as a kid with a computer" class="intro-photo-img" fetchpriority="high" loading="eager" data-astro-cid-6eqrljnt width="800" height="800" decoding="async"> <span class="intro-photo-caption" data-astro-cid-6eqrljnt>1990</span> </div> </div> </div>  <div class="lw-outer" data-astro-cid-ycp4byat>   <section class="lw-section" data-astro-cid-ycp4byat> <div class="lw-grid" data-astro-cid-ycp4byat> <!-- First in DOM: heading + rest of posts + view all --> <div class="lw-right" data-astro-cid-ycp4byat> <h2 class="lw-heading" data-astro-cid-ycp4byat>Latest Writing</h2> <p class="lw-blurb" data-astro-cid-ycp4byat>In a world where opinions are inescapable noise, I try to limit my writing to things worth reading.</p>  <a href="/writing/" class="lw-view-all" data-astro-cid-ycp4byat>View all writing →</a> </div> <!-- Second in DOM, visually first on desktop via order --> <div class="lw-card-wrap" data-astro-cid-ycp4byat> <div class="lw-card" data-astro-cid-ycp4byat> <div class="lw-card-meta" data-astro-cid-ycp4byat> <span class="lw-card-type" data-astro-cid-ycp4byat>Essay</span> <time datetime="2026-05-26T00:00:00.000Z" class="lw-card-date" data-astro-cid-ycp4byat>May 26, 2026</time> </div> <h3 class="lw-card-title" data-astro-cid-ycp4byat> <a href="/writing/are-our-devices-listening/" class="astro-ycp4byat" data-astro-cid-ycp4byat> Are Our Devices Listening to Us? </a> </h3> <p class="lw-card-annotation" data-astro-cid-ycp4byat>What does it actually take to see what your devices are doing? More than you&#39;d think.</p> <a href="/writing/are-our-devices-listening/" class="lw-card-link" data-astro-cid-ycp4byat> Read → </a> <div class="lw-hole" aria-hidden="true" data-astro-cid-ycp4byat></div> </div> </div> </div> </section> </div>  <div class="workblock-outer" data-astro-cid-tpbumywr> <img src="/_astro/splotch-light-cropped_Z2lMjNO.webp" alt="" aria-hidden="true" class="workblock-splotch" loading="lazy" data-astro-cid-tpbumywr> <section class="max-w-3xl mx-auto px-6 py-16" data-astro-cid-tpbumywr> <div class="workblock-inner" data-astro-cid-tpbumywr> <div class="workblock-sticker-wrap" aria-hidden="true" data-astro-cid-tpbumywr> <img src="/_astro/cantilever-sticker_ZBu9kG.webp" alt="" class="workblock-sticker" loading="lazy" data-astro-cid-tpbumywr width="252" height="252" decoding="async"> </div> <div class="workblock-content" data-astro-cid-tpbumywr> <p class="text-gray-700 leading-relaxed mb-5" data-astro-cid-tpbumywr>I&#39;m President of Cantilever, a digital agency  I&#39;ve been part of since 2012. We build and maintain websites for organizations that take their digital presence seriously — strategy, design, and development, from a team that&#39;s been doing this long enough to know how to get you real results.</p> <p class="text-gray-700 leading-relaxed" data-astro-cid-tpbumywr> If you&#39;re thinking about your website, <a href="https://cantilever.co?utm_source=andrewheins.ca&utm_medium=personal_site&utm_campaign=work_section" target="_blank" rel="noopener noreferrer" class="text-gray-900 font-medium underline underline-offset-2 hover:text-gray-600" data-astro-cid-tpbumywr>we&#39;d like to talk</a>.
</p> </div> </div> </section> </div>  <section class="max-w-3xl mx-auto px-6 py-16" data-astro-cid-xdkhcoeo> <h2 class="text-3xl font-bold mb-6" data-astro-cid-xdkhcoeo>How I Think</h2>  <div class="pillar-grid" data-astro-cid-xdkhcoeo> <div class="pillar-card" data-astro-cid-xdkhcoeo> <h3 class="pillar-title" data-astro-cid-xdkhcoeo>Keep Your Promises</h3> <div class="staple" aria-hidden="true" data-astro-cid-xdkhcoeo></div> <p class="pillar-body" data-astro-cid-xdkhcoeo>Businesses run on promises. You make a promise to deliver a product, a service, or a career. Good businesses keep their promises. I help them do that.</p> </div><div class="pillar-card" data-astro-cid-xdkhcoeo> <h3 class="pillar-title" data-astro-cid-xdkhcoeo>Tech as an Enabler, not an End</h3> <div class="staple" aria-hidden="true" data-astro-cid-xdkhcoeo></div> <p class="pillar-body" data-astro-cid-xdkhcoeo>While technology changes fast, your basic business promises probably don&#39;t. Technology can be a tool to help you deliver, and I help decipher what&#39;s worth chasing, and what&#39;s just a trend.</p> </div><div class="pillar-card" data-astro-cid-xdkhcoeo> <h3 class="pillar-title" data-astro-cid-xdkhcoeo>People First</h3> <div class="staple" aria-hidden="true" data-astro-cid-xdkhcoeo></div> <p class="pillar-body" data-astro-cid-xdkhcoeo>We build businesses to support ourselves and our families and uplift our communities. Profits make this possible, but when profits start hurting people, it misses the point.</p> </div> </div> </section>   </main> </div> <footer class="border-t border-gray-100" data-astro-cid-37fxchfa> <div class="max-w-3xl mx-auto px-4 py-8 text-sm text-gray-600 flex items-center justify-between" data-astro-cid-37fxchfa> <span data-astro-cid-37fxchfa>&copy; 2026 Andrew Heins</span> <a href="https://www.linkedin.com/in/andrew-heins-08093017/" target="_blank" rel="noopener noreferrer" class="hover:text-gray-900 transition-colors" data-astro-cid-37fxchfa>LinkedIn</a> </div> </footer> <!-- External link tracking — fires GA4 events for all outbound clicks.
         cantilever_referral and newsletter_signup are marked as key events
         in GA4 Admin → Events → Mark as key event. --> <script>(function(){const workBlogUrl = "https://cantilever.co/articles/";
const cantileverUrl = "https://cantilever.co";

      document.addEventListener('click', function (e) {
        const a = e.target.closest('a');
        if (!a) return;
        const href = a.getAttribute('href') || '';
        if (!href.startsWith('http') || href.startsWith(window.location.origin)) return;

        if (typeof gtag === 'undefined') return;

        const isCantilever = href.startsWith(cantileverUrl);
        const isWorkBlog   = href.startsWith(workBlogUrl);

        if (isCantilever) {
          gtag('event', 'cantilever_referral', { link_url: href });
        } else if (isWorkBlog) {
          gtag('event', 'work_blog_click', { link_url: href });
        } else {
          gtag('event', 'external_link_click', { link_url: href });
        }
      });
    })();</script> </body> </html>