<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>One Tip a Week</title>
    <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
    
    <link>https://one-tip-a-week.beehiiv.com/</link>
    <atom:link href="https://rss.beehiiv.com/feeds/NggVbrRMab.xml" rel="self"/>
    
    <lastBuildDate>Tue, 13 Oct 2026 03:35:00 +0000</lastBuildDate>
    <pubDate>Mon, 12 Oct 2026 11:00:00 +0000</pubDate>
    <atom:published>2026-10-12T11:00:00Z</atom:published>
    <atom:updated>2026-10-13T03:35:00Z</atom:updated>
    
      <category>Programming</category>
    <copyright>Copyright 2026, One Tip a Week</copyright>
    
    <image>
      <url>https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/publication/logo/e873e0ca-6b39-402e-8c1e-9eadfeae594f/Cloudinary_Image_800x800.jpg</url>
      <title>One Tip a Week</title>
      <link>https://one-tip-a-week.beehiiv.com/</link>
    </image>
    
    <docs>https://www.rssboard.org/rss-specification</docs>
    <generator>beehiiv</generator>
    <language>en-us</language>
    <webMaster>support@beehiiv.com (Beehiiv Support)</webMaster>

      <item>
  <title>One Tip a Week: Catch Secrets Before They Leave Your Laptop</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-catch-secrets-before-they-leave-your-laptop</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-catch-secrets-before-they-leave-your-laptop</guid>
  <pubDate>Mon, 12 Oct 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-10-12T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Security]]></category>
    <category><![CDATA[Git]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week’s tip of the week is a tool called <a class="link" href="https://github.com/betterleaks/betterleaks?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-catch-secrets-before-they-leave-your-laptop" target="_blank" rel="noopener noreferrer nofollow">Betterleaks</a>.</p><p class="paragraph" style="text-align:left;">A few months ago, I wrote about <a class="link" href="https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-fighting-your-git-hooks?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-catch-secrets-before-they-leave-your-laptop" target="_blank" rel="noopener noreferrer nofollow">hk</a>, a Git hook manager that can run checks like formatting, linting, and type checking before your code gets committed. One of the things I mentioned was catching leaked secrets.</p><p class="paragraph" style="text-align:left;">Well, here’s how to actually do that.</p><p class="paragraph" style="text-align:left;">Betterleaks is an open-source secrets scanner maintained by folks behind Gitleaks, including its original author.</p><p class="paragraph" style="text-align:left;">GitHub can scan repositories for leaked secrets, and that’s a great safety net.</p><p class="paragraph" style="text-align:left;">But I’d rather catch an API key or token before the commit ever leaves my machine.</p><p class="paragraph" style="text-align:left;">Betterleaks can scan just your staged changes. For this example, I staged some source code with a fake API key and a custom detection rule so there’s no real credential involved.</p><div class="codeblock"><pre><code>$ betterleaks git . --pre-commit --staged

 + ○
   ▾
 betterleaks 1.8.1

┌─demo-api-key──○
│
│ 2 │   const apiKey = &quot;REDACTED&quot;;
│   │                   ^^^^^^^^
│
│ attributes:
│   git.message ......
│   git.sha ..........
│   path ............. src/api.ts
│   resource ......... git.patch_content
└○

11:05PM INF scanned ~394 bytes (394 bytes) in 35.7ms
11:05PM WRN leaks found: 1</code></pre></div><p class="paragraph" style="text-align:left;">And if you’re already using hk from my previous tip, it now has Betterleaks built in. Add it as one of your hook steps:</p><div class="codeblock"><pre><code>[&quot;betterleaks&quot;] = Builtins.betterleaks</code></pre></div><p class="paragraph" style="text-align:left;">Now secret scanning can happen automatically alongside the other checks you already run before committing.</p><p class="paragraph" style="text-align:left;">GitHub can still be another layer of protection, but it doesn’t have to be the first place you find out you committed a secret.</p><p class="paragraph" style="text-align:left;">Check out <a class="link" href="https://github.com/betterleaks/betterleaks?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-catch-secrets-before-they-leave-your-laptop" target="_blank" rel="noopener noreferrer nofollow">Betterleaks</a> and let me know what you think!</p><p class="paragraph" style="text-align:left;">That’s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=f5ba6572-fba1-4867-a70a-51b59c246cf7&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Cut the Terminal Noise Your Coding Agent Reads</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-cut-the-terminal-noise-your-coding-agent-reads</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-cut-the-terminal-noise-your-coding-agent-reads</guid>
  <pubDate>Mon, 05 Oct 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-10-05T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Terminal]]></category>
    <category><![CDATA[Claude Code]]></category>
    <category><![CDATA[Ai]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://github.com/rtk-ai/rtk?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-cut-the-terminal-noise-your-coding-agent-reads" target="_blank" rel="noopener noreferrer nofollow">RTK</a>.</p><p class="paragraph" style="text-align:left;">Coding agents run a lot of terminal commands, and those commands can produce a lot of noise.</p><p class="paragraph" style="text-align:left;">A test suite might print hundreds of passing tests when the agent only needs to see the two that failed. <code>git push</code> produces progress messages that rarely matter. Logs repeat the same lines over and over.</p><p class="paragraph" style="text-align:left;">All of that output gets added to the agent’s context window.</p><p class="paragraph" style="text-align:left;">RTK filters and compresses terminal output before the agent reads it. It supports more than 100 commands, including Git, GitHub CLI, npm, Docker, Kubernetes, test runners, linters, and build tools.</p><p class="paragraph" style="text-align:left;">RTK supports macOS, Linux, and Windows. Check the <a class="link" href="https://www.rtk-ai.app/docs/getting-started/installation/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-cut-the-terminal-noise-your-coding-agent-reads" target="_blank" rel="noopener noreferrer nofollow">official installation instructions</a> for all the available options.</p><p class="paragraph" style="text-align:left;">I’m on macOS. Homebrew was a couple of releases behind when I installed RTK, so I used the official installer:</p><div class="codeblock"><pre><code>curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/master/install.sh | sh</code></pre></div><p class="paragraph" style="text-align:left;">Once installed, configure RTK for your preferred coding harness. For example, Claude Code has a transparent hook integration:</p><div class="codeblock"><pre><code>❯ rtk init -g --agent claude

RTK hook registered (global).

  Command:   rtk hook claude
  RTK.md:    /Users/nicktaylor/.claude/RTK.md (awareness: default)
  CLAUDE.md: @RTK.md reference added

  settings.json: hook already present
  Restart Claude Code. Test with: git status</code></pre></div><p class="paragraph" style="text-align:left;">RTK also supports Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode, Windsurf, and several others. The setup and integration method vary, so check the <a class="link" href="https://github.com/rtk-ai/rtk?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-cut-the-terminal-noise-your-coding-agent-reads#supported-ai-tools" target="_blank" rel="noopener noreferrer nofollow">supported coding harnesses</a> for the appropriate command.</p><p class="paragraph" style="text-align:left;">You can see how much output RTK has removed by running <code>rtk gain</code>:</p><div class="codeblock"><pre><code>❯ rtk gain
RTK Token Savings (Global Scope)
════════════════════════════════════════════════════════════

Total commands:    29
Input tokens:      249.0M
Output tokens:     27.5K
Tokens saved:      248.9M (100.0%)
Total exec time:   10.7s (avg 369ms)
Efficiency meter: ████████████████████████ 100.0%

By Command
────────────────────────────────────────────────────────────────────────
  #  Command                   Count   Saved    Avg%    Time  Impact
────────────────────────────────────────────────────────────────────────
 1.  rtk rg                        2  248.9M  100.0%    4.4s  ██████████
 2.  rtk ls -la /Users/nic...      1     403   71.6%     4ms  ░░░░░░░░░░
 3.  rtk ls -la                    1     196   78.4%     6ms  ░░░░░░░░░░
 4.  rtk ls -la /Users/nic...      1      10   24.4%     4ms  ░░░░░░░░░░
 5.  rtk:toml jq -e .hooks...      1       0    0.0%     9ms  ░░░░░░░░░░
 6.  rtk read                      1       0    0.0%     0ms  ░░░░░░░░░░
 7.  rtk proxy which rtk           1       0    0.0%     3ms  ░░░░░░░░░░
 8.  rtk proxy sh -c strin...      1       0    0.0%    24ms  ░░░░░░░░░░
 9.  rtk proxy sh -c print...      1       0    0.0%     2ms  ░░░░░░░░░░
10.  rtk proxy sh -c ls -l...      1       0    0.0%     7ms  ░░░░░░░░░░
────────────────────────────────────────────────────────────────────────</code></pre></div><p class="paragraph" style="text-align:left;">That result is dominated by two unusually large <code>rg</code> commands, so do not read it as “RTK cut my total AI usage by 100%.” RTK estimates token counts from command output, and terminal output is only one part of an agent’s context.</p><p class="paragraph" style="text-align:left;">Still, less terminal garbage with <a class="link" href="https://github.com/rtk-ai/rtk?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-cut-the-terminal-noise-your-coding-agent-reads" target="_blank" rel="noopener noreferrer nofollow">RTK</a> means more room for the context that matters.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=c2dbf175-ff7a-4e99-bd4c-d1a40b51e6d1&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: A Launcher Worth Knowing About</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-a-launcher-worth-knowing-about</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-a-launcher-worth-knowing-about</guid>
  <pubDate>Mon, 28 Sep 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-09-28T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Desktop App]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week’s tip of the week is <a class="link" href="https://www.woxlauncher.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-a-launcher-worth-knowing-about" target="_blank" rel="noopener noreferrer nofollow">Wox</a>.</p><p class="paragraph" style="text-align:left;">If you use <a class="link" href="https://www.raycast.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-a-launcher-worth-knowing-about" target="_blank" rel="noopener noreferrer nofollow">Raycast</a> on macOS or Windows, or <a class="link" href="https://www.alfredapp.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-a-launcher-worth-knowing-about" target="_blank" rel="noopener noreferrer nofollow">Alfred</a> on macOS, Wox is worth knowing about.</p><p class="paragraph" style="text-align:left;">Wox is a free, open-source launcher for macOS, Windows, and Linux. It gives you the usual goodies like app and file search, clipboard history, calculations, plugins, and more.</p><p class="paragraph" style="text-align:left;">I gave it a try and came away impressed.</p><p class="paragraph" style="text-align:left;">Am I switching from Raycast? Probably not. I’ve been using Raycast for a few years now and I’m pretty deep into that workflow. I’m also perfectly happy on Raycast’s free tier.</p><p class="paragraph" style="text-align:left;">But Raycast itself isn’t open source, and some of its additional features require a paid plan. If open source matters to you, or if I wanted that same style of launcher experience on Linux, Wox gets a lot more interesting.</p><p class="paragraph" style="text-align:left;">And if you’re not already committed to Raycast or Alfred, I’d definitely give Wox a try before deciding which launcher to settle on.</p><p class="paragraph" style="text-align:left;">It’s free, open source, and works across all three major desktop platforms.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://www.woxlauncher.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-a-launcher-worth-knowing-about" target="_blank" rel="noopener noreferrer nofollow">Check out Wox</a> and let me know what you think!</p><p class="paragraph" style="text-align:left;">That’s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=0d0752df-814f-4e38-ab99-55f286166836&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Wasting AI Tokens on Merge Conflicts</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-wasting-ai-tokens-on-merge-conflicts</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-wasting-ai-tokens-on-merge-conflicts</guid>
  <pubDate>Mon, 21 Sep 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-09-21T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Agent Skills]]></category>
    <category><![CDATA[Git]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p id="this-weeks-tip-of-the-week-is-mergi" class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://mergiraf.org/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-wasting-ai-tokens-on-merge-conflicts" target="_blank" rel="noopener noreferrer nofollow">Mergiraf</a></p><p class="paragraph" style="text-align:left;">These days, if I hit an annoying merge conflict, there&#39;s a good chance I&#39;ll just hand it off to my coding agent.</p><p class="paragraph" style="text-align:left;">That works, but it also means I&#39;m burning agent context on something that might not require an LLM at all.</p><p class="paragraph" style="text-align:left;">Mergiraf is a syntax-aware merge tool. Instead of only looking at lines of text like Git does, it understands the structure of supported languages and can automatically resolve some conflicts that Git can&#39;t.</p><p class="paragraph" style="text-align:left;">Here&#39;s a real example:</p><div class="codeblock"><pre><code>$ git merge add-retry-config
Auto-merging internal/config.go
CONFLICT (content): Merge conflict in internal/config.go
Automatic merge failed; fix conflicts and then commit the result.

$ mergiraf solve internal/config.go
WARN Cannot solve conflicts in diff2 style. Merging the original conflict sides from scratch instead.
INFO Solved all conflicts.

$ git diff --name-only --diff-filter=U
# no unresolved conflicts
</code></pre></div><p class="paragraph" style="text-align:left;">Plain Git stopped at the conflict. Mergiraf reconstructed the original sides and resolved it structurally.</p><p class="paragraph" style="text-align:left;">That&#39;s the workflow I wanted, so I also made a <a class="link" href="https://github.com/nickytonline/skills/tree/main/mergiraf?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-wasting-ai-tokens-on-merge-conflicts" target="_blank" rel="noopener noreferrer nofollow">Mergiraf Agent Skill</a>.</p><p class="paragraph" style="text-align:left;">When my agent encounters a merge conflict, the skill checks for Mergiraf, installs it if necessary, and runs Mergiraf against the conflicted files first. Only the conflicts that remain get handed back to the agent for reasoning.</p><p class="paragraph" style="text-align:left;">The principle here is bigger than this one tool: <b>don&#39;t spend LLM tokens reasoning about something deterministic tooling can solve first.</b></p><p class="paragraph" style="text-align:left;">You can install Mergiraf with Homebrew, Scoop, or Cargo. See the <a class="link" href="https://mergiraf.org/installation.html?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-wasting-ai-tokens-on-merge-conflicts" target="_blank" rel="noopener noreferrer nofollow">installation instructions</a>.</p><p class="paragraph" style="text-align:left;">Mergiraf won&#39;t magically solve every conflict, and you should still review what it resolves. But if it can make the conflict smaller, or eliminate it entirely, that&#39;s less work for you and less context for your coding agent.</p><p class="paragraph" style="text-align:left;">And if you find Mergiraf useful, you can <a class="link" href="https://mergiraf.org/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-wasting-ai-tokens-on-merge-conflicts" target="_blank" rel="noopener noreferrer nofollow">set it up as your Git merge driver</a> so Git automatically gives it the first shot during merges, rebases, cherry-picks, and reverts.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=e6129c3a-bc54-4c30-b7fe-0aa374564575&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Fighting With Slide Editors</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-fighting-with-slide-editors</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-fighting-with-slide-editors</guid>
  <pubDate>Mon, 14 Sep 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-09-14T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Markdown]]></category>
    <category><![CDATA[Ai]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://marp.app/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-with-slide-editors" target="_blank" rel="noopener noreferrer nofollow">Marp</a>.</p><p class="paragraph" style="text-align:left;">I’m on my third talk using Marp now, and I really don’t want to go back to building presentations in a traditional slide editor.</p><p class="paragraph" style="text-align:left;">Marp lets you build slide decks with Markdown and CSS.</p><p class="paragraph" style="text-align:left;">That alone is useful, but the killer feature for me is how well it works with coding agents.</p><p class="paragraph" style="text-align:left;">I’m working on my <a class="link" href="https://reg.githubuniverse.com/flow/github/universe26/attendee-portal/page/sessioncatalog/session/1777489102123001ThSM?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-with-slide-editors" target="_blank" rel="noopener noreferrer nofollow">GitHub Universe talk</a> right now, and they provided a pretty complex PowerPoint template they want speakers to use. I basically handed it to my agent and said, “make this work in Marp.”</p><p class="paragraph" style="text-align:left;">My agent converted the PowerPoint design to Marp, pulled down the required fonts, installed what it needed, and got me to a working deck.</p><p class="paragraph" style="text-align:left;">From that point on, the presentation is basically source code.</p><div class="codeblock"><pre><code>---
marp: true
theme: conference
---

# Fine-grained authorization

OAuth gets us authentication.

But what should the agent actually be allowed to do?

---

# The problem

- User can merge PRs
- Agent acts as the user
- OAuth doesn&#39;t know the difference</code></pre></div><p class="paragraph" style="text-align:left;">Now I can ask my agent to tighten a few slides, reorganize a section, add speaker notes, or change styling and it just edits the Markdown and CSS.</p><p class="paragraph" style="text-align:left;">I tried something similar with Google Slides and browser automation before this. It was slow, inaccurate, and at one point the agent started trying to script its way around the UI.</p><p class="paragraph" style="text-align:left;">With Marp, there’s no UI to fight.</p><p class="paragraph" style="text-align:left;">Even if you love Keynote or PowerPoint, I think this workflow is worth trying in the agentic era. Markdown and CSS are just a much better interface for an agent to work with.</p><p class="paragraph" style="text-align:left;">You can see my recent Commit Your Code deck <a class="link" href="https://cyc2026.netlify.app/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-with-slide-editors" target="_blank" rel="noopener noreferrer nofollow">running here</a>, along with the generated <a class="link" href="https://cyc2026.netlify.app/pdf?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-with-slide-editors" target="_blank" rel="noopener noreferrer nofollow">PDF</a> and <a class="link" href="https://cyc2026.netlify.app/powerpoint?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-with-slide-editors" target="_blank" rel="noopener noreferrer nofollow">PowerPoint</a>.</p><p class="paragraph" style="text-align:left;">I’ve also put together an open-source <a class="link" href="https://github.com/nickytonline/marp-kit?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-with-slide-editors" target="_blank" rel="noopener noreferrer nofollow">Marp starter kit</a> with the local dev server and PDF/PowerPoint builds already wired up. Clone it, run it locally, and start writing slides.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=82c29b70-1d25-4418-9c79-db553b229140&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Feeding Your Coding Agent Entire Web Pages</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-feeding-your-coding-agent-entire-web-pages</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-feeding-your-coding-agent-entire-web-pages</guid>
  <pubDate>Mon, 07 Sep 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-09-07T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Terminal]]></category>
    <category><![CDATA[Agent Skills]]></category>
    <category><![CDATA[Automation]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://only-cli.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-feeding-your-coding-agent-entire-web-pages" target="_blank" rel="noopener noreferrer nofollow">only-cli</a>.</p><p class="paragraph" style="text-align:left;">Coding agents read the web constantly, but an entire webpage can mean thousands of tokens of HTML, navigation, scripts, and other stuff the agent doesn&#39;t care about.</p><p class="paragraph" style="text-align:left;"><code>oc</code> gives agents a compact, text-first way to browse instead.</p><p class="paragraph" style="text-align:left;">Install it globally:</p><div class="codeblock"><pre><code>npm install -g @only-cli/oc</code></pre></div><p class="paragraph" style="text-align:left;">Here&#39;s a real example using this newsletter.</p><p class="paragraph" style="text-align:left;">Say I&#39;m asking an agent to help find my next terminal-related tip, but I want it to check what I&#39;ve already covered first:</p><div class="codeblock"><pre><code>oc open https://onetipaweek.com &gt;/dev/null
oc find &quot;terminal&quot;</code></pre></div><p class="paragraph" style="text-align:left;">That gave me:</p><div class="codeblock"><pre><code>4 matches for &quot;terminal&quot;
[37] ...Debug Network Problems Without Being a Network Expert
[40] ...Stop Babysitting Long-Running Terminal Commands
[43] ...Paste Images Into Remote AI Coding Agents

actions: do &lt;n&gt; | find &lt;query&gt; | read &lt;n&gt; | next | raw</code></pre></div><p class="paragraph" style="text-align:left;">The page is fetched once and saved locally. <code>find</code> searches that saved page without fetching it again.</p><p class="paragraph" style="text-align:left;">If the agent wants to inspect one of those posts:</p><div class="codeblock"><pre><code>oc do 40</code></pre></div><p class="paragraph" style="text-align:left;">It gets a compact representation of the actual post:</p><div class="codeblock"><pre><code># One Tip a Week: Stop Babysitting Long-Running Terminal Commands

This week&#39;s tip of the week is Pueue

Have you ever started a long-running command, then realized
your terminal is now its permanent babysitter?

Pueue gives you a proper task queue for shell commands.
...</code></pre></div><p class="paragraph" style="text-align:left;">The same pattern works for documentation, changelogs, project sites, blogs, and other mostly static pages.</p><p class="paragraph" style="text-align:left;">It gets even more useful with coding agents. Install the included skill yourself, or just ask your agent to install it:</p><div class="codeblock"><pre><code>npx skills add https://github.com/only-cli/oc --skill web-browsing-cli</code></pre></div><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/56002d76-d460-4981-9ca0-cc233c6aeff2/Snapzy_2026-09-06_22-29-06_620.png?t=1788748290"/><div class="image__source"><span class="image__source_text"><p>Installing the only-cli agent skill in my OpenClaw agent, McClaw</p></span></div></div><p class="paragraph" style="text-align:left;">Now compatible agents can learn to reach for <code>oc</code> automatically instead of pulling whole webpages into context.</p><p class="paragraph" style="text-align:left;">And this is where the token savings get pretty wild. Want to see them yourself?</p><div class="codeblock"><pre><code>oc --stats open https://onetipaweek.com</code></pre></div><p class="paragraph" style="text-align:left;">On the One Tip a Week archive, <code>oc</code> returned about <b>566 tokens versus roughly 196,209 tokens for the raw page HTML</b>, about <b>99.7% fewer tokens</b>.</p><p class="paragraph" style="text-align:left;">That’s a lot less junk competing with the code, docs, and instructions your agent actually needs when using <a class="link" href="https://only-cli.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-feeding-your-coding-agent-entire-web-pages" target="_blank" rel="noopener noreferrer nofollow">only-cli</a>.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=536f1a04-1990-442a-9588-ae4c53b537ea&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: A Pretty Nifty Open-Source Meeting Assistant</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-a-pretty-nifty-open-source-meeting-assistant</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-a-pretty-nifty-open-source-meeting-assistant</guid>
  <pubDate>Mon, 31 Aug 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-08-31T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Desktop App]]></category>
    <category><![CDATA[Ai]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://github.com/Zackriya-Solutions/meetily?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-a-pretty-nifty-open-source-meeting-assistant" target="_blank" rel="noopener noreferrer nofollow">Meetily</a>.</p><p class="paragraph" style="text-align:left;">AI meeting transcription is genuinely useful, but plenty of people don&#39;t want every conversation they have uploaded to a third-party server.</p><p class="paragraph" style="text-align:left;">Meetily is a pretty nifty <b>MIT-licensed</b>, open-source desktop app for recording and transcribing meetings.</p><p class="paragraph" style="text-align:left;">You can record directly in Meetily, or <b>import an existing audio recording</b> and have it generate a transcript and summary for you.</p><p class="paragraph" style="text-align:left;">From there, Meetily gives you a full transcript, summary, key decisions, and action items.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/23cace63-6bc4-444f-a543-ad1138b0971a/Snapzy_2026-08-09_22-29-40_370.png?t=1786328986"/><div class="image__source"><span class="image__source_text"><p>Meetily in action</p></span></div></div><p class="paragraph" style="text-align:left;">The part that really stands out is that Meetily is <b>local-first</b>.</p><p class="paragraph" style="text-align:left;">Transcription can run locally using Whisper or Parakeet, and if you use Ollama for summaries, the whole workflow can stay on your machine.</p><p class="paragraph" style="text-align:left;">If you prefer hosted models, it also supports providers like Claude, OpenAI, Groq, and OpenRouter.</p><p class="paragraph" style="text-align:left;">So you get to choose whether your meeting ever leaves your computer.</p><p class="paragraph" style="text-align:left;">Installation is straightforward on macOS and Windows from the <a class="link" href="https://github.com/Zackriya-Solutions/meetily/releases?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-a-pretty-nifty-open-source-meeting-assistant" target="_blank" rel="noopener noreferrer nofollow">Meetily releases page</a>. Linux users can build it from source.</p><p class="paragraph" style="text-align:left;">Between the polished UI, local processing, import support, and MIT license, this one is definitely worth checking out.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=aaff6da9-228a-4475-9178-ce8aa16e2bbc&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Debug Network Problems Without Being a Network Expert</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-debug-network-problems-without-being-a-network-expert</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-debug-network-problems-without-being-a-network-expert</guid>
  <pubDate>Mon, 24 Aug 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-08-24T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Terminal]]></category>
    <category><![CDATA[Debugging]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week’s tip of the week is <a class="link" href="https://trippy.rs/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-debug-network-problems-without-being-a-network-expert" target="_blank" rel="noopener noreferrer nofollow">Trippy</a>.</p><p class="paragraph" style="text-align:left;">Ever had an app or service suddenly feel slow and wondered whether it was the app, your network, or something in between?</p><p class="paragraph" style="text-align:left;">I’m definitely not a network expert, but Trippy makes getting some clues pretty approachable.</p><p class="paragraph" style="text-align:left;">It combines ping and traceroute into a live terminal UI that shows the stops between your computer and a server, along with things like latency and packet loss.</p><p class="paragraph" style="text-align:left;"><a class="link" href="https://trippy.rs/guides/installation/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-debug-network-problems-without-being-a-network-expert" target="_blank" rel="noopener noreferrer nofollow">Trippy has installation options</a> for Linux, macOS, Windows, and BSD. Depending on your setup, you&#39;ll also need to <a class="link" href="https://trippy.rs/guides/privileges/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-debug-network-problems-without-being-a-network-expert" target="_blank" rel="noopener noreferrer nofollow">configure the required privileges</a> before running it.</p><p class="paragraph" style="text-align:left;">Once installed, point it at a host. Let’s see what the route to GitHub looks like:</p><p class="paragraph" style="text-align:left;"><code>trip -u github.com</code></p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6463e9dc-1ba4-42e1-873d-147ca695f259/Snapzy_2026-08-09_20-12-14_775.png?t=1786320745"/><div class="image__source"><span class="image__source_text"><p>Trippy tracing <a class="link" href="https://github.com?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-debug-network-problems-without-being-a-network-expert" target="_blank" rel="noopener noreferrer nofollow">github.com</a></p></span></div></div><p class="paragraph" style="text-align:left;">Trippy continuously measures the route, so let it run for a bit and you’ll start getting useful data.</p><p class="paragraph" style="text-align:left;">Say the first several stops are hovering around 20ms, but farther along the route that suddenly jumps to 180ms and stays high.</p><p class="paragraph" style="text-align:left;">That’s a useful clue. The slowdown might be somewhere along the network path rather than the service you’re trying to reach.</p><p class="paragraph" style="text-align:left;">I work on an <a class="link" href="https://pomerium.com?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-debug-network-problems-without-being-a-network-expert" target="_blank" rel="noopener noreferrer nofollow">identity-aware proxy</a> for a living, so being able to answer “is this actually the proxy, or is the network having a bad day?” is pretty handy.</p><p class="paragraph" style="text-align:left;">One caveat: don’t assume packet loss at a single stop means you’ve found the culprit. Some routers deprioritize this kind of diagnostic traffic. If the loss doesn’t continue through the following stops, it might not be a problem at all.</p><p class="paragraph" style="text-align:left;">There’s plenty more you can dig into, but you don’t need to be a network guru to start getting useful information from Trippy.</p><p class="paragraph" style="text-align:left;">If you’ve ever reached for ping while debugging something, <span style="color:#0000ee;"><span style="text-decoration:underline;"><a class="link" href="https://trippy.rs/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-debug-network-problems-without-being-a-network-expert" target="_blank" rel="noopener noreferrer nofollow">give Trippy a try</a></span></span>.</p><p class="paragraph" style="text-align:left;">That’s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=1f4ff831-5029-4e5f-885e-33c1d41a3e06&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Shipping Generic AI-Generated UI</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-shipping-generic-ai-generated-ui</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-shipping-generic-ai-generated-ui</guid>
  <pubDate>Mon, 17 Aug 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-08-17T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Agent Skills]]></category>
    <category><![CDATA[Ai]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week’s tip of the week is <a class="link" href="https://www.usehallmark.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-shipping-generic-ai-generated-ui" target="_blank" rel="noopener noreferrer nofollow">Hallmark</a>.</p><p class="paragraph" style="text-align:left;">If you’ve been using AI to build frontends, you’ve probably noticed they can start to feel a little the same. Hallmark helps you stop shipping generic AI-generated UIs.</p><p class="paragraph" style="text-align:left;">Hallmark is an AI skill that teaches your coding agent better design principles. Instead of settling for the same layouts and visual patterns over and over again, it encourages your AI to produce interfaces with better hierarchy, typography, spacing, and overall polish.</p><p class="paragraph" style="text-align:left;">To put it to the test, I gave an AI the exact same prompt with and without Hallmark:</p><p class="paragraph" style="text-align:left;">“Build a landing page for a developer tool called Logtail that helps developers search, filter, and analyze application logs. Include a hero section, a few key features, and a call to action to get started.”</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/f72f9865-57f8-44bf-b01a-6197942e1216/image.png?t=1786294481"/><div class="image__source"><span class="image__source_text"><p>Landing page generated without Hallmark</p></span></div></div><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/d065ae7e-36eb-42a2-9cae-927a321f70bc/image.png?t=1786294557"/><div class="image__source"><span class="image__source_text"><p>Landing page generated with Hallmark</p></span></div></div><p class="paragraph" style="text-align:left;">Subjective and non-deterministic, but I prefer the Hallmark one.</p><p class="paragraph" style="text-align:left;">Installing it takes less than a minute:</p><p class="paragraph" style="text-align:left;">npx skills add nutlope/hallmark</p><p class="paragraph" style="text-align:left;">Once it’s installed, it works with Claude Code, Cursor, Codex, and other Skills-compatible coding agents. You don’t need to learn a new workflow. Just keep prompting like you normally would, but with Hallmark available to your agent.</p><p class="paragraph" style="text-align:left;">A while back I shared <a class="link" href="https://www.useimpeccable.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-shipping-generic-ai-generated-ui" target="_blank" rel="noopener noreferrer nofollow">Impeccable</a>, another AI skill for building better user interfaces. <a class="link" href="https://www.usehallmark.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-shipping-generic-ai-generated-ui" target="_blank" rel="noopener noreferrer nofollow">Hallmark</a> and Impeccable take slightly different approaches, but I’ve found they complement each other really well.</p><p class="paragraph" style="text-align:left;">That’s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=19ec2600-bf7d-449e-bfa9-7fef8243e7f7&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Your Screen Share Needs This</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-your-screen-share-needs-this</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-your-screen-share-needs-this</guid>
  <pubDate>Mon, 10 Aug 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-08-10T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Desktop App]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week’s tip of the week is <span style="color:#0000ee;"><span style="text-decoration:underline;"><a class="link" href="https://github.com/microsoft/ZoomitForMac?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-your-screen-share-needs-this" target="_blank" rel="noopener noreferrer nofollow">ZoomIt for Mac</a></span></span>.</p><p class="paragraph" style="text-align:left;">Windows users might already know ZoomIt from Microsoft’s <span style="color:#0000ee;"><span style="text-decoration:underline;"><a class="link" href="https://learn.microsoft.com/en-us/sysinternals/downloads/sysinternals-suite?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-your-screen-share-needs-this" target="_blank" rel="noopener noreferrer nofollow">Sysinternals Suite</a></span></span>. It’s been a favorite for years, and now there’s finally a native macOS version.</p><p class="paragraph" style="text-align:left;">If you ever find yourself saying, “Can everyone read that?” during a demo, livestream, or video call, this one’s for you.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/ddefc3aa-7377-4df0-9dff-98a8c8afc7b7/Snapzy_Recording_2026-08-09_22-48-08.gif?t=1786330123"/><div class="image__source"><span class="image__source_text"><p>Drawing with ZoomIt</p></span></div></div><p class="paragraph" style="text-align:left;">ZoomIt for Mac lets you instantly zoom into any part of your screen while still interacting with it. You can also draw directly on your screen to highlight something without opening another app or awkwardly resizing windows.</p><p class="paragraph" style="text-align:left;">Install it with Homebrew:</p><p class="paragraph" style="text-align:left;"><code>brew install --cask microsoft/sysinternalstap/zoomit</code></p><p class="paragraph" style="text-align:left;">If you read my earlier tip about <span style="color:#0000ee;"><span style="text-decoration:underline;"><a class="link" href="https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-replace-three-screenshot-tools-with-one-open-source-app?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-your-screen-share-needs-this" target="_blank" rel="noopener noreferrer nofollow">Snapzy</a></span></span>, I’m still using it every day for screenshots, OCR, and recordings. ZoomIt doesn’t replace it. It fills a different niche by making live demos and screen shares easier to follow.</p><p class="paragraph" style="text-align:left;">That’s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=8b0db023-e5e5-4d4e-8c12-49a4b0559bca&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Babysitting Long-Running Terminal Commands</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-babysitting-long-running-terminal-commands</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-babysitting-long-running-terminal-commands</guid>
  <pubDate>Mon, 03 Aug 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-08-03T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://github.com/Nukesor/pueue?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-babysitting-long-running-terminal-commands" target="_blank" rel="noopener noreferrer nofollow">Pueue</a>.</p><p class="paragraph" style="text-align:left;">Have you ever started a long-running command, then realized your terminal is now its permanent babysitter?</p><p class="paragraph" style="text-align:left;">Maybe it’s a build, a large download, video processing, a test suite, or some job running in your homelab. You can open another terminal, throw it into <code>tmux</code>, or tack on <code>&amp;</code>, but then you’re managing processes instead of getting work done.</p><p class="paragraph" style="text-align:left;">Pueue gives you a proper task queue for shell commands.</p><p class="paragraph" style="text-align:left;">Add a few jobs:</p><div class="codeblock"><pre><code>pueue add &quot;npm run build&quot;
