<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://quintussential.com/atom.xml" rel="self" type="application/atom+xml" /><link href="https://quintussential.com/" rel="alternate" type="text/html" /><updated>2026-04-25T19:25:48+00:00</updated><id>https://quintussential.com/atom.xml</id><title type="html">Quintussential</title><subtitle>Software Engineer</subtitle><author><name>Josh Quintus</name></author><entry><title type="html">3D Printing a Fence and Depth Stop for My Stanley 78</title><link href="https://quintussential.com/archive/2026/04/25/3d-printing-a-fence-and-depth-stop-for-my-stanley-78/" rel="alternate" type="text/html" title="3D Printing a Fence and Depth Stop for My Stanley 78" /><published>2026-04-25T00:00:00+00:00</published><updated>2026-04-25T00:00:00+00:00</updated><id>https://quintussential.com/archive/2026/04/25/3d-printing-a-fence-and-depth-stop-for-my-stanley-78</id><content type="html" xml:base="https://quintussential.com/archive/2026/04/25/3d-printing-a-fence-and-depth-stop-for-my-stanley-78/"><![CDATA[<p>I recently got a free Stanley 78 rabbet plane. The catch was that it was missing the depth stop and the fence. One of the big issues with these older Stanley planes is that none of the screws use common modern thread pitches so it’s hard to find replacements.</p>

<p>Enter Woodya.com. He has a wide varety of aftermarket replacement parts for Stanley planes: blades, screws, etc. They even have a full “<a href="https://woodyah.com/products/stanley-78-fugly-fence">fugly fence</a>” kit but it was all sold out. I could still pick up the hardware that I needed: the <a href="https://woodyah.com/products/stanley-78-replacement-threaded-fence-rod">fence rod</a> and <a href="https://woodyah.com/products/10-28-x-3x8-screw-stanley-uncommon-thread-by-woodyah">10-28 Slotted Stainless Screws</a>.</p>

<p>Now all I needed was something to use them with. <a href="http://Tenbergen.ca">Tenbergen.ca</a> had a Fusion360 model for both the <a href="https://www.tenbergen.ca/3d-printed-fence-for-a-stanley-78-rabbet-plane/">fence and depth stop</a>. The first print was good, but the fence didn’t work with the woodyeh hardware. So I had to open up the files and tweak them in Fusion360 to increase the diameters for the fence rod and set screw. While I was at it, I increased the recessed height for the nut that holds the set screw.</p>

<p>With those tweaks, I was able to restore my free plane. <a href="/assets/models/Width%20fence%20-%20Increased%20Diameters.stl">Attached are the model files with my customizations in case I ever need to reprint them.</a></p>

<p><img src="/images/posts/1000012847.jpg" alt="" /></p>

<p><img src="/images/posts/1000012846.jpg" alt="" /></p>

<p><img src="/images/posts/1000012849.jpg" alt="" /></p>]]></content><author><name>Josh Quintus</name></author><category term="3D Printing" /><category term="3D Modeling" /><category term="Fusion 360" /><summary type="html"><![CDATA[I recently got a free Stanley 78 rabbet plane. The catch was that it was missing the depth stop and the fence. One of the big issues with these older Stanley planes is that none of the screws use common modern thread pitches so it’s hard to find replacements.]]></summary></entry><entry><title type="html">Setting up a parametric modeling pipeline with python</title><link href="https://quintussential.com/archive/2026/04/19/setting-up-a-parametric-modeling-pipeline-with-python/" rel="alternate" type="text/html" title="Setting up a parametric modeling pipeline with python" /><published>2026-04-19T00:00:00+00:00</published><updated>2026-04-19T00:00:00+00:00</updated><id>https://quintussential.com/archive/2026/04/19/setting-up-a-parametric-modeling-pipeline-with-python</id><content type="html" xml:base="https://quintussential.com/archive/2026/04/19/setting-up-a-parametric-modeling-pipeline-with-python/"><![CDATA[<p>WIP</p>

<h2 id="goal">Goal</h2>

<p>I have a couple of pretty simple 3D models that I want to tweak very many ways. There are a dozen different parameters, I’ll be tweaking each one one or two millimeters. When I’m done, I want to wind up with a library of different configurations, and be able to print each without a lot of hassle (finding the files, slicing, etc.). In addition, I want to be able to easily create new configurations quickly and without having to go through a lot of UI clicking.</p>

<p>Originally I was going to use Fusion360’s Configuration Tables but they aren’t available on the free version and it’s not worth upgrading for just that feature.</p>

<p>The stack I am going with is:</p>

<ul>
  <li>DevContainer to simplify the dev environment</li>
  <li>Python with CadQuery to generate the models</li>
  <li>Prussa Slicer CLI to generate the slicing</li>
</ul>

<p>This post will be about getting a minimal hello world set up end to end.</p>

<h2 id="set-up-the-environment">Set Up the Environment</h2>

