<?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: Jack Scott</title>
    <description>The latest articles on DEV Community by Jack Scott (@jackscott7).</description>
    <link>https://dev.to/jackscott7</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%2F446820%2F5074c2a9-e75d-44fe-923c-af7bbefd004e.jpg</url>
      <title>DEV Community: Jack Scott</title>
      <link>https://dev.to/jackscott7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jackscott7"/>
    <language>en</language>
    <item>
      <title>PS7-Completion: Tab completion for Git, SSH and WinGet in PowerShell</title>
      <dc:creator>Jack Scott</dc:creator>
      <pubDate>Thu, 22 Oct 2026 22:20:34 +0000</pubDate>
      <link>https://dev.to/jackscott7/ps7-completion-tab-completion-for-git-ssh-and-winget-in-powershell-4n67</link>
      <guid>https://dev.to/jackscott7/ps7-completion-tab-completion-for-git-ssh-and-winget-in-powershell-4n67</guid>
      <description>&lt;p&gt;The idea for PS7-Completion came from bash-completion. I wanted that same convenience in PowerShell: type part of a command, press Tab, and get some help with what comes next.&lt;/p&gt;

&lt;p&gt;PowerShell already has tab completion, but the experience with command-line tools depends on which tool you’re using and what completion support you have installed. I wanted to make more of the commands I use feel familiar in that respect.&lt;/p&gt;

&lt;p&gt;So I’m building &lt;a href="https://github.com/JackScott7/PS7-Completion" rel="noopener noreferrer"&gt;PS7-Completion&lt;/a&gt;, an open-source module for &lt;strong&gt;PowerShell 7.4+ on Windows&lt;/strong&gt;, with completion support for 34 tools.&lt;/p&gt;

&lt;p&gt;Here’s what using it looks like.&lt;/p&gt;

&lt;p&gt;You start typing a Git command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;che&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press Tab, and it completes to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;checkout&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can do the same with supported options. If you remember that Git has an option for a shorter log, start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--one&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tab completes it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--oneline&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The WinGet equivalent might be an option you’ve used before but keep forgetting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--ex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press Tab:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--exact&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can continue typing from there. Pressing Tab fills in the suggestion; it doesn’t execute the command.&lt;/p&gt;

&lt;p&gt;SSH completion also uses host aliases from your SSH config. If you have an alias called &lt;code&gt;staging-web&lt;/code&gt;, typing this gives you a starting point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stag&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press Tab to complete the matching name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;staging-web&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It’s especially useful for tools you use just often enough to need them, but not often enough to remember their syntax. Opening the help output is fine. Opening it for the same option every few weeks gets old.&lt;/p&gt;

&lt;p&gt;Alongside Git, SSH and WinGet, PS7-Completion covers tools including Docker, GitHub CLI, npm, pip, uv, Ruff, Cargo and ripgrep. The &lt;a href="https://github.com/JackScott7/PS7-Completion#supported-tools" rel="noopener noreferrer"&gt;full list is in the README&lt;/a&gt;. Coverage varies between tools, and this is still an early release.&lt;/p&gt;

&lt;p&gt;To try it, check that you’re running PowerShell 7.4 or newer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="bp"&gt;$PSVersionTable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;PSVersion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Download the Windows installer from the &lt;a href="https://github.com/JackScott7/PS7-Completion/releases/latest" rel="noopener noreferrer"&gt;latest release page&lt;/a&gt;, run it, and open a new PowerShell session.&lt;/p&gt;

&lt;p&gt;Then load the module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Import-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;PS7-Completion&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try a few commands you normally use and press Tab while typing a subcommand or option.&lt;/p&gt;

&lt;p&gt;If you decide to keep it, add that import line to your &lt;a href="https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_profiles" rel="noopener noreferrer"&gt;PowerShell profile&lt;/a&gt; so it loads in new sessions. The installer doesn’t edit your profile.&lt;/p&gt;

&lt;p&gt;I’d appreciate feedback from people using it during ordinary terminal work. Pick a couple of tools you know well and see where the suggestions help or fall short.&lt;/p&gt;

