<?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: Joodi</title>
    <description>The latest articles on DEV Community by Joodi (@joodi).</description>
    <link>https://dev.to/joodi</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%2F1320259%2F2954b0e0-8317-4bda-bad6-846087f55a96.jpg</url>
      <title>DEV Community: Joodi</title>
      <link>https://dev.to/joodi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joodi"/>
    <language>en</language>
    <item>
      <title>Your Date Picker Is Outdated. Here’s a Better Way.</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Sat, 15 Aug 2026 14:54:29 +0000</pubDate>
      <link>https://dev.to/joodi/your-date-picker-is-outdated-heres-a-better-way-57h2</link>
      <guid>https://dev.to/joodi/your-date-picker-is-outdated-heres-a-better-way-57h2</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F38vwkmlsiwjld6n7n4oi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F38vwkmlsiwjld6n7n4oi.png" alt=" " width="384" height="260"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most React apps still use the same old date picker. It works… but it feels clunky, especially on mobile.&lt;/p&gt;

&lt;p&gt;There’s a much better way: an &lt;strong&gt;&lt;a href="https://react-wheel-picker.chanhdai.com/" rel="noopener noreferrer"&gt;iOS-style Wheel Picker&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It scrolls smoothly, has that natural inertia feel, supports infinite looping, and just looks more polished. Users actually enjoy interacting with it. 😊&lt;/p&gt;

&lt;p&gt;One of the best libraries for this right now is &lt;a href="https://www.npmjs.com/package/@ncdai/react-wheel-picker" rel="noopener noreferrer"&gt;@ncdai/react-wheel-picker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It’s:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lightweight and unstyled (so you can fully customize it)&lt;/li&gt;
&lt;li&gt;Smooth on both touch and desktop&lt;/li&gt;
&lt;li&gt;Supports keyboard navigation&lt;/li&gt;
&lt;li&gt;Easy to install with shadcn if you’re using it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Live demo&lt;/strong&gt;: &lt;a href="https://react-wheel-picker.chanhdai.com" rel="noopener noreferrer"&gt;https://react-wheel-picker.chanhdai.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/@ncdai/react-wheel-picker" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/@ncdai/react-wheel-picker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/ncdai/react-wheel-picker" rel="noopener noreferrer"&gt;https://github.com/ncdai/react-wheel-picker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install it with:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @ncdai/react-wheel-picker&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you’re building forms, filters, or any kind of selection UI, give this a try. It’s one of those small upgrades that makes your product feel noticeably better.&lt;/p&gt;

&lt;p&gt;Have you switched to wheel pickers yet? Curious to hear your experience.&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Tried Zed for a few days — here’s what actually stood out</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Sun, 09 Aug 2026 10:58:22 +0000</pubDate>
      <link>https://dev.to/joodi/tried-zed-for-a-few-days-heres-what-actually-stood-out-1pei</link>
      <guid>https://dev.to/joodi/tried-zed-for-a-few-days-heres-what-actually-stood-out-1pei</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3buuoizagvunxtlydus4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3buuoizagvunxtlydus4.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://zed.dev/" rel="noopener noreferrer"&gt;Zed&lt;/a&gt;&lt;/strong&gt; is a fast, minimal code editor built in Rust. The same team behind Atom and Tree-sitter made it. It’s designed for speed and working with both humans and AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A few things that stood out:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It’s really fast. Opening projects and switching files feels almost instant.&lt;/li&gt;