<ol>
  <li>Install Cursor/Vs Code - it doesn’t really matter which but I’m going with Cursor for this.</li>
  <li>Install <a href="https://apps.microsoft.com/detail/XP8CBJ40XLBWKX?hl=en-US&amp;gl=US&amp;ocid=pdpshare">Docker Windows from the store</a></li>
  <li>Install the <a href="https://marketplace.cursorapi.com/items/?itemName=anysphere.remote-containers">Dev Containers extension</a></li>
  <li>Trust the git repo from inside Cursor with: <code class="language-plaintext highlighter-rouge">git config --global --add safe.directory /workspaces/pens</code></li>
  <li></li>
</ol>

<p> </p>]]></content><author><name>Josh Quintus</name></author><category term="3D Modeling" /><category term="3D Printing" /><category term="Fusion 360" /><category term="Pens" /><summary type="html"><![CDATA[WIP]]></summary></entry><entry><title type="html">Setting Up Pages CMS for Jekyll</title><link href="https://quintussential.com/archive/2026/04/13/Setting-Up-Pages-CMS-for-Jekyll/" rel="alternate" type="text/html" title="Setting Up Pages CMS for Jekyll" /><published>2026-04-13T00:00:00+00:00</published><updated>2026-04-13T00:00:00+00:00</updated><id>https://quintussential.com/archive/2026/04/13/Setting-Up-Pages-CMS-for-Jekyll</id><content type="html" xml:base="https://quintussential.com/archive/2026/04/13/Setting-Up-Pages-CMS-for-Jekyll/"><![CDATA[<p>My blog has been running on Jekyll and GitHub Pages for close to a decade now.
The workflow has always been the same: write markdown in vim, commit, push.
That works great when I’m at my computer, but not so much when I want to jot
something down from my phone or when I move around from computer to computer.<br />
<a href="https://pagescms.org/">Pages CMS</a> solves that.
It’s a free and open-source CMS that sits on top of your GitHub repo and gives you
a web-based editor for your content.</p>

<h2 id="getting-started">Getting Started</h2>

<p>Setup is straightforward. Go to <a href="https://app.pagescms.org">app.pagescms.org</a>,
sign in with GitHub, and authorize it to access your repo. Then add a
<code class="language-plaintext highlighter-rouge">.pages.yml</code> file to the root of your repo to configure it.</p>

<h2 id="the-config">The Config</h2>

<p>Here’s the config I ended up with after quite a bit of trial and error:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">media</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">images</span>
    <span class="na">input</span><span class="pi">:</span> <span class="s">images/posts</span>
    <span class="na">output</span><span class="pi">:</span> <span class="s">/images/posts</span>
    <span class="na">extensions</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">png</span><span class="pi">,</span> <span class="nv">jpg</span><span class="pi">,</span> <span class="nv">webp</span><span class="pi">]</span>

<span class="na">content</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">posts</span>
    <span class="na">label</span><span class="pi">:</span> <span class="s">Posts</span>
    <span class="na">type</span><span class="pi">:</span> <span class="s">collection</span>
    <span class="na">path</span><span class="pi">:</span> <span class="s">_posts</span>
    <span class="na">format</span><span class="pi">:</span> <span class="s">yaml-frontmatter</span>
    <span class="na">filename</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{year}/{year}-{month}-{day}-{fields.title}.md"</span>
    <span class="na">media</span><span class="pi">:</span> <span class="s">images</span>
    <span class="na">view</span><span class="pi">:</span>
      <span class="na">fields</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">title</span><span class="pi">,</span> <span class="nv">date</span><span class="pi">]</span>
      <span class="na">default</span><span class="pi">:</span>
        <span class="na">sort</span><span class="pi">:</span> <span class="s">date</span>
        <span class="na">order</span><span class="pi">:</span> <span class="s">desc</span>
    <span class="na">fields</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">title</span>
        <span class="na">label</span><span class="pi">:</span> <span class="s">Title</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
        <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">date</span>
        <span class="na">label</span><span class="pi">:</span> <span class="s">Date</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">date</span>
        <span class="na">required</span><span class="pi">:</span> <span class="no">true</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">tags</span>
        <span class="na">label</span><span class="pi">:</span> <span class="s">Tags</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">select</span>
        <span class="na">list</span><span class="pi">:</span> <span class="no">true</span>
        <span class="na">required</span><span class="pi">:</span> <span class="no">false</span>
        <span class="na">options</span><span class="pi">:</span>
          <span class="na">values</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">Pens</span>
            <span class="pi">-</span> <span class="s">Pi Project</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">categories</span>
        <span class="na">label</span><span class="pi">:</span> <span class="s">Categories</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">select</span>
        <span class="na">list</span><span class="pi">:</span> <span class="no">true</span>
        <span class="na">required</span><span class="pi">:</span> <span class="no">false</span>
        <span class="na">options</span><span class="pi">:</span>
          <span class="na">values</span><span class="pi">:</span>
            <span class="pi">-</span> <span class="s">.NET</span>
            <span class="pi">-</span> <span class="s">Jekyll</span>
            <span class="pi">-</span> <span class="s">GitHub Pages</span>
            <span class="c1"># ... full list of your categories</span>
      <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">body</span>
        <span class="na">label</span><span class="pi">:</span> <span class="s">Content</span>
        <span class="na">type</span><span class="pi">:</span> <span class="s">rich-text</span>
        <span class="na">options</span><span class="pi">:</span>
          <span class="na">media</span><span class="pi">:</span> <span class="s">images</span>