&lt;p&gt;If something is missing or a suggestion looks wrong, &lt;a href="https://github.com/JackScott7/PS7-Completion/issues" rel="noopener noreferrer"&gt;open an issue&lt;/a&gt; with what you typed before pressing Tab, what you expected, and your PowerShell and tool versions. Those examples help me decide what needs attention next.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/JackScott7/PS7-Completion" rel="noopener noreferrer"&gt;PS7-Completion is available on GitHub&lt;/a&gt; under the MIT license. If a tool you use isn’t supported by the time you read this, open an issue and tell me which one. Include a few commands or options you’d like to complete so I know where to start.&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>cli</category>
      <category>opensource</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I got tired of fixing my app windows every day, so I built Centre</title>
      <dc:creator>Jack Scott</dc:creator>
      <pubDate>Fri, 12 Jun 2026 06:28:21 +0000</pubDate>
      <link>https://dev.to/jackscott7/i-got-tired-of-fixing-my-app-windows-every-day-so-i-built-centre-52ik</link>
      <guid>https://dev.to/jackscott7/i-got-tired-of-fixing-my-app-windows-every-day-so-i-built-centre-52ik</guid>
      <description>&lt;p&gt;You know that tiny annoying thing you do every day but never really think about?&lt;/p&gt;

&lt;p&gt;Opening your apps.&lt;/p&gt;

&lt;p&gt;Moving them around.&lt;/p&gt;

&lt;p&gt;Resizing them.&lt;/p&gt;

&lt;p&gt;Putting the terminal here.&lt;/p&gt;

&lt;p&gt;Putting the browser there.&lt;/p&gt;

&lt;p&gt;Fixing the editor window.&lt;/p&gt;

&lt;p&gt;Dragging that one app back from the weird corner of the screen.&lt;/p&gt;

&lt;p&gt;Again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;And again.&lt;/p&gt;

&lt;p&gt;It is not a “big problem”.&lt;/p&gt;

&lt;p&gt;But it is one of those small repeated annoyances that slowly becomes part of your daily routine.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Centre&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Centre is a small Windows tool that helps your apps remember where they belong.&lt;/p&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/JackScott7/centre
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;I wanted something simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“This app should always go here.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;Not a full tiling window manager.&lt;/p&gt;

&lt;p&gt;Not a huge productivity suite.&lt;/p&gt;

&lt;p&gt;Not another app that needs 40 minutes of configuration before it becomes useful.&lt;/p&gt;

&lt;p&gt;Just a small tool that lets you save a window position and bring it back when you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;Because I don’t want to manually rebuild my workspace every time.&lt;/p&gt;

&lt;p&gt;My usual desktop setup is predictable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;terminal in one spot&lt;/li&gt;
&lt;li&gt;browser in another&lt;/li&gt;
&lt;li&gt;editor where I like it&lt;/li&gt;
&lt;li&gt;tools arranged in a way that makes sense to me&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But Windows does not always care.&lt;/p&gt;

&lt;p&gt;Sometimes apps open in random places.&lt;/p&gt;

&lt;p&gt;Sometimes they remember the wrong size.&lt;/p&gt;

&lt;p&gt;Sometimes they appear slightly off.&lt;/p&gt;

&lt;p&gt;Sometimes your workspace just feels messy before you even start working.&lt;/p&gt;

&lt;p&gt;Centre tries to remove that friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow
&lt;/h2&gt;

&lt;p&gt;The workflow is basically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Put a window where you want it.&lt;/li&gt;
&lt;li&gt;Capture that position.&lt;/li&gt;
&lt;li&gt;Restore it later with a shortcut.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s the whole point.&lt;/p&gt;

&lt;p&gt;You arrange your workspace once, then stop thinking about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preview
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/user-attachments/assets/d088a951-8c6b-4731-8228-80b063f1a6e5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  This is not trying to be fancy
&lt;/h2&gt;

&lt;p&gt;Centre is not trying to compete with PowerToys FancyZones.&lt;/p&gt;

&lt;p&gt;It is not trying to replace a tiling window manager.&lt;/p&gt;

&lt;p&gt;It is not trying to become a massive desktop automation platform.&lt;/p&gt;

&lt;p&gt;It is intentionally small.&lt;/p&gt;

&lt;p&gt;I built it because I wanted a lightweight tool that does one thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make my windows go where I expect them to go.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s the kind of boring utility I actually end up using every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who might like this?
&lt;/h2&gt;

