<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta name="language" content="en">
  <meta http-equiv="Content-Language" content="en">
  <title>John Wulff</title>
  <link rel="alternate" type="application/atom+xml" title="John Wulff" href="https://johnwulff.com/feed.xml">
  <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=EB+Garamond:wght@400;600&family=Inter:wght@400;500&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="/assets/css/main.css">
  





<meta name="description" content="Personal site, recipes, and writing from John Wulff.">
<meta name="author" content="John Wulff">

<meta property="og:title" content="John Wulff">
<meta property="og:description" content="Personal site, recipes, and writing from John Wulff.">
<meta property="og:url" content="https://johnwulff.com/">
<meta property="og:image" content="https://johnwulff.com/headshot.jpg">
<meta property="og:type" content="website">
<meta property="og:site_name" content="John Wulff">

<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="John Wulff">
<meta name="twitter:description" content="Personal site, recipes, and writing from John Wulff.">
<meta name="twitter:image" content="https://johnwulff.com/headshot.jpg">

  <script async src="https://www.googletagmanager.com/gtag/js?id=G-HTSDMQRKK9"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-HTSDMQRKK9');
</script>

</head>
<body>
  <div class="container">
    <header>
      <h1>John Wulff</h1>
    </header>

    <div class="main-grid">
      <div class="left-col">
        <section>
  <h2>Posts</h2>
  <ul class="post-list">
    
    <li>
      <a href="/2026/05/19/lucentbrief-feedback-loop/">
        
        <img class="post-card-image" src="/assets/images/posts/lucentbrief-feedback-loop/brief-leak-headline.jpeg" alt="Feedback to Shipped Fix, No Touching" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Feedback to Shipped Fix, No Touching</span>
          <span class="post-meta">May 19, 2026</span>
          <span class="post-summary">I've been wiring a feedback loop into my hobby apps that turns a user's plain-language complaint into shipped code — ...</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/05/18/dictamac-cli-mcp-transcription/">
        
        <div class="post-card-text">
          <span class="post-title">Introducing Dictamac</span>
          <span class="post-meta">May 18, 2026</span>
          <span class="post-summary">A macOS 26 SpeechAnalyzer CLI plus MCP server that replaces the Node + whisper.cpp + two-MCP-server stack from my Jan...</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/04/28/beat-the-bridge-2026/">
        
        <img class="post-card-image" src="/assets/images/posts/beat-the-bridge-2026/team-wulff-2025.jpeg" alt="Year Two of Beat the Bridge for Abigail" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Year Two of Beat the Bridge for Abigail</span>
          <span class="post-meta">Apr 28, 2026</span>
          <span class="post-summary">Eighteen months into our daughter Abigail's Type 1 diabetes journey, we're walking the 44th Annual Beat the Bridge fo...</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/04/26/omnipod-5-dexcom-g7-deactivated-pod-rf/">
        
        <img class="post-card-image" src="/assets/images/posts/omnipod-dexcom-pod-rf/hero.png" alt="Omnipod 5 Won't Connect to Dexcom G7 After a Pod Change? Try Wrapping the Old Pod in Foil" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Omnipod 5 Won't Connect to Dexcom G7 After a Pod Change? Try Wrapping the Old Pod in Foil</span>
          <span class="post-meta">Apr 26, 2026</span>
          <span class="post-summary">It cost us a pod and a CGM replaced four days early before I figured it out. The culprit was a deactivated pod broadc...</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/03/28/steno-always-listening/">
        
        <img class="post-card-image" src="/assets/images/posts/steno-always-listening/steno-go-tui.png" alt="Steno: Always Listening, Always Queryable" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Steno: Always Listening, Always Queryable</span>
          <span class="post-meta">Mar 28, 2026</span>
          <span class="post-summary">Steno went from a single Swift app to a two-process daemon architecture with system audio capture and an MCP server. ...</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/03/25/glucagent-daily-digest/">
        
        <img class="post-card-image" src="/assets/images/posts/glucagent/daily-digest.png" alt="Glucagent: A Daily Diabetes Digest" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Glucagent: A Daily Diabetes Digest</span>
          <span class="post-meta">Mar 25, 2026</span>
          <span class="post-summary">A daily email that reads my daughter's glucose, insulin, and carb data and explains what happened yesterday and why. ...</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/02/21/insights-cost-refactor/">
        
        <img class="post-card-image" src="/assets/images/posts/pixoo-signage/bedrock-cost-chart.png" alt="Dashboard Update: From Agent Framework to One Prompt, Saving $1,700/Month" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Dashboard Update: From Agent Framework to One Prompt, Saving $1,700/Month</span>
          <span class="post-meta">Feb 21, 2026</span>
          <span class="post-summary">Replacing AWS Bedrock Agents with one-shot inference for the diabetes insights display. Same quality, 98% cheaper, 2,...</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/02/03/insights-refinements/">
        
        <img class="post-card-image" src="/assets/images/posts/pixoo-signage/insight-landing.png" alt="Dashboard Update: Teaching the Agent to Think Like We Do" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Dashboard Update: Teaching the Agent to Think Like We Do</span>
          <span class="post-meta">Feb 3, 2026</span>
          <span class="post-summary">Refining the insights agent with rate of change intelligence, post-low rebound awareness, and a real definition of st...</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/02/02/pixoo-signage-insights-agent/">
        
        <img class="post-card-image" src="/assets/images/posts/pixoo-signage/insight-display.png" alt="Dashboard Update: An AI Friend Who Watches the Numbers" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Dashboard Update: An AI Friend Who Watches the Numbers</span>
          <span class="post-meta">Feb 2, 2026</span>
          <span class="post-summary">Adding a Bedrock-powered insights agent to the family glucose dashboard. Supportive observations, not robotic commands.</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/01/31/steno-speech-to-text-tui/">
        
        <img class="post-card-image" src="/assets/images/posts/steno-speech-to-text-tui/steno-tui.png" alt="Building a Speech-to-Text TUI with Claude Code" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Building a Speech-to-Text TUI with Claude Code</span>
          <span class="post-meta">Jan 31, 2026</span>
          <span class="post-summary">A terminal app for real-time transcription using macOS 26's new SpeechAnalyzer API.</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/01/27/pixoo-signage-insulin-tracking/">
        
        <img class="post-card-image" src="/assets/images/posts/pixoo-signage/signage-insulin-display.png" alt="Dashboard Update: Insulin Tracking and Pump Integration" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Dashboard Update: Insulin Tracking and Pump Integration</span>
          <span class="post-meta">Jan 27, 2026</span>
          <span class="post-summary">Adding insulin pump data to the family glucose dashboard with Glooko integration and visual treatment tracking.</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/01/18/pixoo-signage/">
        
        <img class="post-card-image" src="/assets/images/posts/pixoo-signage/web-emulator.png" alt="Family Dashboard: Weather, Glucose, and More in 64x64 Pixels" loading="lazy" />
        
        <div class="post-card-text">
          <span class="post-title">Family Dashboard: Weather, Glucose, and More in 64x64 Pixels</span>
          <span class="post-meta">Jan 18, 2026</span>
          <span class="post-summary">Building a family glucose dashboard on Pixoo64 with serverless AWS and Claude Code.</span>
        </div>
      </a>
    </li>
    
    <li>
      <a href="/2026/01/11/voice-memos-to-second-brain/">
        
        <div class="post-card-text">
          <span class="post-title">Apple Watch to Obsidian via Claude Code</span>
          <span class="post-meta">Jan 11, 2026</span>
          <span class="post-summary">Building two MCP servers to capture voice memos and sync them into Obsidian.</span>
        </div>
      </a>
    </li>
    
  </ul>
