<!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 are self-hosted via @fontsource-variable imports in global.css --><!-- 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.CI9j2b5W.css"></head> <body class="bg-main text-main flex min-h-screen flex-col"> <header class="band border-brass relative border-b-[3px]" data-astro-cid-3ef6ksr2> <div class="relative mx-auto w-full max-w-3xl px-4 md:px-8" data-astro-cid-3ef6ksr2> <div class="text-band-soft flex justify-between gap-4 border-b py-2.5 font-mono text-[11px] tracking-[0.18em] uppercase" style="border-color: rgba(231, 230, 218, 0.12);" data-astro-cid-3ef6ksr2> <span data-astro-cid-3ef6ksr2>Corvallis, OR</span> <span data-astro-cid-3ef6ksr2>Writing since 2002</span> </div> <div class="flex items-center justify-between gap-4 py-5" data-astro-cid-3ef6ksr2> <a href="/" class="font-display text-band-ink text-[19px] leading-tight font-bold" data-astro-cid-3ef6ksr2>
opposable-thumbs.net
</a> <div class="relative flex items-center gap-4" data-astro-cid-3ef6ksr2> <button class="menu-toggle text-band-ink relative z-30 -mr-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-3ef6ksr2> <span class="menu-toggle-icon relative h-px w-6 bg-current" data-astro-cid-3ef6ksr2></span> </button> <ul id="menu-items" class="menu text-band-soft flex gap-5 font-mono text-[12px] tracking-[0.08em] uppercase" data-astro-cid-3ef6ksr2> <li data-astro-cid-3ef6ksr2> <a class="hover:text-band-ink transition-colors text-band-ink underline decoration-[rgb(var(--color-brass))] decoration-1 underline-offset-4" href="/" data-astro-cid-3ef6ksr2="true"> home </a> </li><li data-astro-cid-3ef6ksr2> <a class="hover:text-band-ink transition-colors" href="/posts" data-astro-cid-3ef6ksr2="true"> writing </a> </li><li data-astro-cid-3ef6ksr2> <a class="hover:text-band-ink transition-colors" href="/services" data-astro-cid-3ef6ksr2="true"> services </a> </li><li data-astro-cid-3ef6ksr2> <a class="hover:text-band-ink transition-colors" href="/about" data-astro-cid-3ef6ksr2="true"> about </a> </li><li data-astro-cid-3ef6ksr2> <a class="hover:text-band-ink transition-colors" href="/contact" data-astro-cid-3ef6ksr2="true"> contact </a> </li> </ul> <button id="theme-toggle" class="hover:text-band-ink -mr-2 flex h-8 w-8 items-center justify-center transition-colors" 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> </div> </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> </header> <div class="flex w-full grow flex-col px-4 md:px-8"> <main class="mx-auto w-full max-w-3xl grow pt-10 sm:pt-14">  <section class="mb-16 sm:mb-24"><div class="flex flex-col gap-6"><h1 class="font-display text-4xl leading-[1.05] font-bold tracking-[-0.015em] sm:text-5xl lg:text-[3.25rem]">Thomas Lockney</h1><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="mt-2 flex flex-wrap gap-3"><a href="/about" class="inline-flex items-center justify-center px-5 py-2 font-mono text-[12px] tracking-[0.08em] uppercase border border-main text-main bg-transparent transition-colors hover:border-accent hover:text-accent focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[rgb(var(--color-accent))]">Learn more about me</a><a href="/contact" class="inline-flex items-center justify-center px-5 py-2 font-mono text-[12px] tracking-[0.08em] uppercase border border-main text-main bg-transparent transition-colors hover:border-accent hover:text-accent focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[rgb(var(--color-accent))]">Get in Touch</a></div></div></section> <div class="border-main mb-12 border-t pt-6 sm:mb-16 sm:pt-8"><dl class="flex flex-col gap-y-2 sm:grid sm:grid-cols-[9rem_1fr] sm:gap-x-6"><dt class="text-brass font-mono text-[11px] tracking-[0.12em] uppercase">
Currently
</dt><dd class="font-serif text-base italic sm:text-lg">Metron</dd><dt class="text-brass font-mono text-[11px] tracking-[0.12em] uppercase">
Previously
</dt><dd class="font-serif text-base italic sm:text-lg">HubSpot · Nike</dd></dl></div> <section class="mb-16 sm:mb-24"> <h2 class="text-brass mb-4 font-mono text-[11px] tracking-[0.12em] uppercase"> <span>§</span> recent / writing
</h2> <div> <a class="border-main group grid grid-cols-[14ch_1fr] gap-x-7 border-t py-5 no-underline" href="/posts/2021/06/looking-back/"> <time datetime="2021-06-09T04:47:59.000Z" class="font-mono text-[12px]">2021-06-09</time> <div> <h3 class="font-serif text-xl leading-snug font-medium group-hover:underline group-hover:decoration-dashed group-hover:decoration-1 group-hover:underline-offset-4 sm:text-[22px]">Looking Back</h3>   <p class="mt-3 font-mono text-[11px] tracking-[0.04em]" style="color: rgb(var(--color-text-muted));"> <span class="text-brass">career</span> <span class="mx-2 opacity-40">·</span><span class="text-brass">nike</span> <span class="mx-2 opacity-40">·</span>  3 min read </p> </div> </a><a class="border-main group grid grid-cols-[14ch_1fr] gap-x-7 border-t py-5 no-underline" href="/posts/2012/08/a-few-akka-posts/"> <time datetime="2012-08-16T00:00:00.000Z" class="font-mono text-[12px]">2012-08-16</time> <div> <h3 class="font-serif text-xl leading-snug font-medium group-hover:underline group-hover:decoration-dashed group-hover:decoration-1 group-hover:underline-offset-4 sm:text-[22px]">A few Akka posts</h3>   <p class="mt-3 font-mono text-[11px] tracking-[0.04em]" style="color: rgb(var(--color-text-muted));"> <span class="text-brass">akka</span> <span class="mx-2 opacity-40">·</span><span class="text-brass">scala</span> <span class="mx-2 opacity-40">·</span>  2 min read </p> </div> </a><a class="border-main group grid grid-cols-[14ch_1fr] gap-x-7 border-t py-5 no-underline" href="/posts/2011/11/a-jvm-based-developers-reading-list/"> <time datetime="2011-11-25T00:00:00.000Z" class="font-mono text-[12px]">2011-11-25</time> <div> <h3 class="font-serif text-xl leading-snug font-medium group-hover:underline group-hover:decoration-dashed group-hover:decoration-1 group-hover:underline-offset-4 sm:text-[22px]">A reading list for JVM-based developers</h3>   <p class="mt-3 font-mono text-[11px] tracking-[0.04em]" style="color: rgb(var(--color-text-muted));"> <span class="text-brass">JVM</span> <span class="mx-2 opacity-40">·</span><span class="text-brass">Scala</span> <span class="mx-2 opacity-40">·</span><span class="text-brass">Java</span> <span class="mx-2 opacity-40">·</span>  5 min read </p> </div> </a><a class="border-main group grid grid-cols-[14ch_1fr] gap-x-7 border-t py-5 no-underline" href="/posts/2011/11/quick-haskell-hacking-with-emacs/"> <time datetime="2011-11-11T00:00:00.000Z" class="font-mono text-[12px]">2011-11-11</time> <div> <h3 class="font-serif text-xl leading-snug font-medium group-hover:underline group-hover:decoration-dashed group-hover:decoration-1 group-hover:underline-offset-4 sm:text-[22px]">Quick Haskell Hacking with Emacs</h3>   <p class="mt-3 font-mono text-[11px] tracking-[0.04em]" style="color: rgb(var(--color-text-muted));"> <span class="text-brass">Haskell</span> <span class="mx-2 opacity-40">·</span><span class="text-brass">Emacs</span> <span class="mx-2 opacity-40">·</span>  2 min read </p> </div> </a> </div> <div class="mt-8"> <a href="/posts" class="inline-flex items-center justify-center px-5 py-2 font-mono text-[12px] tracking-[0.08em] uppercase border border-main text-main bg-transparent transition-colors hover:border-accent hover:text-accent focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[rgb(var(--color-accent))]">View all posts</a> </div> </section> </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 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="hover:text-accent inline-flex items-center justify-center text-sm transition-colors" style="color: rgb(var(--color-text-muted));" href="https://bsky.app/profile/tlockney.net" aria-label="BlueSky" target="_blank" rel="noopener noreferrer"> <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="hover:text-accent inline-flex items-center justify-center text-sm transition-colors" style="color: rgb(var(--color-text-muted));" href="https://www.linkedin.com/in/thomaslockney/" aria-label="LinkedIn" target="_blank" rel="noopener noreferrer"> <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="hover:text-accent inline-flex items-center justify-center text-sm transition-colors" style="color: rgb(var(--color-text-muted));" href="https://hachyderm.io/@tlockney" aria-label="Mastodon" target="_blank" rel="noopener noreferrer"> <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="font-mono text-[11px] tracking-[0.08em] uppercase" style="color: rgb(var(--color-text-muted));">
© 2026&nbsp;
<a class="font-serif text-sm tracking-normal normal-case italic hover:underline hover:underline-offset-4" style="color: rgb(var(--color-text-main));" href="/">Thomas Lockney</a>. All rights reserved.
</p> </div> </footer> </div> </body></html>