&lt;p&gt;You might like Centre if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you use Windows every day&lt;/li&gt;
&lt;li&gt;you care about your desktop layout&lt;/li&gt;
&lt;li&gt;you open the same apps repeatedly&lt;/li&gt;
&lt;li&gt;you hate dragging windows into place&lt;/li&gt;
&lt;li&gt;you use terminals/editors/browsers side by side&lt;/li&gt;
&lt;li&gt;you like small tools that remove tiny daily annoyances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is especially useful for developers, power users, and anyone who likes their workspace to feel consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The funny part
&lt;/h2&gt;

&lt;p&gt;This project started from a small annoyance.&lt;/p&gt;

&lt;p&gt;Not some huge architectural idea.&lt;/p&gt;

&lt;p&gt;Not a startup pitch.&lt;/p&gt;

&lt;p&gt;Just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why am I still manually moving this window?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And honestly, that is my favorite kind of project.&lt;/p&gt;

&lt;p&gt;Small problem.&lt;/p&gt;

&lt;p&gt;Small tool.&lt;/p&gt;

&lt;p&gt;Immediate benefit.&lt;/p&gt;

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

&lt;p&gt;Centre is open source and available on GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://github.com/JackScott7/centre
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is also available on PyPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://pypi.org/project/centre/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you use Windows and constantly rearrange the same apps, give it a try.&lt;/p&gt;

&lt;p&gt;And if you have ideas, feedback, edge cases, or weird Windows behavior to report, I’d genuinely like to hear it.&lt;/p&gt;

&lt;p&gt;Because desktop workflow tools are always better when real people use them in real messy setups.&lt;/p&gt;

</description>
      <category>python</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Get Notified When Long-Running Commands Finish in PowerShell 7</title>
      <dc:creator>Jack Scott</dc:creator>
      <pubDate>Wed, 07 Jan 2026 01:10:27 +0000</pubDate>
      <link>https://dev.to/jackscott7/command-exec-notification-in-powershell-7-4gbn</link>
      <guid>https://dev.to/jackscott7/command-exec-notification-in-powershell-7-4gbn</guid>
      <description>&lt;p&gt;Hey there.&lt;br&gt;
I'm gonna give a simple trick to make your life easier when running time consuming commands in &lt;strong&gt;PowerShell 7&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So a while back I installed &lt;strong&gt;Arch Linux&lt;/strong&gt; to see what the hype was about, I opened Konsole and noticed a notification pop up when the command I ran finished.&lt;/p&gt;

&lt;p&gt;After a while I reinstalled Windows, and wanted to make that notification functionality work in &lt;strong&gt;PS7&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  How this works?
&lt;/h3&gt;

&lt;p&gt;This works by recording a timestamp when Enter is pressed and comparing it when PowerShell renders the next prompt. If execution time exceeds a threshold, a Windows toast notification is triggered. That's it.&lt;/p&gt;

&lt;p&gt;If you’re hooked, Let’s make this happen.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1
&lt;/h2&gt;

&lt;p&gt;Install PS7 module by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Install-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;BurntToast&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2
&lt;/h2&gt;

&lt;p&gt;Run the following in PS7 to get the PS7 Profile path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$PROFILE&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;C:\Users\&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;\Documents\PowerShell\Microsoft.PowerShell_profile.ps1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3
&lt;/h2&gt;

&lt;p&gt;Open your profile in VS Code or whatever editor you use.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$PROFILE&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4
&lt;/h2&gt;

&lt;p&gt;Import the Module you just installed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Import-Module&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;BurntToast&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;This should always be at the top, otherwise the next steps won't work&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5
&lt;/h2&gt;

