<?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>Forem: Pavel Piuro</title>
    <description>The latest articles on Forem by Pavel Piuro (@el1fe).</description>
    <link>https://forem.com/el1fe</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%2F1959821%2Fda5187ec-d456-46b2-8fc2-773859f56a4a.JPG</url>
      <title>Forem: Pavel Piuro</title>
      <link>https://forem.com/el1fe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/el1fe"/>
    <language>en</language>
    <item>
      <title>How I Built a Portfolio That Makes Recruiters Actually Stop and Look</title>
      <dc:creator>Pavel Piuro</dc:creator>
      <pubDate>Thu, 25 Dec 2025 18:52:17 +0000</pubDate>
      <link>https://forem.com/el1fe/how-i-built-a-portfolio-that-makes-recruiters-actually-stop-and-look-1e3n</link>
      <guid>https://forem.com/el1fe/how-i-built-a-portfolio-that-makes-recruiters-actually-stop-and-look-1e3n</guid>
      <description>&lt;h2&gt;
  
  
  Intro: Why Most Developer Portfolios Suck
&lt;/h2&gt;

&lt;p&gt;When you open yet another default developer portfolio, you see the same thing: three sections, stock icons, "Hello, I'm John and I'm passionate about code." Boring as hell.&lt;/p&gt;

&lt;p&gt;I decided to do it differently. I wanted my site to demonstrate skills by itself. Not tell about them-show them.&lt;/p&gt;

&lt;p&gt;The result: &lt;strong&gt;el1fe.com&lt;/strong&gt;-a cyberpunk portfolio with an interactive terminal, live cursors, a cosmic experience timeline, Matrix rain, a Snake game, and a ton of other madness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack: Bleeding Edge
&lt;/h2&gt;

&lt;p&gt;When starting a project, you can go with tried-and-true and safe. Or you can go with the latest and suffer. I chose to suffer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Next.js 16&lt;/strong&gt;-yes, version sixteen. While everyone's sitting on 14, I'm already on the bleeding edge.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;React 19&lt;/strong&gt;-with new capabilities like server components and improved suspense.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;-strict typing everywhere, no &lt;code&gt;any&lt;/code&gt; allowed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Animations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Framer Motion&lt;/strong&gt;-version 12+ with motion values and layout animations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CSS Animations&lt;/strong&gt;-for heavy effects (matrix, particles) I use pure CSS to not kill performance.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Infrastructure:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vercel&lt;/strong&gt;-deploys in seconds, edge functions, analytics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supabase&lt;/strong&gt;-for guestbook, analytics, and real-time features.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Husky + lint-staged&lt;/strong&gt;-pre-commit hooks for formatting.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;## The Terminal: 30+ Commands and a Full Filesystem&lt;/p&gt;

