<!DOCTYPE html><html lang="en" class="break-words antialiased"> <head><!-- High Priority Global Metadata --><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Thomas Lockney</title><meta name="generator" content="Astro v5.18.1"><!-- Fonts --><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&family=Libre+Baskerville:ital,wght@0,400;0,700;1,400&display=swap" rel="stylesheet"><!-- Low Priority Global Metadata --><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="sitemap" href="/sitemap-index.xml"><link rel="alternate" type="application/rss+xml" href="/rss.xml" title="RSS"><!-- Page Metadata --><link rel="canonical" href="https://opposable-thumbs.net/"><meta name="description" content="Miscellaneous content—both personal rambling and work related—from the mind of Thomas Lockney. "><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://opposable-thumbs.net/"><meta property="og:title" content="Thomas Lockney"><meta property="og:description" content="Miscellaneous content—both personal rambling and work related—from the mind of Thomas Lockney. "><meta property="og:image" content="https://opposable-thumbs.net/Thomas.jpg"><meta property="og:image:alt" content="Thomas Lockney"><!-- X/Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url" content="https://opposable-thumbs.net/"><meta property="twitter:title" content="Thomas Lockney"><meta property="twitter:description" content="Miscellaneous content—both personal rambling and work related—from the mind of Thomas Lockney. "><meta property="twitter:image" content="https://opposable-thumbs.net/Thomas.jpg"><meta name="twitter:image:alt" content="Thomas Lockney"><script type="module">localStorage.theme==="dark"&&document.documentElement.classList.add("dark");</script><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><script type="module" src="/_astro/ClientRouter.astro_astro_type_script_index_0_lang.CDGfc0hd.js"></script><link rel="stylesheet" href="/_astro/about.De3d9cqm.css"></head> <body class="bg-main text-main"> <div class="flex min-h-screen flex-col px-4 md:px-8"> <nav class="relative mx-auto min-h-10 w-full max-w-3xl pt-4 pb-12 sm:min-h-14 sm:pb-24 md:pt-8" data-astro-cid-dmqpwcec> <div class="relative" data-astro-cid-dmqpwcec> <button class="menu-toggle relative z-30 -ml-1 flex h-8 w-8 items-center justify-center md:hidden" aria-label="Open Menu" aria-expanded="false" aria-controls="menu-items" data-astro-cid-dmqpwcec> <span class="menu-toggle-icon relative h-px w-6 bg-current" data-astro-cid-dmqpwcec></span> </button> <ul id="menu-items" class="menu flex gap-6" data-astro-cid-dmqpwcec> <li class="py-1" data-astro-cid-dmqpwcec> <a class="text-main font-serif text-xl hover:underline hover:decoration-1 hover:underline-offset-2 md:text-base text-accent decoration-accent underline decoration-1 underline-offset-2" href="/" data-astro-cid-dmqpwcec="true"> Home </a> </li><li class="py-1" data-astro-cid-dmqpwcec> <a class="text-main font-serif text-xl hover:underline hover:decoration-1 hover:underline-offset-2 md:text-base" href="/posts" data-astro-cid-dmqpwcec="true"> Blog </a> </li><li class="py-1" data-astro-cid-dmqpwcec> <a class="text-main font-serif text-xl hover:underline hover:decoration-1 hover:underline-offset-2 md:text-base" href="/services" data-astro-cid-dmqpwcec="true"> Services </a> </li><li class="py-1" data-astro-cid-dmqpwcec> <a class="text-main font-serif text-xl hover:underline hover:decoration-1 hover:underline-offset-2 md:text-base" href="/about" data-astro-cid-dmqpwcec="true"> About </a> </li><li class="py-1" data-astro-cid-dmqpwcec> <a class="text-main font-serif text-xl hover:underline hover:decoration-1 hover:underline-offset-2 md:text-base" href="/contact" data-astro-cid-dmqpwcec="true"> Contact </a> </li> </ul> </div> <div class="absolute top-4 right-0 z-10 md:top-8" data-astro-cid-dmqpwcec> <button id="theme-toggle" class="-mr-2 flex h-8 w-8 items-center justify-center" aria-label="Change color scheme"> <svg width="1em" height="1em" data-icon="mdi:circle-half-full">   <symbol id="ai:mdi:circle-half-full" viewBox="0 0 24 24"><path fill="currentColor" d="M12 2A10 10 0 0 0 2 12a10 10 0 0 0 10 10a10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 2a8 8 0 0 1 8 8a8 8 0 0 1-8 8z"/></symbol><use href="#ai:mdi:circle-half-full"></use>  </svg> </button> <script type="module">document.addEventListener("astro:after-swap",()=>{localStorage.theme==="dark"&&document.documentElement.classList.add("dark")});</script> <script type="module">document.addEventListener("astro:page-load",()=>{const e=typeof localStorage<"u"&&localStorage.getItem("theme")?localStorage.getItem("theme")||"light":window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light";e==="light"?document.documentElement.classList.remove("dark"):document.documentElement.classList.add("dark"),window.localStorage.setItem("theme",e);const o=()=>{const t=document.documentElement;t.classList.toggle("dark");const a=t.classList.contains("dark");localStorage.setItem("theme",a?"dark":"light")};document.getElementById("theme-toggle")?.addEventListener("click",o)});</script> </div>  <script type="module">function n(){const s=document.querySelector(".menu"),e=document.querySelector(".menu-toggle");e?.addEventListener("click",()=>{const t=e.getAttribute("aria-expanded")==="true";e.classList.toggle("is-active"),e.setAttribute("aria-expanded",t?"false":"true"),e.setAttribute("aria-label",t?"Open Menu":"Close Menu"),s?.classList.toggle("is-visible")})}n();document.addEventListener("astro:after-swap",n);</script> </nav> <header class="mx-auto mb-12 w-full max-w-3xl sm:mb-16"> <a class="text-theme-foreground font-serif text-2xl leading-tight font-medium sm:text-4xl" href="/"> Thomas Lockney </a> <p class="mt-1 text-sm leading-tight">Engineering Leader &amp; Technologist</p> </header> <main class="mx-auto w-full max-w-3xl grow">  <section class="mb-16 sm:mb-24"><div class="flex flex-col gap-8 md:flex-row md:items-start md:gap-12"><figure class="shrink-0 md:order-2"><img class="mx-auto w-48 rounded-full shadow-lg md:w-56 lg:w-64" src="/Thomas.jpg" loading="lazy" decoding="async" alt="A person sitting at a desk in front of a computer"></figure><div class="flex flex-col gap-6 md:order-1"><div class="prose prose-dante sm:prose-lg max-w-none"><p>I&#39;m an Oregon-based engineering leader with a passion for building impactful technologies and high-performing teams. I thrive when working with diverse teams to tackle complex challenges, combining collective expertise to deliver solutions that make a real difference.</p>
<p>With a product-oriented mindset and a generalist&#39;s perspective, I&#39;ve spent my career building platforms that scale, empower users, and drive measurable success.</p>
</div><div class="flex flex-wrap gap-4"><a href="/about" class="inline-flex items-center justify-center px-6 py-2.5 font-serif text-sm leading-tight text-white bg-accent border-0 rounded shadow-md transition-all hover:shadow-lg hover:brightness-110">Learn more about me</a><a href="/contact" class="inline-flex items-center justify-center px-6 py-2.5 font-serif text-sm leading-tight text-white bg-accent border-0 rounded shadow-md transition-all hover:shadow-lg hover:brightness-110">Get in Touch</a></div></div></div></section> <div class="border-main mb-12 border-t border-dashed pt-6 sm:mb-16 sm:pt-8"><p class="mb-3 text-sm font-medium tracking-wide uppercase opacity-60">
Experience
</p><div class="flex flex-wrap items-center gap-x-6 gap-y-2"><span class="font-serif text-base sm:text-lg">Metron</span><span class="font-serif text-base sm:text-lg">HubSpot</span><span class="font-serif text-base sm:text-lg">Nike</span></div></div> <div class="bg-muted -mx-4 mb-16 rounded-lg px-4 py-10 sm:-mx-6 sm:mb-24 sm:px-6 sm:py-12 md:-mx-8 md:px-8"> <h2 class="mb-10 font-serif text-xl italic sm:mb-12 sm:text-2xl">
Writing
</h2> <a class="bg-main group flex items-start justify-between gap-8 rounded-lg p-4 shadow-sm transition-shadow hover:shadow-md sm:p-5 mb-8 sm:mb-10" href="/posts/2021/06/looking-back/"> <div class="grow"> <h3 class="font-serif text-xl leading-tight font-medium group-hover:underline group-hover:decoration-dashed group-hover:decoration-1 group-hover:underline-offset-4 sm:text-2xl">Looking Back</h3> <div class="mt-1.5 text-sm leading-normal opacity-75"> <time datetime="2021-06-09T04:47:59.000Z"> June 9, 2021 </time>  </div>  <div class="mt-3 flex flex-wrap gap-2"> <span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> career </span><span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> nike </span> </div> </div> <div class="text-accent hidden font-serif italic opacity-0 transition group-hover:opacity-100 sm:inline-flex sm:shrink-0 sm:items-center sm:gap-1">
Read Post <svg width="1em" height="1em" data-icon="mdi:arrow-right">   <symbol id="ai:mdi:arrow-right" viewBox="0 0 24 24"><path fill="currentColor" d="M4 11v2h12l-5.5 5.5l1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5L16 11z"/></symbol><use href="#ai:mdi:arrow-right"></use>  </svg> </div> </a><a class="bg-main group flex items-start justify-between gap-8 rounded-lg p-4 shadow-sm transition-shadow hover:shadow-md sm:p-5 mb-8 sm:mb-10" href="/posts/2012/08/a-few-akka-posts/"> <div class="grow"> <h3 class="font-serif text-xl leading-tight font-medium group-hover:underline group-hover:decoration-dashed group-hover:decoration-1 group-hover:underline-offset-4 sm:text-2xl">A few Akka posts</h3> <div class="mt-1.5 text-sm leading-normal opacity-75"> <time datetime="2012-08-16T00:00:00.000Z"> August 16, 2012 </time>  </div>  <div class="mt-3 flex flex-wrap gap-2"> <span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> akka </span><span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> scala </span> </div> </div> <div class="text-accent hidden font-serif italic opacity-0 transition group-hover:opacity-100 sm:inline-flex sm:shrink-0 sm:items-center sm:gap-1">
Read Post <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="mdi:arrow-right">   <use href="#ai:mdi:arrow-right"></use>  </svg> </div> </a><a class="bg-main group flex items-start justify-between gap-8 rounded-lg p-4 shadow-sm transition-shadow hover:shadow-md sm:p-5 mb-8 sm:mb-10" href="/posts/2011/11/a-jvm-based-developers-reading-list/"> <div class="grow"> <h3 class="font-serif text-xl leading-tight font-medium group-hover:underline group-hover:decoration-dashed group-hover:decoration-1 group-hover:underline-offset-4 sm:text-2xl">A reading list for JVM-based developers</h3> <div class="mt-1.5 text-sm leading-normal opacity-75"> <time datetime="2011-11-25T00:00:00.000Z"> November 25, 2011 </time>  </div>  <div class="mt-3 flex flex-wrap gap-2"> <span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> JVM </span><span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> Scala </span><span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> Java </span> </div> </div> <div class="text-accent hidden font-serif italic opacity-0 transition group-hover:opacity-100 sm:inline-flex sm:shrink-0 sm:items-center sm:gap-1">
Read Post <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="mdi:arrow-right">   <use href="#ai:mdi:arrow-right"></use>  </svg> </div> </a><a class="bg-main group flex items-start justify-between gap-8 rounded-lg p-4 shadow-sm transition-shadow hover:shadow-md sm:p-5 mb-8 sm:mb-10" href="/posts/2011/11/quick-haskell-hacking-with-emacs/"> <div class="grow"> <h3 class="font-serif text-xl leading-tight font-medium group-hover:underline group-hover:decoration-dashed group-hover:decoration-1 group-hover:underline-offset-4 sm:text-2xl">Quick Haskell Hacking with Emacs</h3> <div class="mt-1.5 text-sm leading-normal opacity-75"> <time datetime="2011-11-11T00:00:00.000Z"> November 11, 2011 </time>  </div>  <div class="mt-3 flex flex-wrap gap-2"> <span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> Haskell </span><span class="bg-accent-muted text-accent rounded px-2 py-0.5 text-xs font-medium"> Emacs </span> </div> </div> <div class="text-accent hidden font-serif italic opacity-0 transition group-hover:opacity-100 sm:inline-flex sm:shrink-0 sm:items-center sm:gap-1">
Read Post <svg width="1em" height="1em" viewBox="0 0 24 24" data-icon="mdi:arrow-right">   <use href="#ai:mdi:arrow-right"></use>  </svg> </div> </a> <div class="mt-10 sm:mt-12"> <a href="/posts" class="inline-flex items-center justify-center px-6 py-2.5 font-serif text-sm leading-tight text-white bg-accent border-0 rounded shadow-md transition-all hover:shadow-lg hover:brightness-110">View All Posts</a> </div> </div> </main> <footer class="mx-auto w-full max-w-3xl pt-12 pb-10 sm:pt-24 sm:pb-14">  <div class="border-main flex flex-col gap-4 border-t border-dashed pt-6 sm:flex-row-reverse sm:items-center sm:justify-between"> <div class="flex flex-wrap gap-x-4 gap-y-1"> <a class="inline-flex items-center justify-center text-sm hover:underline hover:underline-offset-2" href="https://bsky.app/profile/tlockney.net" target="_blank" rel="noopener noreferer"> <svg width="1em" height="1em" data-icon="simple-icons:bluesky">   <symbol id="ai:simple-icons:bluesky" viewBox="0 0 24 24"><path fill="currentColor" d="M5.202 2.857C7.954 4.922 10.913 9.11 12 11.358c1.087-2.247 4.046-6.436 6.798-8.501C20.783 1.366 24 .213 24 3.883c0 .732-.42 6.156-.667 7.037c-.856 3.061-3.978 3.842-6.755 3.37c4.854.826 6.089 3.562 3.422 6.299c-5.065 5.196-7.28-1.304-7.847-2.97c-.104-.305-.152-.448-.153-.327c0-.121-.05.022-.153.327c-.568 1.666-2.782 8.166-7.847 2.97c-2.667-2.737-1.432-5.473 3.422-6.3c-2.777.473-5.899-.308-6.755-3.369C.42 10.04 0 4.615 0 3.883c0-3.67 3.217-2.517 5.202-1.026"/></symbol><use href="#ai:simple-icons:bluesky"></use>  </svg> </a><a class="inline-flex items-center justify-center text-sm hover:underline hover:underline-offset-2" href="https://www.linkedin.com/in/thomaslockney/" target="_blank" rel="noopener noreferer"> <svg width="1em" height="1em" data-icon="simple-icons:linkedin">   <symbol id="ai:simple-icons:linkedin" viewBox="0 0 24 24"><path fill="currentColor" d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037c-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85c3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.06 2.06 0 0 1-2.063-2.065a2.064 2.064 0 1 1 2.063 2.065m1.782 13.019H3.555V9h3.564zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0z"/></symbol><use href="#ai:simple-icons:linkedin"></use>  </svg> </a><a class="inline-flex items-center justify-center text-sm hover:underline hover:underline-offset-2" href="https://hachyderm.io/@tlockney" target="_blank" rel="noopener noreferer"> <svg width="1em" height="1em" data-icon="simple-icons:mastodon">   <symbol id="ai:simple-icons:mastodon" viewBox="0 0 24 24"><path fill="currentColor" d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127C.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611c.118 1.24.325 2.47.62 3.68c.55 2.237 2.777 4.098 4.96 4.857c2.336.792 4.849.923 7.256.38q.398-.092.786-.213c.585-.184 1.27-.39 1.774-.753a.06.06 0 0 0 .023-.043v-1.809a.05.05 0 0 0-.02-.041a.05.05 0 0 0-.046-.01a20.3 20.3 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.6 5.6 0 0 1-.319-1.433a.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546c.376 0 .75 0 1.125-.01c1.57-.044 3.224-.124 4.768-.422q.059-.011.11-.024c2.435-.464 4.753-1.92 4.989-5.604c.008-.145.03-1.52.03-1.67c.002-.512.167-3.63-.024-5.545m-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976c-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35c-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102q0-1.965 1.011-3.12c.696-.77 1.608-1.164 2.74-1.164c1.311 0 2.302.5 2.962 1.498l.638 1.06l.638-1.06c.66-.999 1.65-1.498 2.96-1.498c1.13 0 2.043.395 2.74 1.164q1.012 1.155 1.012 3.12z"/></symbol><use href="#ai:simple-icons:mastodon"></use>  </svg> </a> </div> <p class="text-sm">
&copy; 2026&nbsp;<a class="hover:underline hover:underline-offset-2" href="/">Thomas Lockney</a>. All rights reserved.
</p> </div> </footer> </div> </body></html>