<!DOCTYPE html>
<html lang="en-US" dir="auto">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover">
  <title>Matthew Lettini</title>
  <meta name="color-scheme" content="light dark">
  <meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="K8Ym_zH5mInkNEP5aYxbmFcRFU9nT3x5EM1og9yyZjfVaz0Nvp2uizGHooHmKYNp1hYoqufjlUabUULKcOZhcw" />
  
    <link rel="icon" href="https://cdn.u.pika.page/AvMF_DPJAOFBrm8V124HM1hNoMD9syEeorJls_NLz3w/s:100:100/fn:avatar10-v2/plain/s3://pika-production/giy9jve4evee4jhajkq4q4ghoae1" type="image/png">
    <link rel="apple-touch-icon" sizes="180x180" href="https://cdn.u.pika.page/XZO6N58_iQSr3buYLjoVo-n_LBKuh984REq_CGmYcBI/s:300:300/fn:avatar10-v2/plain/s3://pika-production/giy9jve4evee4jhajkq4q4ghoae1">
  <meta name="title" content="Matthew Lettini">
<meta name="description" content="I’m a Brooklyn-based software designer-who-codes. My goal is to make life easier for people, one pixel at a time. Along the way I try to make it a little more fun, too.">
  <meta name="twitter:card" content="summary_large_image">
  <meta property="og:site_name" content="Matthew Lettini">
  <meta property="og:type" content="website">
  <meta property="og:url" content="https://matthewlettini.com/">
  <meta property="og:title" content="Matthew Lettini">
  <meta property="og:image:alt" content="Matthew Lettini">
  <meta property="og:description" content="I’m a Brooklyn-based software designer-who-codes. My goal is to make life easier for people, one pixel at a time. Along the way I try to make it a little more fun, too.">
  <meta property="og:locale" content="en_US">
        <meta property="og:image" content="https://matthewlettini.com/social_preview.png">
    <meta name="twitter:image" content="https://matthewlettini.com/social_preview.png">


        <link rel="alternate" type="application/atom+xml" title="Matthew Lettini" href="/posts_feed" />

  <link rel="stylesheet" href="/assets/application-263be88c68ed562d77d0c89414d3807042e738e3e22008f803d15aee028a565f.css" data-turbo-track="reload" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.22/dist/katex.min.css" crossorigin="anonymous">
  <script type="importmap" data-turbo-track="reload">{"imports":{"@hotwired/turbo-rails":"/assets/turbo.min-b86d83036ff04169e5bf3ebbc82e0ad528456259e47091b448f41a3cadabdb40.js","@hotwired/stimulus":"/assets/stimulus.min-dd364f16ec9504dfb72672295637a1c8838773b01c0b441bd41008124c407894.js","site_view":"/assets/site_view-ca741026f730fecdc05afa7d5dfcdd90a3a7bfeaac1be202fc3037f0697c7976.js","stimulus-clipboard":"https://ga.jspm.io/npm:stimulus-clipboard@4.0.1/dist/stimulus-clipboard.mjs","katex":"https://ga.jspm.io/npm:katex@0.16.21/dist/katex.mjs","controllers/anchor_scroll_controller":"/assets/controllers/anchor_scroll_controller-038fbcc6fe34309b40c5099c16ea8ed9afded75e99f872947160d14f26fdf861.js","controllers/image_zoom_controller":"/assets/controllers/image_zoom_controller-3eaeed8d33514737478757e16827807d2a74bc1a974110d806f3dfc9827c7444.js","controllers/katex_render_controller":"/assets/controllers/katex_render_controller-7962be6cf88900c4f6038082811185d11b8c3116b96f3fd1cfcf6da8a270e52c.js","controllers/lazy_load_controller":"/assets/controllers/lazy_load_controller-64afc84ed23eb4c2ccc4d729e0ea58cf9069c77436ce582ad007ce0072e45aec.js","controllers/local_time_controller":"/assets/controllers/local_time_controller-8ce93445b6398e7f8d32a6b21f83b37387f105032365594f4c28a63d6550a565.js","controllers/site_view/retarget_links_controller":"/assets/controllers/site_view/retarget_links_controller-01b5f07bb27c9d4951c44c8bdbc3241864f13cd0603cc610004f7ced86a29474.js","extensions/zoom":"/assets/extensions/zoom-42c8ffda4c268f689647b5bba7f0122f0fe9a8d5bc6e6359a02dff23396f5f72.js","helpers/local_time":"/assets/helpers/local_time-9a99cb705ce445234a5b0702ff3ff138849d623c2d89e5389c0ba64a8de11a8f.js"}}</script>
