<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Home — Karthick Gopal</title>
  <meta name="description" content="Writer by Design, Product Manager by Trade.">
  <link rel="canonical" href="https://karthickg.com/">
  <link rel="preconnect" href="https://fonts.googleapis.com">
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  <link rel="stylesheet" href="/assets/css/style.css">
  <!-- Begin Jekyll SEO tag v2.8.0 -->
<title>Home | Karthick Gopal</title>
<meta name="generator" content="Jekyll v4.4.1" />
<meta property="og:title" content="Home" />
<meta name="author" content="Karthick Gopal" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="Writer by Design, Product Manager by Trade." />
<meta property="og:description" content="Writer by Design, Product Manager by Trade." />
<link rel="canonical" href="https://karthickg.com/" />
<meta property="og:url" content="https://karthickg.com/" />
<meta property="og:site_name" content="Karthick Gopal" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="Home" />
<meta name="twitter:site" content="@karthickg" />
<meta name="twitter:creator" content="@Karthick Gopal" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebSite","author":{"@type":"Person","name":"Karthick Gopal"},"description":"Writer by Design, Product Manager by Trade.","headline":"Home","name":"Karthick Gopal","url":"https://karthickg.com/"}</script>
<!-- End Jekyll SEO tag -->

</head>
<body>
  <canvas id="kg-canvas"></canvas>