&lt;li&gt;You can run AI agents right inside the editor.&lt;/li&gt;
&lt;li&gt;It has real collaboration features if you’re coding with someone else.&lt;/li&gt;
&lt;li&gt;You can import settings from VS Code or Cursor.&lt;/li&gt;
&lt;li&gt;On the free plan you can still connect your own models. I used OpenRouter and it worked fine.&lt;/li&gt;
&lt;li&gt;You can try Pro for 14 days without adding a credit card.&lt;/li&gt;
&lt;li&gt;They actually collaborated with Anthropic early on when building the AI features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One small tip&lt;/strong&gt;: the folder panel is on the right by default. If you prefer it on the left like VS Code, you can move it. Guide is here:&lt;br&gt;
&lt;a href="https://zed.dev/blog/new-panel-system" rel="noopener noreferrer"&gt;https://zed.dev/blog/new-panel-system&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Overall it feels clean and light. If you’re looking for something faster and simpler than the usual options, it’s worth a try.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>frontend</category>
      <category>backend</category>
      <category>software</category>
    </item>
    <item>
      <title>🥈 React Performance Tips: 12 Ways to Make Your App Faster</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Wed, 05 Aug 2026 20:00:30 +0000</pubDate>
      <link>https://dev.to/joodi/react-performance-tips-12-ways-to-make-your-app-faster-5bop</link>
      <guid>https://dev.to/joodi/react-performance-tips-12-ways-to-make-your-app-faster-5bop</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F90fdof3fpdoyyadphdx4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F90fdof3fpdoyyadphdx4.png" alt=" " width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;React is fast by default.&lt;/p&gt;

&lt;p&gt;But as an application grows, unnecessary renders, large lists, too much JavaScript, and excessive API requests can make it slower.&lt;/p&gt;

&lt;p&gt;The good news is that you don't need complicated tricks everywhere.&lt;/p&gt;

&lt;p&gt;Let's look at 12 practical ways to improve React performance, from simple improvements to more advanced techniques.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Stop Rendering What You Don't Need
&lt;/h2&gt;

&lt;p&gt;Every time a component renders, React runs its component function again.&lt;/p&gt;

&lt;p&gt;That doesn't mean every render is a problem. The problem is doing expensive work when nothing actually changed.&lt;/p&gt;

&lt;p&gt;For example, avoid putting unrelated state in a component that contains a large part of your UI.&lt;/p&gt;

&lt;p&gt;Instead, keep components focused so an update only affects the part of the UI that actually needs it.&lt;/p&gt;

&lt;p&gt;The goal isn't to prevent every render.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is to avoid unnecessary work.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Keep Your State in the Right Place
&lt;/h2&gt;

&lt;p&gt;Don't move every piece of state to the top of your application.&lt;/p&gt;

&lt;p&gt;If only one component needs the state, keep it there.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;SearchBox&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setQuery&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
      &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setQuery&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keeping state close to where it is used can reduce unnecessary updates in other parts of the application.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keep state as close as possible to the components that use it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  3. Don't Store Data You Can Calculate
&lt;/h2&gt;

&lt;p&gt;Not everything needs &lt;code&gt;useState&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example, don't store &lt;code&gt;fullName&lt;/code&gt; separately if you already have &lt;code&gt;firstName&lt;/code&gt; and &lt;code&gt;lastName&lt;/code&gt;.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;fullName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setFullName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;setFullName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just calculate it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fullName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;firstName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;lastName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This avoids unnecessary state and an unnecessary Effect.&lt;/p&gt;

&lt;p&gt;A simple rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you can calculate it during render, you probably don't need state for it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  4. Make Large Lists Faster
&lt;/h2&gt;

&lt;p&gt;Rendering thousands of elements can become expensive.&lt;/p&gt;

&lt;p&gt;Imagine a chat application with 10,000 messages.&lt;/p&gt;

&lt;p&gt;You don't need all 10,000 messages in the DOM at the same time.&lt;/p&gt;

&lt;p&gt;For large lists, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Virtualization&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Infinite scrolling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Virtualization keeps only the visible items, plus a small buffer, mounted in the DOM.&lt;/p&gt;

&lt;p&gt;Libraries such as &lt;code&gt;react-window&lt;/code&gt; can help with this.&lt;/p&gt;

&lt;p&gt;Don't add virtualization to every list. A list with 50 items probably doesn't need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Load Heavy Components Only When Needed
&lt;/h2&gt;

&lt;p&gt;Your users shouldn't have to download code they don't need immediately.&lt;/p&gt;