<link rel="modulepreload" href="/assets/turbo.min-b86d83036ff04169e5bf3ebbc82e0ad528456259e47091b448f41a3cadabdb40.js">
<link rel="modulepreload" href="/assets/stimulus.min-dd364f16ec9504dfb72672295637a1c8838773b01c0b441bd41008124c407894.js">
<link rel="modulepreload" href="/assets/site_view-ca741026f730fecdc05afa7d5dfcdd90a3a7bfeaac1be202fc3037f0697c7976.js">
<link rel="modulepreload" href="https://ga.jspm.io/npm:stimulus-clipboard@4.0.1/dist/stimulus-clipboard.mjs">
<link rel="modulepreload" href="https://ga.jspm.io/npm:katex@0.16.21/dist/katex.mjs">
<link rel="modulepreload" href="/assets/controllers/anchor_scroll_controller-038fbcc6fe34309b40c5099c16ea8ed9afded75e99f872947160d14f26fdf861.js">
<link rel="modulepreload" href="/assets/controllers/image_zoom_controller-3eaeed8d33514737478757e16827807d2a74bc1a974110d806f3dfc9827c7444.js">
<link rel="modulepreload" href="/assets/controllers/katex_render_controller-7962be6cf88900c4f6038082811185d11b8c3116b96f3fd1cfcf6da8a270e52c.js">
<link rel="modulepreload" href="/assets/controllers/lazy_load_controller-64afc84ed23eb4c2ccc4d729e0ea58cf9069c77436ce582ad007ce0072e45aec.js">
<link rel="modulepreload" href="/assets/controllers/local_time_controller-8ce93445b6398e7f8d32a6b21f83b37387f105032365594f4c28a63d6550a565.js">
<link rel="modulepreload" href="/assets/controllers/site_view/retarget_links_controller-01b5f07bb27c9d4951c44c8bdbc3241864f13cd0603cc610004f7ced86a29474.js">
<link rel="modulepreload" href="/assets/extensions/zoom-42c8ffda4c268f689647b5bba7f0122f0fe9a8d5bc6e6359a02dff23396f5f72.js">
<link rel="modulepreload" href="/assets/helpers/local_time-9a99cb705ce445234a5b0702ff3ff138849d623c2d89e5389c0ba64a8de11a8f.js">
<script type="module" nonce="true">import 'site_view'</script>

    <link rel="preconnect" href="https://fonts.bunny.net" crossorigin>
  <link rel="preload" as="style" href="https://fonts.bunny.net/css?family=libre-franklin:400,400i,500,500i,600,600i,700,700i,800,800i,900,900i&display=swap">
  <link rel="stylesheet" href="https://fonts.bunny.net/css?family=libre-franklin:400,400i,500,500i,600,600i,700,700i,800,800i,900,900i&display=swap" media="print" onload="this.media='all'">
    <noscript><link rel="stylesheet" href="https://fonts.bunny.net/css?family=libre-franklin:400,400i,500,500i,600,600i,700,700i,800,800i,900,900i&display=swap"></noscript>


    <meta name="theme-color" media="(prefers-color-scheme: light)" content="rgb(252, 252, 252)">
    <meta name="theme-color" media="(prefers-color-scheme: dark)"  content="rgb(10, 13, 36)">


    <style>
      .color-theme-custom {
        --light-color-variable-bg: 252, 252, 252;
        --light-color-variable-txt: 20, 22, 31;
        --light-color-variable-primary: 7, 46, 239;

        --dark-color-variable-bg: 10, 13, 36;
        --dark-color-variable-txt: 245, 245, 245;
        --dark-color-variable-primary: 77, 154, 255;
      }
    </style>
    <style>
      /* HEADER & AVATAR */
.site-header {
  flex-wrap: wrap !important;
  .site-header-avatar-link,
  .avatar {
    border-radius: var(--radius-round) !important;
  }
}
@media (min-width: 700px) {
  .site-header .site-header-avatar-link .avatar {
    height: 4.5rem !important;
    width: 4.5rem !important;
  }
}
.site-title {
  transform: none !important;
}