</section>

      </div>

      <div class="right-col">
        <section>
          <h2>Elsewhere</h2>
          <div class="links-vertical">
            <a href="https://github.com/jwulff">GitHub</a>
            <a href="https://linkedin.com/in/jwulff">LinkedIn</a>
            <a href="https://www.instagram.com/johnrwulff/">Instagram</a>
            <a href="/feed.xml">RSS</a>
          </div>
        </section>

        <section>
          <h2><a href="/recipes/">Recipes</a></h2>
          <div class="links-vertical">
            
            
            <a href="/recipes/chicken-and-dumplings/">🍲🐔 Chicken and Dumplings</a>
            
            <a href="/recipes/picking-chicken/">🐔🌳 Picking Chicken</a>
            
            <a href="/recipes/south-of-the-border-caesar-salad/">🥬🌶️ South of the Border Caesar Salad</a>
            
            <a href="/recipes/almond-roca/">🍫🍬 Almond Roca</a>
            
            <a href="/recipes/hot-artichoke-dip/">🫕🧀 Hot Artichoke Dip</a>
            
            <a href="/recipes/onion-dip/">🧅🫕 Onion Dip</a>
            
            <a href="/recipes/pigs-in-a-blanket/">🐷🥐 Pigs & Pickles in Puff</a>
            
          </div>
        </section>
      </div>
    </div>
  </div>
</body>
</html>