<script>
// ── mandala canvas ──
(function() {
  const cv  = document.getElementById('kg-canvas');
  const ctx = cv.getContext('2d');
  const sparks = [];
  let W, H;

  function resize() {
    W = cv.width  = window.innerWidth;
    H = cv.height = window.innerHeight;
  }
  resize();
  window.addEventListener('resize', resize);

  function gc(a) {
    return window._kgDark
      ? `rgba(220,150,50,${a})`
      : `rgba(140,75,10,${a})`;
  }

  function drawMandala(cx, cy, baseR, t, os) {
    const rings = [
      [1.00,  0.10, 72, 0.70],
      [0.84, -0.16, 54, 0.55],
      [0.68,  0.23, 40, 0.65],
      [0.53, -0.30, 28, 0.50],
      [0.38,  0.42, 20, 0.55],
      [0.24, -0.58, 12, 0.45],
    ];

    const halo = ctx.createRadialGradient(cx, cy, baseR * 0.4, cx, cy, baseR * 1.2);
    halo.addColorStop(0, gc(0.05 * os));
    halo.addColorStop(1, 'transparent');
    ctx.fillStyle = halo;
    ctx.beginPath(); ctx.arc(cx, cy, baseR * 1.2, 0, Math.PI * 2); ctx.fill();

    rings.forEach(([rf, spd, dashes, lw], i) => {
      const r  = baseR * rf;
      const op = (window._kgDark ? 0.48 : 0.32) * os - i * 0.035;
      ctx.save();
      ctx.translate(cx, cy); ctx.rotate(t * spd);
      ctx.strokeStyle = gc(Math.max(op, 0.05));
      ctx.lineWidth = lw * 0.65;
      const dl = (2 * Math.PI * r) / dashes;
      ctx.setLineDash([dl * 0.5, dl * 0.5]);
      ctx.beginPath(); ctx.arc(0, 0, r, 0, Math.PI * 2); ctx.stroke();
      ctx.setLineDash([]);
      ctx.lineWidth = 0.35;
      ctx.strokeStyle = gc(Math.max(op * 0.6, 0.04));
      for (let j = 0; j < dashes; j++) {
        const a = (j / dashes) * Math.PI * 2;
        const len = j % 4 === 0 ? 6 : 2.5;
        ctx.beginPath();
        ctx.moveTo(Math.cos(a) * (r - len), Math.sin(a) * (r - len));
        ctx.lineTo(Math.cos(a) * r, Math.sin(a) * r);
        ctx.stroke();
      }
      ctx.restore();
    });

    // lotus
    ctx.save();
    ctx.translate(cx, cy); ctx.rotate(t * 0.07);
    const pr = baseR * 0.20;
    ctx.strokeStyle = gc(window._kgDark ? 0.30 : 0.16);
    ctx.lineWidth = 0.55; ctx.setLineDash([]);
    for (let i = 0; i < 8; i++) {
      const a0 = (i / 8) * Math.PI * 2, a1 = ((i + 1) / 8) * Math.PI * 2;
      const mx = (Math.cos(a0) + Math.cos(a1)) * pr * 0.5;
      const my = (Math.sin(a0) + Math.sin(a1)) * pr * 0.5;
      ctx.beginPath(); ctx.moveTo(0, 0);
      ctx.quadraticCurveTo(Math.cos(a0)*pr, Math.sin(a0)*pr, mx*1.6, my*1.6);
      ctx.stroke();
    }
    const hr = pr * 0.65;
    ctx.strokeStyle = gc(window._kgDark ? 0.22 : 0.13);
    ctx.lineWidth = 0.45;
    ctx.beginPath();
    for (let i = 0; i < 6; i++) {
      const a = (i / 6) * Math.PI * 2 - Math.PI / 6;
      i === 0 ? ctx.moveTo(Math.cos(a)*hr, Math.sin(a)*hr)
              : ctx.lineTo(Math.cos(a)*hr, Math.sin(a)*hr);
    }
    ctx.closePath(); ctx.stroke();
    ctx.restore();

    // spokes
    ctx.save();
    ctx.translate(cx, cy); ctx.rotate(-t * 0.04);
    ctx.strokeStyle = gc(window._kgDark ? 0.08 : 0.05);
    ctx.lineWidth = 0.35; ctx.setLineDash([3, 14]);
    for (let i = 0; i < 12; i++) {
      const a = (i / 12) * Math.PI * 2;
      ctx.beginPath();
      ctx.moveTo(Math.cos(a)*baseR*0.26, Math.sin(a)*baseR*0.26);
      ctx.lineTo(Math.cos(a)*baseR, Math.sin(a)*baseR);
      ctx.stroke();
    }
    ctx.restore();
  }

  function mkSpark(cx, cy, baseR) {
    const a = Math.random() * Math.PI * 2;
    const r = baseR * (0.4 + Math.random() * 0.7);
    return {
      x: cx + Math.cos(a)*r, y: cy + Math.sin(a)*r,
      vx: (Math.random()-0.5)*1.0, vy: -Math.random()*1.3-0.3,
      life: 1, decay: 0.013+Math.random()*0.017,
      size: Math.random()*1.6+0.4
    };
  }

  function loop(ts) {
    const t = ts * 0.001;
    ctx.clearRect(0, 0, W, H);

    const cx1 = W * 0.5, cy1 = H * 0.5;
    const br1  = Math.min(W, H) * 0.36;
    drawMandala(cx1, cy1, br1, t, 1);

    const br2 = Math.min(W, H) * 0.18;
    drawMandala(W - br2 * 0.5, H - br2 * 0.5, br2, t * 0.75, 0.5);

    if (Math.random() < 0.22) sparks.push(mkSpark(cx1, cy1, br1));
    ctx.setLineDash([]);
    for (let i = sparks.length - 1; i >= 0; i--) {
      const s = sparks[i];
      s.x += s.vx; s.y += s.vy; s.vy += 0.018;
      s.life -= s.decay;
      if (s.life <= 0) { sparks.splice(i, 1); continue; }
      ctx.beginPath();
      ctx.arc(s.x, s.y, s.size*s.life, 0, Math.PI*2);
      ctx.fillStyle = gc(s.life * (window._kgDark ? 0.8 : 0.5));
      ctx.fill();
    }
    requestAnimationFrame(loop);
  }
  requestAnimationFrame(loop);
})();

// ── dark mode ──
const _SUN  = '<circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/>';
const _MOON = '<path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>';

window._kgDark = false;

// restore saved preference
if (localStorage.getItem('kg-dark') === '1') {
  window._kgDark = true;
  document.body.classList.add('dark');
  document.querySelectorAll('.kg-mode-icon').forEach(el => el.innerHTML = _SUN);
}