&lt;p&gt;Copy and Paste this code at the top of your profile after importing the module&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$OriginalPrompt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Command&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ScriptBlock&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c"&gt;# capture original prompt&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Notification need a logo to use, so we'll be using PowerShell's icon&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$applogo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\Program Files\PowerShell\7\assets\Powershell_av_colors.png"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="nv"&gt;$ExecutionNotifyThreshold&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# seconds&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;__commandStart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$null&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# To format timestamp as human readable as possible&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Format-Elapsed&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TotalSeconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-lt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'{0:0.0}s'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TotalSeconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nv"&gt;$parts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;New-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;System.Collections.Generic.List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Days&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-gt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"{0}d"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Days&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Hours&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-gt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"{0}h"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Hours&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Minutes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-gt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"{0}m"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Minutes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="nv"&gt;$remainingSeconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="n"&gt;Floor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$timestamp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TotalSeconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"{0}s"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$remainingSeconds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;

    &lt;/span&gt;&lt;span class="kr"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$parts&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-join&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nf"&gt;prompt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;__commandStart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$elapsed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;__commandStart&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$elapsed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;TotalSeconds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-ge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$ExecutionNotifyThreshold&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nv"&gt;$lastCmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Get-History&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Count&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CommandLine&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nv"&gt;$text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@(&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s1"&gt;'PS7 Finished:'&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;`$&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$lastCmd&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Took {0}"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(Format-Elapsed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$elapsed&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="n"&gt;New-BurntToastNotification&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-AppLogo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$applogo&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;__commandStart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="bp"&gt;$null&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$OriginalPrompt&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;$ExecutionNotifyThreshold&lt;/em&gt; is the time window you want to be notified when the command is taking longer than this threshold. Adjust as you wish&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We have one last step and we are done, keep going 😁🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6
&lt;/h2&gt;

&lt;p&gt;Now add the below code at the end of your &lt;em&gt;$PROFILE&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This should always be at the end, so nothing else will override your custom functionality&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Set-PSReadLineKeyHandler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ScriptBlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;global&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;__commandStart&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Microsoft.PowerShell.PSConsoleReadLine&lt;/span&gt;&lt;span class="p"&gt;]::&lt;/span&gt;&lt;span class="nx"&gt;AcceptLine&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Save the file, restart your shell (you can also run ". $PROFILE" to restart PS7)&lt;br&gt;
run a command that will take longer than your threshold, you should see a similar Notification pop up like this:&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.amazonaws.com%2Fuploads%2Farticles%2Fjvfuowi5dyjyrfak49qj.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.amazonaws.com%2Fuploads%2Farticles%2Fjvfuowi5dyjyrfak49qj.png" alt=" " width="360" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes &amp;amp; Caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;I have been using oh-my-posh with this approach for a year now and had no problems so far&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This overrides the global &lt;code&gt;prompt&lt;/code&gt; function. If you use oh-my-posh, starship, or another prompt framework, load this &lt;em&gt;after&lt;/em&gt; your prompt is configured.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This hooks the &lt;code&gt;Enter&lt;/code&gt; key via PSReadLine. If you already have a custom Enter handler, you’ll need to merge the logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To remove the behavior:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;Remove-PSReadLineKeyHandler&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enter&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! you're Done. Congrats 🥳&lt;/p&gt;

&lt;p&gt;This removes the need to babysit long-running commands and keeps you informed without breaking flow.&lt;/p&gt;

&lt;p&gt;Tell me what you think about this approach. ❤️&lt;/p&gt;

</description>
      <category>powershell</category>
      <category>windows</category>
      <category>terminal</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Reset Windows 10/11 Password Without USB or Reinstall</title>
      <dc:creator>Jack Scott</dc:creator>
      <pubDate>Wed, 23 Jul 2025 20:26:34 +0000</pubDate>
      <link>https://dev.to/jackscott7/reset-windows-1011-password-without-usb-or-reinstall-43m6</link>
      <guid>https://dev.to/jackscott7/reset-windows-1011-password-without-usb-or-reinstall-43m6</guid>
      <description>&lt;p&gt;Hi there, Its jack, i got locked of my machine 10 minutes before posting this, i thought maybe this post might help some folks out :)&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR (2 minutes)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Boot into &lt;strong&gt;Windows Recovery Environment (WinRE)&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Swap &lt;code&gt;utilman.exe&lt;/code&gt; with &lt;code&gt;cmd.exe&lt;/code&gt; on *&lt;em&gt;C:*&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;On the login screen, hit &lt;strong&gt;Ease of Access&lt;/strong&gt; → instant SYSTEM cmd.&lt;/li&gt;
&lt;li&gt;Run: &lt;code&gt;net user "YourUser" NewPass123!&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Log in, then restore &lt;code&gt;utilman.exe&lt;/code&gt; to close the backdoor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Done. No USB sticks, no reinstall.&lt;/p&gt;




&lt;h2&gt;
  
  
  Copy/Paste Cheat Sheet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:: WinRE Command Prompt (assumes Windows on C:)
bcdedit | find "osdevice"                :: optional sanity check
copy C:\Windows\System32\utilman.exe C:\Windows\System32\utilman.bak
copy C:\Windows\System32\cmd.exe     C:\Windows\System32\utilman.exe
exit                                      :: reboot

:: Login screen → Ease of Access shell
net user                                   :: list users
net user "YourUser" NewPass123!
exit

:: After logging in (Admin cmd)
copy C:\Windows\System32\utilman.bak C:\Windows\System32\utilman.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why This Works (30 seconds)
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;utilman.exe&lt;/code&gt; (Ease of Access) runs &lt;em&gt;before&lt;/em&gt; you sign in. Replace it with &lt;code&gt;cmd.exe&lt;/code&gt;, click the icon on the login screen, and you get a SYSTEM shell. SYSTEM can change local passwords. Afterwards, put &lt;code&gt;utilman.exe&lt;/code&gt; back. Boom.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;BitLocker alert&lt;/strong&gt;: If the drive is locked with BitLocker, you’ll need the recovery key before you can touch &lt;code&gt;C:\Windows\System32&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 0: Force Windows Into WinRE
&lt;/h2&gt;

&lt;p&gt;Can’t log in? Crash it into recovery:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Power on.
&lt;/li&gt;
&lt;li&gt;When you see spinning dots, &lt;strong&gt;hold power&lt;/strong&gt; to force shutdown.
&lt;/li&gt;
&lt;li&gt;Do it &lt;strong&gt;twice&lt;/strong&gt;. On the third boot: &lt;strong&gt;Preparing Automatic Repair&lt;/strong&gt; → &lt;em&gt;Advanced options&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then: &lt;code&gt;Troubleshoot → Advanced options → Command Prompt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You’ll land at something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;X:\Sources&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 1 (Optional): Verify Windows Drive Letter
&lt;/h2&gt;

&lt;p&gt;It’s usually &lt;code&gt;C:&lt;/code&gt;. If you want to be sure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bcdedit | find "osdevice"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;osdevice partition=C:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it says &lt;code&gt;C:&lt;/code&gt;, keep following as-is. If not, swap the letter in the commands below.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Backup utilman.exe &amp;amp; Drop In cmd.exe
&lt;/h2&gt;

&lt;p&gt;Commands (assuming Windows is on &lt;strong&gt;C:&lt;/strong&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copy C:\Windows\System32\utilman.exe C:\Windows\System32\utilman.bak
copy C:\Windows\System32\cmd.exe     C:\Windows\System32\utilman.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Overwrite prompt? Type &lt;code&gt;Yes&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;exit&lt;/code&gt; and reboot.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Pop a SYSTEM Shell From the Login Screen
&lt;/h2&gt;

&lt;p&gt;At the login screen, click the &lt;strong&gt;Ease of Access&lt;/strong&gt; icon (bottom-right). Instead of accessibility tools, you get Command Prompt as SYSTEM.&lt;/p&gt;

&lt;p&gt;List users so you don’t guess wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;net user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reset the password (exact username, wrap in quotes if it has spaces, e.g. Jack):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;net user Jack MyNewPassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see: &lt;code&gt;The command completed successfully.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Close the window, log in with the new password.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Restore utilman.exe (Don’t Leave a Door Open)
&lt;/h2&gt;

&lt;p&gt;This step is optional, since it doesn't mess up your system, but security wise, its recommended to do.&lt;/p&gt;

&lt;p&gt;Inside Windows, open &lt;strong&gt;Command Prompt as Administrator&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copy C:\Windows\System32\utilman.bak C:\Windows\System32\utilman.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Y&lt;/code&gt; to overwrite.&lt;/p&gt;

&lt;p&gt;That closes the backdoor — the Ease of Access button works normally again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting &amp;amp; Gotchas
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;“Access is denied” / Error 5&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You didn’t get a SYSTEM shell. Make sure you clicked Ease of Access &lt;em&gt;after&lt;/em&gt; the swap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Username typos&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Run &lt;code&gt;net user&lt;/code&gt; first. Match the exact name, or wrap it in quotes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Messed up the wrong file / forgot to restore&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Boot back to WinRE and reverse it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;copy C:\Windows\System32\utilman.bak C:\Windows\System32\utilman.exe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;BitLocker prompt&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
No key, no access. Period.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft or Domain accounts&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft account:&lt;/strong&gt; Use the online reset: &lt;a href="https://account.live.com/password/reset" rel="noopener noreferrer"&gt;https://account.live.com/password/reset&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain machine:&lt;/strong&gt; Talk to your admin. This only resets local accounts.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;This is a &lt;strong&gt;break-glass move&lt;/strong&gt;, not routine hygiene. Use a password manager, link a recovery email/phone, or create a reset disk so you don’t need this again.
&lt;/li&gt;
&lt;li&gt;If this saved you time/money/your sanity, drop a thanks — and document your own “oh crap” fixes for Future You.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hope i could help you :)&lt;/p&gt;

&lt;p&gt;Happy un-locking 👊&lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>security</category>
      <category>sysadmin</category>
      <category>troubleshooting</category>
    </item>
    <item>
      <title>🚀 Meet IntelliText: The Power Tool for Text Automation You Didn’t Know You Needed</title>
      <dc:creator>Jack Scott</dc:creator>
      <pubDate>Wed, 06 Nov 2024 07:31:54 +0000</pubDate>
      <link>https://dev.to/jackscott7/introducing-intellitext-the-smart-way-to-manage-text-with-ease-mk7</link>
      <guid>https://dev.to/jackscott7/introducing-intellitext-the-smart-way-to-manage-text-with-ease-mk7</guid>
      <description>&lt;p&gt;Hi There&lt;/p&gt;

&lt;p&gt;Ever felt bogged down by repetitive typing tasks? 😫 Whether you’re a developer, writer, or anyone who types a lot, IntelliText is here to save you time. This Python-based tool listens to your keyboard input, auto-inserting text or performing actions based on custom macros. Say goodbye to redundancy and hello to productivity! 💪&lt;/p&gt;

&lt;p&gt;✨ What is IntelliText?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/JackScott7/IntelliText" rel="noopener noreferrer"&gt;IntelliText&lt;/a&gt; is your new best friend for automating frequent text and commands. It’s designed to manage word macros and action macros through customizable shortcuts. For instance:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Word Macros 📝: Type !email, and IntelliText can insert your entire email signature. Or !addr could fill in your address.
Action Macros ⚙️: Need to quickly paste clipboard content? Use #cb to instantly insert it, or create a macro like #deploy to launch your favorite script.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;With its extension support, IntelliText is adaptable to any unique workflow, ensuring it grows with your needs. 🔧&lt;/p&gt;

&lt;p&gt;🔑 Key Features You’ll Love&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Custom Macros 🛠️: Build your shortcuts in macros.json for fast, flexible text handling.
Action Automation ⚡: From launching apps to pasting data, use # triggers to reduce redundant steps.
Extension Support 📦: Add your own functions or scripts and integrate them with IntelliText macros, expanding possibilities.
Macro Shuffle 🎲: Tired of typing the same things? Configure lists that shuffle outputs, like rotating programming languages or project tasks.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;🚀 How to Get Started&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Clone the Repo 📥: Get IntelliText from GitHub and install dependencies or install using pip.
Create Your Macros ✏️: Define your frequently used text or actions in the it_macros.json file.
Run IntelliText 🏃: With one click, IntelliText starts working with your macros, ready to simplify your workflow.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Examples: What Can IntelliText Do for You? 💡&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Email Management 📧: Insert standardized replies with a shortcut. Type !thanks, and it can auto-fill a thank-you note.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Coding Shortcuts 💻: Use macros to insert commonly used code snippets or comments, saving time on boilerplate code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Quick Data Access 📂: Set up #link to open frequently used resources like documentation or project files directly from IntelliText.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👥 Join the IntelliText Community&lt;/p&gt;

&lt;p&gt;IntelliText is open-source and open for contributions! 💡 If you have ideas for more powerful macros or custom extensions, share them with the community! Get IntelliText, give it a star ⭐ on &lt;a href="https://github.com/JackScott7/IntelliText" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, and let’s make text management smoother together.&lt;/p&gt;

</description>
      <category>python</category>
      <category>automation</category>
      <category>productivity</category>
      <category>shortcut</category>
    </item>
  </channel>
</rss>
