<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Andrew</title>
    <description>The latest articles on DEV Community by Andrew (@rtech91).</description>
    <link>https://dev.to/rtech91</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3511700%2Ff9b2e5a3-e445-4827-a42c-17bb3f3f1bb5.jpeg</url>
      <title>DEV Community: Andrew</title>
      <link>https://dev.to/rtech91</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rtech91"/>
    <language>en</language>
    <item>
      <title>I Got Tired of Typing Long Paths, So I Built JustJump</title>
      <dc:creator>Andrew</dc:creator>
      <pubDate>Tue, 21 Apr 2026 17:59:36 +0000</pubDate>
      <link>https://dev.to/rtech91/i-got-tired-of-typing-long-paths-so-i-built-justjump-4o5p</link>
      <guid>https://dev.to/rtech91/i-got-tired-of-typing-long-paths-so-i-built-justjump-4o5p</guid>
      <description>&lt;p&gt;You open a terminal, and before you can do any actual work, you type something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/foo/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or if you work with WordPress:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/client-site/wp-content/themes/my-custom-theme/
&lt;span class="nb"&gt;cd&lt;/span&gt; ../../plugins/my-custom-plugin/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or Drupal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/drupal-site/web/modules/custom/my_feature_module/
&lt;span class="nb"&gt;cd&lt;/span&gt; ../../../themes/custom/my_theme/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every. Single. Time.&lt;/p&gt;

&lt;p&gt;It does not get easier with practice. It just gets annoying. And the worst part? You already &lt;em&gt;know&lt;/em&gt; where everything is. Your brain has the map. The shell just refuses to use it.&lt;/p&gt;

&lt;p&gt;That frustration is exactly why I built &lt;a href="https://github.com/rtech91/justjump" rel="noopener noreferrer"&gt;JustJump&lt;/a&gt; — a small Go CLI that lets you register the directories that matter and jump to them interactively, with two keystrokes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Real Problem
&lt;/h2&gt;

&lt;p&gt;I work across a lot of different environments: monorepos, microservices, client projects, and &lt;a href="https://ddev.readthedocs.io/" rel="noopener noreferrer"&gt;DDEV&lt;/a&gt; containers. Deep directory trees are everywhere. Shell aliases helped me for a while, but they get stale fast — you rename a folder, and suddenly half your aliases are broken. Bookmark plugins add yet another thing to configure and maintain.&lt;/p&gt;

&lt;p&gt;I wanted something that stayed out of my way. And yes — I know about &lt;code&gt;zoxide&lt;/code&gt; and &lt;code&gt;fzf&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;I tried both. &lt;code&gt;zoxide&lt;/code&gt; is essentially a flash bookmark manager: it learns from your history and guesses where you want to go. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;fzf&lt;/code&gt; is a powerful fuzzy finder, but at its core it's an old-fashioned indexer and filesystem scanner — it searches what exists, not what you've decided matters. So I designed JustJump around a simple two-level model: &lt;/p&gt;

&lt;p&gt;— &lt;strong&gt;Top-level project directories&lt;/strong&gt; I register once. For example, &lt;code&gt;~/projects/myproject/&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local jump points&lt;/strong&gt; — subdirectories inside a project, declared in a &lt;code&gt;.justjump.yaml&lt;/code&gt; file. For example, &lt;code&gt;backend/&lt;/code&gt;, &lt;code&gt;frontend/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Two levels, two commands, zero magic.&lt;/p&gt;

&lt;p&gt;Running &lt;code&gt;jj&lt;/code&gt; inside a registered project opens an interactive picker for that project's jump points. Running &lt;code&gt;jj -G&lt;/code&gt; lets me switch between projects. Pick, Enter, done.&lt;/p&gt;

&lt;p&gt;And since &lt;code&gt;.justjump.yaml&lt;/code&gt; is just a file sitting in the project root, you can commit it to git. Every teammate who clones the repo gets the same jump points out of the box — no individual setup, no "how do you navigate this codebase" onboarding questions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using It Day to Day
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Get It Running
&lt;/h3&gt;