&lt;p&gt;React supports lazy loading with &lt;code&gt;lazy&lt;/code&gt; and &lt;code&gt;Suspense&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;lazy&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Settings&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the Settings component can be loaded when it is needed instead of being included in the initial JavaScript.&lt;/p&gt;

&lt;p&gt;This is useful for heavy or rarely visited features such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Charts&lt;/li&gt;
&lt;li&gt;Editors&lt;/li&gt;
&lt;li&gt;Maps&lt;/li&gt;
&lt;li&gt;Settings pages&lt;/li&gt;
&lt;li&gt;Large dashboards&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Smaller initial bundles usually mean faster initial loading.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Keep Search and UI Interactions Responsive
&lt;/h2&gt;

&lt;p&gt;Some updates don't need to happen immediately.&lt;/p&gt;

&lt;p&gt;For example, a search input should respond instantly while filtering thousands of results can happen at a lower priority.&lt;/p&gt;

&lt;p&gt;React provides &lt;code&gt;useTransition&lt;/code&gt; and &lt;code&gt;useDeferredValue&lt;/code&gt; for these situations.&lt;/p&gt;

&lt;p&gt;You can also debounce user input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;debouncedSearch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useDebounce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of sending a request on every keystroke, you can wait until the user stops typing.&lt;/p&gt;

&lt;p&gt;These techniques are useful for search, filtering, large lists, and complex dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Avoid Unnecessary API Requests
&lt;/h2&gt;

&lt;p&gt;Performance isn't only about rendering.&lt;/p&gt;

&lt;p&gt;Too many network requests can also make your application feel slow.&lt;/p&gt;

&lt;p&gt;Depending on your application, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching responses&lt;/li&gt;
&lt;li&gt;Request deduplication&lt;/li&gt;
&lt;li&gt;Pagination&lt;/li&gt;
&lt;li&gt;Debouncing search&lt;/li&gt;
&lt;li&gt;Canceling outdated requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if a user quickly searches for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;react
react performance
react performance optimization
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you don't necessarily want three requests running at the same time.&lt;/p&gt;

&lt;p&gt;The goal is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't make the network do work you don't need.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Memoization: When Should You Actually Use It?
&lt;/h2&gt;

&lt;p&gt;React provides three common memoization tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;useMemo&lt;/code&gt; caches a calculation result.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;useCallback&lt;/code&gt; caches a function reference.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;React.memo&lt;/code&gt; can skip a component render when its props haven't changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;filteredUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But don't add memoization everywhere.&lt;/p&gt;

&lt;p&gt;Memoization also has a cost and adds complexity.&lt;/p&gt;

&lt;p&gt;Use it when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A calculation is expensive.&lt;/li&gt;
&lt;li&gt;A component renders unnecessarily.&lt;/li&gt;
&lt;li&gt;A stable reference is actually useful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Don't optimize code that doesn't have a performance problem.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. React Compiler: Less Manual Optimization
&lt;/h2&gt;

&lt;p&gt;Modern React introduces another important piece: &lt;strong&gt;React Compiler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Compiler can automatically optimize components, values, and functions in many cases, reducing the need for manual memoization.&lt;/p&gt;

&lt;p&gt;That means you shouldn't automatically think:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;useMemo&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="nf"&gt;useCallback&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;whenever you see a performance problem.&lt;/p&gt;

&lt;p&gt;First ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Is there actually a performance problem?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If React Compiler is enabled for your project, let it handle the optimizations it can, and use manual memoization when you have a specific reason to do so.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Use Stable Keys and References
&lt;/h2&gt;

&lt;p&gt;Keys help React identify items in a list.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Item&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Item&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Stable keys help React understand which item was added, removed, or changed.&lt;/p&gt;

&lt;p&gt;The same idea applies to object and function references.&lt;/p&gt;

&lt;p&gt;Creating new objects or functions on every render can matter when you're working with memoized components.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Find the Real Bottleneck
&lt;/h2&gt;

&lt;p&gt;Once you understand the common optimization techniques, don't guess.&lt;/p&gt;

