224 lines
8.4 KiB
HTML
224 lines
8.4 KiB
HTML
<!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=b0813e810319" />
|
||
<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 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" />
|
||
<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=cd61c39d895d"></script>
|
||
</head>
|
||
<body data-font="english" data-path="/posts/tools-of-the-trade/">
|
||
<header>
|
||
<nav>
|
||
<div class="nav-row">
|
||
<div class="nav-home"><a href="/">joshua.seigler.net</a></div>
|
||
<div class="nav-settings">
|
||
<div class="nav-toggles">
|
||
<label class="nav-toggle-button" title="Light mode"
|
||
>☀️<input type="radio" name="theme" value="light"
|
||
/></label>
|
||
<label class="nav-toggle-button" title="Automatic"
|
||
>🔄<input type="radio" name="theme" value="auto"
|
||
/></label>
|
||
<label class="nav-toggle-button" title="Dark mode"
|
||
>🌒<input type="radio" name="theme" value="dark"
|
||
/></label>
|
||
</div>
|
||
<div class="nav-toggles">
|
||
<label class="nav-toggle-button" data-language="english"
|
||
>English<input type="radio" name="language" value="english"
|
||
/></label>
|
||
<label class="nav-toggle-button" data-language="aurebesh"
|
||
>Aurebesh<input type="radio" name="language" value="aurebesh"
|
||
/></label>
|
||
</div>
|
||
</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>
|
||
</div>
|
||
</header>
|
||
<main 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 don’t 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>
|
||
|
||
<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>
|
||
</main>
|
||
<footer>
|
||
<section>
|
||
© Joshua Seigler 2025. -
|
||
<a href="https://github.com/seigler" rel="me noopener" target="_blank"
|
||
>GitHub</a
|
||
>
|
||
-
|
||
<a href="/feed.xml">RSS</a>
|
||
-
|
||
<a rel="me" href="mailto:joshua@seigler.net?subject=Hello">Contact</a>
|
||
-
|
||
<a href="/unoffice-hours/">Unoffice Hours</a>
|
||
</section>
|
||
<section>
|
||
Webrings:
|
||
<strong>Unoffice Hours</strong>
|
||
<a href="https://unofficehours.com/prev.html" rel="noopener">Prev</a>
|
||
<a href="https://unofficehours.com/next.html" rel="noopener">Next</a>
|
||
<a href="https://unofficehours.com/random.html" rel="noopener"
|
||
>Random</a
|
||
>
|
||
<a href="https://unofficehours.com" rel="noopener">List</a>
|
||
</section>
|
||
</footer>
|
||
<div id="effects"></div>
|
||
</body>
|
||
</html>
|