pueue add &quot;npm test&quot;
pueue add &quot;yt-dlp https://example.com/video&quot;</code></pre></div><p class="paragraph" style="text-align:left;">By default, Pueue runs them one at a time. You can see everything in the queue with:</p><div class="codeblock"><pre><code>pueue status</code></pre></div><p class="paragraph" style="text-align:left;">Need to inspect the output from a task?</p><div class="codeblock"><pre><code>pueue log 0</code></pre></div><p class="paragraph" style="text-align:left;">You can also pause the queue, resume it later, or restart a failed task:</p><div class="codeblock"><pre><code>pueue pause
pueue start
pueue restart 0</code></pre></div><p class="paragraph" style="text-align:left;">If your machine can handle more work, let multiple tasks run at once:</p><div class="codeblock"><pre><code>pueue parallel 3</code></pre></div><p class="paragraph" style="text-align:left;">Pueue runs through a background daemon. The queue isn’t tied to the terminal where you created it, so you can close the window or end an SSH session without losing your jobs. Your task history and logs are persisted too.</p><p class="paragraph" style="text-align:left;">Pueue works on macOS, Linux, and Windows. On macOS, install it with Homebrew:</p><div class="codeblock"><pre><code>brew install pueue
brew services start pueue</code></pre></div><p class="paragraph" style="text-align:left;">You can also install it using your system package manager, download a prebuilt binary, or use Cargo:</p><div class="codeblock"><pre><code>cargo install --locked pueue
pueued -d</code></pre></div><p class="paragraph" style="text-align:left;">It’s not trying to replace cron, CI, or a heavy-duty job scheduler. It’s for those commands you start manually but don’t want to babysit manually. Give <a class="link" href="https://github.com/Nukesor/pueue?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-babysitting-long-running-terminal-commands" target="_blank" rel="noopener noreferrer nofollow">Pueue</a> a try and let me know what you think!</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=91a4a769-86ea-4d9b-8a1a-5aa117861d4f&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Writing Scripts to Inspect Data</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-writing-scripts-to-inspect-data</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-writing-scripts-to-inspect-data</guid>
  <pubDate>Mon, 27 Jul 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-07-27T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://duckdb.org/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-writing-scripts-to-inspect-data" target="_blank" rel="noopener noreferrer nofollow">DuckDB</a>.</p><p class="paragraph" style="text-align:left;">At some point, most developers get handed a data export and need to answer one question about it.</p><p class="paragraph" style="text-align:left;">If the file is small, you open it in a spreadsheet. If it is large or nested, you start writing a throwaway script, importing it into a database, or watching your editor reconsider its life choices.</p><p class="paragraph" style="text-align:left;">DuckDB lets you query CSV, JSON, and Parquet files directly with SQL. There is no database server to run, schema to define, or import step required.</p><p class="paragraph" style="text-align:left;">I recently exported all the 404 URLs from Google Search Console to figure out why Google was still crawling pages that no longer existed on my site.</p><p class="paragraph" style="text-align:left;">Follow the <a class="link" href="https://duckdb.org/install/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-writing-scripts-to-inspect-data" target="_blank" rel="noopener noreferrer nofollow">installation page</a> for Windows, macOS, or Linux. On macOS and Linux:</p><div class="codeblock"><pre><code>curl https://install.duckdb.org | sh</code></pre></div><p class="paragraph" style="text-align:left;">The installer will tell you how to add DuckDB to your PATH. Then launch it:</p><div class="codeblock"><pre><code>duckdb</code></pre></div><p class="paragraph" style="text-align:left;">Query the CSV by filename:</p><div class="codeblock"><pre><code>SELECT URL, &quot;Last crawled&quot;