/* POST META */
.published-at i {
  transform: translateY(-1px) !important;
}
.site-stream-of-posts .published-at {
  color: var(--color-txt-light) !important;
  i {
    display: none !important;
  }
}
    </style>
      <style>
        html > body.site-view > footer.pika-branding,
        html > body.site-view > footer.pika-branding > a,
        html > body.site-view > footer.pika-branding > a[href*="pika"] {
          color: var(--color-txt) !important;
          background: transparent !important;
          border-radius: 0 !important;
          box-shadow: none !important;
          display: block !important;
          filter: none !important;
          font-size: 1rem !important;
          line-height: var(--base-line-height) !important;
          margin: auto auto 0 !important;
          opacity: 1 !important;
          transform: none !important;
          visibility: visible !important;
          width: min-content !important;
        }
      </style>

  
    <link rel="me" href="https://mastodon.social/@mlettini">
    <meta name='fediverse:creator' content="@mlettini@mastodon.social" />
  <link rel="micropub" href="https://pika.page/micropub">
</head>

<body class="site-view site-page-body site-home-page site-page-4273 color-theme-custom font-theme-franklin-gothic"
      data-controller='anchor-scroll image-zoom katex-render lazy-load retarget-links' data-retarget-links-pika-domain-value='pika.page' data-retarget-links-subdomain-value='mlettini' data-retarget-links-domain-value='matthewlettini.com'>
  <div id="top"></div>
  <a class="skip-link" href="#main">Skip to content</a>

  <div id="flash"></div>

  

    <header class="site-header h-card">
        <a class="site-header-avatar-link" title="Matthew Lettini" href="https://matthewlettini.com/">
          <img alt="Matthew Lettini" class="avatar u-photo" aria-hidden="true" src="https://cdn.u.pika.page/XZO6N58_iQSr3buYLjoVo-n_LBKuh984REq_CGmYcBI/s:300:300/fn:avatar10-v2/plain/s3://pika-production/giy9jve4evee4jhajkq4q4ghoae1" width="72" height="72" />
</a>      <div>
        <div class="site-title m-0"><a class="p-name u-url" href="https://matthewlettini.com/">Matthew Lettini</a></div>
          <nav class="site-nav">
            <ul>
                <li><a href="https://matthewlettini.com/posts">Blog</a></li>
                <li><a href="https://matthewlettini.com/now">Now</a></li>
                <li><a href="https://matthewlettini.com/work">Work</a></li>
                <li><a href="https://matthewlettini.com/contact">Contact</a></li>
            </ul>
          </nav>
      </div>
    </header>

    <hr class="site-hr-below-site-header mt-L">

  <main id="main" class="site-main">
    
<div class="site-page zoomable">
    <header class="site-page-header">
      <h1>Hello, I’m Matthew, but everyone calls me Lettini 👋</h1>
    </header>

  <div class="trix-content e-content">
  <p>I’m a Brooklyn-based dog dad to a <em><del>velociraptor</del></em> <a href="https://www.instagram.com/p/CXeYImOFqui/">blue heeler</a> and a software designer-who-codes. I’m currently creating products that are <a href="https://goodenough.us/">Good Enough</a>, like this blogging platform <a href="https://pika.page/">Pika</a>. Previously, I spent over a ✨decade✨ helping to build <a href="https://getharvest.com/">Harvest</a> and <a href="https://getharvest.com/forecast">Forecast</a>, the web’s best team time tracking, invoicing, and scheduling tools. My goal is to make life easier for people, one pixel at a time. Along the way I try to make it a little more fun, too.</p>
<p>Beyond the desk, I’m an out-of-practice musician and avid gamer always ready to min-max a new D&amp;D character. I love hiking, basketball, watches, karaoke, the oxford comma, and a good cognac.</p>
<action-text-attachment sgid="eyJfcmFpbHMiOnsiZGF0YSI6ImdpZDovL3Bpa2EvQWN0aXZlU3RvcmFnZTo6QmxvYi8xMTgxMTE_ZXhwaXJlc19pbiIsInB1ciI6ImF0dGFjaGFibGUifX0=--7878090674611d1522f3de42ec5ac1dab193e5d2" content-type="image/png" url="https://pika.page/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsiZGF0YSI6MTE4MTExLCJwdXIiOiJibG9iX2lkIn19--6a7287a9c9420afb4057f9d14c78e9133091cd6e/image.png" filename="image.png" filesize="3046927" width="1800" height="1200" previewable="true" presentation="gallery" caption="I’m not a photographer but I do have a camera." alt="Photo of Matthew Lettini in Portugal"><figure class="attachment attachment--preview attachment--png">



      <img height="1200" width="1800" data-zoom-src="https://cdn.u.pika.page/HOBq5yWjBqUn-Dv8p5tr2hzbRNBL36aXQLbqKPWCxOo/s:3840:3840/fn:image/plain/s3://pika-production/31swaf1r28z453eynp5p4vkamp8e" data-original-src="https://cdn.u.pika.page/sCbSTvEQbfqogbOr1hQuG1BtAe-plXRfxC2F_fnN_XM/fn:image/plain/s3://pika-production/31swaf1r28z453eynp5p4vkamp8e" alt="Photo of Matthew Lettini in Portugal" src="https://cdn.u.pika.page/KaWbBTd_PS1SlfBiXzOXuU8TqTlyGDTbwg6wq4vywB4/s:1800:1400/fn:image/plain/s3://pika-production/31swaf1r28z453eynp5p4vkamp8e">

    <figcaption class="attachment__caption" aria-hidden="true">
      I’m not a photographer but I do have a camera.
    </figcaption>