</code></pre></div></div>

<h2 id="pitfalls">Pitfalls</h2>

<p>Of course nothing is easy. So here are some of the issues that I learned along the way.</p>

<h3 id="type-list-does-not-exist"><code class="language-plaintext highlighter-rouge">type: list</code> Does Not Exist</h3>

<p>This was the biggest one. I originally had my tags and categories configured as:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">tags</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">list</span>
</code></pre></div></div>

<p>This silently fails. Pages CMS’s valid field types are <code class="language-plaintext highlighter-rouge">string</code>, <code class="language-plaintext highlighter-rouge">number</code>,
<code class="language-plaintext highlighter-rouge">date</code>, <code class="language-plaintext highlighter-rouge">boolean</code>, <code class="language-plaintext highlighter-rouge">select</code>, <code class="language-plaintext highlighter-rouge">rich-text</code>, <code class="language-plaintext highlighter-rouge">text</code>, <code class="language-plaintext highlighter-rouge">code</code>, <code class="language-plaintext highlighter-rouge">image</code>, <code class="language-plaintext highlighter-rouge">file</code>,
<code class="language-plaintext highlighter-rouge">object</code>, and a few others. There is no <code class="language-plaintext highlighter-rouge">list</code> type.</p>

<p>To make a field repeatable (an array), you use the <code class="language-plaintext highlighter-rouge">list</code> <strong>property</strong> on any
field type:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">tags</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">string</span>
  <span class="na">list</span><span class="pi">:</span> <span class="no">true</span>
</code></pre></div></div>

<p>Or, if you want a dropdown with predefined values:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">tags</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">select</span>
  <span class="na">list</span><span class="pi">:</span> <span class="no">true</span>
  <span class="na">options</span><span class="pi">:</span>
    <span class="na">values</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">Pens</span><span class="pi">,</span> <span class="nv">Arduino</span><span class="pi">,</span> <span class="nv">Recipes</span><span class="pi">]</span>
</code></pre></div></div>

<p>The really frustrating part is that <code class="language-plaintext highlighter-rouge">type: list</code> doesn’t produce a config error.
The field just silently doesn’t work. If you combine it with <code class="language-plaintext highlighter-rouge">hidden: true</code>
(say, to auto-tag posts), you get a validation error on save
(“Please fix the errors before saving”) with no indication of what’s wrong
because the broken field is hidden.</p>

<h3 id="path--doesnt-work-for-collections"><code class="language-plaintext highlighter-rouge">path: "."</code> Doesn’t Work for Collections</h3>

<p>I tried to set up a “Pages” collection to edit files in the repo root
(<code class="language-plaintext highlighter-rouge">index.html</code>, <code class="language-plaintext highlighter-rouge">about/index.md</code>, etc.):</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">pages</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">collection</span>
  <span class="na">path</span><span class="pi">:</span> <span class="s">.</span>
</code></pre></div></div>

<p>Pages CMS doesn’t accept <code class="language-plaintext highlighter-rouge">.</code> as a path. The fix is to use <code class="language-plaintext highlighter-rouge">type: file</code> entries
for individual files instead:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">about</span>
  <span class="na">label</span><span class="pi">:</span> <span class="s">About Page</span>
  <span class="na">type</span><span class="pi">:</span> <span class="s">file</span>
  <span class="na">path</span><span class="pi">:</span> <span class="s">about/index.md</span>
  <span class="na">format</span><span class="pi">:</span> <span class="s">yaml-frontmatter</span>
</code></pre></div></div>

<h3 id="subdirectory-organized-posts-show-as-folders">Subdirectory-Organized Posts Show as Folders</h3>

<p>If your posts are organized in year subdirectories (<code class="language-plaintext highlighter-rouge">_posts/2024/</code>,
<code class="language-plaintext highlighter-rouge">_posts/2025/</code>, etc.), Pages CMS displays them as a folder tree rather than a
flat sorted list. I tried <code class="language-plaintext highlighter-rouge">view.layout: list</code> but it didn’t help. This
appears to be a limitation since the folder view is driven by the filesystem
structure.</p>

<p>It’s annoying to have a blog list posts in chronological order, but it’s still worlds better than what I had before.</p>

<h3 id="hidden-fields-with-bad-types-break-silently">Hidden Fields with Bad Types Break Silently</h3>

<p>I tried creating a separate “Project: Pens” collection that would auto-tag
posts. This didn’t work as expected which is why I wound up going with the
dropdown (<code class="language-plaintext highlighter-rouge">type: select</code>) on the main posts collection instead.</p>

<h2 id="bonus-enforcing-tag-consistency">Bonus: Enforcing Tag Consistency</h2>