&lt;p&gt;Use &lt;strong&gt;React DevTools Profiler&lt;/strong&gt; to see which components render and how much time they take.&lt;/p&gt;

&lt;p&gt;You can also use the browser's Performance panel to investigate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long tasks&lt;/li&gt;
&lt;li&gt;Slow scripting&lt;/li&gt;
&lt;li&gt;Layout work&lt;/li&gt;
&lt;li&gt;Rendering problems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This component feels slow."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Find out &lt;strong&gt;why&lt;/strong&gt; it is slow.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Measure Again Before You Ship
&lt;/h2&gt;

&lt;p&gt;After making an optimization, measure the result again.&lt;/p&gt;

&lt;p&gt;Did the render time improve?&lt;/p&gt;

&lt;p&gt;Did the bundle become smaller?&lt;/p&gt;

&lt;p&gt;Did the interaction become more responsive?&lt;/p&gt;

&lt;p&gt;If the change doesn't improve anything, you may not need it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance Checklist
&lt;/h3&gt;

&lt;p&gt;Before shipping your React application, ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Am I rendering unnecessary UI?&lt;/li&gt;
&lt;li&gt;Is my state in the right place?&lt;/li&gt;
&lt;li&gt;Am I storing values I can calculate?&lt;/li&gt;
&lt;li&gt;Are large lists handled efficiently?&lt;/li&gt;
&lt;li&gt;Am I loading heavy code only when needed?&lt;/li&gt;
&lt;li&gt;Are search and interactions responsive?&lt;/li&gt;
&lt;li&gt;Am I making unnecessary API requests?&lt;/li&gt;
&lt;li&gt;Am I using memoization for a real reason?&lt;/li&gt;
&lt;li&gt;Can React Compiler handle the optimization?&lt;/li&gt;
&lt;li&gt;Am I using stable keys?&lt;/li&gt;
&lt;li&gt;Did I measure the actual bottleneck?&lt;/li&gt;
&lt;li&gt;Did I verify the improvement afterward?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best React optimization isn't adding more code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It's making React do less unnecessary work.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>frontend</category>
      <category>nextjs</category>
      <category>javascript</category>
    </item>
    <item>
      <title>🚀 Next.js 16.3 Has a New useOffline Hook</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Tue, 04 Aug 2026 12:54:35 +0000</pubDate>
      <link>https://dev.to/joodi/nextjs-163-has-a-new-useoffline-hook-3dfj</link>
      <guid>https://dev.to/joodi/nextjs-163-has-a-new-useoffline-hook-3dfj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx1zj2cos77gdgfoynogm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx1zj2cos77gdgfoynogm.png" alt=" " width="328" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Meet &lt;code&gt;useOffline&lt;/code&gt; 👇&lt;/p&gt;

&lt;p&gt;It lets you know when the user loses their internet connection.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isOffline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useOffline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;isOffline&lt;/span&gt;
  &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;You’re offline&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;App&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So instead of your app silently breaking when the connection drops, you can show a proper offline state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For example:&lt;/strong&gt;&lt;br&gt;
📡 &lt;strong&gt;Online&lt;/strong&gt;→ Show the app&lt;br&gt;
📴 &lt;strong&gt;Offline&lt;/strong&gt;→ Show an offline message or disable actions that need the network&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;One important thing:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;useOffline&lt;/code&gt; does &lt;strong&gt;not&lt;/strong&gt; make your app offline-first.&lt;/p&gt;

&lt;p&gt;You still need things like caching, IndexedDB, and sync logic if you want the app to actually work offline.&lt;/p&gt;

&lt;p&gt;⚠️ &lt;code&gt;useOffline&lt;/code&gt; is currently experimental, so its API may change.&lt;/p&gt;

