<?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: Zaur Ibrahimov</title>
    <description>The latest articles on Forem by Zaur Ibrahimov (@zaur_ibrahimov).</description>
    <link>https://forem.com/zaur_ibrahimov</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%2F2530109%2F771438c1-b0fe-4dad-8887-278f3c35ad2b.JPG</url>
      <title>Forem: Zaur Ibrahimov</title>
      <link>https://forem.com/zaur_ibrahimov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/zaur_ibrahimov"/>
    <language>en</language>
    <item>
      <title>PomoFox: The Pomodoro Timer That Does More Than Just Time</title>
      <dc:creator>Zaur Ibrahimov</dc:creator>
      <pubDate>Mon, 03 Feb 2025 12:32:10 +0000</pubDate>
      <link>https://forem.com/zaur_ibrahimov/pomofox-the-pomodoro-timer-that-does-more-than-just-time-9g8</link>
      <guid>https://forem.com/zaur_ibrahimov/pomofox-the-pomodoro-timer-that-does-more-than-just-time-9g8</guid>
      <description>&lt;h2&gt;
  
  
  Have you ever wondered if a Pomodoro timer could be more than just a countdown? I did, and here’s how I brought that idea to life…
&lt;/h2&gt;

&lt;p&gt;A couple of weeks ago, I set out to create an exciting open-source project. Since the Pomodoro technique is part of my daily routine, I thought, “Why not build a Pomodoro timer app and share it on GitHub?”&lt;/p&gt;

&lt;p&gt;But after checking out the existing apps, I noticed they all looked the same—plain interface, timer in the center, and that’s pretty much it. So I asked myself, what if my app could surprise users during each break with something a little more… unconventional?&lt;/p&gt;

&lt;p&gt;Imagine this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A prompt to do 10 push-ups.&lt;/li&gt;
&lt;li&gt;A random "Would You Rather?" question.&lt;/li&gt;
&lt;li&gt;AI giving you a sarcastic roast.&lt;/li&gt;
&lt;li&gt;A pointless yet hilarious fact.&lt;/li&gt;
&lt;li&gt;A website that melts like ice cream.&lt;/li&gt;
&lt;li&gt;The whole page flipping upside down.&lt;/li&gt;
&lt;li&gt;A random riddle to solve.&lt;/li&gt;
&lt;li&gt;And for those long late-night work sessions, Ana de Armas from &lt;em&gt;Blade Runner 2049&lt;/em&gt; appears in the background, saying, “What a day… You look lonely, I can fix that.” 😆&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In essence: fun, delightful chaos.&lt;/p&gt;

&lt;p&gt;I got to work right away, designing the app in a retro pixel-art style and naming it &lt;em&gt;PomoFox&lt;/em&gt;. Fortunately, the domain &lt;a href="https://www.pomofox.com/" rel="noopener noreferrer"&gt;pomofox.com&lt;/a&gt; was free, so I snatched it up. I also created a cute fox mascot 🦊, added a Lofi music player, light/dark mode pixel art backgrounds, customizable timers, and a fun logo.&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%2Fevmfa8xwi9mcafc1cfau.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%2Fevmfa8xwi9mcafc1cfau.png" alt="PomoFox" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But as I progressed, I realized the app had shifted from chaotic to more of an aesthetic experience. And that’s when I decided to bring back the chaos—with a game! 🎮&lt;/p&gt;

&lt;p&gt;Since “Pomodoro” means “tomato” in Italian and my app is &lt;em&gt;PomoFox&lt;/em&gt; (Pomo = 🍅, Fox = 🦊), I created a game where a fox runs through the forest, dodging sword-wielding tomatoes 🍅⚔️. (I mean, it just made sense, right?)&lt;/p&gt;

&lt;p&gt;I had never built a game before, but I dove in, learned along the way, and shipped it. You can play the game here: &lt;a href="https://game.pomofox.com" rel="noopener noreferrer"&gt;game.pomofox.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As a fan of open-source, I’ve also uploaded the code to GitHub: &lt;a href="https://github.com/zibrahimov/fox-runner" rel="noopener noreferrer"&gt;github.com/zibrahimov/fox-runner&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.amazonaws.com%2Fuploads%2Farticles%2F5fp4l0kxpc3a2vu3bmem.gif" 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%2F5fp4l0kxpc3a2vu3bmem.gif" alt="PomoFox Game" width="440" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I shared the app on &lt;a href="https://www.producthunt.com/posts/pomofox" rel="noopener noreferrer"&gt;ProductHunt&lt;/a&gt; and &lt;a href="https://www.reddit.com/r/webdev/comments/1ifawh7/pomodoro_app_with_music_player_and_breaktime_game/?utm_source=share&amp;amp;utm_medium=web3x&amp;amp;utm_name=web3xcss&amp;amp;utm_term=1&amp;amp;utm_content=share_button" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt;, and the response has been fantastic 🚀. All of this was accomplished in just two weeks.&lt;/p&gt;

