<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, viewport-fit=cover">
  <meta name="referrer" content="origin-when-cross-origin">
  <!--
    Preconnect to essential domains
  -->
  <link rel="preconnect" href="https://bsky.social">
  <link rel="preconnect" href="https://go.bsky.app">
  <title>@justinschuh.com on Bluesky</title>

  <!-- Hello Humans! API docs at https://atproto.com -->

  <link rel="preload" as="font" type="font/woff2" href="https://web-cdn.bsky.app/static/media/InterVariable.c504db5c06caaf7cdfba.woff2" crossorigin>

  <style>
    /**
     * Minimum styles required to render splash.
     *
     * ALL OTHER STYLES BELONG IN `src/style.css`
     *
     * THIS NEEDS TO BE DUPLICATED IN `bskyweb/templates/base.html`
     */
    @font-face {
      font-family: 'InterVariable';
      src: url("https://web-cdn.bsky.app/static/media/InterVariable.c504db5c06caaf7cdfba.woff2") format('woff2');
      font-weight: 300 1000;
      font-style: normal;
      font-display: swap;
    }
    @font-face {
      font-family: 'InterVariableItalic';
      src: url("https://web-cdn.bsky.app/static/media/InterVariable-Italic.01dcbad1bac635f9c9cd.woff2") format('woff2');
      font-weight: 300 1000;
      font-style: italic;
      font-display: swap;
    }
    html,
    body {
      margin: 0px;
      padding: 0px;
      font-family: InterVariable, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Liberation Sans', Helvetica, Arial, sans-serif;
      text-rendering: optimizeLegibility;
      /* Platform-specific reset */
      -webkit-overflow-scrolling: touch;
      -webkit-text-size-adjust: 100%;
      -webkit-font-smoothing: antialiased;
      -moz-osx-font-smoothing: grayscale;
      -ms-overflow-style: scrollbar;
      font-synthesis-weight: none;
    }
    :root {
      --text: black;
      --background: white;
      --backgroundLight: #e2e7ee;
    }
    @media (prefers-color-scheme: dark) {
      :root {
        color-scheme: dark;
        --text: white;
        --background: black;
        --backgroundLight: #232e3e;
      }
    }
    html,
    body,
    #root {
      display: flex;
      flex: 1 0 auto;
      min-height: 100%;
      width: 100%;
    }
    html.theme--light,
    html.theme--light body,
    html.theme--light #root {
      background-color: white;
      --text: black;
      --background: white;
      --backgroundLight: #DCE2EA;
    }
    html.theme--dark,
    html.theme--dark body,
    html.theme--dark #root {
      color-scheme: dark;
      background-color: black;
      --text: white;
      --background: black;
      --backgroundLight: #232E3E;
    }
    html.theme--dim,
    html.theme--dim body,
    html.theme--dim #root {
      color-scheme: dark;
      background-color: #151D28;
      --text: white;
      --background: #151D28;
      --backgroundLight: #2C3A4E;
    }
    #splash {
      display: flex;
      position: fixed;
      top: 0;
      bottom: 0;
      left: 0;
      right: 0;
      align-items: center;
      justify-content: center;
    }
    #splash svg {
      position: relative;
      top: -50px;
      width: 100px;
    }
    /**
     * We need these styles to prevent shifting due to scrollbar show/hide on
     * OSs that have them enabled by default. This also handles cases where the
     * screen wouldn't otherwise scroll, and therefore hide the scrollbar and
     * shift the content, by forcing the page to show a scrollbar.
     */
    body {
      width: 100%;
      overflow-y: scroll;
    }
  </style>
  <script>
    const theme = localStorage.getItem('ALF_THEME')
    if (theme) {
      document.documentElement.classList.add(`theme--${theme}`)
    }
  </script>

  <script defer="defer" src="https://web-cdn.bsky.app/static/js/2057.9bb01c7f.js"></script>
<link rel="stylesheet" href="https://web-cdn.bsky.app/static/css/main.dbb4f61c.css">
<script defer="defer" src="https://web-cdn.bsky.app/static/js/main.367fc2fc.js"></script>
  <link rel="apple-touch-icon" sizes="180x180" href="https://web-cdn.bsky.app/static/apple-touch-icon.png">
  <link rel="icon" type="image/png" sizes="32x32" href="https://web-cdn.bsky.app/static/favicon-32x32.png">
  <link rel="icon" type="image/png" sizes="16x16" href="https://web-cdn.bsky.app/static/favicon-16x16.png">
  <link rel="mask-icon" href="https://web-cdn.bsky.app/static/safari-pinned-tab.svg" color="#1185fe">
  <meta name="theme-color">
  <meta name="application-name" content="Bluesky">
  <meta name="generator" content="bskyweb">
  <meta property="og:site_name" content="Bluesky Social">
  <meta property="og:logo" content="https://web-cdn.bsky.app/static/favicon.png">
  <meta name="twitter:site" content="@bluesky" />
  <link type="application/activity+json" href="" />

  <meta property="og:site_name" content="Bluesky Social">
  <meta property="og:type" content="profile">
  
  <meta property="og:url" content="https://bsky.app/profile/justinschuh.com">
  <link rel="canonical" href="https://bsky.app/profile/justinschuh.com" />
  