<p>After a decade of free-form typing, my categories were a mess, e.g., <code class="language-plaintext highlighter-rouge">c#</code> vs <code class="language-plaintext highlighter-rouge">C#</code>,
<code class="language-plaintext highlighter-rouge">docker</code> vs <code class="language-plaintext highlighter-rouge">Docker</code>, <code class="language-plaintext highlighter-rouge">tools</code> vs <code class="language-plaintext highlighter-rouge">Tools</code>. Using <code class="language-plaintext highlighter-rouge">type: select</code> with an explicit
list of values fixes this going forward. No more typos, no more casing
inconsistencies.</p>]]></content><author><name>Josh Quintus</name></author><category term="Jekyll" /><category term="GitHub Pages" /><summary type="html"><![CDATA[My blog has been running on Jekyll and GitHub Pages for close to a decade now. The workflow has always been the same: write markdown in vim, commit, push. That works great when I’m at my computer, but not so much when I want to jot something down from my phone or when I move around from computer to computer. Pages CMS solves that. It’s a free and open-source CMS that sits on top of your GitHub repo and gives you a web-based editor for your content.]]></summary></entry><entry><title type="html">Claude with Notion</title><link href="https://quintussential.com/archive/2026/04/12/claude-with-notion/" rel="alternate" type="text/html" title="Claude with Notion" /><published>2026-04-12T00:00:00+00:00</published><updated>2026-04-12T00:00:00+00:00</updated><id>https://quintussential.com/archive/2026/04/12/claude-with-notion</id><content type="html" xml:base="https://quintussential.com/archive/2026/04/12/claude-with-notion/"><![CDATA[<p>Setting up Claude to read your Notion documentation is easy.</p>

<ol>
  <li>Add Notion’s MCP to claude
  ```</li>
</ol>

<p>```</p>