&lt;p&gt;The main feature of the site is the interactive terminal. It's not just decoration. It's a full bash simulation with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Virtual filesystem&lt;/strong&gt;-&lt;code&gt;/home/visitor&lt;/code&gt;, &lt;code&gt;/pages&lt;/code&gt;, &lt;code&gt;/projects&lt;/code&gt; with real files&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;30+ commands&lt;/strong&gt;: &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;cd&lt;/code&gt;, &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;tree&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;find&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;tail&lt;/code&gt;, &lt;code&gt;wc&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Easter eggs&lt;/strong&gt;: &lt;code&gt;cowsay&lt;/code&gt;, &lt;code&gt;fortune&lt;/code&gt;, &lt;code&gt;figlet&lt;/code&gt;, &lt;code&gt;matrix&lt;/code&gt;, &lt;code&gt;hack&lt;/code&gt;, &lt;code&gt;sl&lt;/code&gt; (train!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vim trap&lt;/strong&gt;-the &lt;code&gt;vim&lt;/code&gt; command traps you, and you need to know how to exit (:q!)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Autocomplete&lt;/strong&gt;-Tab works like in a real terminal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Command history&lt;/strong&gt;-up/down arrows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cursor navigation&lt;/strong&gt;-move left/right through the line&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The terminal code is 980+ lines just in &lt;code&gt;commands.ts&lt;/code&gt;. That's more than the entire codebase of some "portfolios."&lt;/p&gt;

&lt;h2&gt;
  
  
  Cosmic Experience Timeline
&lt;/h2&gt;

&lt;p&gt;The experience page isn't a boring list. It's a journey through space:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Parallax background&lt;/strong&gt;-three layers of stars moving at different speeds&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cosmic stations&lt;/strong&gt;-each job is a space station in orbit&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Warp effect&lt;/strong&gt;-scrolling creates a warp jump effect&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Nebula clouds&lt;/strong&gt;-animated nebulae in the background&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Glitch effects&lt;/strong&gt;-headers with cyberpunk glitch&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Live Cursors
&lt;/h2&gt;

&lt;p&gt;You can see other visitors' cursors on the site in real-time. Built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supabase Realtime&lt;/strong&gt;-WebSocket connections&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Throttled updates&lt;/strong&gt;-to not spam the server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smooth interpolation&lt;/strong&gt;-cursors move smoothly&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Numbers That Speak:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;~475,000&lt;/strong&gt; lines of TypeScript/TSX&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~14,000&lt;/strong&gt; lines of CSS
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;89&lt;/strong&gt; commits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;28&lt;/strong&gt; components&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;55&lt;/strong&gt; CSS modules&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;12&lt;/strong&gt; pages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;30+&lt;/strong&gt; terminal commands&lt;/li&gt;
&lt;li&gt;Development since &lt;strong&gt;July 2023&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Features Nobody Asked For, But I Built Anyway
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Snake Game&lt;/strong&gt;-right on the homepage, 🐍 button&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Matrix mode&lt;/strong&gt;-&lt;code&gt;matrix&lt;/code&gt; command in terminal&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hack simulation&lt;/strong&gt;-&lt;code&gt;hack mainframe&lt;/code&gt; launches a hacking simulation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cowsay&lt;/strong&gt;-because what terminal is complete without a cow&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Vim trap&lt;/strong&gt;-classic joke for programmers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Neofetch&lt;/strong&gt;-displays portfolio "system information"&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;World map analytics&lt;/strong&gt;-map showing visitor locations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sound effects&lt;/strong&gt;-optional audio feedback&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Bilingual&lt;/strong&gt;-full RU/EN support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PWA&lt;/strong&gt;-works as an app, service worker, offline mode&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Hydration Is Pain
&lt;/h3&gt;

&lt;p&gt;Next.js SSR + client-side animations = endless hydration mismatches. Solution: &lt;code&gt;mounted&lt;/code&gt; state and conditional rendering.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Service Workers Can Break Everything
&lt;/h3&gt;

&lt;p&gt;Caching HTML pages with cache-first strategy = users see old versions. Solution: network-first for HTML, cache-first for static assets.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Scroll Restoration Is the Enemy
&lt;/h3&gt;

&lt;p&gt;Browser tries to restore scroll position after reload. On SPAs this looks like a bug. Solution: &lt;code&gt;history.scrollRestoration = 'manual'&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Framer Motion on Mobile-Be Careful
&lt;/h3&gt;

&lt;p&gt;Complex animations drain battery. For heavy effects, pure CSS animations with &lt;code&gt;will-change&lt;/code&gt; work better.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. TypeScript Saves Lives
&lt;/h3&gt;

&lt;p&gt;113 .ts/.tsx files and zero runtime type errors in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;[ ] AI-powered chat in terminal?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] More games (Tetris? Doom?)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] 3D sections with Three.js&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;[ ] Blog with MDX and code playground&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;A developer portfolio isn't a resume in HTML. It's an opportunity to show what you're capable of. I chose to show that I can create something unique, interactive, and technically complex.&lt;/p&gt;

