joshua.seigler.net/posts/tools-of-the-trade/index.html
Joshua Seigler 1fe29b8b1a Updates
2025-06-26 19:12:39 -04:00

247 lines
8.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta
name="viewport"
content="width=device-width, initial-scale=1.0, viewport-fit=cover"
/>
<link rel="stylesheet" href="/site.css?v=658836c9b392" />
<style>
/* inter-latin-wght-normal */
@font-face {
font-family: "Inter Variable";
font-style: normal;
font-display: swap;
font-weight: 100 900;
src: url(/fonts/inter-latin-wght-normal.woff2)
format("woff2-variations");
unicode-range:
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
U+2212, U+2215, U+FEFF, U+FFFD;
} /* inter-latin-wght-italic */
@font-face {
font-family: "Inter Variable";
font-style: italic;
font-display: swap;
font-weight: 100 900;
src: url(/fonts/inter-latin-wght-italic.woff2)
format("woff2-variations");
unicode-range:
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC,
U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
U+2212, U+2215, U+FEFF, U+FFFD;
}
</style>
<script
defer
src="https://stats.apps.seigler.net/script.js"
data-website-id="ccb4bd94-2a71-47fe-8eea-d85bf75b7f6d"
></script>
<script defer src="/scripts/effects.js?v=d86d3b7642f1"></script>
<link rel="me" href="https://github.com/seigler" />
<link
rel="webmention"
href="https://webmention.io/joshua.seigler.net/webmention"
/>
<title>Tools of the trade - joshua.seigler.net</title>
<meta name="description" content="Some dev tools I recommend." />
<meta name="keywords" content="posts, technical, software" />
<meta property="og:title" content="Tools of the trade" />
<meta property="og:type" content="" />
<meta
property="og:url"
content="https://joshua.seigler.net/posts/tools-of-the-trade/"
/>
<meta name="twitter:title" content="Tools of the trade" />
<meta name="twitter:description" content="Some dev tools I recommend." />
<meta name="twitter:card" content="summary" />
<meta name="generator" content="Eleventy v3.1.0" />
</head>
<body data-font="english" data-path="/posts/tools-of-the-trade/">
<script>
const savedTheme = localStorage.getItem("theme");
if (savedTheme != null) {
document.body.setAttribute("data-theme", savedTheme);
}
</script>
<header>
<nav>
<div class="nav-row">
<div class="nav-home"><a href="/">joshua.seigler.net</a></div>
</div>
<div class="nav-categories">
<a class="nav-active" href="/posts/">/posts</a>
<a class="" href="/about/">/about</a>
<a class="" href="/now/">/now</a>
<a class="" href="/uses/">/uses</a>
<a class="" href="/recipes/">/recipes</a>
<a class="" href="/music/">/music</a>
<a class="" href="/books/">/books</a>
<a class="" href="/search/">/search</a>
</div>
</nav>
<h1>Tools of the trade</h1>
<div class="header-meta">
<author>Joshua Seigler</author><date>May 15, 2025</date>
<span class="tags" style="--totalTags: 11"
><a class="tag" style="--tagIndex: 5" href="/tags/technical"
>technical</a
>
<a class="tag" style="--tagIndex: 8" href="/tags/software"
>software</a
>
</span>
</div>
</header>
<header class="toc">
<span class="toc">
<ol>
<li><a href="#mise-en-place"> mise-en-place</a></li>
<li><a href="#stack-pr"> stack-pr</a></li>
<li><a href="#xc"> xc</a></li>
<li><a href="#pd2slack"> pd2slack</a></li>
<li><a href="#syncthing"> SyncThing</a></li>
<li><a href="#obsidian"> Obsidian</a></li>
<li><a href="#keepassxc"> KeePassXC</a></li>
</ol>
</span>
</header>
<main data-pagefind-body="data-pagefind-body">
<p>
Everyone has different tools that they find especially effective. Here
are some I have found with a few words about why I like them.
</p>
<blockquote>
<p>
Update: I made a <a href="/uses">/uses</a> page that lists these tools
and many others I like.
</p>
</blockquote>
<h3 id="mise-en-place" tabindex="-1">
<a class="header-anchor" href="#mise-en-place" aria-hidden="true"></a>
<a href="https://mise.jdx.dev/" target="_blank" rel="noopener"
>mise-en-place</a
>
</h3>
<p>
Universal dev tool version manager. Specify tool versions in a config
file and this tool can ensure that they are installed and active when
entering the project directory. Amazing for getting a new dev
environment set up in seconds. Replaces <code>asdf</code>,
<code>nvm</code>, <code>pyenv</code>, <code>venv</code>,
<code>rbenv</code>, and many other tool-specific version managers.
Supports an incredible number of tools thanks to compatibility with
<code>asdf</code>.
</p>
<p>
It also supports installing specific global tools, like
<code>angular-cli</code> from <code>npm</code>, or
<code>stack-pr</code> from <code>pipx</code>.
</p>
<h3 id="stack-pr" tabindex="-1">
<a class="header-anchor" href="#stack-pr" aria-hidden="true"></a>
<a
href="https://github.com/modular/stack-pr"
target="_blank"
rel="noopener"
>stack-pr</a
>
</h3>
<p>
Open source tool for
<a href="https://www.stacking.dev/" target="_blank" rel="noopener"
>stacking PRs</a
>.
</p>
<p>
PR stacks are, as far as I can tell, the best way to manage large
features in git. I first heard about this practice in a series of blog
posts from Graphite, a company offering free PR-stacking software and
related paid services. But you dont need a custom CI flow or managed
service for stacking to work - this CLI tool or one of the others at
<a href="https://www.stacking.dev/" target="_blank" rel="noopener"
>stacking.dev</a
>
can take care of this.
</p>
<p>
If you start using PR stacks your whole company will start copying you.
</p>
<h3 id="xc" tabindex="-1">
<a class="header-anchor" href="#xc" aria-hidden="true"></a>
<a href="https://xcfile.dev/" target="_blank" rel="noopener">xc</a>
</h3>
<p>Markdown based task runner.</p>
<p>
Define tasks in code blocks in markdown, and call them from the CLI.
Serves as both task definition and documentation.
</p>
<h3 id="pd2slack" tabindex="-1">
<a class="header-anchor" href="#pd2slack" aria-hidden="true"></a>
<a
href="https://github.com/sidpremkumar/pd2slack"
target="_blank"
rel="noopener"
>pd2slack</a
>
</h3>
<p>
Simple python script to update the members of a Slack group such as
<code>@oncall</code> to match the active member(s) of a PagerDuty
schedule. This replaces several expensive SAAS services.
</p>
<h3 id="syncthing" tabindex="-1">
<a class="header-anchor" href="#syncthing" aria-hidden="true"></a>
<a href="https://syncthing.net/" target="_blank" rel="noopener"
>SyncThing</a
>
</h3>
<p>
P2P alternative to Dropbox, supports mobile and desktop. Synchronize
folders of content across all my devices.
</p>
<h3 id="obsidian" tabindex="-1">
<a class="header-anchor" href="#obsidian" aria-hidden="true"></a>
<a href="https://obsidian.md/" target="_blank" rel="noopener"
>Obsidian</a
>
</h3>
<p>
For notes and reference. Sync across devices with
<code>syncthing</code>.
</p>
<h3 id="keepassxc" tabindex="-1">
<a class="header-anchor" href="#keepassxc" aria-hidden="true"></a>
<a href="https://keepassxc.org/" target="_blank" rel="noopener"
>KeePassXC</a
>
</h3>
<p>For passwords. Sync across devices with <code>syncthing</code>.</p>
</main>
<script
data-isso="//comments.apps.seigler.net/"
src="//comments.apps.seigler.net/js/embed.min.js"
></script>
<section id="isso-thread" data-title="">
<noscript>Javascript needs to be activated to view comments.</noscript>
</section>
<footer>
&copy; Joshua Seigler 2025. -
<a rel="me" href="mailto:joshua@seigler.net?subject=Hello">Contact</a>
-
<a href="/feed.xml">RSS</a>
-
<a href="/unoffice-hours/">Unoffice Hours</a>
-
<a href="/webrings/">Webrings</a>
</footer>
<div id="effects"></div>
</body>
</html>