<p>claude mcp add –transport http notion <a href="https://mcp.notion.com/mcp">https://mcp.notion.com/mcp</a>
Added HTTP MCP server notion with URL: <a href="https://mcp.notion.com/mcp">https://mcp.notion.com/mcp</a> to local config
File modified: /Users/jq/.claude.json [project: /Users/jq/code/hightouch/claude_local/2026-01-wsl]
    ```</p>
<ol>
  <li>In a claud session, type <code class="language-plaintext highlighter-rouge">/mcp</code> to bring up the list of servers you can configure. If the newly added server isn’t there, then run <code class="language-plaintext highlighter-rouge">/doctor</code> to force claude to reread the configs</li>
  <li>Select the Notion server from the list and authenticate</li>
  <li>That’s it. You can now send Claude links to docs you want it to read</li>
</ol>]]></content><author><name>Josh Quintus</name></author><category term="Claude" /><category term="AI" /><summary type="html"><![CDATA[Setting up Claude to read your Notion documentation is easy.]]></summary></entry><entry><title type="html">Roast Chicken Thighs, Potatoes &amp;amp; Peas (One Pan)</title><link href="https://quintussential.com/archive/2026/04/12/chicken-with-potatoes-and-peas/" rel="alternate" type="text/html" title="Roast Chicken Thighs, Potatoes &amp;amp; Peas (One Pan)" /><published>2026-04-12T00:00:00+00:00</published><updated>2026-04-12T00:00:00+00:00</updated><id>https://quintussential.com/archive/2026/04/12/chicken-with-potatoes-and-peas</id><content type="html" xml:base="https://quintussential.com/archive/2026/04/12/chicken-with-potatoes-and-peas/"><![CDATA[<h1 id="roast-chicken-thighs-potatoes--peas-one-pan">Roast Chicken Thighs, Potatoes &amp; Peas (One Pan)</h1>

<p>Oven: 425°F
Pan: metal roasting pan / sheet pan</p>

<h2 id="ingredients">Ingredients</h2>

<ul>
  <li>4–6 bone-in, skin-on chicken thighs</li>
  <li>2 lb potatoes (Yukon Gold or russet), 1½” chunks</li>
  <li>1 medium yellow onion, thick wedges</li>
  <li>¾–1 cup frozen peas</li>
  <li>¼ cup dry white wine</li>
  <li>1–2 small rosemary sprigs</li>
  <li>Olive oil, salt, pepper</li>
</ul>

<h2 id="method">Method</h2>

<ol>
  <li><strong>Potatoes first</strong>
    <ul>
      <li>Toss potatoes with olive oil, salt, pepper.</li>
    </ul>
    <ul>
      <li>Roast 20–25 min, cut-side down, until browned.</li>
    </ul>
  </li>
  <li><strong>Chicken + onions</strong>
    <ul>
      <li>Season chicken. Add thighs (skin up) and onion wedges.</li>
    </ul>
    <ul>
      <li>Roast 15–20 min until fat is rendering.</li>
    </ul>
  </li>
  <li><strong>Wine + rosemary</strong>
    <ul>
      <li>Pull pan. Splash ¼ cup wine against pan edge.</li>
    </ul>
    <ul>
      <li>Add rosemary. Return to oven immediately.</li>
    </ul>
  </li>
  <li><strong>Peas</strong>
    <ul>
      <li>Scatter frozen peas over pan.</li>
    </ul>
    <ul>
      <li>Roast 8–10 min more.</li>
    </ul>
  </li>
  <li><strong>Finish</strong>
    <ul>
      <li>Optional broil 2–3 min.</li>
    </ul>
    <ul>
      <li>Remove rosemary. Rest 5 min, toss once, serve.</li>
    </ul>
  </li>
</ol>

<h2 id="notes">Notes</h2>

<ul>
  <li>If it doesn’t sizzle when wine hits, pan wasn’t hot enough</li>
  <li>Crowding is good — potatoes should sit in fat</li>
  <li>No liquid left at the end = correct</li>
</ul>]]></content><author><name>Josh Quintus</name></author><summary type="html"><![CDATA[Roast Chicken Thighs, Potatoes &amp; Peas (One Pan)]]></summary></entry><entry><title type="html">8mm Brass Tube Sizing</title><link href="https://quintussential.com/archive/2026/04/12/8mm-brass-tube-sizing/" rel="alternate" type="text/html" title="8mm Brass Tube Sizing" /><published>2026-04-12T00:00:00+00:00</published><updated>2026-04-12T00:00:00+00:00</updated><id>https://quintussential.com/archive/2026/04/12/8mm-brass-tube-sizing</id><content type="html" xml:base="https://quintussential.com/archive/2026/04/12/8mm-brass-tube-sizing/"><![CDATA[<p>7.4 mm.</p>

<p>Maybe a little bit larger. But a touch of super glue would get it.</p>

<p>7.45mm to 7.49mm feel viable with just   friction fit.</p>

<h3 id="fitted-with-pilot-precise-v5rt">Fitted with Pilot Precise V5RT</h3>

<p><img src="/images/posts/1000012635.jpg" alt="" /></p>

<h3 id="fitted-schmidt-888-102">Fitted Schmidt 888 102</h3>

<p><img src="/images/posts/1000012637.jpg" alt="" /></p>

<p><img src="/images/posts/1000012636.jpg" alt="" /></p>

<h3 id="bushing-sizes">Bushing Sizes</h3>

<ul>
  <li>Pk-penxxbu bushings are 10.8 mm</li>
  <li>PK Parkbu bushings are
    <ul>
      <li>12.45 mm</li>
      <li>10.2 mm</li>
    </ul>
  </li>
</ul>

<h3 id="nose-cone-changes">Nose Cone changes</h3>

<ol>
  <li>Increase inner diameter to 4.75 mm</li>
  <li>Increase length 2.2mm for Schmidt</li>
  <li>Increase length 2.75 mm for pilot Precise</li>
  <li>Create 5 mm deep shoulder at the 4.75mm</li>
  <li>Nose cone opening should be around 2.75mm wide.</li>
  <li>Account for 4 mm thickness for about 10 mm for pilot</li>
</ol>

<h3 id="ink-bodies">Ink bodies</h3>

<ul>
  <li>Pilot
    <ul>
      <li>6 mm diameter</li>
      <li>90 mm length to shoulder</li>
      <li>21.25 mm Shoulder to tip</li>
      <li>Springs
        <ul>
          <li>18 mm included spring length</li>
          <li>4.3 mm included spring diameter</li>
          <li>Parker style springs can be used</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>Schmidt
    <ul>
      <li>6.25 mm diameter</li>
      <li>90 mm length to shoulder</li>
      <li>20.5 mm Shoulder to tip</li>
    </ul>
  </li>
</ul>]]></content><author><name>Josh Quintus</name></author><category term="Pens" /><summary type="html"><![CDATA[7.4 mm.]]></summary></entry><entry><title type="html">Fusion360 and ParaParam</title><link href="https://quintussential.com/archive/2026/04/11/paraparam/" rel="alternate" type="text/html" title="Fusion360 and ParaParam" /><published>2026-04-11T00:00:00+00:00</published><updated>2026-04-11T00:00:00+00:00</updated><id>https://quintussential.com/archive/2026/04/11/paraparam</id><content type="html" xml:base="https://quintussential.com/archive/2026/04/11/paraparam/"><![CDATA[<p>When I’m chasing tolerances on your 3D designs, I will print the same design with 1mm differences. <a href="https://github.com/hanskellner/Fusion360ParaParam">ParaParam</a> is great at scripting generating STL files with changes to a specific parameter.</p>

<p>To install the add in, download the zipped code from GitHub, extract it, and put it in the <code class="language-plaintext highlighter-rouge">%appdata%\Autodesk\Autodesk Fusion 360\API\Scripts</code> folder. You may need to create the <code class="language-plaintext highlighter-rouge">Scripts</code> folder.</p>

<p>The file structure should be</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>API\
  Scripts\
    ParaParam\
      ParaParam.py
      ParaParam.manifest
      ...
</code></pre></div></div>

<p>Fusion360 and ParaParam</p>]]></content><author><name>Josh Quintus</name></author><category term="Pens" /><summary type="html"><![CDATA[When I’m chasing tolerances on your 3D designs, I will print the same design with 1mm differences. ParaParam is great at scripting generating STL files with changes to a specific parameter.]]></summary></entry><entry><title type="html">Creating Labels on Curved Models in Fusion 360</title><link href="https://quintussential.com/archive/2025/07/20/Creating-Labels-on-Curved-Models-in-Fusion-360/" rel="alternate" type="text/html" title="Creating Labels on Curved Models in Fusion 360" /><published>2025-07-20T00:00:00+00:00</published><updated>2025-07-20T00:00:00+00:00</updated><id>https://quintussential.com/archive/2025/07/20/Creating-Labels-on-Curved-Models-in-Fusion-360</id><content type="html" xml:base="https://quintussential.com/archive/2025/07/20/Creating-Labels-on-Curved-Models-in-Fusion-360/"><![CDATA[<h1 id="creating-labels-on-curved-models-in-fusion-360">Creating Labels on Curved Models in Fusion 360</h1>

<p>It’s really easy to create labels on flat models in Fusion 360:</p>

<ol>
  <li>Create a new sketch on the flat face of your model.</li>
  <li>Use the text tool to add your label.</li>
  <li>Exit the sketch.</li>
  <li>Emboss the sketch on to the surface.</li>
</ol>

<p>But it’s a little more tricky to create labels on curved models.</p>

<h2 id="heres-how-to-do-it">Here’s how to do it</h2>

<ol>
  <li>
    <p>Create a new body with a curved surface that you want to label. Rename the body
<code class="language-plaintext highlighter-rouge">Main</code> to keep track of it.</p>
  </li>
  <li>
    <p>Create an offset plane outside of the body.</p>

    <p><a href="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/Step 2 - Create Offset Plane.png"><img src="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/thumbnails/Step 2 - Create Offset Plane.png" alt="Step 2 - Create Offset Plane.png" /></a></p>
  </li>
  <li>
    <p>Create a sketch on that plane with whatever message you want.</p>
  </li>
  <li>
    <p>Extrude the the sketch through the surface of your body. You need to make sure
you have this deep enough that the full text will intersect with the body.</p>

    <p><a href="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/Step 4 - Extrude the label.png"><img src="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/thumbnails/Step 4 - Extrude the label.png" alt="Step 4 - Extrude the label.png" /></a></p>
  </li>
  <li>
    <p>Create another sketch on the <em>back</em> of the extrusion. This just needs to intersect
all of the letters of the text. If there are any hollow areas of your text (the
circle in the center of an <code class="language-plaintext highlighter-rouge">e</code>, for example), you want to make sure that you exclude
the hollow areas. You can either do this directly by not intersecting with the
hollow areas, or you can project the letters from the original sketch onto the
new sketch. In the screenshot, you can see that the sketch is just a simple box that
overlaps all of the letters.</p>

    <p><a href="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/Step 5 - Second Sketch.png"><img src="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/thumbnails/Step 5 - Second Sketch.png" alt="Step 5 - Second Sketch.png" /></a></p>
  </li>
  <li>
    <p>Extrude the new sketch through the bodies of the old sketch, effectively joining
them together into one body. This makes it easier to do the next few steps because
you’ll have a single body to work with instead of one body per letter.</p>

    <p><a href="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/Step 6 - Extrude the connector plate.png"><img src="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/thumbnails/Step 6 - Extrude the connector plate.png" alt="Step 6 - Extrude the connector plate.png" /></a></p>
  </li>
  <li>
    <p>Name this new body <code class="language-plaintext highlighter-rouge">Label</code></p>
  </li>
  <li>Use the <code class="language-plaintext highlighter-rouge">Combine</code> tool to trim the <code class="language-plaintext highlighter-rouge">Label</code> so it doesn’t extrude past the face
of <code class="language-plaintext highlighter-rouge">Main</code>.
    <ul>
      <li><strong>Target</strong>: <code class="language-plaintext highlighter-rouge">Label</code></li>
      <li><strong>Tool</strong>: <code class="language-plaintext highlighter-rouge">Main</code></li>
      <li><strong>Operation</strong>: <code class="language-plaintext highlighter-rouge">Intersect</code></li>
      <li><strong>Keep Tools</strong>: True</li>
    </ul>

    <p><a href="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/Step 8 - Trim the Label.png"><img src="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/thumbnails/Step 8 - Trim the Label.png" alt="Step 8 - Trim the Label.png" /></a></p>
  </li>
  <li>Use the <code class="language-plaintext highlighter-rouge">Combine</code> tool again to create the recess for the label to fit into.
    <ul>
      <li><strong>Target</strong>: <code class="language-plaintext highlighter-rouge">Main</code></li>
      <li><strong>Tool</strong>: <code class="language-plaintext highlighter-rouge">Label</code></li>
      <li><strong>Operation</strong>: <code class="language-plaintext highlighter-rouge">Cut</code></li>
      <li><strong>Keep Tools</strong>: True</li>
    </ul>

    <p><a href="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/Step 9 - Create the recess for the letters.png"><img src="/images/posts/2025/2025-07-20-Creating-Labels-on-Curved-Models-in-Fusion-360/thumbnails/Step 9 - Create the recess for the letters.png" alt="Step 9 - Create the recess for the letters.png" /></a></p>
  </li>
</ol>

<p>Done.</p>]]></content><author><name>Josh Quintus</name></author><category term="3D Modeling" /><category term="Fusion 360" /><category term="3D Printing" /><summary type="html"><![CDATA[Creating Labels on Curved Models in Fusion 360]]></summary></entry><entry><title type="html">Create a Hotkey to Debug a Specific Launch Config in VS Code</title><link href="https://quintussential.com/archive/2024/12/09/Create-a-Hotkey-to-Debug-a-Specific-Launch-Config-in-VS-Code/" rel="alternate" type="text/html" title="Create a Hotkey to Debug a Specific Launch Config in VS Code" /><published>2024-12-09T00:00:00+00:00</published><updated>2024-12-09T00:00:00+00:00</updated><id>https://quintussential.com/archive/2024/12/09/Create-a-Hotkey-to-Debug-a-Specific-Launch-Config-in-VS-Code</id><content type="html" xml:base="https://quintussential.com/archive/2024/12/09/Create-a-Hotkey-to-Debug-a-Specific-Launch-Config-in-VS-Code/"><![CDATA[<p>I’ve started using VS Code for more complex projects that have multiple (many)
launch configurations. At any given moment there are a handful of of projects
that I may want to debug. Me being me, I want to be able to press a single
button and debug he right project.</p>

<p>So of course I went to wire up a hotkey for that… only you can’t.</p>

<p>Well. Not be default at least.</p>

<p>First things first, you’re gonna need an extension called
<a href="https://marketplace.visualstudio.com/items?itemName=ArturoDent.launch-config">Launch Config</a>.
Go ahead and install that.</p>

<p>Next up, you’re going to need a suitably complex <code class="language-plaintext highlighter-rouge">.vscode/launch.json</code>. Luckily,
I have one just kicking around. Let’s use this</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.2.0"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"configurations"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"d1"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"node"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"request"</span><span class="p">:</span><span class="w"> </span><span class="s2">"launch"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"runtimeExecutable"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cmd.exe"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"/c"</span><span class="p">,</span><span class="w"> </span><span class="s2">"echo Hello, Console 11111111111111"</span><span class="p">],</span><span class="w">
      </span><span class="nl">"console"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integratedTerminal"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"d2"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"node"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"request"</span><span class="p">:</span><span class="w"> </span><span class="s2">"launch"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"runtimeExecutable"</span><span class="p">:</span><span class="w"> </span><span class="s2">"cmd.exe"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"args"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"/c"</span><span class="p">,</span><span class="w"> </span><span class="s2">"echo Hello, Console 2222222222222"</span><span class="p">],</span><span class="w">
      </span><span class="nl">"console"</span><span class="p">:</span><span class="w"> </span><span class="s2">"integratedTerminal"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>This adds two configurations <code class="language-plaintext highlighter-rouge">d1</code> and <code class="language-plaintext highlighter-rouge">d2</code>. Both of which just echo a message to
the command line. Not the most realistic sample, but perfect for testing.</p>

<p>From there, you can configure them to work with <code class="language-plaintext highlighter-rouge">Launch Configs</code> by in your
<code class="language-plaintext highlighter-rouge">.vscode/settings.json</code>.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">"launches"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="nl">"RunD1"</span><span class="p">:</span><span class="w"> </span><span class="s2">"d1"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"RunD2"</span><span class="p">:</span><span class="w"> </span><span class="s2">"d2"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>What this does is create an entry named <code class="language-plaintext highlighter-rouge">RunD1</code> with <code class="language-plaintext highlighter-rouge">Launch Configs</code> that will
launch your <code class="language-plaintext highlighter-rouge">d1</code> configuration.</p>

<p>Next, you have to create the keybindings going to the command pallet
(<code class="language-plaintext highlighter-rouge">ctrl-shift-p</code>) and search for <code class="language-plaintext highlighter-rouge">keyboard</code>. This will open up the UI, you can
use that or you can hit the page looking icon at the top of VS Code to open the
text file. For me it’s located in
<code class="language-plaintext highlighter-rouge">C:\Users\Josh Quintus\AppData\Roaming\Code\User\keybindings.json</code> (keybindings
can’t be stored at the workspace level 🙁.</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w"> </span><span class="p">{</span><span class="w">
  </span><span class="nl">"key"</span><span class="p">:</span><span class="w"> </span><span class="s2">"f14"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"launches.RunD1"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"arg"</span><span class="p">:</span><span class="w"> </span><span class="s2">"restart"</span><span class="w">
</span><span class="p">}</span><span class="err">,</span><span class="w">
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"key"</span><span class="p">:</span><span class="w"> </span><span class="s2">"f15"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"launches.RunD2"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"arg"</span><span class="p">:</span><span class="w"> </span><span class="s2">"restart"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>This maps the <code class="language-plaintext highlighter-rouge">F14</code> and <code class="language-plaintext highlighter-rouge">F15</code> key to starting the <code class="language-plaintext highlighter-rouge">d1</code> and <code class="language-plaintext highlighter-rouge">d2</code> config,
respectively. But of course, you could set it to anything you like.</p>

<h2 id="tldr">TL;DR</h2>

<ol>
  <li>Install
<a href="https://marketplace.visualstudio.com/items?itemName=ArturoDent.launch-config">Launch Config</a>.</li>
  <li>Create an entry in <code class="language-plaintext highlighter-rouge">.vscode/launch.json</code></li>
  <li>Create a matching entry in <code class="language-plaintext highlighter-rouge">.vscode/settings.json</code> that points to the launch
config</li>
  <li>Create a keybinding that references the item in <code class="language-plaintext highlighter-rouge">settings.json</code></li>
</ol>]]></content><author><name>Josh Quintus</name></author><category term="VSCode" /><category term="Debugging" /><summary type="html"><![CDATA[I’ve started using VS Code for more complex projects that have multiple (many) launch configurations. At any given moment there are a handful of of projects that I may want to debug. Me being me, I want to be able to press a single button and debug he right project.]]></summary></entry><entry><title type="html">Neovim and the Conditional Keybindings</title><link href="https://quintussential.com/archive/2024/12/09/Neovim-and-the-Conditional-Keybindings/" rel="alternate" type="text/html" title="Neovim and the Conditional Keybindings" /><published>2024-12-09T00:00:00+00:00</published><updated>2024-12-09T00:00:00+00:00</updated><id>https://quintussential.com/archive/2024/12/09/Neovim-and-the-Conditional-Keybindings</id><content type="html" xml:base="https://quintussential.com/archive/2024/12/09/Neovim-and-the-Conditional-Keybindings/"><![CDATA[<p>I recently installed the
<a href="https://marketplace.visualstudio.com/items?itemName=asvetliakov.vscode-neovim">Neovim extension</a>
in VS Code. I have a love/hate relationship with it. Sometimes it’s great. Vim
is just so much easier to navigate files and make fast edits. Sometimes it just
gets in the way.</p>

<p>It’d be really nice if I could just map a hotkey to toggle it on and off. Going
down this rabbit hole, I learned about the <code class="language-plaintext highlighter-rouge">when</code> clause in VS Code keybindings
but more importantly, I learned how to figure out what variables are available
when using it.</p>

<p>Enter <code class="language-plaintext highlighter-rouge">Developer: Toggle Developer Tools</code>. With this command (in the Command
Pallet) you can open up the standard chrome developer tools. But in this case,
it allows you to inspect VS Code itself. After that, you can get a list of all
of the
“<a href="https://code.visualstudio.com/api/references/when-clause-contexts">Context Keys</a>”
available for your when clause.</p>

<p>For example, here’s a handful of mine right now</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">...</span><span class="w">
</span><span class="err">neovim.editorLangIdExclusions</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">null</span><span class="w">
</span><span class="err">neovim.init</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="err">neovim.mode</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="s2">"normal"</span><span class="w">
</span><span class="err">notebookChatAgentRegistered</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span><span class="err">notebookVariableViewEnabled</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span><span class="err">notificationCenterVisible</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span><span class="err">notificationToastsVisible</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span><span class="err">npm.canMove</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="err">npm.defaultViewLocation</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="err">openFolderWorkspaceSupport</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="err">operationInProgress</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span><span class="err">outline.active</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="err">outline.canMove</span><span class="w"> </span><span class="err">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span><span class="err">...</span><span class="w">
</span></code></pre></div></div>

<p>From here, I can see that <code class="language-plaintext highlighter-rouge">neovim.init</code> is a boolean. I can probably use that
for my when clause.</p>

<p>My <code class="language-plaintext highlighter-rouge">keybindings.json</code> (in <code class="language-plaintext highlighter-rouge">~\AppData\Roaming\Code\User\keybindings.json</code>)</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"key"</span><span class="p">:</span><span class="w"> </span><span class="s2">"f17"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vscode-neovim.stop"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"when"</span><span class="p">:</span><span class="w"> </span><span class="s2">"neovim.init"</span><span class="w">
</span><span class="p">}</span><span class="err">,</span><span class="w">
</span><span class="p">{</span><span class="w">
  </span><span class="nl">"key"</span><span class="p">:</span><span class="w"> </span><span class="s2">"f17"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"command"</span><span class="p">:</span><span class="w"> </span><span class="s2">"vscode-neovim.restart"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"when"</span><span class="p">:</span><span class="w"> </span><span class="s2">"!neovim.init"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>Now, when neovim is enabled, pressing <code class="language-plaintext highlighter-rouge">F17</code> will turn it off and when it’s off,
pressing it again will turn it back on. Teh is after good.</p>

<h2 id="tldr">TL;DR</h2>

<ol>
  <li><code class="language-plaintext highlighter-rouge">Developer: Toggle Developer Tools</code></li>
  <li><code class="language-plaintext highlighter-rouge">Developer: Inspect Context Keys</code></li>
</ol>]]></content><author><name>Josh Quintus</name></author><category term="VSCode" /><category term="hotkey" /><summary type="html"><![CDATA[I recently installed the Neovim extension in VS Code. I have a love/hate relationship with it. Sometimes it’s great. Vim is just so much easier to navigate files and make fast edits. Sometimes it just gets in the way.]]></summary></entry></feed>