<?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: Ivan Zakharchanka</title>
    <description>The latest articles on DEV Community by Ivan Zakharchanka (@zenpie).</description>
    <link>https://dev.to/zenpie</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%2F1511093%2Ffe824c21-b78c-4c8a-b470-70612244d162.jpg</url>
      <title>DEV Community: Ivan Zakharchanka</title>
      <link>https://dev.to/zenpie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zenpie"/>
    <language>en</language>
    <item>
      <title>prmt: instant-feeling shell prompts (sub-millisecond, even over SSH)</title>
      <dc:creator>Ivan Zakharchanka</dc:creator>
      <pubDate>Wed, 29 Oct 2025 22:06:45 +0000</pubDate>
      <link>https://dev.to/zenpie/prmt-instant-feeling-shell-prompts-sub-millisecond-even-over-ssh-2dd3</link>
      <guid>https://dev.to/zenpie/prmt-instant-feeling-shell-prompts-sub-millisecond-even-over-ssh-2dd3</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Rust-powered shell prompt with sub-millisecond rendering that stays fast over SSH.&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/3axap4eHko" rel="noopener noreferrer"&gt;
        3axap4eHko
      &lt;/a&gt; / &lt;a href="https://github.com/3axap4eHko/prmt" rel="noopener noreferrer"&gt;
        prmt
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Ultra-fast, customizable shell prompt generator
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;prmt 🚀&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Ultra-fast, customizable shell prompt that won't slow you down&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://crates.io/crates/prmt" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/ff56291c18c098350104c4e9c3ccb2f98378e3c2a6cf912e0f1261c93108342e/68747470733a2f2f696d672e736869656c64732e696f2f6372617465732f762f70726d742e737667" alt="Crates.io"&gt;&lt;/a&gt;
&lt;a href="https://opensource.org/licenses/MIT" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://www.rust-lang.org" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/988c2cec53d721a6d93ba204b70bcd3a4536428be58e3870e3a05bf5a2b59009/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f727573742d323032342d6f72616e67652e737667" alt="Rust"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/3axap4eHko/prmt/./terminal.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2F3axap4eHko%2Fprmt%2F.%2Fterminal.png" alt="Terminal"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rendered with &lt;code&gt;"{path:#89dceb}{rust:#f38ba8:f: 🦀}{git:#f9e2af:f: }\n{ok:#a6e3a1}{fail:#f38ba8} "&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;⚡ Blazing Fast&lt;/strong&gt;: Sub-millisecond rendering for typical prompts (~2ms end-to-end)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🎨 Highly Customizable&lt;/strong&gt;: Full control over colors, formats, and what information to show&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🚀 Context Aware&lt;/strong&gt;: Automatically detects git repos, project files, shows only what's relevant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📦 Zero Dependencies&lt;/strong&gt;: Single binary, no runtime dependencies required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🦀 Memory Efficient&lt;/strong&gt;: Zero-copy parsing with SIMD optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;✨ Smart Rendering&lt;/strong&gt;: Only shows information when relevant to your current directory&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why prmt?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Faster than alternatives&lt;/strong&gt; – Typical prompts render in ~2ms. Starship averages 10-50ms, oh-my-posh 20-100ms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zero configuration needed&lt;/strong&gt; – Works out of the box with sensible defaults. Customize only what you want.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Predictable performance&lt;/strong&gt; – No async operations, no network calls, no surprises. Your prompt is always instant.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Single binary&lt;/strong&gt; – Just install and go. No configuration files required unless…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/3axap4eHko/prmt" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;







&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Starship&lt;/strong&gt;: Beautiful but slow (~10-50ms renders). Async I/O adds unpredictable latency over SSH.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;oh-my-posh&lt;/strong&gt;: Feature-rich but heavy. 20MB binary, 20-100ms renders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pure Bash/Zsh&lt;/strong&gt;: Fast but unmaintainable config spaghetti.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sub-millisecond renders&lt;/strong&gt; — ~10-50 µs for path + git&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable&lt;/strong&gt; — no async I/O, no surprises over SSH&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero config&lt;/strong&gt; — works out of the box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Drop-in replacement&lt;/strong&gt; — migrate from Starship in 5 minutes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;prmt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Bash / Zsh
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Bash: ~/.bashrc&lt;/span&gt;
&lt;span class="nv"&gt;PS1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'$(prmt --code $? "{path:cyan:s} {git:purple:s:on :} {ok:green}{fail:red} ")'&lt;/span&gt;

&lt;span class="c"&gt;# Zsh: ~/.zshrc (add this line first)&lt;/span&gt;
setopt PROMPT_SUBST
&lt;span class="nv"&gt;PROMPT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'$(prmt --code $? "{path:cyan:s} {git:purple:s:on :} {ok:green}{fail:red} ")'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Fish
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# ~/.config/fish/config.fish
function fish_prompt
  prmt --code $status '{path:cyan:s} {git:purple:s:on :} {ok:green}{fail:red} '
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;PowerShell is also supported — see the &lt;a href="https://github.com/3axap4eHko/prmt#quick-start" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Performance breakdown
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;th&gt;Modules&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;What's slow?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Minimal&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{path}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~10 µs&lt;/td&gt;
&lt;td&gt;Nothing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{path} {git} {ok}{fail}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~1-2 ms&lt;/td&gt;
&lt;td&gt;Git status check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{path} {git} {rust} {node}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;~25-30 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Running &lt;code&gt;rustc --version&lt;/code&gt; etc&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast mode&lt;/td&gt;
&lt;td&gt;&lt;code&gt;--no-version&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&amp;lt; 5 ms&lt;/td&gt;
&lt;td&gt;Skips all version calls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Key insight&lt;/strong&gt;: The renderer is microseconds. Version detection (running &lt;code&gt;rustc --version&lt;/code&gt;, &lt;code&gt;node --version&lt;/code&gt;) dominates total time. Use &lt;code&gt;--no-version&lt;/code&gt; if you don't need versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reproduce locally
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Internal benchmark&lt;/span&gt;
prmt &lt;span class="nt"&gt;--bench&lt;/span&gt; &lt;span class="s1"&gt;'{path} {git} {ok}{fail}'&lt;/span&gt;