<meta property="profile:username" content="justinschuh.com">
  <meta property="og:title" content="Justin Schuh (@justinschuh.com)">
  <link rel="alternate" href="at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.actor.profile/self" />

  <meta name="twitter:label1" content="Account DID">
  <meta name="twitter:value1" content="did:plc:l3efsnzegvrsoek3tr2lknal">
  <link rel="alternate" type="application/rss+xml" href="https://bsky.app/profile/did:plc:l3efsnzegvrsoek3tr2lknal/rss">
  

  
  
    <meta name="description" content="Back in Chicago as a stay-at-home dad and small business owner. Expect some infosec/privacy/safety, 3D printing, and politics. You&#39;re probably following me because of my old job(s).

infosec.exchange/@jschuh
Defunct: twitter.com/justinschuh">
    <meta property="og:description" content="Back in Chicago as a stay-at-home dad and small business owner. Expect some infosec/privacy/safety, 3D printing, and politics. You&#39;re probably following me because of my old job(s).

infosec.exchange/@jschuh
Defunct: twitter.com/justinschuh">
    
    <meta property="og:image" content="https://cdn.bsky.app/img/banner/plain/did:plc:l3efsnzegvrsoek3tr2lknal/bafkreiafv4cscdijmpt3m2gc32k5xg7zjbl4jjheq7vvd6fcenediij5ea">
    <meta name="twitter:card" content="summary_large_image">
  
  <script type="application/ld+json">{"@context":"https://schema.org","@type":"ProfilePage","dateCreated":"2023-04-30T15:34:44.470Z","mainEntity":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","description":"Back in Chicago as a stay-at-home dad and small business owner. Expect some infosec/privacy/safety, 3D printing, and politics. You're probably following me because of my old job(s).\n\ninfosec.exchange/@jschuh\nDefunct: twitter.com/justinschuh","image":"https://cdn.bsky.app/img/avatar/plain/did:plc:l3efsnzegvrsoek3tr2lknal/bafkreihgmmdjy7sulyw7fskbklntemklbqlkzkt7wfphp7v4wtnimezrki","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/FollowAction","userInteractionCount":3363}],"agentInteractionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/FollowAction","userInteractionCount":527},{"@type":"InteractionCounter","interactionType":"https://schema.org/WriteAction","userInteractionCount":1727}]},"hasPart":[{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mnryy6murs2o","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mnryy6murs2o","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"The tool-changer arms race that Snapmaker kicked off last year has been amazing for the 3D printing community. But the Sovol M1D is the first tool-changer that checks all the boxes for me, and I'm seriously thinking about buying one.\nhttps://www.sovol3d.com/pages/sovol-m1d-landing-page","datePublished":"2026-06-08T15:33:45.267Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":0},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}],"commentCount":1,"sharedContent":{"@type":"WebPage","url":"https://www.sovol3d.com/pages/sovol-m1d-landing-page"}},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mnrrtysr7k2n","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mnrrtysr7k2n","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"The California vote count is a lot like watching a marble run, where the outcome is determined entirely at the start. The count may look like a shifting race—and the press covers it that way—but the result was locked in on election day. California just takes an annoyingly long time to tabulate it.","datePublished":"2026-06-08T13:26:05.563Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":5},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}],"commentCount":1},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mnldfzduuc2k","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mnldfzduuc2k","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"Hey Google friends, I've been trying to set up a payment card on my son's Pixel without success for a week now. I'm getting bounced between my bank and Google Wallet support, because it's failing during the handoff between the Wallet and bank app. Any assistance would be appreciated.","datePublished":"2026-06-05T23:51:44.770Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":0},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}],"commentCount":1},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mnkwxp3ymc26","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mnkwxp3ymc26","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"The human body shouldn't be able to produce rocks, much less rocks that get stuck in the worst places...\n\"intelligent design\" my ass.","datePublished":"2026-06-05T20:09:05.972Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":6},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":3},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}],"commentCount":3},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mnfgxpwp4s2y","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mnfgxpwp4s2y","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"I just got spammed by a NIMBY group opposing the Grand Ave safety improvements for pedestrians/cyclists. Here's the RSVP information for their meeting this Saturday. Seems like they'd benefit from being presented with a broader set of perspectives than just maximizing street parking.","image":["https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:l3efsnzegvrsoek3tr2lknal/bafkreifjdj3caz4kvwbhz77exfj224nyqnm6j3tdskgwygyw2hzdjyp2yy"],"thumbnailUrl":"https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:l3efsnzegvrsoek3tr2lknal/bafkreifjdj3caz4kvwbhz77exfj224nyqnm6j3tdskgwygyw2hzdjyp2yy","datePublished":"2026-06-03T15:39:27.163Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":2},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}],"commentCount":1},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mmuopp7quk2t","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mmuopp7quk2t","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"Spicy miso ramen. If there's a better treatment for a cold and sore throat, well I haven't found it. 🍜","datePublished":"2026-05-27T23:42:47.474Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":4},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}],"commentCount":1},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mmpmfj5qoc2j","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mmpmfj5qoc2j","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"The 13yo has a recently NB friend, whose name has a popular non-gendered form. But the kid doesn't like that name, and is opting for a much less obvious derivative. Of course, my first response is to say good for the friend, but point out the miss on the name choice. I've become very dad.","datePublished":"2026-05-25T23:18:01.275Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":5},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}],"commentCount":0},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mmmlj35vss2o","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mmmlj35vss2o","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"I'd even make it a requirement for new construction near anything classified as a mobility hub or better.\n\n[contains quote post or other embedded content]","datePublished":"2026-05-24T18:24:09.273Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":3},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":1}],"commentCount":0,"isBasedOn":"https://bsky.app/profile/stevevance.net/post/3mijzlq2h6k2f"},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mmhuea7vy22j","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mmhuea7vy22j","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"Back in the 2020 Democratic primaries I commented that I'd pick hara kiri over Gabbard if it ever came down to it. I still think that's the sanest call.\nhttps://apnews.com/article/trump-tulsi-gabbard-director-national-intelligence-iran-788f1f14259d72bd7936fa2e83149efa","datePublished":"2026-05-22T21:19:11.477Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":5},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}],"commentCount":1,"sharedContent":{"@type":"WebPage","url":"https://apnews.com/article/trump-tulsi-gabbard-director-national-intelligence-iran-788f1f14259d72bd7936fa2e83149efa"}},{"@type":"DiscussionForumPosting","url":"https://bsky.app/profile/justinschuh.com/post/3mmh7pklfws2y","identifier":"at://did:plc:l3efsnzegvrsoek3tr2lknal/app.bsky.feed.post/3mmh7pklfws2y","author":{"@type":"Person","name":"Justin Schuh","alternateName":"@justinschuh.com","identifier":"did:plc:l3efsnzegvrsoek3tr2lknal","url":"https://bsky.app/profile/justinschuh.com"},"text":"It's a very sad irony that affordable housing requirements are a favorite NIMBY tool to block new housing from being built. The end result is a paucity of affordable housing, while market prices grow increasingly unaffordable.\n\n[contains quote post or other embedded content]","datePublished":"2026-05-22T15:09:41.873Z","interactionStatistic":[{"@type":"InteractionCounter","interactionType":"https://schema.org/LikeAction","userInteractionCount":8},{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":0},{"@type":"InteractionCounter","interactionType":"https://schema.org/ShareAction","userInteractionCount":0}],"commentCount":0,"isBasedOn":"https://bsky.app/profile/michaelmclean.me/post/3mmg2vdgho22k"}]}</script>
  
</head>
<body>
  <div id="splash">
    <!-- Bluesky SVG -->
    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 57"><path fill="#006AFF" d="M13.873 3.805C21.21 9.332 29.103 20.537 32 26.55v15.882c0-.338-.13.044-.41.867-1.512 4.456-7.418 21.847-20.923 7.944-7.111-7.32-3.819-14.64 9.125-16.85-7.405 1.264-15.73-.825-18.014-9.015C1.12 23.022 0 8.51 0 6.55 0-3.268 8.579-.182 13.873 3.805ZM50.127 3.805C42.79 9.332 34.897 20.537 32 26.55v15.882c0-.338.13.044.41.867 1.512 4.456 7.418 21.847 20.923 7.944 7.111-7.32 3.819-14.64-9.125-16.85 7.405 1.264 15.73-.825 18.014-9.015C62.88 23.022 64 8.51 64 6.55c0-9.818-8.578-6.732-13.873-2.745Z"/></svg>
  </div>
  <div id="root">
  </div>

  <noscript>
    <h1 lang="en">JavaScript Required</h1>
    <p lang="en">This is a heavily interactive web application, and JavaScript is required. Simple HTML interfaces are possible, but that is not what this is.
    <p lang="en">Learn more about Bluesky at <a href="https://bsky.social">bsky.social</a> and <a href="https://atproto.com">atproto.com</a>.
    <div id="bsky_profile_summary">
  <h3>Profile</h3>
  <p id="bsky_display_name">Justin Schuh</p>
  <p id="bsky_handle">justinschuh.com</p>
  <p id="bsky_did">did:plc:l3efsnzegvrsoek3tr2lknal</p>
  <p id="bsky_profile_description">Back in Chicago as a stay-at-home dad and small business owner. Expect some infosec/privacy/safety, 3D printing, and politics. You&#39;re probably following me because of my old job(s).

infosec.exchange/@jschuh
Defunct: twitter.com/justinschuh</p>
</div>

  </noscript>
</body>
</html>