function kgToggleMode() {
  window._kgDark = !window._kgDark;
  document.body.classList.toggle('dark', window._kgDark);
  document.querySelectorAll('.kg-mode-icon').forEach(el => {
    el.innerHTML = window._kgDark ? _SUN : _MOON;
  });
  localStorage.setItem('kg-dark', window._kgDark ? '1' : '0');
}
</script>

  <nav id="kg-nav">
  <a class="kg-logo" href="/">Karthick Gopal</a>
  <div class="kg-nav-links">
    <a class="kg-nav-link " href="/blog/">Writing</a>
    <a class="kg-nav-link " href="/resume/">Resume</a>
    <a class="kg-nav-link " href="/about/">About</a>
	<a class="kg-nav-link " href="/nightelf/">Elf</a>
    <button class="kg-mode-btn" onclick="kgToggleMode()" title="Toggle mode">
      <svg class="kg-mode-icon" width="15" height="15" viewBox="0 0 24 24" fill="none"
           stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
        <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
      </svg>
    </button>
  </div>
</nav>

  <div class="kg-home">

  <!-- animated glyph -->
  <svg class="kg-glyph" id="kg-glyph" viewBox="0 0 72 72" xmlns="http://www.w3.org/2000/svg" style="overflow:visible;">
    <circle id="gr1" cx="36" cy="36" r="32" fill="none" stroke="#c8903a" stroke-width="0.8" stroke-dasharray="6 3" opacity="0.65"/>
    <circle id="gr2" cx="36" cy="36" r="23" fill="none" stroke="#d4983c" stroke-width="0.65" stroke-dasharray="4 3" opacity="0.6"/>
    <circle id="gr3" cx="36" cy="36" r="15" fill="none" stroke="#c8903a" stroke-width="0.6" stroke-dasharray="2.5 2.5" opacity="0.55"/>
    <g id="gspk" opacity="0.3" stroke="#d4983c" stroke-width="0.5" stroke-dasharray="2 8">
      <line x1="36" y1="4" x2="36" y2="68"/>
      <line x1="4" y1="36" x2="68" y2="36"/>
      <line x1="15" y1="15" x2="57" y2="57"/>
      <line x1="57" y1="15" x2="15" y2="57"/>
    </g>
    <polygon id="ghex" points="36,22 47,29 47,43 36,50 25,43 25,29" fill="none" stroke="#d4983c" stroke-width="0.55" opacity="0.45"/>
    <radialGradient id="gcg" cx="50%" cy="50%" r="50%">
      <stop offset="0%" stop-color="#ffb830" stop-opacity="0.8"/>
      <stop offset="100%" stop-color="#c06010" stop-opacity="0"/>
    </radialGradient>
    <circle cx="36" cy="36" r="10" fill="url(#gcg)" opacity="0.55"/>
    <circle cx="36" cy="36" r="2.8" fill="#ffcc50" opacity="0.8"/>
  </svg>

  <h1 class="kg-hero-name">Karthick Gopal</h1>
  <p class="kg-hero-tagline">Writer by Design, Product Manager by Trade.</p>

  <div class="kg-rule">
    <div class="kg-rl"></div>
    <div class="kg-rd"></div>
    <div class="kg-rl"></div>
  </div>

  <!-- latest post — update title + url when you publish something new -->
  
  
  <a class="kg-latest" href="/2026/03/22/the-hardest-part-of-thinking-like-an-executive-isnt-the-thinking-its-the-saying/">
    <span class="kg-latest-label">Latest</span>
    <span class="kg-latest-title">The hardest part of thinking like an executive isn't the thinking. It's the saying.</span>
    <span class="kg-latest-arrow">→</span>
  </a>
  

</div>

<script>
// glyph animation
(function() {
  let t = 0;
  const els = {
    r1:  document.getElementById('gr1'),
    r2:  document.getElementById('gr2'),
    r3:  document.getElementById('gr3'),
    spk: document.getElementById('gspk'),
    hex: document.getElementById('ghex'),
  };
  function tick() {
    t += 0.008;
    const d = t * (180 / Math.PI);
    els.r1.setAttribute('transform',  `rotate(${d * 0.9},36,36)`);
    els.r2.setAttribute('transform',  `rotate(${-d * 1.3},36,36)`);
    els.r3.setAttribute('transform',  `rotate(${d * 1.9},36,36)`);
    els.spk.setAttribute('transform', `rotate(${d * 0.5},36,36)`);
    els.hex.setAttribute('transform', `rotate(${-d * 0.7},36,36)`);
    requestAnimationFrame(tick);
  }
  tick();
})();
</script>

</body>
</html>