FROM &#39;Table.csv&#39;
ORDER BY &quot;Last crawled&quot; DESC
LIMIT 10;</code></pre></div><p class="paragraph" style="text-align:left;">I only cared about the route paths so I could search my codebase and content:</p><div class="codeblock"><pre><code>SELECT
  regexp_extract(URL, &#39;^https?://[^/]+(/[^?]*)&#39;, 1) AS path,
  &quot;Last crawled&quot;
FROM &#39;Table.csv&#39;
ORDER BY &quot;Last crawled&quot; DESC
LIMIT 10;</code></pre></div><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/a50dc27f-5b47-4279-a295-d15a6ed5a1ef/Snapzy_2026-07-25_08-26-43_150.png?t=1784982408"/><div class="image__source"><span class="image__source_text"><p>Extracting route paths from a Google Search Console CSV export</p></span></div></div><p class="paragraph" style="text-align:left;">It does not even need to be a local file. DuckDB can also query JSON and Parquet files directly over HTTPS.</p><p class="paragraph" style="text-align:left;">For example, I queried the live speaker data from AI Engineer Europe 2026, where I spoke this year. I expanded each speaker’s sessions and, for fun, found everyone whose name starts with <code>nic</code>:</p><div class="codeblock"><pre><code>SELECT
  speaker.name,
  speaker.role,
  speaker.company,
  talk.title
FROM read_json_auto(
  &#39;https://www.ai.engineer/europe/2026/speakers.json&#39;
) AS conference,
UNNEST(conference.speakers) AS s(speaker),
UNNEST(speaker.sessions) AS t(talk)
WHERE speaker.name ILIKE &#39;nic%&#39;
ORDER BY speaker.name, talk.title;
</code></pre></div><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/2c0a49e5-20bd-4427-92cb-eb197acbb759/Snapzy_2026-07-25_08-48-39_213.png?t=1784984041"/><div class="image__source"><span class="image__source_text"><p>Querying remote JSON data with DuckDB</p></span></div></div><p class="paragraph" style="text-align:left;">That is the kind of task I would normally reach for <code>jq</code> or a quick script to handle.</p><p class="paragraph" style="text-align:left;">Prefer a UI? Run <code>duckdb -ui</code> to browse data and write SQL in a local browser interface.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/6c0d0aab-7317-45fa-8304-f0cc3ccced60/Snapzy_2026-07-25_08-56-59_156.png?t=1784984232"/><div class="image__source"><span class="image__source_text"><p>Running the DuckDB UI locally in a browser</p></span></div></div><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=f206572e-cca9-44d6-affd-6eb9803daab7&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Fighting Your Git Hooks</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-fighting-your-git-hooks</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-fighting-your-git-hooks</guid>
  <pubDate>Mon, 20 Jul 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-07-20T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://hk.jdx.dev/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-your-git-hooks" target="_blank" rel="noopener noreferrer nofollow">hk</a>.</p><p class="paragraph" style="text-align:left;">I&#39;ve always found Git hooks useful, but I think they matter even more now that agents are writing and changing more of our code.</p><p class="paragraph" style="text-align:left;">The more code our tools generate, the more valuable it is to automatically catch formatting issues, lint errors, broken tests, or even leaked secrets before they become commits.</p><p class="paragraph" style="text-align:left;">The problem is that slow Git hooks are easy to resent.</p><p class="paragraph" style="text-align:left;">You make a commit, stare at your terminal while formatting runs, then linting, then tests... and before long <code>git commit --no-verify</code> starts looking very tempting.</p><p class="paragraph" style="text-align:left;">That&#39;s where hk comes in.</p><p class="paragraph" style="text-align:left;">hk is a Git hook manager that can run independent checks like formatting, linting, and type checking in parallel when it&#39;s safe to do so, while still making sure dependent steps happen in the right order.</p><p class="paragraph" style="text-align:left;">hk supports several installation methods across macOS, Linux, and Windows. Check out the <a class="link" href="https://hk.jdx.dev/getting_started?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-your-git-hooks" target="_blank" rel="noopener noreferrer nofollow">installation docs</a> for your platform.</p><p class="paragraph" style="text-align:left;">Once it&#39;s installed, add its Git hooks to your repository:</p><div class="codeblock"><pre><code>hk install</code></pre></div><p class="paragraph" style="text-align:left;">I&#39;ve spent a lot of time in the JavaScript and TypeScript ecosystems, so I&#39;ve generally used Git hook tooling distributed as npm packages. But Git hooks are really repository infrastructure. The repository might contain Go, Rust, Python, JavaScript, or all of the above.</p><p class="paragraph" style="text-align:left;">If you&#39;re happy with tools like <a class="link" href="https://github.com/typicode/husky?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-your-git-hooks" target="_blank" rel="noopener noreferrer nofollow">Husky</a>, <a class="link" href="https://github.com/lint-staged/lint-staged?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-your-git-hooks" target="_blank" rel="noopener noreferrer nofollow">lint-staged</a>, or maybe <a class="link" href="https://viteplus.dev/guide/commit-hooks?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-fighting-your-git-hooks" target="_blank" rel="noopener noreferrer nofollow">Vite+&#39;s hooks support</a>, there&#39;s no urgent reason to switch. But if your hooks are starting to feel slow, or you&#39;re working across multiple languages, hk is well worth a look.</p><p class="paragraph" style="text-align:left;">Give it a go and let me know what you think.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=027745a1-cbee-4d60-9469-9e9d9b3be3d3&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Paste Images Into Remote AI Coding Agents</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-paste-images-into-remote-ai-coding-agents</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-paste-images-into-remote-ai-coding-agents</guid>
  <pubDate>Mon, 13 Jul 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-07-13T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Terminal]]></category>
    <category><![CDATA[Llm]]></category>
    <category><![CDATA[Claude Code]]></category>
    <category><![CDATA[Ai]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://herdr.dev/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-paste-images-into-remote-ai-coding-agents" target="_blank" rel="noopener noreferrer nofollow">herdr</a>.</p><p class="paragraph" style="text-align:left;">If you run an AI coding agent on a remote machine, you&#39;ve probably hit this annoying little problem.</p><p class="paragraph" style="text-align:left;">You take a screenshot, copy it, switch to your SSH session, and discover you can&#39;t paste the image into Claude Code, Codex, Pi, or whatever agent you&#39;re using.</p><p class="paragraph" style="text-align:left;">herdr&#39;s native remote mode fixes that:</p><div class="codeblock"><pre><code>herdr --remote workbox
</code></pre></div><p class="paragraph" style="text-align:left;">Your local herdr client connects to a herdr session on the remote machine, bridging your clipboard, including images. If herdr isn&#39;t already installed remotely, it&#39;ll offer to install it for you.</p><p class="paragraph" style="text-align:left;">Honestly, that feature alone sold me on it.</p><p class="paragraph" style="text-align:left;">The rest is why I&#39;ve been using herdr every day.</p><p class="paragraph" style="text-align:left;">I mostly run it locally as the command centre for my development workflow. Some panes have local agents, others SSH into remote machines, and others run dev servers, logs, or regular terminal commands.</p><p class="paragraph" style="text-align:left;">herdr also understands agent state, so I can see which agents are working, idle, done, or waiting for me. It can play a sound when one finishes or needs input, which means less tab-hopping to check whether anything happened.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/8abcf396-bf39-4eef-a51c-8783f8ab62a2/Snapzy_2026-07-11_09-38-08_667.png?t=1783777098"/><div class="image__source"><span class="image__source_text"><p>herdr in action</p></span></div></div><p class="paragraph" style="text-align:left;">Its keyboard shortcuts follow familiar tmux conventions. For example, <code>Ctrl+B</code>, then <code>Q</code>, detaches from the session. Run <code>herdr</code> again later, and you&#39;re back in the same live session with your panes and processes still running.</p><p class="paragraph" style="text-align:left;">I&#39;m no tmux expert, either. Herdr has excellent mouse support, so you can click panes, tabs, agents, and context menus while the shortcuts slowly become muscle memory.</p><p class="paragraph" style="text-align:left;">Install herdr on macOS with Homebrew:</p><div class="codeblock"><pre><code>brew install herdr</code></pre></div><p class="paragraph" style="text-align:left;">You can also use its installer on Linux or macOS:</p><div class="codeblock"><pre><code>curl -fsSL https://herdr.dev/install.sh | sh</code></pre></div><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=29df675a-facb-4cd2-a4bd-60d8b2937f61&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Typing So Much</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-typing-so-much</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-typing-so-much</guid>
  <pubDate>Mon, 06 Jul 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-07-06T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://handy.computer/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-typing-so-much" target="_blank" rel="noopener noreferrer nofollow">Handy</a>.</p><p class="paragraph" style="text-align:left;">I started using Handy recently, and it&#39;s quickly become one of the apps I use every day. Before Handy, I was using macOS&#39;s built in dictation. It wasn&#39;t bad, but Handy has been noticeably more accurate thanks to its offline speech-to-text models like Whisper and Parakeet. After a few days, I stopped reaching for the built in dictation altogether.</p><p class="paragraph" style="text-align:left;">I&#39;ve mostly been using it for two things. The first is blogging. It&#39;s often easier to explain an idea than type it. I&#39;ll dictate a rough draft, then go back and clean it up later. The second is talking to AI coding agents. Instead of typing long prompts, I just press a shortcut, explain what I want, and press it again when I&#39;m done.</p><p class="paragraph" style="text-align:left;">Because Handy works at the operating system level, it doesn&#39;t matter whether I&#39;m talking to Claude Code, ChatGPT, Goose, GitHub Copilot, or writing in VS Code, Slack, GitHub, Notion, or my browser. If I can type there, I can dictate there.</p><p class="paragraph" style="text-align:left;">Another thing I appreciate is that everything runs locally. Your audio stays on your machine, which makes it much easier to use with work projects than cloud-based dictation services. It also supports models for languages other than English.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/4843642a-b4c0-4368-9f14-329bc38964d4/Snapzy_2026-06-29_12-44-41_808.png?t=1782751512"/><div class="image__source"><span class="image__source_text"><p>Handy list of text to speech models</p></span></div></div><p class="paragraph" style="text-align:left;">Installing it is straightforward. You can <a class="link" href="https://handy.computer/download?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-typing-so-much" target="_blank" rel="noopener noreferrer nofollow">download the app</a> or use one of the following:</p><div class="codeblock"><pre><code># macOS
brew install --cask handy

# Windows
winget install cjpais.Handy</code></pre></div><p class="paragraph" style="text-align:left;">Linux users can download the latest <a class="link" href="https://github.com/cjpais/Handy?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-typing-so-much" target="_blank" rel="noopener noreferrer nofollow">release from the project page</a>. There are a few distro and desktop environment specific notes in the README, so I&#39;d recommend following the official installation instructions.</p><p class="paragraph" style="text-align:left;">I still use a keyboard for writing code, but for blog posts, documentation, AI prompts, GitHub issues, and Slack messages, I&#39;ve found myself reaching for Handy more and more.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=70b58d51-8c7a-4c8d-848e-53c8909df1fc&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>Search Code by Structure, Not Text</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/search-code-by-structure-not-text</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/search-code-by-structure-not-text</guid>
  <pubDate>Mon, 29 Jun 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-06-29T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Terminal]]></category>
    <category><![CDATA[Code Search]]></category>
    <category><![CDATA[Debugging]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://ast-grep.github.io?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=search-code-by-structure-not-text" target="_blank" rel="noopener noreferrer nofollow">ast-grep</a>.</p><p class="paragraph" style="text-align:left;">Have you ever needed to update code across a large codebase and immediately regretted opening the search box? Regex can get you surprisingly far, but eventually you hit the wall. Code is structured. Text search is not.</p><p class="paragraph" style="text-align:left;">That&#39;s where ast-grep comes in. It lets you search and rewrite code based on its <a class="link" href="https://en.wikipedia.org/wiki/Abstract_syntax_tree?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=search-code-by-structure-not-text" target="_blank" rel="noopener noreferrer nofollow">abstract syntax tree</a> (AST) instead of matching raw text. It understands the structure of your code, which means you can find things that would be painful, fragile, or downright impossible with traditional search.</p><p class="paragraph" style="text-align:left;">For example, find every <code>console.log</code> call:</p><div class="codeblock"><pre><code>ast-grep --pattern &#39;console.log($$$)&#39;</code></pre></div><p class="paragraph" style="text-align:left;">Or find every <code>slog.New</code> call in a Go progam:</p><div class="codeblock"><pre><code>ast-grep --lang go --pattern &#39;slog.New($$$)&#39;</code></pre></div><p class="paragraph" style="text-align:left;">Or find every React <code>useEffect</code>:</p><div class="codeblock"><pre><code>ast-grep --pattern &#39;useEffect($$$)&#39;</code></pre></div><p class="paragraph" style="text-align:left;">You can even perform safe code transformations across an entire project. Let&#39;s say your team deprecated a function <code>oldApi(user)</code> and replaced it with <code>newApi(user)</code>. Instead of manually hunting through hundreds of files, ast-grep can find every usage and even rewrite them for you.</p><p class="paragraph" style="text-align:left;">The real magic happens when you start creating reusable rules. Teams can use ast-grep for code migrations, enforcing conventions, detecting anti-patterns, and cleaning up large refactors.</p><p class="paragraph" style="text-align:left;">You can <a class="link" href="https://github.com/ast-grep/ast-grep?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=search-code-by-structure-not-text#installation" target="_blank" rel="noopener noreferrer nofollow">install it via brew, cargo, npm and many other package managers</a>.</p><p class="paragraph" style="text-align:left;">If you&#39;ve ever written a regex that looked like Klingon just to find a function call, <a class="link" href="https://ast-grep.github.io?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=search-code-by-structure-not-text" target="_blank" rel="noopener noreferrer nofollow">ast-grep</a> is worth a look.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=2e03361e-da1c-44b0-9d10-4cff90a9ae7b&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Find Broken Links Before Your Readers Do</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-find-broken-links-before-your-readers-do</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-find-broken-links-before-your-readers-do</guid>
  <pubDate>Mon, 22 Jun 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-06-22T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Terminal]]></category>
    <category><![CDATA[Markdown]]></category>
    <category><![CDATA[Testing]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://github.com/lycheeverse/lychee?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-find-broken-links-before-your-readers-do" target="_blank" rel="noopener noreferrer nofollow">Lychee</a></p><p class="paragraph" style="text-align:left;">You know what’s fun? Clicking a link in a README or documentation and landing on a 404. Actually, no. It’s not fun. It makes your docs feel stale, your project feel abandoned.</p><p class="paragraph" style="text-align:left;">Lychee is a fast link checker written in Rust that can scan Markdown, HTML, reStructuredText, websites, and more. It finds broken links and email addresses before someone opens an issue with “hey, this link is dead.”</p><p class="paragraph" style="text-align:left;">Install on macOS with Homebrew:</p><div class="codeblock"><pre><code>brew install lychee</code></pre></div><p class="paragraph" style="text-align:left;">on Windows:</p><div class="codeblock"><pre><code>winget install --id lycheeverse.lychee</code></pre></div><p class="paragraph" style="text-align:left;">on Linux:</p><div class="codeblock"><pre><code>snap install lychee</code></pre></div><p class="paragraph" style="text-align:left;">and for other Linux and other install options, see their <a class="link" href="https://github.com/lycheeverse/lychee?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-find-broken-links-before-your-readers-do#installation" target="_blank" rel="noopener noreferrer nofollow">installation docs</a>.</p><p class="paragraph" style="text-align:left;">Once installed, run it against a project:</p><div class="codeblock"><pre><code>lychee .</code></pre></div><p class="paragraph" style="text-align:left;">Or check specific files:</p><div class="codeblock"><pre><code>lychee README.md docs/**/*.md</code></pre></div><p class="paragraph" style="text-align:left;">Or check a website. Here it is in action on my own site:</p><div class="codeblock"><pre><code>❯ lychee https://nickyt.co
32/32 ━━━━━━━━━━━━━━━━━━━━ Finished extracting links                                                                                                        🔍 32 Total (in 4s 646ms) 🔗 28 Unique ✅ 32 OK 🚫 0 Errors 🔀 27 Redirects

Hint: Followed 27 redirects. You might want to consider replacing redirecting URLs with the resolved URLs. Use verbose mode (`-v`/`-vv`) to see redirection details.</code></pre></div><p class="paragraph" style="text-align:left;">That’s already useful locally, but the real win is putting it in continuous integration (CI) so broken links fail before they ship. Check out the <a class="link" href="https://github.com/marketplace/actions/lychee-broken-link-checker?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-find-broken-links-before-your-readers-do" target="_blank" rel="noopener noreferrer nofollow">official GitHub Action</a>.</p><p class="paragraph" style="text-align:left;">Here’s a tiny GitHub Actions example:</p><div class="codeblock"><pre><code>name: Links

on:
  repository_dispatch:
  workflow_dispatch:
  schedule:
    - cron: &quot;00 18 * * *&quot;

jobs:
  linkChecker:
    runs-on: ubuntu-latest
    permissions:
      issues: write # required for peter-evans/create-issue-from-file
    steps:
      - uses: actions/checkout@v5

      - name: Link Checker
        id: lychee
        uses: lycheeverse/lychee-action@v2
        with:
          fail: false

      - name: Create Issue From File
        if: steps.lychee.outputs.exit_code != 0
        uses: peter-evans/create-issue-from-file@v5
        with:
          title: Link Checker Report
          content-filepath: ./lychee/out.md
          labels: report, automated issue</code></pre></div><p class="paragraph" style="text-align:left;">You can also add a <code>.lycheeignore</code> file for links you know are weird, temporary, private, or blocked by some site that hates bots. The internet is held together with duct tape and redirects, so this matters.</p><p class="paragraph" style="text-align:left;">I like this because it’s boring in the best way. It catches the stuff you probably won’t notice during a docs update, blog migration, repo cleanup, or release.</p><p class="paragraph" style="text-align:left;">And honestly, I would rather have a robot tell me a link is broken than have a reader discover it first. Ready to add it? <a class="link" href="https://github.com/marketplace/actions/lychee-broken-link-checker?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-find-broken-links-before-your-readers-do" target="_blank" rel="noopener noreferrer nofollow">Drop it in your CI today</a>.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=7eaf403a-07e7-483d-84aa-e4557427acfd&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Stop Installing a Version Manager for Every Language</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-installing-a-version-manager-for-every-language</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-stop-installing-a-version-manager-for-every-language</guid>
  <pubDate>Mon, 15 Jun 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-06-15T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Terminal]]></category>
    <category><![CDATA[Automation]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://mise.jdx.dev/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-installing-a-version-manager-for-every-language" target="_blank" rel="noopener noreferrer nofollow">mise</a></p><p class="paragraph" style="text-align:left;">If you jump between repos a lot, you probably know this dance:</p><p class="paragraph" style="text-align:left;">“Which Node version does this use again?”<br>“Was this project on Python 3.11 or 3.12?”<br>“Where did we document the env vars?”<br>“Is the setup command in the README, package.json, Makefile, or someone’s brain?”</p><p class="paragraph" style="text-align:left;">mise helps clean that up by managing project-specific runtimes, environment variables, and tasks from one config file.</p><p class="paragraph" style="text-align:left;">Think of it like parts of <code>asdf</code>, <code>pyenv</code>, <code>rbenv</code>, <code>nvm</code>, and task runners like Make or npm scripts living under one roof, without turning your dev setup into a scavenger hunt.</p><p class="paragraph" style="text-align:left;">Install it using the <a class="link" href="https://mise.jdx.dev/getting-started.html?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-stop-installing-a-version-manager-for-every-language" target="_blank" rel="noopener noreferrer nofollow">mise install docs</a>. There are options for Homebrew, curl, package managers, and shell setup. Pick whatever install method from the buffet you prefer.</p><p class="paragraph" style="text-align:left;">Once it’s set up, add a <code>mise.toml</code> to your project. Here’s a small <code>mise.toml</code> example:</p><div class="codeblock"><pre><code>[tools]
node = &quot;22&quot;
python = &quot;3.12&quot;

[env]
NODE_ENV = &quot;development&quot;
API_URL = &quot;http://localhost:3000&quot;

[tasks.install]
description = &quot;Install project dependencies&quot;
run = &quot;npm install &amp;&amp; pip install -r requirements.txt&quot;

[tasks.dev]
description = &quot;Start the app and API&quot;
run = &quot;npm run dev &amp; python manage.py runserver&quot;

[tasks.test]
description = &quot;Run tests&quot;
run = &quot;npm test&quot;</code></pre></div><p class="paragraph" style="text-align:left;">Now when someone opens the repo, they can run:</p><div class="codeblock"><pre><code>mise install # install runtimes, e.f. Node 22, Python 3.12
mise run install # install task
mise run dev</code></pre></div><p class="paragraph" style="text-align:left;">For a simple Node app, I’d probably keep using <code>npm run dev</code>. No need to add another layer just for the vibes. The win with mise is that the right Node version, Python version, and env vars are already loaded before that command runs.</p><p class="paragraph" style="text-align:left;">The task runner side is more useful when a repo crosses ecosystems, or when you want consistent commands across projects. One repo might use <code>npm run dev</code>, another <code>pnpm dev</code>, another <code>cargo run</code>, but your muscle memory can stay <code>mise run dev</code>.</p><p class="paragraph" style="text-align:left;">One honest caveat: mise configs can run commands, so treat a new <code>mise.toml</code> like you would a shell script from a repo you just cloned. Read it before trusting it.</p><p class="paragraph" style="text-align:left;">Even if you are happy with <code>asdf</code>, <code>direnv</code>, <code>nvm</code>, or a pile of npm scripts, mise is worth a look if your projects keep needing “just one more setup step.”</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=abb497b1-e4ab-41f8-9c19-2ffec6d22a4a&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Reclaim Disk Space From Old Coding Projects</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-reclaim-disk-space-from-old-coding-projects</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-reclaim-disk-space-from-old-coding-projects</guid>
  <pubDate>Mon, 08 Jun 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-06-08T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Terminal]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://github.com/tbillington/kondo?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-reclaim-disk-space-from-old-coding-projects" target="_blank" rel="noopener noreferrer nofollow">Kondo</a>.</p><p class="paragraph" style="text-align:left;">Do you have a folder full of old coding projects that you swear you’re going to come back to? Same. The problem is that those projects are usually dragging around a bunch of stuff you do not need anymore: dependencies, build artifacts, caches, compiled output, etc.</p><p class="paragraph" style="text-align:left;">Kondo helps clean that up. This is not just “delete <code>node_modules</code> again.” à la <code>rimraf</code> or <code>rm -rf</code>. Kondo supports 20+ project types across different stacks, which makes it a nice cleanup tool for anyone with a messy <code>~/code</code>, <code>~/dev</code>, or <code>~/projects</code> folder.</p><p class="paragraph" style="text-align:left;">It scans your projects and finds dependency and build artifact folders that can usually be regenerated later. Think <code>node_modules</code>, Rust <code>target</code>, <code>build</code> folders, Composer <code>vendor</code>, CMake artifacts, and a bunch more.</p><p class="paragraph" style="text-align:left;">Install it with Homebrew:</p><div class="codeblock"><pre><code>brew install kondo</code></pre></div><p class="paragraph" style="text-align:left;">Or with Cargo (you’ll need <a class="link" href="https://rust-lang.org/tools/install/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-reclaim-disk-space-from-old-coding-projects" target="_blank" rel="noopener noreferrer nofollow">rust installed</a>):</p><div class="codeblock"><pre><code>cargo install kondo</code></pre></div><p class="paragraph" style="text-align:left;">Then point it at a folder:</p><div class="codeblock"><pre><code>kondo ~/code</code></pre></div><p class="paragraph" style="text-align:left;">Kondo will scan your projects and prompt you before deleting anything. This is basically <code>rm -rf</code> with a nicer workflow and prompts. That is useful, but it also means you should review what it wants to delete before smashing yes like you’re accepting cookie banners.</p><p class="paragraph" style="text-align:left;">A good first run is somewhere scoped:</p><div class="codeblock"><pre><code>❯ kondo ./mcterm