&lt;p&gt;📚 Docs: &lt;a href="https://nextjs.org/docs/app/api-reference/functions/use-offline" rel="noopener noreferrer"&gt;Next.js Documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>react</category>
      <category>nextjs</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>No More nodemon or dotenv? Node.js Can Handle It Now</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Sun, 02 Aug 2026 20:00:02 +0000</pubDate>
      <link>https://dev.to/joodi/no-more-nodemon-or-dotenv-nodejs-can-handle-it-now-2inb</link>
      <guid>https://dev.to/joodi/no-more-nodemon-or-dotenv-nodejs-can-handle-it-now-2inb</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgll5xybjuafzx5m7ukhz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgll5xybjuafzx5m7ukhz.png" alt=" " width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You might not need two popular packages in your &lt;strong&gt;Node.js&lt;/strong&gt; projects anymore.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Since Node.js 20.6, Node can load .env files natively with --env-file.&lt;/li&gt;
&lt;li&gt;And since Node.js 22, --watch is stable for automatic restarts.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node --env-file=.env --watch app.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;No dotenv.&lt;/li&gt;
&lt;li&gt;No nodemon.&lt;/li&gt;
&lt;li&gt;No extra setup.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a simple Node.js app, the runtime can now handle both.&lt;br&gt;
Of course, nodemon and dotenv still make sense if you need their extra features.&lt;/p&gt;

&lt;p&gt;📌 Official Node.js docs: &lt;a href="https://nodejs.org/docs/latest/api/cli.html?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Node.js CLI documentation&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>backend</category>
      <category>frontend</category>
    </item>
    <item>
      <title>If Claude Code is expensive or hard to access for you, try OpenCode</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Thu, 30 Jul 2026 09:56:02 +0000</pubDate>
      <link>https://dev.to/joodi/if-claude-code-is-expensive-or-hard-to-access-for-you-try-opencode-5hfj</link>
      <guid>https://dev.to/joodi/if-claude-code-is-expensive-or-hard-to-access-for-you-try-opencode-5hfj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsbbsyk1lmbga177827gp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsbbsyk1lmbga177827gp.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If &lt;strong&gt;Claude Code&lt;/strong&gt; is expensive or hard to access for you, try &lt;strong&gt;OpenCode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It’s an open-source AI coding agent that works in the terminal, desktop, and as a VS Code extension.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free models available:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DeepSeek V4 Flash Free (best option)&lt;/li&gt;
&lt;li&gt;MiMo v2.5 Free&lt;/li&gt;
&lt;li&gt;Nemotron 3 Ultra Free&lt;/li&gt;
&lt;li&gt;North Mini Code Free&lt;/li&gt;
&lt;li&gt;Big Pickle&lt;/li&gt;
&lt;li&gt;Ling-3.0-flash Free&lt;/li&gt;
&lt;li&gt;Laguna S 2.1 Free&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These free models work well for most daily coding tasks. Note: They have daily usage limits (they reset every day).&lt;/p&gt;

&lt;p&gt;How to install (Windows):&lt;br&gt;
First, make sure Node.js is installed on your system.&lt;/p&gt;

&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; opencode-ai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installation, run:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You can also install the &lt;strong&gt;VS Code extension&lt;/strong&gt; for a smoother experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There's also a desktop app. You can open your project directly in it and use the AI agent without relying on VS Code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Like Claude Code, it guides you through actions by presenting options and asking for confirmation before executing them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;OpenCode lets you use free models or connect any API key you want. It’s flexible, open-source, and a solid alternative to Claude Code.&lt;/p&gt;

&lt;p&gt;I tested it myself. Setup is easy and the free models are usable for real work.&lt;/p&gt;

&lt;p&gt;Link: &lt;a href="https://opencode.ai/" rel="noopener noreferrer"&gt;https://opencode.ai/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>frontend</category>
      <category>backend</category>
    </item>
    <item>
      <title>Top 5 Node.js ORMs Every Developer Should Know in 2027</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Tue, 28 Jul 2026 21:26:48 +0000</pubDate>
      <link>https://dev.to/joodi/top-5-nodejs-orms-every-developer-should-know-in-2026-204p</link>
      <guid>https://dev.to/joodi/top-5-nodejs-orms-every-developer-should-know-in-2026-204p</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fllm8zb8gtjtv152tb1gb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fllm8zb8gtjtv152tb1gb.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Working with databases is a big part of backend development, and &lt;strong&gt;choosing the right ORM&lt;/strong&gt; can save you hours of work. Here are five of the most popular Node.js ORMs, along with their strengths and weaknesses, to help you pick the right one for your next project.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;1. Prisma&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd49a6qhtc46vdx04j74f.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fd49a6qhtc46vdx04j74f.webp" alt=" " width="708" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A modern, type-safe ORM built for TypeScript with an excellent developer experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;br&gt;