&lt;p&gt;89 commits. 475,000 lines of code. One uncompromising result.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;el1fe.com&lt;/strong&gt;-welcome to the cyber terminal.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;P.S. If you found a bug-it's not a bug, it's a feature. But write in the guestbook anyway.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>portfolio</category>
      <category>discuss</category>
    </item>
    <item>
      <title>My first CLI tool to make git commits faster</title>
      <dc:creator>Pavel Piuro</dc:creator>
      <pubDate>Thu, 20 Feb 2025 18:45:38 +0000</pubDate>
      <link>https://forem.com/el1fe/my-first-cli-tool-to-make-git-commits-faster-38eb</link>
      <guid>https://forem.com/el1fe/my-first-cli-tool-to-make-git-commits-faster-38eb</guid>
      <description>&lt;h2&gt;
  
  
  Introducing Smart Commit: My First CLI Tool for Smarter Git Commits
&lt;/h2&gt;

&lt;p&gt;Hey devs!&lt;/p&gt;

&lt;p&gt;I’m thrilled to introduce &lt;strong&gt;Smart Commit&lt;/strong&gt;, my very first CLI tool that’s been an absolute game-changer for my workflow. I built it out of sheer frustration with messy, inconsistent commit messages and wanted a way to streamline my Git process. What started as a personal project quickly evolved into a robust tool packed with features that not only simplify my life but could help you too!&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Smart Commit?
&lt;/h3&gt;

&lt;p&gt;Smart Commit is a highly customizable CLI utility designed to guide you through the commit process interactively. It ensures your commit messages and branch names are consistent and well-formatted, integrating seamlessly with your development workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Interactive Prompts:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Pick exactly which prompts you need—from commit type, scope, summary, body, and footer, to ticket and CI tests. You get to tailor the commit process to your workflow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Template-Based Commit Messages:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Define your own commit message format using placeholders like &lt;code&gt;{type}&lt;/code&gt;, &lt;code&gt;{summary}&lt;/code&gt;, &lt;code&gt;{body}&lt;/code&gt;, and more. Total flexibility means your commit messages always follow your preferred style.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CI Integration:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Optionally run a CI command before your commit. It’s a handy way to double-check your changes automatically.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auto Ticket Extraction:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Automatically extract a ticket ID from your branch name. No more manual copying and pasting—just seamless integration with your issue tracking!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Push and Signed Commits:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Automatically push commits after creation with the &lt;code&gt;--push&lt;/code&gt; flag, and create GPG-signed commits using the &lt;code&gt;--sign&lt;/code&gt; flag for extra security.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Commit Statistics &amp;amp; History Search:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
View commit statistics as cool ASCII graphs (like a shortlog by author or an activity graph) or search your commit history by keyword, author, or date range. It’s all about keeping you informed about your project’s progress.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Additional Commands:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Need to amend, rollback, or rebase? Smart Commit offers interactive commands for amending your last commit, rolling back changes (with options for soft or hard reset), and even a rebase helper with in-editor guidance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Advanced Branch Creation:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The &lt;code&gt;sc branch&lt;/code&gt; command lets you create a new branch from a base branch (or current HEAD) using a customizable naming template. With support for universal placeholders, branch type selection, and custom sanitization rules, creating and managing branches has never been easier.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  My Journey and Call for Contributions
&lt;/h3&gt;

&lt;p&gt;I built Smart Commit to solve a very personal problem—dealing with messy commits—and I’m really proud of what it can do. This is my very first library, and it’s been a journey of learning, experimenting, and improving. I’m super open to feedback, suggestions, and contributions. Whether you have ideas to make it even better or want to jump in and contribute code, please feel free to open issues or submit pull requests.&lt;/p&gt;

&lt;p&gt;Let’s build something awesome together!&lt;/p&gt;

&lt;h3&gt;
  
  
  Check It Out
&lt;/h3&gt;

&lt;p&gt;You can find Smart Commit on GitHub here: &lt;a href="https://github.com/eL1fe/smart-commit" rel="noopener noreferrer"&gt;Smart Commit on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks a ton for taking a look, and happy coding!&lt;/p&gt;

</description>
      <category>cli</category>
      <category>git</category>
      <category>node</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