/Users/nicktaylor/dev/oss/mcterm/McTermCore Swift project (3 months ago)
  └─ .build (804.2MiB)
  └─ .swiftpm (345.0B)
  delete above artifact directories? ([y]es, [n]o, [a]ll, [q]uit): y
Projects cleaned: 1/1, Bytes deleted: 804.2MiB / 804.2MiB
</code></pre></div><p class="paragraph" style="text-align:left;">If you have a pile of cloned repos, abandoned experiments, or conference demo apps sitting around, this is an easy way to claw back space without manually spelunking through every folder.</p><p class="paragraph" style="text-align:left;">I’ve <a class="link" href="https://onetipaweek.com/p/one-tip-a-week-free-up-95gb-on-your-mac?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-reclaim-disk-space-from-old-coding-projects" target="_blank" rel="noopener noreferrer nofollow">written about Mole</a> before, which is also in the disk cleanup world (macOS only), but Kondo is more focused on cleaning dependency and build artifacts from code projects specifically, so it earns its own spot.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=107e987e-d860-45d8-9ad1-cac696395885&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

      <item>
  <title>One Tip a Week: Before You npm Install That Package</title>
  <description>One developer tip a week. Short &amp; valuable. That&#39;s it!</description>
  <link>https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-before-you-npm-install-that-package</link>
  <guid isPermaLink="true">https://one-tip-a-week.beehiiv.com/p/one-tip-a-week-before-you-npm-install-that-package</guid>
  <pubDate>Mon, 01 Jun 2026 11:00:00 +0000</pubDate>
  <atom:published>2026-06-01T11:00:00Z</atom:published>
    <dc:creator>Nick Taylor</dc:creator>
    <category><![CDATA[Node.Js]]></category>
    <category><![CDATA[Security]]></category>
  <content:encoded><![CDATA[
    <div class='beehiiv'><style>
  .bh__table, .bh__table_header, .bh__table_cell { border: 1px solid #C0C0C0; }
  .bh__table_cell { padding: 5px; background-color: #FFFFFF; }
  .bh__table_cell p { color: #2D2D2D; font-family: 'Helvetica',Arial,sans-serif !important; overflow-wrap: break-word; }
  .bh__table_header { padding: 5px; background-color:#F1F1F1; }
  .bh__table_header p { color: #2A2A2A; font-family:'Trebuchet MS','Lucida Grande',Tahoma,sans-serif !important; overflow-wrap: break-word; }
</style><div class='beehiiv__body'><p class="paragraph" style="text-align:left;">This week&#39;s tip of the week is <a class="link" href="https://docs.socket.dev/docs/socket-firewall-free?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-before-you-npm-install-that-package" target="_blank" rel="noopener noreferrer nofollow">Socket Firewall Free</a>.</p><p class="paragraph" style="text-align:left;">I’ve been using <a class="link" href="https://github.com/nickytonline/nickytdotco/pull/914?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-before-you-npm-install-that-package" target="_blank" rel="noopener noreferrer nofollow">Socket’s GitHub app in my OSS projects</a>, but for some reason, I wasn’t using Socket’s firewall locally.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/fd1ea74e-dc23-4b50-bfd9-a774da5e1454/Snapzy_2026-05-22_13-11-37_795.png?t=1779448303"/></div><p class="paragraph" style="text-align:left;">Sébastien Lorber, who runs the excellent React newsletter This Week In React (<a class="link" href="https://thisweekinreact.com/?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-before-you-npm-install-that-package" target="_blank" rel="noopener noreferrer nofollow">subscribe</a> if you live in React), <a class="link" href="https://x.com/sebastienlorber/status/2057733567484953019?s=20&utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-before-you-npm-install-that-package" target="_blank" rel="noopener noreferrer nofollow">shared his local setup for this</a>. It’s worth sharing beyond the React ecosystem because npm supply chain attacks keep getting worse.</p><p class="paragraph" style="text-align:left;">The setup is simple:</p><div class="codeblock"><pre><code>npm install -g sfw

# add these to your shell profile
alias npm=&quot;sfw npm&quot;
alias npx=&quot;sfw npx&quot;
alias pnpm=&quot;sfw pnpm&quot;
alias yarn=&quot;sfw yarn&quot;
alias bun=&quot;sfw bun&quot;</code></pre></div><p class="paragraph" style="text-align:left;">Now your package manager commands run through Socket Firewall first.</p><p class="paragraph" style="text-align:left;">So instead of blindly running <code>npm install</code>, <code>npx some-random-cli</code>, or <code>pnpm add whatever</code>, Socket Firewall Free can block known malware before it hits your machine.</p><div class="image"><img alt="" class="image__image" style="" src="https://media.beehiiv.com/cdn-cgi/image/fit=scale-down,format=auto,onerror=redirect,quality=80/uploads/asset/file/cd364850-213d-4cfb-b803-c05019e44ec9/Snapzy_Recording_2026-05-22_14-51-14.gif?t=1779454570"/><div class="image__source"><span class="image__source_text"><p>Socket Firewall Free in action</p></span></div></div><p class="paragraph" style="text-align:left;">Socket Firewall Free is free, as the name implies, for both open source and commercial use, which makes it an easy win for local development machines.<br><br>As I mentioned, they also offer a GitHub integration and team features for CI/CD workflows.<br><br>This is a no-brainer to set up locally.</p><p class="paragraph" style="text-align:left;">That&#39;s it! Short and sweet. Until the next one!<br><br>Update 2026-06-01 11:04am: Thanks for this heads up from one of our subscribers. <b>Telemetry is not configurable.</b> <a class="link" href="https://docs.socket.dev/docs/socket-firewall-free?utm_source=one-tip-a-week.beehiiv.com&utm_medium=newsletter&utm_campaign=one-tip-a-week-before-you-npm-install-that-package#telemetry" target="_blank" rel="noopener noreferrer nofollow">Socket Firewall Free collects anonymous telemetry</a>. Socket Firewall Enterprise allows you to configure telemetry collection.</p></div><div class='beehiiv__footer'><br class='beehiiv__footer__break'><hr class='beehiiv__footer__line'><a target="_blank" class="beehiiv__footer_link" style="text-align: center;" href="https://www.beehiiv.com/powered-by?publication_logo=https%3A%2F%2Fmedia.beehiiv.com%2Fcdn-cgi%2Fimage%2Ffit%3Dscale-down%2Cformat%3Dauto%2Conerror%3Dredirect%2Cquality%3D80%2Fuploads%2Fpublication%2Flogo%2Fe873e0ca-6b39-402e-8c1e-9eadfeae594f%2FCloudinary_Image_800x800.jpg%3Fv%3D1791861625&publication_name=One+Tip+a+Week&utm_campaign=d7133dae-49f2-49f2-923e-6bc88c58f21f&utm_medium=post_rss&utm_source=one_tip_a_week">Powered by beehiiv</a></div></div>
  ]]></content:encoded>
</item>

  </channel>
</rss>