&lt;p&gt;Moving forward, I’ll be adding even more creative features (and probably some more quirky 2D games) whenever inspiration hits. If you have any wild ideas for PomoFox, feel free to share them in the comments! 🚀🦊&lt;/p&gt;

&lt;p&gt;What do you think of the project?&lt;/p&gt;

&lt;p&gt;And if you’re new to the Pomodoro Technique, check out my blog post where I dive into how it works and my personal experience with it!&lt;br&gt;
&lt;a href="https://www.egoodies.io/post/my-experience-with-pomodoro-technique" rel="noopener noreferrer"&gt;My Experience with Pomodoro Technique&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Thinking of Creating an NPM Package – Any Feedback or Ideas?</title>
      <dc:creator>Zaur Ibrahimov</dc:creator>
      <pubDate>Wed, 01 Jan 2025 19:10:46 +0000</pubDate>
      <link>https://forem.com/zaur_ibrahimov/thinking-of-creating-an-npm-package-any-feedback-or-ideas-335f</link>
      <guid>https://forem.com/zaur_ibrahimov/thinking-of-creating-an-npm-package-any-feedback-or-ideas-335f</guid>
      <description>&lt;p&gt;Hey everyone, 👋&lt;/p&gt;

&lt;p&gt;I’ve been working on a few utilities and thought it might be a good idea to bundle them into an NPM package to share with the community. I’m looking to create something that makes developers' lives a bit easier by providing simple, reusable code for common tasks.&lt;/p&gt;

&lt;p&gt;Before diving into the development process, I wanted to get some feedback from you all:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are some types of utilities you wish were easier to find as an NPM package?&lt;/li&gt;
&lt;li&gt;What problems do you commonly face that could be solved with a small package?&lt;/li&gt;
&lt;li&gt;What would make you more likely to use or recommend such a package?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Any thoughts, feedback, or ideas are much appreciated! 🙌&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Zustand - 🐻 Bear necessities for state management in React</title>
      <dc:creator>Zaur Ibrahimov</dc:creator>
      <pubDate>Mon, 09 Dec 2024 16:13:53 +0000</pubDate>
      <link>https://forem.com/zaur_ibrahimov/zustand-bear-necessities-for-state-management-in-react-1omd</link>
      <guid>https://forem.com/zaur_ibrahimov/zustand-bear-necessities-for-state-management-in-react-1omd</guid>
      <description>&lt;p&gt;State management has always been an important part of modern applications. Over the years, various state management tools and libraries have emerged to help developers handle this complexity. First, Redux changed the game in larger applications with complex state logic. Especially back in the day, it was going hand in hand with React. But it has a heavy boilerplate and a steeper learning curve.&lt;/p&gt;

&lt;p&gt;Then we had MobX, a state management solution based on reactive programming principles. It requires less boilerplate than Redux, automatically tracks state, and updates components. But it also had concepts such as observables can be difficult for some developers.&lt;/p&gt;

&lt;p&gt;Then Facebook introduced the Context API which requires no additional libraries and integrates well with other React features. But it’s also not handy with complex state logic.&lt;/p&gt;

&lt;p&gt;Examples can go on and on. So let’s cut to the chase.&lt;/p&gt;

&lt;p&gt;In this article, I want to talk about a new state management library that has been gaining popularity recently - Zustand. I use it in my work and now we’ll take a closer look at Zustand and try to understand how it can simplify state management in React applications.&lt;/p&gt;

&lt;p&gt;Let’s begin!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Zustand?
&lt;/h2&gt;

&lt;p&gt;According to their official documentation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A small, fast, and scalable bearbones state management solution. Zustand has a comfy API based on hooks. It isn't boilerplatey or opinionated, but has enough convention to be explicit and flux-like.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zustand (which means "state" in German) is a minimalistic state management library for React and other JavaScript-based applications. It provides a way to create a global state without the added complexity of larger solutions, such as Redux or MobX. Zustand's API is straightforward and aims to be more React-ish, making it easier for developers familiar with React to pick up and use.&lt;/p&gt;

&lt;p&gt;Here are some key features of Zustand:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Simplicity:&lt;/strong&gt; Zustand offers a simple API, which means a shorter learning curve, especially for those familiar with React's useState and useContext.&lt;br&gt;
&lt;strong&gt;- No Redux Boilerplate:&lt;/strong&gt; Unlike Redux, Zustand does away with the need for actions, types, reducers, and middleware for most use cases.&lt;br&gt;
&lt;strong&gt;- Flexibility:&lt;/strong&gt; It doesn't tie you to React, making it usable with other libraries or even vanilla JavaScript.&lt;br&gt;
&lt;strong&gt;- Middlewares:&lt;/strong&gt; Allows for middlewares to intercept actions and state changes.&lt;br&gt;
&lt;strong&gt;- Devtools:&lt;/strong&gt; Supports integration with React DevTools for a better debugging experience.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started with Zustand
&lt;/h2&gt;