</figure></action-text-attachment><p>I’m not very active on social media, but you can find me @mlettini around the web, like <a href="https://albumwhale.com/mlettini">Album Whale</a>, <a href="https://bsky.app/profile/mlettini.bsky.social">Bluesky</a>, <a href="https://mastodon.social/@mlettini">Mastodon</a>, <a href="https://www.instagram.com/mlettini/">Instagram</a>, or <a href="https://open.spotify.com/user/mlettini?si=d17c07ed944d4d5f">Spotify</a>. I’m slowly trying to be a better blogger instead, as you can see below.</p>
<hr>
<h3 id="recent-posts">
<a href="#recent-posts" class="anchor" title="Link to this heading" aria-hidden="true"></a>Recent posts</h3>
<ul class="t-list-of-posts site-list-of-posts">  <li class="h-entry">
  <time class="dt-published" data-controller="local-time" datetime="2026-05-20 17:22:00 UTC" title="2026-05-20 17:22:00 UTC">
    May 20
  </time>
  <span class="t-post post-link"><a class="p-name u-url" href="/posts/i-vibe-coded-an-itinerary-app-for-my-trip-to-japan-then-binned-it">I vibe-coded an itinerary app for my trip to Japan, then binned it</a></span>
</li>

  <li class="h-entry">
  <time class="dt-published" data-controller="local-time" datetime="2026-05-10 22:34:00 UTC" title="2026-05-10 22:34:00 UTC">
    May 10
  </time>
  <span class="t-post post-link"><a class="p-name u-url" href="/posts/dm-vibing-beyond-lost-mines-of-phandelver">DM Vibing: Beyond Lost Mines of Phandelver</a></span>
</li>

  <li class="h-entry">
  <time class="dt-published" data-controller="local-time" datetime="2026-05-08 14:30:00 UTC" title="2026-05-08 14:30:00 UTC">
    May 8
  </time>
  <span class="t-post post-link"><a class="p-name u-url" href="/posts/you-dont-have-to-be-a-hardcore-fan-to-root-for-a-team">You don’t have to be a hardcore fan to root for a team</a></span>
</li>

  <li class="h-entry">
  <time class="dt-published" data-controller="local-time" datetime="2026-04-29 22:03:00 UTC" title="2026-04-29 22:03:00 UTC">
    Apr 29
  </time>
  <span class="t-post post-link"><a class="p-name u-url" href="/posts/2026-04-29-im-not-a-fervent">I’m not a fervent follower of John Goblikon,...</a></span>
</li>

  <li class="h-entry">
  <time class="dt-published" data-controller="local-time" datetime="2026-04-17 13:31:00 UTC" title="2026-04-17 13:31:00 UTC">
    Apr 17
  </time>
  <span class="t-post post-link"><a class="p-name u-url" href="/posts/2026-04-17-a-little-short-film">A little short film about Norm MacDonald, by...</a></span>
</li>

</ul>
<p><a href="https://matthewlettini.com/posts">See all posts…</a></p>
</div>

</div>

  </main>

    <hr class="site-hr-above-user-site-footer">
    <footer class="user-site-footer">
      <div class="trix-content">
  <p><a href="#top">↑ Top</a>&nbsp; •&nbsp; © 2026 Matthew Lettini</p>
</div>

    </footer>

    <footer class="pika-branding">
      <a href="https://pika.page/?utm_source=pika_blog&utm_medium=pika_footer_branding" target="_blank">PIKA</a>
    </footer>

  <div class="safe-area-div"></div>
</body>
</html>