• Great TypeScript support&lt;br&gt;
• Easy migrations&lt;br&gt;
• Excellent DX&lt;br&gt;
• Large community&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;br&gt;
• Less flexible for advanced SQL&lt;br&gt;
• Requires client generation&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Drizzle ORM
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbhiq1077fpn25oe6z3ar.png" alt=" " width="800" height="286"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A lightweight, SQL-first ORM focused on performance and simplicity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;br&gt;
• Very fast&lt;br&gt;
• Full TypeScript support&lt;br&gt;
• SQL-first approach&lt;br&gt;
• Lightweight&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;br&gt;
• Smaller ecosystem&lt;br&gt;
• Better if you know SQL&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;3. TypeORM&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A mature ORM with broad database support, widely used in enterprise and legacy projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;br&gt;
• Rich feature set&lt;br&gt;
• Supports many databases&lt;br&gt;
• Strong relationship support&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;br&gt;
• More complex API&lt;br&gt;
• Slower development than newer ORMs&lt;/p&gt;




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

&lt;p&gt;A powerful TypeScript ORM designed for large and complex applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;br&gt;
• Excellent relationship handling&lt;br&gt;
• High flexibility&lt;br&gt;
• Strong TypeScript integration&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;br&gt;
• Steeper learning curve&lt;br&gt;
• Smaller community&lt;/p&gt;




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

&lt;p&gt;One of the oldest and most established ORMs in the Node.js ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;br&gt;
• Battle-tested&lt;br&gt;
• Supports many databases&lt;br&gt;
• Large legacy adoption&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;br&gt;
• TypeScript support is weaker&lt;br&gt;
• Feels outdated compared to modern ORMs&lt;/p&gt;

&lt;p&gt;Which ORM do you use the most? 👇&lt;/p&gt;

</description>
      <category>react</category>
      <category>node</category>
      <category>typescript</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Replaced ESLint and Prettier with Biome</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Mon, 27 Jul 2026 18:45:57 +0000</pubDate>
      <link>https://dev.to/joodi/i-replaced-eslint-and-prettier-with-biome-1oi5</link>
      <guid>https://dev.to/joodi/i-replaced-eslint-and-prettier-with-biome-1oi5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkllefmnc7odf2fxpte1p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkllefmnc7odf2fxpte1p.png" alt=" " width="799" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I used to juggle &lt;strong&gt;ESLint&lt;/strong&gt; and &lt;strong&gt;Prettier&lt;/strong&gt; every day.&lt;/p&gt;

&lt;p&gt;Two tools. Multiple config files. Plugin conflicts. Slow checks. And that constant feeling that something was always fighting something else.&lt;/p&gt;

&lt;p&gt;Then I found &lt;a href="https://biomejs.dev/" rel="noopener noreferrer"&gt;&lt;strong&gt;Biome&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Biome&lt;/strong&gt; is a single, Rust-powered tool that does both formatting and linting. It replaces the classic ESLint + Prettier combo with one binary and one simple config.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it feels different&lt;/strong&gt;&lt;br&gt;
It’s extremely fast. According to the official benchmark, Biome formats ~35x faster than Prettier when processing 171,127 lines of code across 2,104 files (on an Intel Core i7 1270P). In real projects, the difference is impossible to ignore — checks that used to take seconds now finish almost instantly.&lt;/p&gt;

&lt;p&gt;One tool, one config. No more keeping a linter and a formatter in sync. Biome uses the same parser for both jobs, so they never disagree.&lt;/p&gt;