&lt;span class="c"&gt;# End-to-end with hyperfine&lt;/span&gt;
hyperfine &lt;span class="nt"&gt;--warmup&lt;/span&gt; 5 &lt;span class="s1"&gt;'prmt --no-version "{path} {git} {ok}{fail}"'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Migrating from Starship
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Starship&lt;/th&gt;
&lt;th&gt;prmt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;directory&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{path:r}&lt;/code&gt; (relative) or &lt;code&gt;{path:s}&lt;/code&gt; (short)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git_branch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{git:s}&lt;/code&gt; (branch only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git_status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{git}&lt;/code&gt; (branch + status)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;character&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{ok}{fail}&lt;/code&gt; with &lt;code&gt;--code $?&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;nodejs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{node:s}&lt;/code&gt; (short version)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rust&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;{rust:s}&lt;/code&gt; (short version)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Plain prompt&lt;/strong&gt; (path + git + indicator):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prmt &lt;span class="nt"&gt;--code&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="s2"&gt;"{path:cyan:s} {git:purple:s:on :} {ok:green}{fail:red} "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With versions&lt;/strong&gt; (add Node/Rust):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;prmt &lt;span class="nt"&gt;--code&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt; &lt;span class="s2"&gt;"{path:cyan:s} {node:green:s: ⬢}{rust:red:s: 🦀}{git:purple} {ok}{fail} "&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output: &lt;code&gt;projects ⬢20.5 🦀1.90 main ❯&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Why it's fast
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero-copy parsing&lt;/strong&gt; — minimal allocations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cached module detection&lt;/strong&gt; — only checks relevant directories&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No async runtime&lt;/strong&gt; — no Tokio overhead, predictable latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;See the &lt;a href="https://github.com/3axap4eHko/prmt#performance" rel="noopener noreferrer"&gt;README&lt;/a&gt; for benchmarks and implementation details.&lt;/p&gt;




&lt;h2&gt;
  
  
  Format cheatsheet
&lt;/h2&gt;

&lt;p&gt;Syntax: &lt;code&gt;{module:style:type:prefix:postfix}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modules&lt;/strong&gt;: &lt;code&gt;path&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, &lt;code&gt;rust&lt;/code&gt;, &lt;code&gt;node&lt;/code&gt;, &lt;code&gt;python&lt;/code&gt;, &lt;code&gt;go&lt;/code&gt;, &lt;code&gt;time&lt;/code&gt;, &lt;code&gt;ok&lt;/code&gt;, &lt;code&gt;fail&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Styles&lt;/strong&gt;: &lt;code&gt;red&lt;/code&gt;, &lt;code&gt;cyan&lt;/code&gt;, &lt;code&gt;#89dceb&lt;/code&gt; (hex), &lt;code&gt;bold&lt;/code&gt;, &lt;code&gt;dim&lt;/code&gt;, &lt;code&gt;italic&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Path types&lt;/strong&gt;: &lt;code&gt;r&lt;/code&gt; (relative), &lt;code&gt;a&lt;/code&gt; (absolute), &lt;code&gt;s&lt;/code&gt; (short — last dir only)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Git types&lt;/strong&gt;: &lt;code&gt;f&lt;/code&gt; (branch+status), &lt;code&gt;s&lt;/code&gt; (branch only)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version types&lt;/strong&gt;: &lt;code&gt;m&lt;/code&gt; (major), &lt;code&gt;s&lt;/code&gt; (short), &lt;code&gt;f&lt;/code&gt; (full)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Examples&lt;/strong&gt;:&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;path:cyan:s&lt;span class="o"&gt;}&lt;/span&gt;              &lt;span class="c"&gt;# Short path in cyan&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;git:purple::on :&lt;span class="o"&gt;}&lt;/span&gt;         &lt;span class="c"&gt;# "on main" in purple&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;rust:red:s: 🦀&lt;span class="o"&gt;}&lt;/span&gt;           &lt;span class="c"&gt;# "🦀1.90" in red&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;ok:green:✓&lt;span class="o"&gt;}{&lt;/span&gt;fail:red:✗&lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c"&gt;# Custom success/fail symbols&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full reference in the &lt;a href="https://github.com/3axap4eHko/prmt#format-specification" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;




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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;prmt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Like it? ⭐ the &lt;a href="https://github.com/3axap4eHko/prmt" rel="noopener noreferrer"&gt;repo&lt;/a&gt; and share your config!&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Ivan Zakharchanka&lt;/strong&gt; · GitHub &lt;a href="https://github.com/3axap4eHko" rel="noopener noreferrer"&gt;@3axap4eHko&lt;/a&gt;&lt;/p&gt;

</description>
      <category>terminal</category>
      <category>rust</category>
      <category>cli</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
