<?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: nk sharma</title>
    <description>The latest articles on DEV Community by nk sharma (@nksharmaexe).</description>
    <link>https://dev.to/nksharmaexe</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4074030%2F645ce7a7-b50c-46c1-95fa-3bf2f1662db4.jpg</url>
      <title>DEV Community: nk sharma</title>
      <link>https://dev.to/nksharmaexe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nksharmaexe"/>
    <language>en</language>
    <item>
      <title>I built a VS Code extension that saves checkpoints without commits</title>
      <dc:creator>nk sharma</dc:creator>
      <pubDate>Fri, 30 Oct 2026 06:33:40 +0000</pubDate>
      <link>https://dev.to/nksharmaexe/i-built-a-vs-code-extension-that-saves-checkpoints-without-commits-7cl</link>
      <guid>https://dev.to/nksharmaexe/i-built-a-vs-code-extension-that-saves-checkpoints-without-commits-7cl</guid>
      <description>&lt;p&gt;You finish step 1 of a feature and you don't want to commit yet, so you stage it. Then step 2 happens, and you're staring at one pile of changes again with no way to tell the steps apart.&lt;/p&gt;

&lt;p&gt;I kept hitting this, so I built &lt;strong&gt;Waypoint&lt;/strong&gt;: a free, open-source VS Code extension that saves hidden checkpoints between steps, without commits, and without touching your branch, staging area, stash or history.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff192dkhy41ncpxtrcuoy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff192dkhy41ncpxtrcuoy.png" alt="Waypoint - Git Snapshots" width="800" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flgk9yb5c9nq3vuz8v0p8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flgk9yb5c9nq3vuz8v0p8.png" alt="Waypoint sidebar and diff" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One shortcut&lt;/strong&gt; (&lt;code&gt;Cmd+Opt+K&lt;/code&gt; / &lt;code&gt;Ctrl+Alt+K&lt;/code&gt;) creates a checkpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expand a checkpoint&lt;/strong&gt; to see only what that step changed, with a side-by-side diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working changes&lt;/strong&gt; shows what you've done since the last checkpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare&lt;/strong&gt; any two checkpoints, or a checkpoint with your current files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Restore&lt;/strong&gt; a checkpoint (or a single file), with an Undo button.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One list per branch&lt;/strong&gt;, and a filter by file path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checkpoints include untracked files and respect &lt;code&gt;.gitignore&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Git already has everything needed, so Waypoint is a thin layer over git plumbing:&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="c"&gt;# work on a copy of the index, so your real staging area is never touched&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .git/index /tmp/waypoint-index
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GIT_INDEX_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/waypoint-index

git add &lt;span class="nt"&gt;-A&lt;/span&gt;                                    &lt;span class="c"&gt;# snapshot the whole working tree&lt;/span&gt;
&lt;span class="nv"&gt;tree&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git write-tree&lt;span class="si"&gt;)&lt;/span&gt;                        &lt;span class="c"&gt;# turn it into a tree object&lt;/span&gt;
&lt;span class="nv"&gt;commit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;git commit-tree &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$tree&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; HEAD &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Checkpoint 1"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
git update-ref refs/checkpoints/br-main/&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt; +%s&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$commit&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each checkpoint is a full snapshot stored as a hidden commit under a private ref. Git stores identical file contents only once, so ten checkpoints are cheap. The sidebar just runs diffs between neighbouring checkpoints.&lt;/p&gt;

&lt;p&gt;Because everything lives inside &lt;code&gt;.git&lt;/code&gt;, running &lt;code&gt;git reset --hard&lt;/code&gt; or &lt;strong&gt;Discard All Changes&lt;/strong&gt; can't touch your checkpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guard checkpoints
&lt;/h2&gt;

&lt;p&gt;The part I like most is an automatic safety net. Waypoint keeps a quiet baseline snapshot of your files. If &lt;code&gt;HEAD&lt;/code&gt; moves because of a reset, pull, checkout or rebase, or if six or more files change outside the editor (a bulk discard, a code generator, an AI agent writing straight to disk), it saves that baseline as a checkpoint named something like &lt;code&gt;Guard · before reset: moving to HEAD~1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So an uncommitted edit that a &lt;code&gt;git reset --hard&lt;/code&gt; would have erased is sitting in the sidebar, one click from being restored.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it isn't
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Not a backup.&lt;/strong&gt; Checkpoints are local, aren't pushed, and are gone if you delete or re-clone the repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not a replacement for WIP commits.&lt;/strong&gt; If you're happy committing throwaway work and squashing later, you may not need this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not instant on huge repos.&lt;/strong&gt; Refreshing &lt;em&gt;Working changes&lt;/em&gt; snapshots the tree, which can be slow in very large ones. There's a setting to turn off the automatic part.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It makes no network requests and has no telemetry.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug I shipped
&lt;/h2&gt;

&lt;p&gt;Version 0.1.1 had a startup bug. I'd left a duplicate command registration in the code, and VS Code throws on that, which aborts &lt;code&gt;activate()&lt;/code&gt;. Everything registered after the duplicate silently never existed, so Delete, Compare and Filter all showed "command not found".&lt;/p&gt;

&lt;p&gt;The fixes in 0.1.3: a small script that checks every command in &lt;code&gt;package.json&lt;/code&gt; against the code, a check for duplicate IDs, and a written test plan I run before each release.&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;grep&lt;/span&gt; &lt;span class="nt"&gt;-A1&lt;/span&gt; &lt;span class="s1"&gt;'registerCommand'&lt;/span&gt; src/extension.ts | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s1"&gt;'"waypoint\.[A-Za-z]*"'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that prints anything, you have a duplicate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;VS Code:&lt;/strong&gt; [MARKETPLACE LINK, add once it's live]&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cursor, Antigravity, VSCodium:&lt;/strong&gt; &lt;a href="https://open-vsx.org/extension/nksharmaexe/waypoint" rel="noopener noreferrer"&gt;https://open-vsx.org/extension/nksharmaexe/waypoint&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source (MIT):&lt;/strong&gt; &lt;a href="https://github.com/nksharmaexe/waypoint" rel="noopener noreferrer"&gt;https://github.com/nksharmaexe/waypoint&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is v0.1.3, so expect rough edges. How do you handle this problem today: WIP commits, stash, or something else? And what would make this useful for you?&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>git</category>
      <category>typescript</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