&lt;p&gt;Install without sudo (binary goes to &lt;code&gt;~/.local/bin&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://rtech91.github.io/justjump/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or build from source if you prefer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make build-release
make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add the shell integration to your profile. Copy the right &lt;code&gt;.justjumprc&lt;/code&gt; from &lt;code&gt;misc/rc/bash/&lt;/code&gt; or &lt;code&gt;misc/rc/zsh/&lt;/code&gt; into your home directory, then source it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.justjumprc &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; ~/.justjumprc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Register a Project
&lt;/h3&gt;

&lt;p&gt;Go to any project root and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/myproject
jj add &lt;span class="nt"&gt;-G&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; Global jump root added: myproject -&amp;gt; ~/projects/myproject&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Define Your Jump Points
&lt;/h3&gt;

&lt;p&gt;Drop a &lt;code&gt;.justjump.yaml&lt;/code&gt; in the project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jumppoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;backend/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;frontend/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;infra/terraform/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also &lt;code&gt;cd&lt;/code&gt; into any subdirectory and run &lt;code&gt;jj add&lt;/code&gt; (no &lt;code&gt;-G&lt;/code&gt;) to register that path directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Jump
&lt;/h3&gt;

&lt;p&gt;Inside a registered project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jj
&lt;span class="c"&gt;# -&amp;gt; interactive picker with local jump points&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From anywhere, to switch projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jj &lt;span class="nt"&gt;-G&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; interactive picker with global roots&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Keep Things Clean
&lt;/h3&gt;

&lt;p&gt;Remove what's no longer relevant:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jj remove        &lt;span class="c"&gt;# removes current dir's local jump point&lt;/span&gt;
jj remove &lt;span class="nt"&gt;-G&lt;/span&gt;     &lt;span class="c"&gt;# removes the current project root registration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  DDEV Integration
&lt;/h2&gt;

&lt;p&gt;If you use DDEV, you know the pain of container paths. &lt;code&gt;/var/www/html/web/modules/custom/mymodule&lt;/code&gt; is not something you want to type repeatedly.&lt;/p&gt;

&lt;p&gt;Since container paths differ from host paths, registration has to happen inside the container. Here's my setup in &lt;code&gt;.ddev/config.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;webimage_extra_packages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;golang&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;post-start&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;curl -sSf https://rtech91.github.io/justjump/install.sh | bash&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo 'export PATH="$HOME/.local/bin:$PATH"' &amp;gt;&amp;gt; ~/.bashrc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After &lt;code&gt;ddev start&lt;/code&gt; or &lt;code&gt;ddev restart&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ddev ssh
&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html
jj add &lt;span class="nt"&gt;-G&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add &lt;code&gt;.justjump.yaml&lt;/code&gt; at the container project root:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;jumppoints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web/modules/custom/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;web/themes/custom/&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;config/sync/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From that point on, &lt;code&gt;jj&lt;/code&gt; inside the container gives you instant navigation. If you use Zsh inside DDEV, also append to &lt;code&gt;.zshrc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;hooks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;post-start&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo 'export PATH="$HOME/.local/bin:$PATH"' &amp;gt;&amp;gt; ~/.zshrc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  A Few Design Decisions I'm Happy With
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No database, no daemon.&lt;/strong&gt; Everything lives in plain files under &lt;code&gt;~/.config/justjump/&lt;/code&gt;. Nothing runs in the background. You can audit, backup, or delete the whole thing with standard shell tools.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No silent stale paths.&lt;/strong&gt; JustJump skips missing entries and warns you. &lt;code&gt;jj verify&lt;/code&gt; makes the health check explicit when you want it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Consistent mnemonic flags.&lt;/strong&gt; The &lt;code&gt;--global&lt;/code&gt; / &lt;code&gt;-G&lt;/code&gt; flag works the same way across &lt;code&gt;add&lt;/code&gt;, &lt;code&gt;remove&lt;/code&gt;, &lt;code&gt;verify&lt;/code&gt;, and jumping. Learn it once, use it everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;JustJump is not trying to be clever. It is just removing the friction between knowing where you want to go and actually getting there.&lt;/p&gt;

&lt;p&gt;Register a project root once. Define meaningful local jump points. Type &lt;code&gt;jj&lt;/code&gt;, pick, Enter. That's the whole thing — and it works the same way on your laptop and inside a DDEV container.&lt;/p&gt;

&lt;p&gt;The source is on &lt;a href="https://github.com/rtech91/justjump" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; if you want to try it or poke around the code. Happy to hear how others are using it or what you'd do differently.&lt;/p&gt;

</description>
      <category>go</category>
      <category>github</category>
      <category>tooling</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