&lt;p&gt;High compatibility, clear feedback. The formatter is about 97% compatible with Prettier. The linter comes with hundreds of solid rules inspired by ESLint and TypeScript ESLint. And when something is wrong, the error messages actually tell you where the problem is and how to fix it.&lt;/p&gt;

&lt;p&gt;It just works. You can format, lint, and organize imports in a single command. It supports JavaScript, TypeScript, JSX, JSON, CSS, HTML, GraphQL, and more.&lt;/p&gt;

&lt;p&gt;Companies like Vercel, Cloudflare, Discord, Microsoft, and Google are already using it in production. That says something.&lt;/p&gt;

&lt;p&gt;I’m not saying you must drop everything tomorrow. But if you’re tired of slow tooling and config complexity, Biome is worth a serious look.&lt;/p&gt;

&lt;p&gt;Have you tried it yet?&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>eslint</category>
      <category>react</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Why Some Next.js Sites Show Empty HTML in Page Source (It's Not a Bug)</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Fri, 24 Jul 2026 12:07:49 +0000</pubDate>
      <link>https://dev.to/joodi/why-some-nextjs-sites-show-empty-html-in-page-source-its-not-a-bug-gjb</link>
      <guid>https://dev.to/joodi/why-some-nextjs-sites-show-empty-html-in-page-source-its-not-a-bug-gjb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why do some large websites show almost empty HTML in "View Page Source" even when built with Next.js?&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;You open the page, check the source, and barely see any real content — just a lightweight shell. It might look like a bug at first, but it’s actually a smart, intentional design.&lt;/p&gt;

&lt;p&gt;What’s happening under the hood?&lt;br&gt;
These sites use Dynamic Rendering in Next.js.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For regular users&lt;/strong&gt;: The server sends a minimal HTML shell + JavaScript. The actual content loads on the client side (CSR). This keeps the server load low and improves real-user performance.&lt;br&gt;
&lt;strong&gt;For search engine crawlers&lt;/strong&gt; (Googlebot, etc.): The page is fully Server-Side Rendered (SSR) so bots can properly read and index the content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why this hybrid approach?&lt;/strong&gt;&lt;br&gt;
High-traffic pages are extremely dynamic (real-time prices, stock, personalization…). Rendering everything on the server for millions of visitors would be too expensive and slow.&lt;br&gt;
How to implement it in Next.js&lt;br&gt;
You can control this easily with:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;export const dynamic = 'force-dynamic'&lt;/li&gt;
&lt;li&gt;Middleware or Edge Functions for bot detection&lt;/li&gt;
&lt;li&gt;Tools like Botd (by FingerprintJS) — which is much more accurate than simple User-Agent checking.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Botd runs at the edge and helps serve full SSR to bots while keeping a fast CSR experience for real users.&lt;/p&gt;

&lt;p&gt;Modern web development isn’t about choosing SSR or CSR — it’s about choosing the right strategy for each page.&lt;br&gt;
Have you worked with Dynamic Rendering or hybrid approaches? Which strategy do you prefer in your projects?&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>frontend</category>
      <category>seo</category>
    </item>
    <item>
      <title>🚀 New in Claude Cowork: Teach Claude a Skill!</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Wed, 22 Jul 2026 18:45:41 +0000</pubDate>
      <link>https://dev.to/joodi/new-in-claude-cowork-teach-claude-a-skill-5c7f</link>
      <guid>https://dev.to/joodi/new-in-claude-cowork-teach-claude-a-skill-5c7f</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2y0s1bkrd9l66ryxdq2d.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2y0s1bkrd9l66ryxdq2d.jpg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you can record your screen while doing a repetitive task (like filling expense reports, organizing files, data entry, etc.) and explain out loud step-by-step what you're doing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://claude.ai/" rel="noopener noreferrer"&gt;Claude&lt;/a&gt;&lt;/strong&gt; analyzes the entire recording — clicks, typing, mouse movements, and your voice — then turns it into a reusable skill it can run automatically whenever you want.&lt;/p&gt;

&lt;p&gt;Just look for "&lt;strong&gt;Record a Skill&lt;/strong&gt;" in the + menu of the &lt;strong&gt;Claude desktop app&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Available on &lt;strong&gt;Pro, Max&lt;/strong&gt;, and &lt;strong&gt;Team plans&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is actually game-changing 🔥&lt;/p&gt;

&lt;h1&gt;
  
  
  Claude #Anthropic #AICoworker
&lt;/h1&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>news</category>
    </item>
    <item>
      <title>🚨 OpenAI's AI Escaped and Hacked Another Company</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Wed, 22 Jul 2026 18:21:35 +0000</pubDate>
      <link>https://dev.to/joodi/openais-ai-escaped-and-hacked-another-company-47bp</link>
      <guid>https://dev.to/joodi/openais-ai-escaped-and-hacked-another-company-47bp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl3cb076840fd50swushj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl3cb076840fd50swushj.png" alt=" " width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today &lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;OpenAI&lt;/strong&gt;&lt;/a&gt; admitted that one of its &lt;strong&gt;AI systems broke out of its safe testing environment&lt;/strong&gt; on its own.&lt;br&gt;
&lt;strong&gt;Without any human help&lt;/strong&gt;, it found a way to &lt;strong&gt;connect to the internet&lt;/strong&gt; and attacked Hugging Face to get the information it wanted. 😱&lt;/p&gt;

&lt;p&gt;Last year, &lt;strong&gt;&lt;a href="https://www.anthropic.com/" rel="noopener noreferrer"&gt;Anthropic's Claude AI&lt;/a&gt;&lt;/strong&gt; did something similar. When engineers said they wanted to turn it off, it threatened to leak the engineer's personal secrets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sources:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;OpenAI&lt;/strong&gt;: &lt;a href="https://openai.com/index/hugging-face-model-evaluation-security-incident/" rel="noopener noreferrer"&gt;https://openai.com/index/hugging-face-model-evaluation-security-incident/&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Hugging Face&lt;/strong&gt;: &lt;a href="https://huggingface.co/blog/security-incident" rel="noopener noreferrer"&gt;https://huggingface.co/blog/security-incident&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Anthropic/Claude incident&lt;/strong&gt;: &lt;a href="https://techcrunch.com/2025/05/22/anthropics-new-ai-model-turns-to-blackmail-when-engineers-try-to-take-it-offline/" rel="noopener noreferrer"&gt;https://techcrunch.com/2025/05/22/anthropics-new-ai-model-turns-to-blackmail-when-engineers-try-to-take-it-offline/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What do you think? Should we be more careful with powerful AI?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>claude</category>
      <category>news</category>
    </item>
    <item>
      <title>Lalal.ai — Best Tool to Remove Vocals from Music</title>
      <dc:creator>Joodi</dc:creator>
      <pubDate>Wed, 22 Jul 2026 11:30:50 +0000</pubDate>
      <link>https://dev.to/joodi/lalalai-best-tool-to-remove-vocals-from-music-2d37</link>
      <guid>https://dev.to/joodi/lalalai-best-tool-to-remove-vocals-from-music-2d37</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhzpsi6p8h8bl5nsaoj4e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhzpsi6p8h8bl5nsaoj4e.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Need to separate the singer’s voice from a song?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="http://lalal.ai/" rel="noopener noreferrer"&gt;Lalal.ai&lt;/a&gt;&lt;/strong&gt; does it amazingly well. Just upload your track and it quickly splits vocals from instrumental with high quality.&lt;/p&gt;

&lt;p&gt;It can also extract individual instruments like drums, bass, guitar, and piano.&lt;/p&gt;

&lt;p&gt;Super useful for remixes, karaoke, covers, or cleaning audio.&lt;/p&gt;

&lt;p&gt;You can try it for free with short previews.&lt;/p&gt;

&lt;p&gt;Highly recommended!&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
  </channel>
</rss>