&lt;p&gt;To get started with Zustand, you’ll need to install it via &lt;code&gt;npm&lt;/code&gt; or &lt;br&gt;
&lt;code&gt;yarn&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# NPM
npm install zustand

# Yarn
yarn add zustand
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here's a quick example to give you an idea of how it works:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import create from 'zustand';

// Create a store
const useStore = create(set =&amp;gt; ({
  count: 0,
  increase: () =&amp;gt; set(state =&amp;gt; ({ count: state.count + 1 })),
  decrease: () =&amp;gt; set(state =&amp;gt; ({ count: state.count - 1 }))
}));

// React component
function Counter() {
  const { count, increase, decrease } = useStore();

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;button onClick={decrease}&amp;gt;-&amp;lt;/button&amp;gt;
      &amp;lt;span&amp;gt;{count}&amp;lt;/span&amp;gt;
      &amp;lt;button onClick={increase}&amp;gt;+&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the example above, create from Zustand is used to define a store with state and actions. This store is then utilized within a React component via the custom hook, useStore. It's simply a hook and you can use it anywhere, without the need for providers.&lt;/p&gt;

&lt;p&gt;Pretty simple!&lt;/p&gt;

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

&lt;p&gt;Zustand provides a lightweight and powerful alternative to heavier state management solutions. It’s especially great for projects that need a simple global state.&lt;/p&gt;

</description>
      <category>zustand</category>
      <category>react</category>
      <category>javascript</category>
      <category>web</category>
    </item>
    <item>
      <title>VSCode Extension to Simplify Code Collaboration and Sharing</title>
      <dc:creator>Zaur Ibrahimov</dc:creator>
      <pubDate>Thu, 05 Dec 2024 21:57:41 +0000</pubDate>
      <link>https://forem.com/zaur_ibrahimov/vscode-extension-to-simplify-code-collaboration-and-sharing-bm6</link>
      <guid>https://forem.com/zaur_ibrahimov/vscode-extension-to-simplify-code-collaboration-and-sharing-bm6</guid>
      <description>&lt;p&gt;Hey Devs! 👋&lt;/p&gt;

&lt;p&gt;As a developer, I’ve always found sharing and discussing code to be surprisingly difficult. Whether it’s trying to explain feedback over Slack or sharing code snippets, it feels like trying to describe a painting over the phone—frustrating, time-consuming, and often unclear.&lt;/p&gt;

&lt;p&gt;So, I built &lt;a href="https://marketplace.visualstudio.com/items?itemName=Coremote.coremote-vs-extension" rel="noopener noreferrer"&gt;CoRemote&lt;/a&gt; to make this process simpler. It’s a tool designed to bring code-related discussions right where they belong: in your IDE.&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%2Fbeha9xjhq1l1omot0kmx.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%2Fbeha9xjhq1l1omot0kmx.png" alt="Image description" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Problem Does It Solve and How It Works 🛠️
&lt;/h2&gt;

&lt;p&gt;Sharing specific code blocks and discussing them can be really frustrating. You’re often left with three bad options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hop on a meeting&lt;/strong&gt; to explain it in person.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Take a screenshot&lt;/strong&gt; and try to describe the issue in the text.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Record a video&lt;/strong&gt; and hope the recipient watches it in the right context.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CoRemote fixes this by letting you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start discussions directly on specific lines of code&lt;/strong&gt;—perfect for detailed feedback.&lt;/li&gt;
&lt;/ul&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%2Fi5niyastisxtchkrqq6k.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%2Fi5niyastisxtchkrqq6k.png" alt="Image description" width="800" height="680"&gt;&lt;/a&gt;&lt;br&gt;
Use CoRemote to quickly start conversations right where the action happens, whether it's a bug fix or a feature request. This feature allows you to give and receive feedback instantly, keeping the discussion highly relevant and contextual.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Share deep links to exact code locations&lt;/strong&gt;—because context is everything.&lt;/li&gt;
&lt;/ul&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%2Fdmzjnnjw036um4vrams9.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%2Fdmzjnnjw036um4vrams9.png" alt="Image description" width="800" height="772"&gt;&lt;/a&gt;&lt;br&gt;
CoRemote lets you generate and share deep links to exact lines of code, ensuring that everyone involved is on the same page, with no confusion about where to look. This makes referencing code snippets faster and easier than ever.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.coremote.co/" rel="noopener noreferrer"&gt;View Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I just launched &lt;strong&gt;CoRemote&lt;/strong&gt; in beta, and I’d love for you to give it a try. Feedback is key at this stage—it’s how I’ll make it even better for you.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=Coremote.coremote-vs-extension" rel="noopener noreferrer"&gt;👉 Check it out here!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s make code collaboration smooth and fun again! 🙌&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>productivity</category>
      <category>developer</category>
      <category>product</category>
    </item>
  </channel>
</rss>
