<?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: Luciano Menezes</title>
    <description>The latest articles on DEV Community by Luciano Menezes (@luciano655).</description>
    <link>https://dev.to/luciano655</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%2F1281073%2Ff011b5d8-a3ee-4a7c-bd7e-e2a13f88d0fa.png</url>
      <title>DEV Community: Luciano Menezes</title>
      <link>https://dev.to/luciano655</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luciano655"/>
    <language>en</language>
    <item>
      <title>Your Distributed Lock Can Expire Correctly and Still Corrupt Data</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Sun, 26 Jul 2026 16:25:03 +0000</pubDate>
      <link>https://dev.to/luciano655/your-distributed-lock-can-expire-correctly-and-still-corrupt-data-3dpl</link>
      <guid>https://dev.to/luciano655/your-distributed-lock-can-expire-correctly-and-still-corrupt-data-3dpl</guid>
      <description>&lt;p&gt;A worker acquires a distributed lock, starts updating a document, and freezes for 12 seconds.&lt;/p&gt;

&lt;p&gt;Its 10-second lock expires. Another worker acquires the same lock, finishes the update—and then the first worker wakes up and overwrites it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing in that sequence requires the lock service to malfunction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the trap: most “distributed locks” are leases. A lease can tell everyone who owns a resource &lt;em&gt;for a limited window&lt;/em&gt;. It cannot recall code after that window or pull a delayed write out of the network.&lt;/p&gt;

&lt;p&gt;The fix is not a longer TTL. It is a fencing token enforced by the resource being protected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lock expired correctly—and data still lost
&lt;/h2&gt;

&lt;p&gt;Imagine two workers and a lock with a 10-second TTL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;worker A: acquire #41 ───── paused ─────────────────── write #41 ✗
lease:                         expires
worker B:                         acquire #42 ─ write #42 ✓
resource:                                      remembers 42
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Worker A may pause for garbage collection, CPU starvation, a page fault, a frozen container, or &lt;code&gt;SIGSTOP&lt;/code&gt;. Its write may also sit in a network queue after the process sent it.&lt;/p&gt;

&lt;p&gt;Those delays are not theoretical. During a &lt;a href="https://github.blog/news-insights/the-library/downtime-last-saturday/" rel="noopener noreferrer"&gt;2012 GitHub outage&lt;/a&gt;, network traffic between access switches was blocked for roughly 90 seconds. Active/passive file-server pairs missed heartbeats, fencing commands were not delivered, and multiple pairs later believed they were active for the same resource. GitHub kept the site in maintenance mode while recovering its file-storage infrastructure; recovery took more than five hours.&lt;/p&gt;

&lt;p&gt;GitHub’s architecture was not our toy worker, but the lesson transfers directly: &lt;strong&gt;a timeout is evidence about time, not proof that the old owner has stopped acting.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A TTL turns your mutex into a lease
&lt;/h2&gt;

&lt;p&gt;The usual code looks comforting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lease&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;locks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;acquire&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;ttlMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resourceId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;lease&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&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;The hole is the &lt;code&gt;save&lt;/code&gt;, not only the &lt;code&gt;release&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Redis’s official locking pattern uses &lt;code&gt;SET key random-value NX PX ttl&lt;/code&gt;. The random value matters: release must delete the key only if its value still matches. Otherwise worker A can wake after expiry and delete worker B’s newer lock. Redis 8.4 added &lt;code&gt;DELEX ... IFEQ&lt;/code&gt;; older versions use a compare-and-delete Lua script.&lt;/p&gt;

&lt;p&gt;But that random value answers only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Is this still the lock instance I acquired?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It does not answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Is this operation newer than every operation previously accepted?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A UUID has identity but no order. It prevents an unsafe unlock; it cannot reject a stale write.&lt;/p&gt;

&lt;p&gt;What if A checks the lock immediately before &lt;code&gt;save&lt;/code&gt;? A can pause between the check and the write. What if the process uses a monotonic clock and aborts after its deadline? The packet can be delayed after the process sends it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There is always a final gap unless the protected resource participates in the decision.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fencing gives the resource the final say
&lt;/h2&gt;

&lt;p&gt;On each successful acquisition, the coordinator returns a strictly increasing generation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;first owner  → token 41
next owner   → token 42
next owner   → token 43
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every protected write carries that token. The resource remembers the greatest generation it has accepted and rejects anything older.&lt;/p&gt;

&lt;p&gt;For a PostgreSQL row, the core can be one atomic statement:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;documents&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fencing_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;fencing_token&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If token 42 has already landed, the later-arriving token 41 updates zero rows. Worker A is stale, regardless of what it believes about its lease.&lt;/p&gt;

&lt;p&gt;The comparison and mutation must be atomic. This is subtly broken:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;seen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;seen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;token&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;Two workers can both pass the check before either update commits. Use one conditional update, or lock the fence row and perform the fence update plus all business mutations in one database transaction.&lt;/p&gt;

&lt;p&gt;For inserts, store the accepted generation beside the logical resource. For a multi-row operation, keep one fence record and the business changes inside the same transaction. For an object store, use its conditional-write primitive if it exposes one.&lt;/p&gt;

&lt;p&gt;This pattern has history. Google’s &lt;a href="https://research.google.com/archive/chubby-osdi06.pdf" rel="noopener noreferrer"&gt;Chubby paper&lt;/a&gt; describes a monotonically increasing 64-bit lock generation. A Chubby “sequencer” contains the lock name, mode, and generation; clients pass it to file servers and other protected services, which validate it or compare it with the latest sequencer observed.&lt;/p&gt;

&lt;p&gt;The lock service grants an opinion. &lt;strong&gt;The resource enforces the order.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;INCR&lt;/code&gt; is not automatically token 42
&lt;/h2&gt;

&lt;p&gt;Fencing needs a token source whose order matches lock acquisition order, including failover.&lt;/p&gt;

&lt;p&gt;Adding &lt;code&gt;INCR lock:counter&lt;/code&gt; somewhere beside a lease is safe only if the combined grant path guarantees one total order. If the lock is granted but token allocation fails, what happens? If a primary fails after issuing a value that its replacement never saw, can a later owner receive a lower value? If acquisition and increment happen on unrelated systems, which one defines ownership?&lt;/p&gt;

&lt;p&gt;This is why the distinction between an owner UUID and a fencing generation matters. Redis’s current &lt;a href="https://redis.io/docs/latest/develop/clients/patterns/distributed-locks/" rel="noopener noreferrer"&gt;distributed-lock documentation&lt;/a&gt; explicitly recommends fencing tokens for correctness-sensitive work and warns not to assume a lock remains held as long as its process is alive.&lt;/p&gt;

&lt;p&gt;Consensus-backed coordinators already expose useful order. Chubby has lock generations. ZooKeeper’s &lt;a href="https://zookeeper.apache.org/doc/r3.3.3/recipes.pdf" rel="noopener noreferrer"&gt;lock recipe&lt;/a&gt; creates ephemeral sequential nodes; the smallest sequence owns the lock, and each waiter watches only its immediate predecessor, avoiding a thundering herd.&lt;/p&gt;

&lt;p&gt;Do not invent a distributed counter because the SQL example looks easy. The easy part is comparing generations. The hard part is issuing them in an order you can defend during partitions and failover.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production-grade means observing lease loss
&lt;/h2&gt;

&lt;p&gt;Fencing handles stale writes, but it does not make leases operationally free.&lt;/p&gt;

&lt;p&gt;AWS’s &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BestPractices_DistributedLocking.html" rel="noopener noreferrer"&gt;DynamoDB Lock Client guide&lt;/a&gt; shows a 10-second lease with a 3-second heartbeat. It also names the costs developers skip in diagrams: extra table capacity, clock-skew sensitivity for short leases, and consistent acquisition ordering when an operation needs multiple locks.&lt;/p&gt;

&lt;p&gt;In production, capture at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;acquisition wait time&lt;/li&gt;
&lt;li&gt;time the lease is held&lt;/li&gt;
&lt;li&gt;successful-renewal slack before expiry&lt;/li&gt;
&lt;li&gt;renewal failures and lost-lease events&lt;/li&gt;
&lt;li&gt;rejected stale generations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;fence_rejected_total&lt;/code&gt; should be almost boring—and never ignored. One increment means an old owner attempted a write that would have been accepted without fencing. That metric is evidence that the safety mechanism just prevented corruption.&lt;/p&gt;

&lt;p&gt;Renewal is still useful. It reduces unnecessary takeovers during healthy long work. It is not the correctness proof: after the last successful heartbeat, a process or packet can still be delayed past expiry.&lt;/p&gt;

&lt;p&gt;Longer TTLs make that overlap less likely but make crash recovery slower. Shorter TTLs improve takeover time but increase false lease loss. Fencing separates that availability tradeoff from data safety.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sometimes the right lock is no distributed lock
&lt;/h2&gt;

&lt;p&gt;Before adding a coordinator, ask where the protected truth already lives.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Situation&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One relational database owns all state&lt;/td&gt;
&lt;td&gt;Row lock, unique constraint, advisory lock, or conditional update in a transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Work is naturally a durable job&lt;/td&gt;
&lt;td&gt;Queue claim/ack with retry semantics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate request can be replayed safely&lt;/td&gt;
&lt;td&gt;Idempotency key&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Several processes coordinate an external mutable resource&lt;/td&gt;
&lt;td&gt;Lease plus a fence the resource enforces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate cache refresh is only wasted work&lt;/td&gt;
&lt;td&gt;A simple best-effort lease may be enough&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fencing also has a hard boundary: the recipient must understand the token. You cannot fence an email after it was sent or ask an arbitrary payment API to compare your generation. For irreversible external effects, route the effect through one durable owner, use the provider’s idempotency facility, or record an outbox entry transactionally and let a controlled dispatcher deliver it.&lt;/p&gt;

&lt;p&gt;The lock is not a magical “exactly once” wrapper.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you remember one thing
&lt;/h2&gt;

&lt;p&gt;A distributed lease can expire while its former owner is still capable of acting. Therefore, ownership alone cannot protect correctness.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make every sensitive write prove that its generation is newer than the last accepted one—or choose a primitive that keeps coordination and state in the same transaction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Where are you currently using a TTL lock, and can the resource it protects actually reject a stale owner?&lt;/p&gt;

</description>
      <category>programming</category>
      <category>distributedsystems</category>
      <category>database</category>
      <category>backend</category>
    </item>
    <item>
      <title>One Bad Regex Can Freeze Node.js: Here's How to Stop It</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Thu, 23 Jul 2026 13:26:23 +0000</pubDate>
      <link>https://dev.to/luciano655/one-bad-regex-can-freeze-nodejs-heres-how-to-stop-it-ec4</link>
      <guid>https://dev.to/luciano655/one-bad-regex-can-freeze-nodejs-heres-how-to-stop-it-ec4</guid>
      <description>&lt;p&gt;A single regular expression once pushed Cloudflare's HTTP-serving CPUs to nearly 100% worldwide.&lt;/p&gt;

&lt;p&gt;The network returned 502s for 27 minutes. The rule had passed review and CI.&lt;/p&gt;

&lt;p&gt;The regex returned the right answers. It just needed a catastrophic amount of work to return one of them.&lt;/p&gt;

&lt;p&gt;That is the uncomfortable lesson behind &lt;strong&gt;Regular Expression Denial of Service (ReDoS)&lt;/strong&gt;: for a pattern that touches untrusted input, correctness has two dimensions. It must accept the right language, and it must reject the wrong input within a bounded amount of work.&lt;/p&gt;

&lt;p&gt;Let's break a small Node.js validator, watch why it explodes, and replace it with a production rule you can actually defend.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug hides in a perfectly reasonable test suite
&lt;/h2&gt;

&lt;p&gt;Suppose an API accepts a comma-separated list of word-like tags. This pattern looks permissive and compact:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(\w&lt;/span&gt;&lt;span class="sr"&gt;+,&lt;/span&gt;&lt;span class="se"&gt;?)&lt;/span&gt;&lt;span class="sr"&gt;*$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node,security,regex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node,,regex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fixtures pass. Short invalid inputs fail instantly. A reviewer sees anchors, an allowed character class, and no suspicious &lt;code&gt;.*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now time a failure that arrives late:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:perf_hooks&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vulnerable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;(\w&lt;/span&gt;&lt;span class="sr"&gt;+,&lt;/span&gt;&lt;span class="se"&gt;?)&lt;/span&gt;&lt;span class="sr"&gt;*$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;26&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="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;vulnerable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ms&lt;/span&gt;&lt;span class="dl"&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;On my Node 22.16 run, the last four measurements were roughly &lt;strong&gt;4.6, 17.6, 67.8, and 265.4 ms&lt;/strong&gt;. Exact timings depend on the CPU and runtime, but the shape matters: two extra &lt;code&gt;a&lt;/code&gt; characters cost about four times as much.&lt;/p&gt;

&lt;p&gt;The exclamation mark does the damage. Until that final character, the engine can believe it has a match. When &lt;code&gt;!&lt;/code&gt; violates the anchor, the engine tries all the other ways the repeated group could have consumed the same run of &lt;code&gt;a&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;One request can now occupy Node's event-loop thread for hundreds of milliseconds. A slightly longer value turns a validator into an availability incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backtracking turns ambiguity into a search tree
&lt;/h2&gt;

&lt;p&gt;JavaScript's V8 engine normally uses Irregexp, a backtracking engine. When a pattern offers several possible ways forward, it tries one. If a later token fails, it rewinds to the last choice and tries another.&lt;/p&gt;

&lt;p&gt;That is useful. Backtracking helps implement features such as lookarounds and backreferences, and it is extremely fast for ordinary patterns. The dangerous case is &lt;strong&gt;overlapping choices inside repetition&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our group can match the same &lt;code&gt;aaaa&lt;/code&gt; in many equivalent partitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aaaa
aaa + a
aa + aa
aa + a + a
a + aaa
a + aa + a
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The final &lt;code&gt;!&lt;/code&gt; makes every partition fail, so the engine must disprove them one by one. &lt;a href="https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS" rel="noopener noreferrer"&gt;OWASP's canonical example&lt;/a&gt; shows the same doubling: &lt;code&gt;^(a+)+$&lt;/code&gt; has 16 paths for &lt;code&gt;aaaaX&lt;/code&gt;, but 65,536 paths for sixteen &lt;code&gt;a&lt;/code&gt;s followed by &lt;code&gt;X&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is why successful-input benchmarks are misleading. &lt;a href="https://nodejs.org/learn/asynchronous-work/dont-block-the-event-loop" rel="noopener noreferrer"&gt;Node's own guidance&lt;/a&gt; warns that vulnerable expressions often match long valid strings quickly; the blow-up appears when a mismatch arrives after the engine has accumulated many unresolved choices.&lt;/p&gt;

&lt;p&gt;Not every nested quantifier is slow on every runtime. Engines recognize and optimize some shapes. That is not a safety proof. If two repeated pieces can consume the same characters, treat the pattern as suspect and test it on the exact engine you deploy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remove the ambiguity instead of tuning it
&lt;/h2&gt;

&lt;p&gt;The tag grammar has a simpler shape: one word, followed by zero or more comma-plus-word pairs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;safeTags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\w&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;(?:&lt;/span&gt;&lt;span class="sr"&gt;,&lt;/span&gt;&lt;span class="se"&gt;\w&lt;/span&gt;&lt;span class="sr"&gt;+&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;*$/&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;safeTags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node,security,regex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// true&lt;/span&gt;
&lt;span class="nx"&gt;safeTags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node,,regex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        &lt;span class="c1"&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each character now has one structural job. A comma can only begin the next pair; a word character cannot be reassigned across nested repetitions. The same hostile inputs stayed below the useful resolution of the small timing loop on my machine.&lt;/p&gt;

&lt;p&gt;That rewrite suggests a general review technique:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Suspicious shape&lt;/th&gt;
&lt;th&gt;Question to ask&lt;/th&gt;
&lt;th&gt;Safer direction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;(x+)+&lt;/code&gt; or &lt;code&gt;(x*)*&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Can inner and outer loops repartition the same text?&lt;/td&gt;
&lt;td&gt;Collapse to one repetition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;`(a&lt;/td&gt;
&lt;td&gt;aa)+`&lt;/td&gt;
&lt;td&gt;Do alternatives share a prefix?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;.*.*TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Can adjacent wildcards trade characters?&lt;/td&gt;
&lt;td&gt;Use one bounded class or a delimiter-aware parser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Backreference on user input&lt;/td&gt;
&lt;td&gt;Is there any worst-case guarantee?&lt;/td&gt;
&lt;td&gt;Bound input and isolate work, or avoid the feature&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Changing greedy &lt;code&gt;*&lt;/code&gt; to lazy &lt;code&gt;*?&lt;/code&gt; is not a general fix. In &lt;a href="https://blog.cloudflare.com/details-of-the-cloudflare-outage-on-july-2-2019/" rel="noopener noreferrer"&gt;Cloudflare's postmortem&lt;/a&gt;, laziness improved one matching case but did nothing for the catastrophic failure variant. It changed which path the engine tried first, not how many paths existed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real fix is to remove overlapping interpretations.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Put more than one guardrail around untrusted regex
&lt;/h2&gt;

&lt;p&gt;A safe pattern is the first layer, not the whole design.&lt;/p&gt;

&lt;p&gt;First, cap input before matching. If a tag field is allowed to contain 200 characters, reject 20,000 bytes before the regex sees them. A length limit does not turn exponential work into linear work, but it puts a ceiling on the blast radius and protects parsers, logs, and downstream storage too.&lt;/p&gt;

&lt;p&gt;Second, use simpler primitives when they express the rule. For literal containment, &lt;code&gt;includes()&lt;/code&gt; or &lt;code&gt;indexOf()&lt;/code&gt; is linear and easier to review. For comma-separated data, splitting and validating each token may be clearer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;isTagList&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &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="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&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="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
    &lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;every&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;part&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\w&lt;/span&gt;&lt;span class="sr"&gt;+$/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;part&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;Third, add adversarial tests. A good regex test suite contains long &lt;strong&gt;near misses&lt;/strong&gt;: valid prefixes with one illegal suffix, missing delimiters, repeated shared prefixes, and values at the maximum permitted length. Mozilla's engineering guidance makes the same point: test large non-matching inputs and verify that they fail quickly, because happy-path correctness will not expose backtracking risk.&lt;/p&gt;

&lt;p&gt;Finally, run a ReDoS-aware static analyzer in CI, but treat its output as a lead. Regex complexity depends on both syntax and engine behavior; a clean scan is not a runtime guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Node makes synchronous regex a shared failure
&lt;/h2&gt;

&lt;p&gt;In a threaded request-per-worker server, one pathological match can consume one worker. In a normal Node process, a synchronous &lt;code&gt;RegExp.test()&lt;/code&gt; runs on the event-loop thread. While it searches, unrelated timers, sockets, and requests wait too.&lt;/p&gt;

&lt;p&gt;That changes the production question from “is this validation slow?” to “how many users share this stall?”&lt;/p&gt;

&lt;p&gt;V8 has explored an escape hatch. Since V8 8.8, an &lt;a href="https://v8.dev/blog/non-backtracking-regexp" rel="noopener noreferrer"&gt;experimental non-backtracking engine&lt;/a&gt; can provide linear time, with an optional fallback after 50,000 backtracks. But the fallback is not universal: patterns with backreferences, lookarounds, some finite repetitions, or the &lt;code&gt;u&lt;/code&gt; and &lt;code&gt;i&lt;/code&gt; flags are excluded. V8 also notes that the linear engine can be orders of magnitude slower for common patterns.&lt;/p&gt;

&lt;p&gt;So do not assume the runtime will rescue an ambiguous validator. If you truly must evaluate complex or user-supplied patterns, isolate that work in a worker or separate process with a killable time budget. A &lt;code&gt;Promise.race()&lt;/code&gt; around synchronous &lt;code&gt;RegExp.test()&lt;/code&gt; is not a timeout—the event loop cannot fire the timer while the regex owns the thread.&lt;/p&gt;

&lt;p&gt;In production, watch event-loop delay, CPU saturation, input sizes, and per-validator latency. Name expensive validators in traces or metrics. A generic “request took 3 seconds” span is much less useful than “username_regex took 2.9 seconds on a 41-byte rejection.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The code-review rule worth keeping
&lt;/h2&gt;

&lt;p&gt;Cloudflare's outage was not just “one bad regex.” The rule was deployed globally, CPU safeguards had gaps, and rollback took time. Still, the initiating pattern reduced to adjacent ambiguous wildcards, and the network lost around 80% of its traffic at one point.&lt;/p&gt;

&lt;p&gt;The small version of that failure can live in any signup form, route matcher, log parser, or dependency.&lt;/p&gt;

&lt;p&gt;When a regex touches untrusted input, review four things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can repeated parts consume the same characters?&lt;/li&gt;
&lt;li&gt;Does a long near miss fail quickly?&lt;/li&gt;
&lt;li&gt;Is input length bounded before matching?&lt;/li&gt;
&lt;li&gt;Can one match block shared work?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;If you remember one thing, test the rejection path—not just the answer.&lt;/strong&gt; A regex that says &lt;code&gt;false&lt;/code&gt; after 30 seconds is not correct.&lt;/p&gt;

&lt;p&gt;What is the nastiest production regex you have had to untangle?&lt;/p&gt;

</description>
      <category>regex</category>
      <category>webdev</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Stop Retry Storms: Backoff Is Not Enough Without a Budget</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Wed, 22 Jul 2026 18:48:29 +0000</pubDate>
      <link>https://dev.to/luciano655/stop-retry-storms-backoff-is-not-enough-without-a-budget-3f3n</link>
      <guid>https://dev.to/luciano655/stop-retry-storms-backoff-is-not-enough-without-a-budget-3f3n</guid>
      <description>&lt;p&gt;A backend can safely process 10,000 requests per second. Traffic rises to 10,100. The extra 100 requests fail, so the clients immediately retry them.&lt;/p&gt;

&lt;p&gt;One second later, the backend receives 10,200 requests. Then 10,300. Soon it spends more time rejecting retries than completing original work.&lt;/p&gt;

&lt;p&gt;The failure was small. &lt;strong&gt;The recovery code turned it into an outage.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A retry is load, not a second chance
&lt;/h2&gt;

&lt;p&gt;Retries are usually introduced like local error handling: catch an exception, wait, try again. But the retry executes on the system that just told you it could not complete the first attempt.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sre.google/sre-book/addressing-cascading-failures/" rel="noopener noreferrer"&gt;Google's SRE book&lt;/a&gt; walks through the 10,000 QPS scenario above. A backend overloaded by only 100 QPS begins receiving an additional 100 retry QPS every round. The feedback loop can consume CPU, memory, file descriptors, and eventually crash replicas. Google says this pattern has contributed to several real cascading failures across RPC, browser, and offline-sync clients.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10,100 original QPS
   100 fail
   100 retry  ──┐
   200 fail     │ positive feedback
   200 retry  ──┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dropping original traffic back to 9,000 QPS may not recover the service. If only a fraction of replicas remains healthy, or rejecting a request is expensive, retries can keep the backend above its new reduced capacity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first design question is not “how long should I wait?” It is “may this system afford another attempt?”&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Layers turn three retries into 64 attempts
&lt;/h2&gt;

&lt;p&gt;Now put the request behind a browser, frontend, API, and database adapter. Each layer sees an error and performs three retries: four total attempts per layer.&lt;/p&gt;

&lt;p&gt;The database does not receive four attempts. It can receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;browser × frontend × backend
   4    ×    4     ×    4    = 64 attempts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That 64-attempt example comes from Google's guidance on cascading failures. The fix is architectural: &lt;strong&gt;one layer owns the retry for a failing dependency.&lt;/strong&gt; The layer immediately above that dependency usually has the best error detail and the smallest amount of duplicated work.&lt;/p&gt;

&lt;p&gt;A browser may retry a whole checkout while the API client inside the server also retries the payment call. Even perfect exponential backoff cannot repair that ownership bug; it only spreads 64 attempts over time.&lt;/p&gt;

&lt;p&gt;Carry attempt metadata across boundaries, such as &lt;code&gt;attempt: 2&lt;/code&gt; or a request ID. Then a downstream “do not retry” decision can survive the trip back up instead of being translated into a generic 500 that every layer interprets as permission.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retry only work that is safe to repeat
&lt;/h2&gt;

&lt;p&gt;Transport failure creates an uncomfortable ambiguity: the server may have committed the operation and lost the response. Retrying a read is usually harmless. Retrying &lt;code&gt;POST /charges&lt;/code&gt; can charge twice.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9110.html#name-idempotent-methods" rel="noopener noreferrer"&gt;RFC 9110&lt;/a&gt; defines PUT, DELETE, and safe methods as idempotent. It also says clients should not automatically retry a non-idempotent request unless they know its semantics are idempotent or know the original request was never applied.&lt;/p&gt;

&lt;p&gt;HTTP method alone is not enough. A broken DELETE handler might send a second email, while a POST protected by an idempotency key can be safe. The server needs to make the business operation repeatable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&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="nx"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idempotency-Key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;key required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;400&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;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tx&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;previous&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;idempotency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previous&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;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;idempotency&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;order&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;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;201&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The idempotency record and side effect must commit atomically. A “check, then insert” outside one transaction has a race: two copies can both observe no record and both create an order. Give the key a unique constraint and define its scope, retention period, and response-replay behavior.&lt;/p&gt;

&lt;p&gt;Do not retry authentication failures, validation errors, or malformed requests. No amount of waiting turns a missing field into a valid payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backoff without jitter schedules the next spike
&lt;/h2&gt;

&lt;p&gt;Exponential backoff increases the maximum delay after each failure. If 1,000 clients fail together and all wait exactly 100 ms, then 200 ms, then 400 ms, they remain synchronized. You have replaced one spike with a series of scheduled spikes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/" rel="noopener noreferrer"&gt;AWS simulated 100 clients&lt;/a&gt; contending to update one object. With plain exponential backoff, calls still arrived in clusters. Adding full jitter—choosing a random delay from zero to the exponential cap—cut the call count by more than half compared with no jitter and also improved completion time.&lt;/p&gt;

&lt;p&gt;Here is a compact policy for JavaScript:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RETRYABLE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;408&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;429&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;span class="mi"&gt;502&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;503&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;504&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchWithRetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&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="nx"&gt;maxAttempts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;baseMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;capMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deadlineMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;maxAttempts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="o"&gt;++&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="nx"&gt;remainingMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;deadlineMs&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remainingMs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DOMException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;retry deadline exceeded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TimeoutError&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&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;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AbortSignal&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;remainingMs&lt;/span&gt;&lt;span class="p"&gt;))),&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;

      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;RETRYABLE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;maxAttempts&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&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;response&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="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseRetryAfter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;retry-after&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;windowMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;capMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseMs&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;delayMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;retryAfter&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;windowMs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;delayMs&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;deadlineMs&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&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;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;delayMs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;maxAttempts&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;remainingAfterFailure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;deadlineMs&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remainingAfterFailure&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;windowMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;capMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseMs&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nx"&gt;windowMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;remainingAfterFailure&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sleep&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ms&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;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;resolve&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;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;parseRetryAfter&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="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isFinite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;seconds&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;seconds&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dateMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&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="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isFinite&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dateMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dateMs&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&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;The example is intentionally conservative, not universal. Your API must classify which failures are transient. A 500 from a deterministic bug will fail again. A connection error after sending a non-idempotent body is ambiguous. A response body or domain error can override the status-code default.&lt;/p&gt;

&lt;p&gt;Respect server direction. RFC 9110 allows &lt;code&gt;Retry-After&lt;/code&gt; on a 503 as either a delay in seconds or an HTTP date. Treat it as a lower bound, validate absurd values, and still enforce the caller's overall deadline. Waiting 120 seconds is not recovery when only 800 ms remains.&lt;/p&gt;

&lt;h2&gt;
  
  
  A retry budget breaks the feedback loop
&lt;/h2&gt;

&lt;p&gt;Attempts cap the cost of one logical request. A retry budget caps the cost of all requests during a failure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sre.google/sre-book/handling-overload/" rel="noopener noreferrer"&gt;Google describes two controls working together&lt;/a&gt;: up to three attempts per request and a per-client retry ratio below 10%. The per-request limit alone can push worst-case traffic close to 3×. Adding the 10% ratio holds general growth to about 1.1×.&lt;/p&gt;

&lt;p&gt;That is the difference between “every failure gets two retries” and “retries may consume at most 10% of current traffic.” When the budget is empty, fail fast. The user sees an error, but the dependency receives the quiet period it needs to recover.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html" rel="noopener noreferrer"&gt;AWS SDKs implement the same principle&lt;/a&gt; with a token bucket. Their standard mode uses full-jitter backoff and a retry quota; widespread failures drain tokens, after which calls return errors without retrying. Successful first attempts replenish the budget.&lt;/p&gt;

&lt;p&gt;Set budgets per dependency and, where noisy neighbors matter, per tenant or operation class. A healthy inventory service should not donate its retry capacity to a failing recommendation service. Interactive reads and asynchronous jobs should not compete under one policy either.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observe attempts, not just errors
&lt;/h2&gt;

&lt;p&gt;A dashboard showing a rising 503 rate cannot tell whether retries are helping or feeding the incident. Record these dimensions together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;original request rate and retry request rate;&lt;/li&gt;
&lt;li&gt;attempts per logical operation;&lt;/li&gt;
&lt;li&gt;success-after-retry versus final failure;&lt;/li&gt;
&lt;li&gt;delay chosen, including whether &lt;code&gt;Retry-After&lt;/code&gt; won;&lt;/li&gt;
&lt;li&gt;budget exhaustion and “do not retry” decisions;&lt;/li&gt;
&lt;li&gt;dependency saturation: queue depth, latency percentiles, rejected work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alert on retry amplification: &lt;code&gt;(originals + retries) / originals&lt;/code&gt;. A ratio of 1.02 during isolated network noise may be healthy. A ratio climbing toward 1.5 while dependency throughput falls is a feedback loop, not resilience.&lt;/p&gt;

&lt;p&gt;During an incident, the fastest mitigation may be to disable retries, shed low-priority work, or return a clear overload response. Adding replicas can fail when cold caches and synchronized retries overwhelm each new process as soon as it starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The policy in one review checklist
&lt;/h2&gt;

&lt;p&gt;Before approving a retry loop, demand concrete answers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Which exact failures are transient?&lt;/li&gt;
&lt;li&gt;Is the operation idempotent, or protected by an atomic idempotency key?&lt;/li&gt;
&lt;li&gt;Which single layer owns the retry?&lt;/li&gt;
&lt;li&gt;What are the attempt cap and overall deadline?&lt;/li&gt;
&lt;li&gt;Is delay randomized with full jitter, and is &lt;code&gt;Retry-After&lt;/code&gt; honored?&lt;/li&gt;
&lt;li&gt;What global budget stops retries during widespread failure?&lt;/li&gt;
&lt;li&gt;Which metric exposes amplification?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Retries spend capacity to buy another probability of success.&lt;/strong&gt; Spend that capacity only when the failure is transient, the operation is safe, and a budget proves the system can afford it.&lt;/p&gt;

&lt;p&gt;Which retry in your stack currently has no owner, no budget, or no idempotency guarantee?&lt;/p&gt;

</description>
      <category>backend</category>
      <category>distributedsystems</category>
      <category>sre</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>Your Clock Can Go Backward—Use the Right One for Durations</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Tue, 21 Jul 2026 12:39:14 +0000</pubDate>
      <link>https://dev.to/luciano655/your-clock-can-go-backward-use-the-right-one-for-durations-1ic</link>
      <guid>https://dev.to/luciano655/your-clock-can-go-backward-use-the-right-one-for-durations-1ic</guid>
      <description>&lt;p&gt;A request starts at 10:00:00.900 and finishes 200 ms later.&lt;/p&gt;

&lt;p&gt;Your latency log says &lt;strong&gt;-800 ms&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That sounds impossible until the machine corrects its clock between the two reads. Then ordinary code turns an adjustable wall clock into a broken stopwatch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The subtraction that works—until it does not
&lt;/h2&gt;

&lt;p&gt;This is probably hiding in one of your metrics helpers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;operation&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="nx"&gt;startedAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;operation&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;startedAt&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most of the time, this reports a sensible number. That is what makes it dangerous.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Date.now()&lt;/code&gt; answers a calendar question: how many milliseconds have passed since the Unix epoch according to this machine? The answer must remain comparable with logs, users, and other computers, so synchronization software is allowed to correct it. A correction can change its rate, jump it forward, or move it backward.&lt;/p&gt;

&lt;p&gt;If either correction lands between the two calls, the subtraction measures the clock adjustment as if it were work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A timestamp is a coordinate. A duration is a distance. They need different instruments.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Your computer already has two kinds of clock
&lt;/h2&gt;

&lt;p&gt;Operating systems expose several clocks, but two mental buckets cover most application code:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Clock&lt;/th&gt;
&lt;th&gt;JavaScript example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;“When did this happen?”&lt;/td&gt;
&lt;td&gt;Wall clock&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Date.now()&lt;/code&gt;, &lt;code&gt;new Date()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;“How long did this take?”&lt;/td&gt;
&lt;td&gt;Monotonic clock&lt;/td&gt;
&lt;td&gt;&lt;code&gt;performance.now()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A wall clock follows civil time. It has an epoch and can be serialized as an ISO timestamp. A monotonic clock starts at an arbitrary origin and promises that later readings will not be lower than earlier readings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;wall:       1000 ── 1001 ── 0998 ── 0999   clock correction
monotonic:    40 ───── 41 ───── 42 ───── 43
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Linux, &lt;a href="https://man7.org/linux/man-pages/man3/clock_gettime.3.html" rel="noopener noreferrer"&gt;&lt;code&gt;CLOCK_REALTIME&lt;/code&gt; is settable wall time&lt;/a&gt;. &lt;code&gt;CLOCK_MONOTONIC&lt;/code&gt; cannot be set and does not make discontinuous jumps backward, although gradual frequency adjustment can affect its rate. Linux even has &lt;code&gt;CLOCK_BOOTTIME&lt;/code&gt; for a monotonic counter that includes suspended time.&lt;/p&gt;

&lt;p&gt;Three properties are easy to confuse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Resolution:&lt;/strong&gt; how small a change the clock can represent.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accuracy:&lt;/strong&gt; how close it is to an external reference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monotonicity:&lt;/strong&gt; whether readings can go backward.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A microsecond-resolution wall clock can still jump. A coarse monotonic clock can still be the correct stopwatch. MDN says browsers may expose Performance API timestamps at 5 µs in isolated contexts or coarsen them to 100 µs for privacy. Both modes remain monotonic.&lt;/p&gt;

&lt;h2&gt;
  
  
  A negative duration once broke DNS
&lt;/h2&gt;

&lt;p&gt;At midnight UTC on January 1, 2017, a leap second exposed this exact assumption inside Cloudflare’s RRDNS service.&lt;/p&gt;

&lt;p&gt;RRDNS measured upstream DNS resolver performance. During the leap, some elapsed values became negative. Those values entered a weighted-selection calculation and eventually reached Go’s &lt;code&gt;rand.Int63n&lt;/code&gt;, which panics when its argument is negative.&lt;/p&gt;

&lt;p&gt;The blast radius was small in percentage terms but enormous in context: &lt;a href="https://blog.cloudflare.com/how-and-why-the-leap-second-affected-cloudflare-dns/" rel="noopener noreferrer"&gt;Cloudflare reported about 0.2% of DNS queries affected at peak&lt;/a&gt;, under 1% of HTTP requests, across a small number of machines in 102 data centers. The worst-hit machines were patched within 90 minutes; the worldwide fix finished at 06:45 UTC.&lt;/p&gt;

&lt;p&gt;Why did redundant machines fail together? The leap second was a correlated trigger. The same rare assumption existed in many replicas, and the external event arrived everywhere at once.&lt;/p&gt;

&lt;p&gt;Go changed its time model after this class of failure. Its current &lt;code&gt;time.Now()&lt;/code&gt; value may carry both wall and monotonic readings; subtraction uses the monotonic part when both operands have it. The &lt;a href="https://go.googlesource.com/proposal/+/master/design/12914-monotonic.md" rel="noopener noreferrer"&gt;design proposal estimated roughly 30% of &lt;code&gt;time.Now&lt;/code&gt; calls&lt;/a&gt; were being used to measure elapsed time.&lt;/p&gt;

&lt;p&gt;This was not exotic timekeeping trivia. It was an API footgun with production evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fix the stopwatch, then fix the deadline
&lt;/h2&gt;

&lt;p&gt;For a duration inside one browser context or Node.js process, use &lt;code&gt;performance.now()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;timed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;operation&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="nx"&gt;startedAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;operation&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="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;durationMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;startedAt&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Performance_API/High_precision_timing" rel="noopener noreferrer"&gt;The Performance API uses a stable monotonic clock&lt;/a&gt; whose origin is &lt;code&gt;performance.timeOrigin&lt;/code&gt;. Node’s implementation returns high-resolution milliseconds from process start. If you need integer nanoseconds in Node, &lt;code&gt;process.hrtime.bigint()&lt;/code&gt; serves the same interval-measurement job.&lt;/p&gt;

&lt;p&gt;The same rule improves timeouts. Suppose an HTTP handler has 250 ms for authentication, a database query, and an upstream request. Giving each step a fresh 250 ms timeout turns one budget into 750 ms.&lt;/p&gt;

&lt;p&gt;Calculate one monotonic deadline and pass the remaining budget down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchWithDeadline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;deadlineMs&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="nx"&gt;remainingMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;deadlineMs&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;remainingMs&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;request budget exhausted&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;timer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;remainingMs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;clearTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timer&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deadlineMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;authenticate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deadlineMs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;queryDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;deadlineMs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchWithDeadline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://inventory.internal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;deadlineMs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A timeout belongs to one operation; a deadline preserves one budget across the whole call tree.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In real code, clamp every remaining budget to zero, stop before starting work with no budget left, and record which stage consumed it. That turns “request timed out” into “database queue used 187 of 250 ms.”&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary: never serialize a monotonic reading
&lt;/h2&gt;

&lt;p&gt;A monotonic value is meaningful only relative to its own clock origin. Process A’s &lt;code&gt;5421.3&lt;/code&gt; and process B’s &lt;code&gt;5421.3&lt;/code&gt; are not the same instant. A restart creates another origin. Serialization often strips monotonic information deliberately; &lt;a href="https://go.dev/pkg/time/?m=old" rel="noopener noreferrer"&gt;Go’s time package does exactly that&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Use this decision table:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Request latency, retry delay, local timeout&lt;/td&gt;
&lt;td&gt;Monotonic time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log timestamp, invoice date, calendar event&lt;/td&gt;
&lt;td&gt;Wall time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persisted expiration such as &lt;code&gt;expires_at&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Authoritative wall time, usually server-side&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ordering events across machines&lt;/td&gt;
&lt;td&gt;Sequence, logical clock, or database order—not client wall time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Distributed lease safety&lt;/td&gt;
&lt;td&gt;Consensus/authority plus fencing tokens—not clock subtraction alone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Monotonic clocks also differ around suspend. Linux &lt;code&gt;CLOCK_MONOTONIC&lt;/code&gt; excludes sleep, while &lt;code&gt;CLOCK_BOOTTIME&lt;/code&gt; includes it; Go documents that monotonic elapsed time may exclude suspend on some systems. Ask whether “five minutes” means five minutes of active process time or five minutes experienced by a user.&lt;/p&gt;

&lt;p&gt;NTP does not remove these choices. Leap smearing avoids a one-second step by changing clock rate over a window, but smear strategies are not universal. Google’s Go proposal describes a 20-hour smear at 99.9986% speed; &lt;a href="https://engineering.fb.com/2022/07/25/production-engineering/its-time-to-leave-the-leap-second-in-the-past/" rel="noopener noreferrer"&gt;Meta describes its own 17-hour smear&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make time testable and observable
&lt;/h2&gt;

&lt;p&gt;Production telemetry needs both clocks, each doing its own job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;observedAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;startedAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;await handleRequest();&lt;/p&gt;

&lt;p&gt;logger.info({&lt;br&gt;
  observedAt,&lt;br&gt;
  durationMs: performance.now() - startedAt,&lt;br&gt;
});&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
The wall timestamp lets you correlate services. The monotonic duration keeps the measurement immune to a local clock correction. Monitor host clock offset separately; do not bake it into request latency.

Wrap both clock reads behind injectable functions in business logic. Tests can then step wall time backward, jump it forward, and advance monotonic time independently. That catches expiry and timeout assumptions without changing the developer laptop’s clock.

Avoid the tempting fallback &amp;lt;code&amp;gt;Math.max(0, Date.now() - start)&amp;lt;/code&amp;gt;. Cloudflare used a defensive negative check as an emergency mitigation, but clamping merely hides the wrong measurement. Use the right clock and keep guards for impossible values as alarms.

## One rule worth remembering

**Wall time tells you when. Monotonic time tells you how long.**

Use &amp;lt;code&amp;gt;Date&amp;lt;/code&amp;gt; for timestamps people and systems exchange. Use &amp;lt;code&amp;gt;performance.now()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;process.hrtime.bigint()&amp;lt;/code&amp;gt;, or your runtime’s monotonic API for latency, budgets, and local deadlines. Do not send monotonic readings across a process boundary.

Which piece of your codebase still subtracts two wall-clock timestamps—and what would happen if the second one were smaller?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🎥 Why is it almost impossible to create a social media with videos - Daykeeper</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Tue, 05 Aug 2025 04:18:11 +0000</pubDate>
      <link>https://dev.to/luciano655/why-is-it-almost-impossible-to-create-a-social-media-with-videos-daykeeper-kna</link>
      <guid>https://dev.to/luciano655/why-is-it-almost-impossible-to-create-a-social-media-with-videos-daykeeper-kna</guid>
      <description>&lt;p&gt;Currently, I’m a 16-year-old student, and since January 2024, I’ve been developing DayKeeper on my own — a social network with a different proposal: turning each day into a meaningful memory. Inspired by platforms like Twitter and Instagram, DayKeeper lets users make daily posts with text, images, and videos.&lt;/p&gt;

&lt;p&gt;Over time, the idea has gone through many changes. A lot has changed: the project’s vision matured, features were redesigned, and the code… well, most of the code has been rewritten several times. One of the biggest challenges so far? &lt;strong&gt;Supporting video uploads in a scalable, secure, and affordable way.&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  DayKeeper’s Environment
&lt;/h1&gt;

&lt;p&gt;To understand the problem, you first need to understand the project’s environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; MongoDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File storage:&lt;/strong&gt; AWS S3 (images and videos)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Content moderation:&lt;/strong&gt; Amazon Rekognition&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video verification notifications:&lt;/strong&gt; Amazon SNS (Simple Notification Service)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, along with many other things, like &lt;strong&gt;nodemailer&lt;/strong&gt; for emails, &lt;strong&gt;passport&lt;/strong&gt; for third-party login, &lt;strong&gt;firebase&lt;/strong&gt; for mobile app notifications, etc.&lt;/p&gt;

&lt;p&gt;To understand what happens when a user creates a post, here’s the route:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/create&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;checkTokenMW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;multer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;multerConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;both&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;files&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;handleMulterError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;createMediaDocsMW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;detectInappropriateFileMW&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;postValidation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;createPost&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or explained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;checkTokenMW&lt;/code&gt;: Makes sure the user is authenticated.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;multer(...)&lt;/code&gt;: Middleware to upload files (images or videos).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;handleMulterError&lt;/code&gt;: Handles upload errors.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;createMediaDocsMW&lt;/code&gt;: Creates documents in the "media" collection, separating files from the post.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;detectInappropriateFileMW&lt;/code&gt;: Uses Rekognition to moderate files. Images are moderated instantly; videos go through asynchronous analysis.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;postValidation&lt;/code&gt;: Validates post data.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;createPost&lt;/code&gt;: Creates the post with references to stored files.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  The Problem
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Storage structure
&lt;/h2&gt;

&lt;p&gt;Originally, images could be embedded in the post objects. But videos require asynchronous moderation. So a unified structure was created: all files (images and videos) are now stored in a separate "media" collection with fields like &lt;code&gt;status: 'pending'&lt;/code&gt;, &lt;code&gt;public&lt;/code&gt;, or &lt;code&gt;rejected&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Verification time
&lt;/h2&gt;

&lt;p&gt;Images are analyzed in milliseconds, but videos take minutes. The system sends the video to Rekognition, waits for processing, and gets a notification via SNS when it’s done. During this time, the post stays pending.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Costs
&lt;/h2&gt;

&lt;p&gt;This is the critical part.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Images:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Cost: &lt;strong&gt;$0.001 per verified image&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1,000 images/day ≈ $1/day = $30/month&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Videos:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Cost: &lt;strong&gt;$0.10 per minute&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;1,000 videos of 5 minutes ≈ $500/month&lt;/li&gt;
&lt;li&gt;Not counting multiple videos per post&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;S3 Storage:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;$0.023 per GB/month&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PNG 1080x1080 ≈ 500 KB – 5 MB&lt;/li&gt;
&lt;li&gt;1080p Video (5 Mbps) ≈ 1.5 GB&lt;/li&gt;
&lt;li&gt;$100/month in S3 gives:&lt;/li&gt;
&lt;li&gt;~4.4 million PNG images&lt;/li&gt;
&lt;li&gt;~2,400 five-minute videos&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Result&lt;/strong&gt;: Supporting video content is dozens or hundreds of times more expensive than images.&lt;/p&gt;

&lt;h1&gt;
  
  
  Possible Solutions
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Having funds ($$$)
&lt;/h2&gt;

&lt;p&gt;The obvious but least accessible solution for solo developers. If you have investors or a big budget, you can afford full video moderation. For me, a 16-year-old student without capital, this isn’t viable.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Imposing limits
&lt;/h2&gt;

&lt;p&gt;Strict limits might be necessary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Max video length: &lt;strong&gt;3 minutes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Size limit&lt;/strong&gt; (e.g., 700 MB)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic compression&lt;/strong&gt; for all files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily upload limits&lt;/strong&gt; per user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These reduce video costs and let you store more content in the same space. Of course, this might affect user experience, so it must be implemented carefully.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Trust-based moderation system
&lt;/h2&gt;

&lt;p&gt;Currently on DayKeeper, not every file is automatically analyzed by Rekognition.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trust Factor&lt;/strong&gt;: New users have low trust and all their files are checked. If they follow rules and aren’t banned, they gain trust and can post without automatic checks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report System&lt;/strong&gt;: Any file can be reported. If reported multiple times, it’s reanalyzed, even if it passed automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual moderation&lt;/strong&gt;: Admins can view reports, ban users, and manually moderate content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On top of that, random moderation of unchecked files will run in the background to keep the app safe. If a malicious user tries to bypass thumbnail analysis, and the post gets many reports, a full video check is triggered and the user may be auto-banned.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Partial video verification
&lt;/h2&gt;

&lt;p&gt;Analyzing every frame is expensive — and often unnecessary. DayKeeper only checks a few:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 frames at the start&lt;/li&gt;
&lt;li&gt;2 in the middle&lt;/li&gt;
&lt;li&gt;2 at the end&lt;/li&gt;
&lt;li&gt;2 random frames&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This equals about 1 frame every 18 seconds for a 3-minute video. If a video is reported, it’s reanalyzed in full. This also varies depending on Trust Factor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Queues with Redis and BullMQ
&lt;/h3&gt;

&lt;p&gt;Creating and verifying thumbnails takes time, and handling thousands of simultaneous requests could overload the server. DayKeeper uses a &lt;code&gt;moderation queue&lt;/code&gt; with BullMQ to manage tasks in a scalable and safe way.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Video compression
&lt;/h2&gt;

&lt;p&gt;A clear way to cut storage costs is by compressing every file &lt;strong&gt;before uploading to the server&lt;/strong&gt;. This lets you store more videos in less space, with little quality loss — massively reducing storage costs.&lt;/p&gt;

&lt;h1&gt;
  
  
  DayKeeper’s Solution
&lt;/h1&gt;

&lt;p&gt;DayKeeper combines a &lt;strong&gt;trust-based moderation system&lt;/strong&gt; with admins and reports, &lt;strong&gt;partial video verification&lt;/strong&gt;, &lt;strong&gt;task queues&lt;/strong&gt;, and &lt;strong&gt;file compression&lt;/strong&gt;, all alongside &lt;strong&gt;clear limits&lt;/strong&gt; on daily stories, posts, and uploaded files.&lt;/p&gt;

&lt;p&gt;Imposing limits also opens the door for a &lt;strong&gt;premium subscription&lt;/strong&gt;. While it might seem controversial in a social network, I believe it’s more acceptable than selling user data or spamming ads. If done right, it won’t hurt free users too much and can help monetize the app.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Building a video-friendly social network isn’t impossible — but it’s a real challenge, especially for solo developers. Costs, moderation time, and technical complexity are tough hurdles.&lt;/p&gt;

&lt;p&gt;In DayKeeper, we’re overcoming them with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;File compression&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partial video checks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trust and reporting systems&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Human moderation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With creative solutions and scalable thinking, even a solo project can reach a professional level. The key is balancing user experience, security, and costs — all while building something you believe in.&lt;/p&gt;

&lt;p&gt;If you want to learn more about DayKeeper, you can &lt;a href="https://github.com/luciano655dev/daykeeper-api" rel="noopener noreferrer"&gt;check the code here&lt;/a&gt; or visit &lt;a href="https://daykeeper.app" rel="noopener noreferrer"&gt;our website&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>socialmedia</category>
      <category>node</category>
    </item>
    <item>
      <title>🎆THE BEST PROGRAMMING CHALLENGES USED IN BIG TECHS FOR YOU TO TRAIN IN 2024🎆</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Thu, 28 Mar 2024 00:05:13 +0000</pubDate>
      <link>https://dev.to/luciano655/the-best-programming-challenges-used-in-big-techs-for-you-to-train-in-2024-29e1</link>
      <guid>https://dev.to/luciano655/the-best-programming-challenges-used-in-big-techs-for-you-to-train-in-2024-29e1</guid>
      <description>&lt;h1&gt;
  
  
  ⭐- WHAT WILL I SHOW?
&lt;/h1&gt;

&lt;p&gt;In this post, I will show you REAL programming challenges used by VARIOUS BIG TECHS in job interviews!&lt;/p&gt;

&lt;p&gt;From simpler challenges to more complex ones, including PicPay, Google, Uber, Amazon, Netflix, and MORE!&lt;/p&gt;

&lt;p&gt;Enjoy the post!&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 1 - Back-end Challenge by PicPay
&lt;/h1&gt;

&lt;p&gt;This challenge, as the title says, has already been used by PicPay for a Backend position.&lt;/p&gt;

&lt;p&gt;Your challenge? Develop a simplified system inspired by PicPay.&lt;/p&gt;

&lt;p&gt;The system should allow two types of users, regular users, and merchants, to transfer money between them.&lt;/p&gt;

&lt;p&gt;To see the details and solve the challenge, just go to &lt;a href="https://github.com/PicPay/picpay-desafio-backend" rel="noopener noreferrer"&gt;this GitHub repository!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you want to see a resolution video, I highly recommend &lt;a href="https://youtube.com/watch?v=QXunBiLq2SM&amp;amp;t=621s" rel="noopener noreferrer"&gt;@kipperdev's on YouTube!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I HIGHLY recommend you try it out!&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%2Fpbs.twimg.com%2Fmedia%2FGJtooeIW0AA3IKL%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJtooeIW0AA3IKL%3Fformat%3Dpng%26name%3Dsmall" width="664" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 2 - First Missing Positive by Google
&lt;/h1&gt;

&lt;p&gt;This is a hard-level challenge that has been used by GOOGLE itself.&lt;/p&gt;

&lt;p&gt;Here, you'll receive an unordered array of INTs &lt;code&gt;nums&lt;/code&gt; and need to return the smallest integer not present in the array.&lt;/p&gt;

&lt;p&gt;To do this, you must implement an algorithm that runs in O(n) time and uses O(1) auxiliary space.&lt;/p&gt;

&lt;p&gt;Sounds easy? &lt;a href="https://leetcode.com/problems/first-missing-positive/description/" rel="noopener noreferrer"&gt;Here's the challenge on LeetCode for you to try!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you want to see a resolution video, &lt;a href="https://youtube.com/watch?v=DsG617OTdhs" rel="noopener noreferrer"&gt;@phenpessoa's on YouTube is GREAT!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one's good! I recommend it!&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%2Fpbs.twimg.com%2Fmedia%2FGJtqx2TXAAAG9_w%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJtqx2TXAAAG9_w%3Fformat%3Dpng%26name%3Dsmall" width="652" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 3 - Backend Challenge by Uber
&lt;/h1&gt;

&lt;p&gt;Here's another challenge for BackEnds, this time from Uber!&lt;/p&gt;

&lt;p&gt;Here, you should create a prototype of one of the following projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Departure Times&lt;/li&gt;
&lt;li&gt;SF Movies&lt;/li&gt;
&lt;li&gt;Email Service&lt;/li&gt;
&lt;li&gt;Food Trucks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The design is up to you, and you should deploy it as if it were in production!&lt;/p&gt;

&lt;p&gt;To see more details, &lt;a href="https://github.com/uber-archive/coding-challenge-tools/blob/master/coding_challenge.md" rel="noopener noreferrer"&gt;just go to this GitHub repo!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you want to see any resolution videos, &lt;a href="https://youtube.com/watch?v=eFgeO9M9lLw&amp;amp;list=PLNCSWIsR6ADKaT1cO6XUJkRy0_v9p-h0Z" rel="noopener noreferrer"&gt;@kipperdev's is ideal!&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%2Fpbs.twimg.com%2Fmedia%2FGJttLwJWcAAApgK%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJttLwJWcAAApgK%3Fformat%3Dpng%26name%3Dsmall" width="680" height="489"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 4 - Product of Array Except Self by Amazon
&lt;/h1&gt;

&lt;p&gt;This is a medium-level challenge, but still, it's interview level!&lt;/p&gt;

&lt;p&gt;Here, you receive an array &lt;code&gt;nums&lt;/code&gt; and need to return an array &lt;code&gt;answer&lt;/code&gt; where &lt;code&gt;answer[i]&lt;/code&gt; is equal to the product of the elements of &lt;code&gt;nums&lt;/code&gt; MINUS &lt;code&gt;num[i]&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Additionally, the product of any prefix or suffix of &lt;code&gt;nums&lt;/code&gt; must be a 32-bit integer.&lt;/p&gt;

&lt;p&gt;If you want to try it yourself, &lt;a href="https://leetcode.com/problems/product-of-array-except-self/description/" rel="noopener noreferrer"&gt;just go to this LeetCode challenge!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you want to see a resolution video, &lt;a href="https://youtube.com/watch?v=2sM68Rxr950" rel="noopener noreferrer"&gt;Vamos Codar's is quick, practical, and efficient!&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%2Fpbs.twimg.com%2Fmedia%2FGJtuwJAXsAAO3d_%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJtuwJAXsAAO3d_%3Fformat%3Dpng%26name%3Dsmall" width="680" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 5 - First Unique Character in a String by Netflix
&lt;/h1&gt;

&lt;p&gt;LOOK, this one is EASY level on LeetCode and has been USED IN NETFLIX!&lt;/p&gt;

&lt;p&gt;In this challenge, you receive a string &lt;code&gt;s&lt;/code&gt; and need to return the index of the first character that does not repeat!&lt;/p&gt;

&lt;p&gt;If this character does not exist, just return &lt;code&gt;-1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Seriously, this is one of the EASIEST, but still, it can be a great challenge!&lt;/p&gt;

&lt;p&gt;To try to solve it, &lt;a href="https://leetcode.com/problems/first-unique-character-in-a-string/description/" rel="noopener noreferrer"&gt;just go to this challenge on LeetCode!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you want to see a resolution video, &lt;a href="https://youtube.com/watch?v=XIvgNQdTcn4" rel="noopener noreferrer"&gt;@phenpessoa's is THE BEST!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Of all on this list, this is the one I most recommend you try!&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%2Fpbs.twimg.com%2Fmedia%2FGJtwfF-WQAElaT2%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJtwfF-WQAElaT2%3Fformat%3Dpng%26name%3Dsmall" width="680" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐- BONUS - Uber Archives
&lt;/h1&gt;

&lt;p&gt;If you want to see other challenges that have been used in Uber interviews in the past, the &lt;a href="https://github.com/uber-archive" rel="noopener noreferrer"&gt;Uber Archives repository&lt;/a&gt; has MANY of these challenges in an Open Source format!&lt;/p&gt;

&lt;p&gt;I HIGHLY recommend checking it out!&lt;/p&gt;

&lt;h1&gt;
  
  
  😄 - THANK YOU!
&lt;/h1&gt;

&lt;p&gt;Of all on this profile, without a doubt, this is one of the best in my opinion!&lt;/p&gt;

&lt;p&gt;Took me a while to post it precisely because I researched a lot and wasn't very free, but still, I hope you liked it!&lt;/p&gt;

&lt;p&gt;If you have any suggestions, just send me a &lt;a href="https://twitter.com/Luciano655dev" rel="noopener noreferrer"&gt;DM on Twitter!&lt;/a&gt; I always want to bring the best content here.&lt;/p&gt;

&lt;p&gt;My recent posts didn't reach many people, and even if it continues like this, I'll never stop posting!&lt;/p&gt;

&lt;p&gt;Finally, Thank you for reading this far!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/luciano655dev" rel="noopener noreferrer"&gt;Also, check out other projects of mine on my GitHub!&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thank you!
&lt;/h3&gt;

</description>
    </item>
    <item>
      <title>🎆THE BEST HTML/REACT TAGS YOU SURELY DON'T KNOW FOR 2024🎆</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Mon, 25 Mar 2024 23:31:10 +0000</pubDate>
      <link>https://dev.to/luciano655/the-best-htmlreact-tags-you-surely-dont-know-for-2024-3jjo</link>
      <guid>https://dev.to/luciano655/the-best-htmlreact-tags-you-surely-dont-know-for-2024-3jjo</guid>
      <description>&lt;h1&gt;
  
  
  ⭐- WHAT WILL I SHOW?
&lt;/h1&gt;

&lt;p&gt;In this post, I'll showcase AMAZING HTML/REACT tags that you DEFINITELY DON'T KNOW to START USING IN 2024&lt;/p&gt;

&lt;p&gt;If you're new, I always post programming content here! Stay tuned!&lt;/p&gt;

&lt;p&gt;Enjoy the read!!&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 1 - &lt;code&gt;&amp;lt;picture&amp;gt;&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This Tag allows you to place MULTIPLE IMAGES at the same time, being able to choose which one will be shown according to the client's screen!&lt;/p&gt;

&lt;p&gt;It's AMAZING for when you have various images of different sizes!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://w3schools.com/tags/tag_picture.asp" rel="noopener noreferrer"&gt;Learn more here!&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%2Fpbs.twimg.com%2Fmedia%2FGJjT36tXcAAHCU9%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJjT36tXcAAHCU9%3Fformat%3Djpg%26name%3Dsmall" alt="Picture Tag" width="680" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 2 - &lt;code&gt;&amp;lt;dialog&amp;gt;&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This one is simpler, but VERY USEFUL&lt;/p&gt;

&lt;p&gt;You know when you want to show those dialog boxes on your website? This tag will save you!&lt;/p&gt;

&lt;p&gt;I only use it now!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://w3schools.com/tags/tag_dialog.asp" rel="noopener noreferrer"&gt;Learn more here!&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%2Fpbs.twimg.com%2Fmedia%2FGJjUTBYXUAAoC-0%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJjUTBYXUAAoC-0%3Fformat%3Dpng%26name%3Dsmall" alt="Dialog Tag" width="680" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 3 - &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;No more defining a variable with an ENTIRE HTML in your JavaScript!&lt;/p&gt;

&lt;p&gt;This tag allows you to place content that can be shown or not, based on JavaScript&lt;/p&gt;

&lt;p&gt;IMAGINE THE POSSIBILITIES!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://w3schools.com/w3css/w3css_templates.asp" rel="noopener noreferrer"&gt;Learn more here!&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%2Fpbs.twimg.com%2Fmedia%2FGJjU6ldW4AAX4aU%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJjU6ldW4AAX4aU%3Fformat%3Djpg%26name%3Dsmall" alt="Template Tag" width="680" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 4 - &lt;code&gt;&amp;lt;track&amp;gt;&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This TAG you use along with a media element, like a video or an audio, and you can simply provide SUBTITLES for that content!&lt;/p&gt;

&lt;p&gt;MAKES YOUR LIFE MUCH EASIER!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://w3schools.com/tags/tag_track.asp" rel="noopener noreferrer"&gt;Learn more here!&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%2Fpbs.twimg.com%2Fmedia%2FGJjVTuhXgAAK3ya%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJjVTuhXgAAK3ya%3Fformat%3Dpng%26name%3Dsmall" alt="Track Tag" width="680" height="240"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 5 - &lt;code&gt;&amp;lt;object&amp;gt;&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This one allows you to embed external content within your HTML page!&lt;/p&gt;

&lt;p&gt;You can put a PDF, files, videos, audios, and even handle the error if the browser doesn't support it!&lt;/p&gt;

&lt;p&gt;simply AMAZING!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://w3schools.com/tags/tag_object.asp" rel="noopener noreferrer"&gt;Learn more here!&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%2Fpbs.twimg.com%2Fmedia%2FGJjV5Q0WwAAH3xy%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJjV5Q0WwAAH3xy%3Fformat%3Dpng%26name%3Dsmall" alt="Object Tag" width="680" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐ BONUS - &lt;code&gt;&amp;lt;base&amp;gt;&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This one's good!&lt;br&gt;
With it, you set a Base URL for ALL URLs on your page!&lt;/p&gt;

&lt;p&gt;No more repeating the same URL all the time!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.w3schools.com/tags/tag_base.asp" rel="noopener noreferrer"&gt;Learn more here!&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%2Fpbs.twimg.com%2Fmedia%2FGJjWTHKW0AAlKVA%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJjWTHKW0AAlKVA%3Fformat%3Dpng%26name%3Dsmall" alt="Base Tag" width="620" height="355"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  😄 - THANK YOU!
&lt;/h1&gt;

&lt;p&gt;This post was shorter than the others, mainly because time is a bit tighter, but I'll make the next one AMAZING!!&lt;/p&gt;

&lt;p&gt;Thank you for reading so far! If you have any suggestions, just let me know and I'll tag you at the top!!&lt;/p&gt;

&lt;p&gt;Also, check out my other projects:&lt;/p&gt;

&lt;p&gt;better-format: &lt;a href="https://github.com/luciano655dev/better-format" rel="noopener noreferrer"&gt;https://github.com/luciano655dev/better-format&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DayKeeper (in dev):&lt;br&gt;
&lt;a href="https://github.com/luciano655dev/daykeeper" rel="noopener noreferrer"&gt;https://github.com/luciano655dev/daykeeper&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Thank you!
&lt;/h3&gt;

</description>
    </item>
    <item>
      <title>🎆 THE BEST CSS PROPERTIES YOU SURELY DON'T KNOW FOR 2024 🎆</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Thu, 21 Mar 2024 00:01:17 +0000</pubDate>
      <link>https://dev.to/luciano655/the-best-css-properties-you-surely-dont-know-for-2024-4ad3</link>
      <guid>https://dev.to/luciano655/the-best-css-properties-you-surely-dont-know-for-2024-4ad3</guid>
      <description>&lt;p&gt;This post is also available, originally, in a &lt;a href="https://twitter.com/Luciano655dev/status/1770597755854946554" rel="noopener noreferrer"&gt;Twitter thread&lt;/a&gt; and in Portuguese, on &lt;a href="https://www.tabnews.com.br/Luciano655/as-melhores-propriedades-css-que-voce-com-certeza-nao-conhece-para-2024" rel="noopener noreferrer"&gt;Tabnews&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%2Fpbs.twimg.com%2Fmedia%2FGJJdWhcXQAAZInI%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJdWhcXQAAZInI%3Fformat%3Djpg%26name%3Dsmall" width="680" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐ - WHAT WILL I SHOW?
&lt;/h1&gt;

&lt;p&gt;In this Post, I'll show you some &lt;strong&gt;AMAZING CSS PROPERTIES&lt;/strong&gt; that you &lt;strong&gt;DEFINITELY&lt;/strong&gt; don't know about!&lt;/p&gt;

&lt;p&gt;If you're new here, I always post programming content on &lt;a href="https://twitter.com/luciano655dev" rel="noopener noreferrer"&gt;my Twitter&lt;/a&gt;! Feel free to follow and give suggestions!&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 1 - &lt;code&gt;mix-blend-mode&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This property allows you to control how an element blends with the content of its parent element and the background element.&lt;/p&gt;

&lt;p&gt;With it, you can create UNIQUE overlay effects, among MANY other things!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/mix-blend-mode" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJmYbWWIAAVM0c%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJmYbWWIAAVM0c%3Fformat%3Dpng%26name%3Dsmall" width="680" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 2 - &lt;code&gt;shape-outside&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This one allows you to wrap content around a specific shape, like a circle, a triangle, a polygon, and MANY others.&lt;/p&gt;

&lt;p&gt;This is GREAT for creating more interesting and creative layouts for your website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/shape-outside" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJmoNvXAAAyHo9%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJmoNvXAAAyHo9%3Fformat%3Dpng%26name%3Dsmall" width="680" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 3 - &lt;code&gt;backdrop-filter&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This property applies filtering effects, such as blur or color inversion, to the background of an element, including nested elements.&lt;/p&gt;

&lt;p&gt;With this, you can create some visual effects that make the page INCREDIBLY more beautiful!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/backdrop-filter" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJnME7WMAATl7u%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJnME7WMAATl7u%3Fformat%3Dpng%26name%3Dsmall" width="680" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 4 - &lt;code&gt;scroll-behavior&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;You know when you want to automatically scroll to somewhere on your page? This property will save you!&lt;/p&gt;

&lt;p&gt;With it, you can configure how the scroll will be, whether it will be fast, linear, smooth, HOWEVER you want!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-behavior" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJnr_bWAAAzIU1%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJnr_bWAAAzIU1%3Fformat%3Dpng%26name%3Dsmall" width="680" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 5 - &lt;code&gt;clip-path&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;With this property, you can cut elements IN ANY SHAPE YOU PREFER.&lt;/p&gt;

&lt;p&gt;You can make a geometric shape, a star, ANYTHING, making your page UNIQUE and INCREDIBLY BEAUTIFUL.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/clip-path" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJoFrQWIAA7HRI%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJoFrQWIAA7HRI%3Fformat%3Dpng%26name%3Dsmall" width="680" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 6 - &lt;code&gt;object-fit&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This one's for you who CAN'T DEAL with an image!&lt;/p&gt;

&lt;p&gt;With this property, you can place an element HOWEVER YOU WANT over another, whether by filling it, cutting it to make a mask, ANYTHING.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/object-fit" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJoeAHXMAA9gH7%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJoeAHXMAA9gH7%3Fformat%3Dpng%26name%3Dsmall" width="680" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 7 - &lt;code&gt;perspective&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;I KNOW you often want to create some 3D effect on your Website and always end up going for some library.&lt;/p&gt;

&lt;p&gt;With THIS property, you define the user's perspective in relation to the Z axis of the website, GREATLY IMPROVING any 3D you're going to do!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/perspective" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJpAKgWQAAjAQI%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJpAKgWQAAjAQI%3Fformat%3Dpng%26name%3Dsmall" width="680" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 8 - &lt;code&gt;column-count&lt;/code&gt; AND &lt;code&gt;column-gap&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;These two properties allow you to divide the content of an element into a specific number of columns and define the space between these columns.&lt;/p&gt;

&lt;p&gt;With this, everything becomes MUCH more organized, it can SAVE a website!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/column-gap" rel="noopener noreferrer"&gt;Learn more about column-gap!&lt;/a&gt;&lt;br&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/column-count" rel="noopener noreferrer"&gt;Learn more about column-count!&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%2Fpbs.twimg.com%2Fmedia%2FGJJp-u3WoAAd0R5%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJp-u3WoAAd0R5%3Fformat%3Dpng%26name%3Dsmall" width="680" height="335"&gt;&lt;/a&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%2Fpbs.twimg.com%2Fmedia%2FGJJqHl_WoAA8CLh%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJqHl_WoAA8CLh%3Fformat%3Dpng%26name%3Dsmall" width="680" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 9 - &lt;code&gt;image-rendering&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;You know when the image is on the website, but it looks a bit weird?&lt;/p&gt;

&lt;p&gt;THIS PROPERTY allows you to DEFINE how an image will be rendered!&lt;/p&gt;

&lt;p&gt;Whether it'll be pixelated, with sharper edges, YOU CHOOSE.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/image-rendering" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJqYWFXoAIz7VX%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJqYWFXoAIz7VX%3Fformat%3Dpng%26name%3Dsmall" width="680" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 10 - &lt;code&gt;word-wrap&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;You know when that text of yours is ALL MESSED UP on the page, overflowing the container and everything?&lt;/p&gt;

&lt;p&gt;Well, this property allows you to BREAK the sentence WHENEVER YOU NEED!&lt;/p&gt;

&lt;p&gt;NO MORE MESSED UP SENTENCES, NO MORE BAD TEXTS, NEVER AGAIN!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://w3schools.com/cssref/css3_pr_word-wrap.php" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJrdWlW0AErLAe%3Fformat%3Dpng%26name%3D240x240" 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%2Fpbs.twimg.com%2Fmedia%2FGJJrdWlW0AErLAe%3Fformat%3Dpng%26name%3D240x240" alt="Sorry for the image, it was the best I could do" width="213" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐ BONUS - &lt;code&gt;text-overflow&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This property, just like the previous one, allows you to IMPROVE THAT MESSED UP TEXT by 100%&lt;/p&gt;

&lt;p&gt;With it, you can put '...' at the end of a sentence that doesn't fit in the container, for example, and MUCH MORE.&lt;/p&gt;

&lt;p&gt;THIS HAS SAVED ME A LOT&lt;/p&gt;

&lt;p&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/text-overflow" rel="noopener noreferrer"&gt;Learn more!&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%2Fpbs.twimg.com%2Fmedia%2FGJJsOd6W0AE8Su0%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGJJsOd6W0AE8Su0%3Fformat%3Dpng%26name%3Dsmall" width="680" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  😄 - THANK YOU
&lt;/h1&gt;

&lt;p&gt;The last thread didn't reach as many people, but even if none of my threads yield results, I WILL ALWAYS CONTINUE POSTING.&lt;/p&gt;

&lt;p&gt;Hope you enjoyed! Remember that this post is also available on TabNews and DevTo!&lt;/p&gt;

&lt;p&gt;My last thread: &lt;a href="https://twitter.com/Luciano655dev/status/1769868521863835956" rel="noopener noreferrer"&gt;https://twitter.com/Luciano655dev/status/1769868521863835956&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also check out my other projects!&lt;/p&gt;

&lt;p&gt;better-format: &lt;a href="https://github.com/luciano655dev/better-format" rel="noopener noreferrer"&gt;https://github.com/luciano655dev/better-format&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DayKeeper (in dev): &lt;a href="https://github.com/luciano655dev/daykeeper" rel="noopener noreferrer"&gt;https://github.com/luciano655dev/daykeeper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;THANK YOU!&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🎆THE BEST GIT COMMANDS YOU PROBABLY DON'T KNOW FOR 2024 🎆</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Mon, 18 Mar 2024 23:43:03 +0000</pubDate>
      <link>https://dev.to/luciano655/the-best-git-commands-you-probably-dont-know-for-2024-3mjl</link>
      <guid>https://dev.to/luciano655/the-best-git-commands-you-probably-dont-know-for-2024-3mjl</guid>
      <description>&lt;p&gt;This post is also available originally in &lt;a href="https://twitter.com/luciano655dev" rel="noopener noreferrer"&gt;Thread format on Twitter&lt;/a&gt; and in English on &lt;a href="https://dev.to/luciano655dev"&gt;Dev.To&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%2Fpbs.twimg.com%2Fmedia%2FGI-nAE-XEAEfMbQ%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI-nAE-XEAEfMbQ%3Fformat%3Dpng%26name%3Dsmall" width="640" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐- WHAT WILL I SHOW?
&lt;/h1&gt;

&lt;p&gt;In this Thread, I'll show you &lt;strong&gt;useful git commands&lt;/strong&gt; that &lt;strong&gt;you probably haven't even heard of&lt;/strong&gt; and believe me, they are &lt;strong&gt;VERY USEFUL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're new, I always post content here and on Twitter! Keep an eye out!&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 1 - &lt;code&gt;git rebase -i&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This GIT command allows you to reorganize, edit, or combine commits during a rebase&lt;/p&gt;

&lt;p&gt;This is VERY useful for cleaning up commit history before sending a pull request, merging your changes into a main branch, etc.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-rebase" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI-rrZAWgAEIueg%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI-rrZAWgAEIueg%3Fformat%3Dpng%26name%3Dsmall" width="518" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 2 - &lt;code&gt;git cherry-pick&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This command basically allows you to copy a single commit from one branch to another&lt;/p&gt;

&lt;p&gt;It's very useful when you need to add a specific change from a commit without merging the entire branch, for example&lt;/p&gt;

&lt;p&gt;Ever since I saw it, I've been using it all the time!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-cherry-pick" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI-sVQ2W4AA5z23%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI-sVQ2W4AA5z23%3Fformat%3Dpng%26name%3Dsmall" width="550" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 3 - &lt;code&gt;git reflog&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Reflog records ALL previous HEADs, allowing you to navigate through the change history, even after a rebase or reset&lt;/p&gt;

&lt;p&gt;It's incredible for recovering lost commits, reversing accidental actions, among MANY other things&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-reflog" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_QaATXcAImYvV%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_QaATXcAImYvV%3Fformat%3Dpng%26name%3Dsmall" width="466" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 4 - &lt;code&gt;git bisect&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This command is used to locate a specific commit that introduced a bug, performing a binary search between two known points&lt;/p&gt;

&lt;p&gt;You can use it to quickly identify the cause of problems in large commit histories, for example&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-bisect" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_QxL-WgAA2wRd%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_QxL-WgAA2wRd%3Fformat%3Dpng%26name%3Dsmall" width="466" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 5 - &lt;code&gt;git worktree&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This one allows you to work with MULTIPLE working directories from the same Git repository&lt;/p&gt;

&lt;p&gt;It works great when you need to work on multiple branches simultaneously without switching between directories, etc...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-worktree" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_RIZtW4AATgWu%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_RIZtW4AATgWu%3Fformat%3Dpng%26name%3Dsmall" width="500" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 6 - &lt;code&gt;git submodule&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Submodules are Git repositories embedded within a main repository&lt;/p&gt;

&lt;p&gt;They are useful for including dependencies from other repositories in your project while keeping them as separate entities&lt;/p&gt;

&lt;p&gt;With this command, you can manage EVERYTHING from a submodule&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-submodule" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_RghfXAAAxjRv%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_RghfXAAAxjRv%3Fformat%3Dpng%26name%3Dsmall" width="518" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 7 - &lt;code&gt;git clean&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This command is used to remove untracked files from the working directory&lt;/p&gt;

&lt;p&gt;It's useful for cleaning up automatically generated files or temporary files that shouldn't be included in the repository (which has happened to me before)&lt;/p&gt;

&lt;p&gt;This one's one of the best, I recommend it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-clean" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_SB99XcAAGmK9%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_SB99XcAAGmK9%3Fformat%3Dpng%26name%3Dsmall" width="450" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 8 - &lt;code&gt;git worktree prune&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;Prune is used to clean up inactive working directories created by git worktree, which we saw a little while ago&lt;/p&gt;

&lt;p&gt;This is useful for freeing up disk space and keeping the workspace always clean!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-prune" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_SbnQW4AEK70O%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_SbnQW4AEK70O%3Fformat%3Dpng%26name%3Dsmall" width="602" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 9 - &lt;code&gt;git sparse-checkout&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This feature allows you to work only with a subset of files in a large repository&lt;/p&gt;

&lt;p&gt;It's good for saving your time and disk space when cloning or pulling large projects, greatly improving everything&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-sparse-checkout" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_Sh4kXIAAjaP8%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_Sh4kXIAAjaP8%3Fformat%3Dpng%26name%3Dsmall" width="618" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 10 - &lt;code&gt;git rerere&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This command automatically records successful conflict resolutions and reuses them in similar conflicts in the future&lt;/p&gt;

&lt;p&gt;This is AMAZING for saving your time when dealing with recurring conflicts during merge, for example&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-rerere" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_S4P1WkAELfy_%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_S4P1WkAELfy_%3Fformat%3Dpng%26name%3Dsmall" width="466" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐ BONUS - &lt;code&gt;git notes&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;This command attaches notes to your commits without altering the main timeline&lt;/p&gt;

&lt;p&gt;This is GREAT for adding additional information, such as code reviews or review notes, without modifying the original commits&lt;/p&gt;

&lt;p&gt;&lt;a href="https://git-scm.com/docs/git-notes" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGI_TdzeW0AARHKs%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGI_TdzeW0AARHKs%3Fformat%3Dpng%26name%3Dsmall" width="450" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  😄- THANK YOU
&lt;/h1&gt;

&lt;p&gt;I hope you enjoyed the post!&lt;/p&gt;

&lt;p&gt;I always post programming content here and on &lt;a href="https://twitter.com/luciano655dev" rel="noopener noreferrer"&gt;my Twitter&lt;/a&gt;, feel free to follow and give suggestions! I always give credit at the top of the Thread!&lt;/p&gt;

&lt;p&gt;Also, check out my other projects!&lt;/p&gt;

&lt;p&gt;⭐ better-format: &lt;a href="https://github.com/luciano655dev/better-format" rel="noopener noreferrer"&gt;https://github.com/luciano655dev/better-format&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⭐ DayKeeper (under development): &lt;a href="https://github.com/luciano655dev/daykeeper" rel="noopener noreferrer"&gt;https://github.com/luciano655dev/daykeeper&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thank you!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>git</category>
      <category>commands</category>
      <category>new</category>
      <category>terminal</category>
    </item>
    <item>
      <title>🎆HOW TO CREATE YOUR OWN PACKAGE ON NPM EASILY, QUICKLY, AND UPDATED 2024🎆</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Thu, 29 Feb 2024 22:42:11 +0000</pubDate>
      <link>https://dev.to/luciano655/how-to-create-your-own-package-on-npm-easily-quickly-and-updated-2024-5bkl</link>
      <guid>https://dev.to/luciano655/how-to-create-your-own-package-on-npm-easily-quickly-and-updated-2024-5bkl</guid>
      <description>&lt;p&gt;This post is also available, originally, in &lt;a href="https://twitter.com/Luciano655dev/status/1763330058389782898" rel="noopener noreferrer"&gt;Thread format on Twitter&lt;/a&gt; and, in Portuguese, on &lt;a href="https://www.tabnews.com.br/Luciano655/como-criar-seu-proprio-pacote-no-npm-facil-rapido-e-atualizado-2024" rel="noopener noreferrer"&gt;TabNews&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%2Fpbs.twimg.com%2Fmedia%2FGHiJ-t2XQAAavp6%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiJ-t2XQAAavp6%3Fformat%3Djpg%26name%3Dsmall" alt="Image by Hare Prananda on LinkedIn" width="680" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐- WHAT ARE WE GOING TO DO?
&lt;/h1&gt;

&lt;p&gt;In this thread, I will teach you how to create your &lt;strong&gt;own package on NPM&lt;/strong&gt;, in an &lt;strong&gt;EASY AND QUICK&lt;/strong&gt; way, with &lt;strong&gt;JavaScript/TypeScript&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;This thread will be based on &lt;strong&gt;my own package, BETTER-FORMAT&lt;/strong&gt;, which I will use as a reference!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/luciano655dev/better-format" rel="noopener noreferrer"&gt;See more here on GitHub!&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%2Fpbs.twimg.com%2Fmedia%2FGHiK5T8WUAYQCgb%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiK5T8WUAYQCgb%3Fformat%3Dpng%26name%3Dsmall" alt="Better-Format by Luciano655dev on GitHub" width="680" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅- WHAT IS NPM?
&lt;/h1&gt;

&lt;p&gt;NPM, or Node Package Manager, is simply a package manager for Node.JS.&lt;/p&gt;

&lt;p&gt;In other words, it's a place where anyone can create and publish packages.&lt;/p&gt;

&lt;p&gt;Here we have both HUGE and smaller packages, all useful for something!&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%2Fpbs.twimg.com%2Fmedia%2FGHiQ57ZXgAAe6nz%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiQ57ZXgAAe6nz%3Fformat%3Djpg%26name%3Dsmall" width="680" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅- BEFORE CREATING...
&lt;/h1&gt;

&lt;p&gt;Before creating an NPM package, think about what this package will do.&lt;/p&gt;

&lt;p&gt;Better-Format, for example, helps you format and validate some types of data, such as strings, numbers, CPF validation, card, etc...&lt;/p&gt;

&lt;p&gt;Just have an idea and put it into practice!&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%2Fpbs.twimg.com%2Fmedia%2FGHiRkK5W8AAuCyB%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiRkK5W8AAuCyB%3Fformat%3Dpng%26name%3Dsmall" width="680" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅- WHAT YOU WILL NEED
&lt;/h1&gt;

&lt;p&gt;To create your first package, you just need an account on NPM and knowledge in some language, like JavaScript!&lt;/p&gt;

&lt;p&gt;Depending on the package, you can also use other existing packages to help you, such as &lt;a href="https://axios-http.com" rel="noopener noreferrer"&gt;axios&lt;/a&gt;, &lt;a href="https://www.npmjs.com/package/bcrypt" rel="noopener noreferrer"&gt;bcrypt&lt;/a&gt;, etc...&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%2Fpbs.twimg.com%2Fmedia%2FGHiSjYjW8AAiR_I%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiSjYjW8AAiR_I%3Fformat%3Djpg%26name%3Dsmall" width="680" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 1 - HOW TO GET STARTED
&lt;/h1&gt;

&lt;p&gt;First, you need to initialize a package, something you've surely done before, with &lt;code&gt;npm init&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Fill in as much information as possible here, as it is important.&lt;/p&gt;

&lt;p&gt;Before that, it's also good to create a repository on GitHub to link to your project!&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%2Fpbs.twimg.com%2Fmedia%2FGHiXOUEWsAAyhma%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiXOUEWsAAyhma%3Fformat%3Dpng%26name%3Dsmall" width="612" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 2 - FIRST CODE
&lt;/h1&gt;

&lt;p&gt;After initializing the package, create an &lt;code&gt;index.js&lt;/code&gt; file and put something in it, like a &lt;code&gt;hello world&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then, run the &lt;code&gt;npm link&lt;/code&gt; command, which will start your package locally, making it ready for testing.&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%2Fpbs.twimg.com%2Fmedia%2FGHiUs3XXUAAPPrm%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiUs3XXUAAPPrm%3Fformat%3Dpng%26name%3Dsmall" width="630" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 3 - CREATING THE PACKAGE
&lt;/h1&gt;

&lt;p&gt;From here on, it's up to you and your creativity!&lt;/p&gt;

&lt;p&gt;Create as many folders as you want, install as many dependencies as you want, and make your code work!&lt;/p&gt;

&lt;p&gt;After that, just export everything in your &lt;code&gt;index.js&lt;/code&gt; with &lt;code&gt;module.exports = {...}&lt;/code&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%2Fpbs.twimg.com%2Fmedia%2FGHiVfeQW8AAy6SH%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiVfeQW8AAy6SH%3Fformat%3Djpg%26name%3Dsmall" width="628" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 4 - CREATING TESTS
&lt;/h1&gt;

&lt;p&gt;Along with everything you do, I strongly recommend running a test for it!&lt;/p&gt;

&lt;p&gt;To do this, just install Jest with &lt;code&gt;npm i jest&lt;/code&gt; and create a &lt;code&gt;./tests&lt;/code&gt; folder, for example.&lt;/p&gt;

&lt;p&gt;Here, you can test the functions you created! Use and abuse it!&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%2Fpbs.twimg.com%2Fmedia%2FGHiWPnEWEAELJl5%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiWPnEWEAELJl5%3Fformat%3Djpg%26name%3Dsmall" width="680" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 5 - TESTING LOCALLY
&lt;/h1&gt;

&lt;p&gt;Remember we ran the &lt;code&gt;npm link&lt;/code&gt; command before? That's what allows us to test the package before it's published!&lt;/p&gt;

&lt;p&gt;In another folder, run the command&lt;br&gt;
&lt;code&gt;npm i {my_package}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then just import it with&lt;br&gt;
&lt;code&gt;const myPackage = require('my_package')&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and test as much as you want!&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%2Fpbs.twimg.com%2Fmedia%2FGHiYZ3SXkAAFNyp%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiYZ3SXkAAFNyp%3Fformat%3Djpg%26name%3Dsmall" width="680" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 6 - PUBLISHING THE PACKAGE
&lt;/h1&gt;

&lt;p&gt;After developing the package, the simplest part is to publish!&lt;/p&gt;

&lt;p&gt;Run the &lt;code&gt;npm login&lt;/code&gt; command and enter your NPM account!&lt;/p&gt;

&lt;p&gt;Then, check the version and run &lt;code&gt;npm publish&lt;/code&gt; and YOU'RE DONE! YOU'VE ALREADY PUBLISHED YOUR FIRST PACKAGE!&lt;/p&gt;

&lt;p&gt;To update, change the version and run the same command again!&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%2Fpbs.twimg.com%2Fmedia%2FGHiZJnaWQAA8cKo%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiZJnaWQAA8cKo%3Fformat%3Djpg%26name%3Dsmall" width="680" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 7 - AFTER PUBLISHING
&lt;/h1&gt;

&lt;p&gt;After publishing, promote your package!&lt;/p&gt;

&lt;p&gt;Post it on your social networks, everything! Besides, NPM itself distributes your package when you create it!&lt;/p&gt;

&lt;p&gt;Remember to create a good README to attract people and make everything right on GitHub!&lt;/p&gt;

&lt;p&gt;Check Issues, PRs, create a good environment for other developers, and hopefully, your package will be a success!&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%2Fpbs.twimg.com%2Fmedia%2FGHiZxeVXkAAVmyQ%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGHiZxeVXkAAVmyQ%3Fformat%3Dpng%26name%3Dsmall" width="379" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐ - BONUS
&lt;/h1&gt;

&lt;p&gt;If you want to see more content about it, there are two videos that I HIGHLY recommend you to watch!&lt;/p&gt;

&lt;p&gt;One from &lt;a href="https://www.youtube.com/@WebDevSimplified" rel="noopener noreferrer"&gt;WebDevSimplified&lt;/a&gt; that shows in detail how to create the package.&lt;/p&gt;

&lt;p&gt;And another from &lt;a href="https://www.youtube.com/@PaulaSantamaria" rel="noopener noreferrer"&gt;Paula Santamaría&lt;/a&gt;, which shows how she created her own package in a VERY well-produced video!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/watch?v=J4b_T-qH3BY&amp;amp;t=233s" rel="noopener noreferrer"&gt;WebDevSimplified video here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/watch?v=cdHb1fTl6_E&amp;amp;list=WL&amp;amp;index=1" rel="noopener noreferrer"&gt;Paula Santamaría video here&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  😄 - THANK YOU!
&lt;/h1&gt;

&lt;p&gt;Hope you enjoyed it!&lt;/p&gt;

&lt;p&gt;It had been a while since I last did a thread, mostly due to lack of good content, but I always want to post more!&lt;/p&gt;

&lt;p&gt;If you liked it, visit the Better-Format repository! Your contribution will always be very welcome!&lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🎆 THE BEST AND MOST USEFUL VSCODE EXTENSIONS 🎆</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Thu, 22 Feb 2024 13:13:57 +0000</pubDate>
      <link>https://dev.to/luciano655/the-best-and-most-useful-vscode-extensions-jb3</link>
      <guid>https://dev.to/luciano655/the-best-and-most-useful-vscode-extensions-jb3</guid>
      <description>&lt;p&gt;This post is also avaliable on &lt;a href="https://twitter.com/Luciano655dev/status/1760448495339626753" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; and, in portuguese, on &lt;a href="https://www.tabnews.com.br/Luciano655/as-melhores-e-mais-uteis-extensoes-do-vscode" rel="noopener noreferrer"&gt;TabNews&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  THE BEST AND MOST USEFUL VSCODE EXTENSIONS
&lt;/h1&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%2Fpbs.twimg.com%2Fmedia%2FGGaORyPXwAE5Xoa%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaORyPXwAE5Xoa%3Fformat%3Djpg%26name%3Dsmall" alt="Peacock (end of thread)" width="680" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐- WHAT WILL I SHOW?
&lt;/h1&gt;

&lt;p&gt;In this Thread, I won't show you little extensions that you probably already know, like &lt;a href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer" rel="noopener noreferrer"&gt;Live Server&lt;/a&gt; or &lt;a href="https://prettier.io" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I'll focus on &lt;strong&gt;USEFUL&lt;/strong&gt; extensions that you &lt;strong&gt;probably don't have or know&lt;/strong&gt;, but of course, I'll also go through some simple ones along the way.&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%2Fpbs.twimg.com%2Fmedia%2FGGaQFEnXYAAKNak%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaQFEnXYAAKNak%3Fformat%3Dpng%26name%3Dsmall" width="680" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 1 - BETTER COMMENTS
&lt;/h1&gt;

&lt;p&gt;This extension will &lt;strong&gt;REVOLUTIONIZE&lt;/strong&gt; the way you comment your code!&lt;/p&gt;

&lt;p&gt;With it, you can change the &lt;strong&gt;color&lt;/strong&gt;, &lt;strong&gt;style&lt;/strong&gt;, leave the comment &lt;strong&gt;THE WAY YOU PREFER&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I myself always use it and &lt;strong&gt;WON'T STOP USING IT&lt;/strong&gt;, it helps a lot to make the code beautiful!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGaR4ErWwAA8NXV%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaR4ErWwAA8NXV%3Fformat%3Djpg%26name%3Dsmall" width="680" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 2 - ERROR LENS
&lt;/h1&gt;

&lt;p&gt;You know when you're writing code and need to &lt;strong&gt;ALWAYS COMPILE&lt;/strong&gt; it to then &lt;strong&gt;LOOK FOR THE ERROR&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;THAT ENDS HERE! Error Lens shows you &lt;strong&gt;CLEARLY&lt;/strong&gt; where the errors are &lt;strong&gt;WHILE YOU WRITE THE CODE&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;And I'll warn you, it also shows TypeScript alerts hahaha, I highly recommend it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGaR7_9XUAEYtWR%3Fformat%3Djpg%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaR7_9XUAEYtWR%3Fformat%3Djpg%26name%3Dsmall" width="680" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 3 - TABNINE AI AUTOCOMPLETE
&lt;/h1&gt;

&lt;p&gt;You may know others like it, but I assure you, &lt;strong&gt;I'VE BEEN USING THIS FOR YEARS AND NEVER REGRETTED IT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even the free version helps you &lt;strong&gt;A LOT&lt;/strong&gt; to write code! It has a VERY complete system, besides being &lt;strong&gt;VERY reliable&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;I DON'T CODE WITHOUT IT ANYMORE! I HIGHLY RECOMMEND IT!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=TabNine.tabnine-vscode" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGaShqwWQAADkbx%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaShqwWQAADkbx%3Fformat%3Dpng%26name%3Dsmall" width="680" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 4 - VSCODE ANIMATIONS
&lt;/h1&gt;

&lt;p&gt;This extension &lt;strong&gt;WILL IMPROVE YOUR VSCODE EXPERIENCE BY 1000x&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It adds &lt;strong&gt;simple animations to VARIOUS actions&lt;/strong&gt;, like opening a new file, terminal, etc.&lt;/p&gt;

&lt;p&gt;And believe me! It won't bother you &lt;strong&gt;AT ALL&lt;/strong&gt;! IT'S REALLY WORTH IT!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=BrandonKirbyson.vscode-animations" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGaTThBXsAAfM3x%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaTThBXsAAfM3x%3Fformat%3Dpng%26name%3Dsmall" width="663" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 5 - BOOKMARKS
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;NO MORE GETTING LOST IN CODE&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;With Bookmarks, you can add markers wherever you want!&lt;br&gt;
These markers can have &lt;strong&gt;comments&lt;/strong&gt;, be &lt;strong&gt;customized&lt;/strong&gt;, and all of them appear in a &lt;strong&gt;TAB JUST FOR THEM&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;It's REALLY WORTH IT for large codes, &lt;strong&gt;I HIGHLY RECOMMEND IT&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=alefragnani.Bookmarks" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGaZeIWXYAACqDY%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaZeIWXYAACqDY%3Fformat%3Dpng%26name%3Dsmall" width="680" height="652"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 6 - CODE SNAP
&lt;/h1&gt;

&lt;p&gt;You probably already know this one, &lt;strong&gt;BUT WAIT, I'LL SHOW YOU SOMETHING YOU DON'T KNOW&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;With this extension, you take &lt;strong&gt;THE BEST PHOTOS OF YOUR CODE&lt;/strong&gt;, it's perfect for sharing anywhere! even on Instagram to brag about your clean code! hahaha&lt;/p&gt;

&lt;p&gt;And one thing you might not know is that it's &lt;strong&gt;CUSTOMIZABLE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can change the background, color, opacity, spacing, &lt;strong&gt;EVERYTHING&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;It's really worth it! I ALWAYS recommend it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=adpyke.codesnap" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGaanG3WsAApHFf%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaanG3WsAApHFf%3Fformat%3Dpng%26name%3Dsmall" width="680" height="678"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 7 - VSCODE PETS
&lt;/h1&gt;

&lt;p&gt;I showed this one in the previous post, &lt;strong&gt;BUT IT'S WORTH SHOWING AGAIN&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;With this extension, &lt;strong&gt;YOU CAN PUT PETS IN YOUR VSCODE&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;There are various options for animals, scenarios, you can play with them, &lt;strong&gt;EVERYTHING, IT'S AMAZING&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;IT'S REALLY WORTH INSTALLING OH MY GOD IT'S REALLY WORTH IT&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=tonybaloney.vscode-pets" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGaaueRXQAA8NIM%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaaueRXQAA8NIM%3Fformat%3Dpng%26name%3Dsmall" width="680" height="673"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 8 - WAKA TIME
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;THIS IS INNOVATIVE, YOU'LL SEE!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With this extension &lt;strong&gt;YOU CONTROL ALL THE TIME YOU SPENT CODING IN THE WEEK&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It sends you a report about &lt;strong&gt;EVERYTHING&lt;/strong&gt; in the week, with the time you spent on each project, file, &lt;strong&gt;IT'S AMAZING&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Just sign up and make the most of it!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=WakaTime.WakaTime" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGaba1zXEAEEoyr%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGaba1zXEAEEoyr%3Fformat%3Dpng%26name%3Dsmall" width="680" height="675"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 9 - GIT HISTORY
&lt;/h1&gt;

&lt;p&gt;If you use Git / GitHub frequently, &lt;strong&gt;THIS EXTENSION WILL SAVE YOU A LOT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It shows &lt;strong&gt;ALL&lt;/strong&gt; Git history, from commits, pull requests, &lt;strong&gt;EVERYTHING YOU CAN IMAGINE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And this with the &lt;strong&gt;SIMPLEST AND MOST INTUITIVE&lt;/strong&gt; design&lt;/p&gt;

&lt;p&gt;Even though it's simpler, &lt;strong&gt;IT'S REALLY WORTH IT&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory" rel="noopener noreferrer"&gt;See more here&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%2Fpbs.twimg.com%2Fmedia%2FGGacsZdXcAAr9sN%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGacsZdXcAAr9sN%3Fformat%3Dpng%26name%3Dsmall" width="680" height="629"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ✅ 10 - PEACOCK
&lt;/h1&gt;

&lt;p&gt;If you're a person like me, who always has &lt;strong&gt;MANY&lt;/strong&gt; VSCode tabs open and always gets lost in them, &lt;strong&gt;THIS EXTENSION IS THE SOLUTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With it, you can put &lt;strong&gt;ANY COLOR ON THE GITHUB BORDER&lt;/strong&gt;, making it &lt;strong&gt;UNMISTAKABLE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;(AND IT STARTED THE POST)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-peacock" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGadqVjXYAA-Jya%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGadqVjXYAA-Jya%3Fformat%3Dpng%26name%3Dsmall" width="680" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐ BONUS - REGEX PREVIEWER
&lt;/h1&gt;

&lt;p&gt;This one's for you &lt;strong&gt;WHO DON'T KNOW AND DON'T WANT TO KNOW REGEX&lt;/strong&gt; (JUST LIKE ME HAHAHA)&lt;/p&gt;

&lt;p&gt;With this extension, you preview what your RegEx expression does!&lt;/p&gt;

&lt;p&gt;Believe me, &lt;strong&gt;IT WILL HELP YOU A LOT&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=chrmarti.regex" rel="noopener noreferrer"&gt;See more here!&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%2Fpbs.twimg.com%2Fmedia%2FGGafd68WoAAtjlC%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FGGafd68WoAAtjlC%3Fformat%3Dpng%26name%3Dsmall" width="680" height="584"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  😄 - THANK YOU
&lt;/h1&gt;

&lt;p&gt;I hope you liked it!&lt;/p&gt;

&lt;p&gt;If you have any questions, just DM me on Twitter! I'm always available!&lt;/p&gt;

&lt;h3&gt;
  
  
  My social networks:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/luciano655dev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/luciano655dev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My projects:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/luciano655dev/DayKeeper" rel="noopener noreferrer"&gt;DayKeeper&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/luciano655dev/better-format" rel="noopener noreferrer"&gt;Better-Format&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  THANK YOU!
&lt;/h2&gt;

</description>
    </item>
    <item>
      <title>HOW TO CUSTOMIZE YOUR VS Code AND Windows TERMINAL!</title>
      <dc:creator>Luciano Menezes</dc:creator>
      <pubDate>Thu, 15 Feb 2024 00:11:38 +0000</pubDate>
      <link>https://dev.to/luciano655/how-to-customize-your-vs-code-and-windows-terminal-4jb4</link>
      <guid>https://dev.to/luciano655/how-to-customize-your-vs-code-and-windows-terminal-4jb4</guid>
      <description>&lt;p&gt;This post is a translation of a Thread posted by me on Twitter! Feel free to see the original version &lt;a href="https://twitter.com/Luciano655dev/status/1757910828320428092" rel="noopener noreferrer"&gt;here&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%2Fa4s49r6vwnc6tpomgdtc.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%2Fa4s49r6vwnc6tpomgdtc.png" alt=" " width="800" height="429"&gt;&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%2Fnen4v6064fmfvwju242a.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%2Fnen4v6064fmfvwju242a.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  ⭐WHAT DO WE DO???
&lt;/h1&gt;

&lt;p&gt;In this Post, we will go through themes, vscode settings, fonts, icons, color palette, terminal styling in Windows, EVERYTHING YOU CAN IMAGINE&lt;/p&gt;

&lt;h1&gt;
  
  
  🎆 - VS CODE THEME
&lt;/h1&gt;

&lt;p&gt;The theme I'm using is called "Min Theme", which is very simple, but very good!&lt;/p&gt;

&lt;p&gt;If you want to use a livelier theme, there's "Shades of Purple" which I used for a long time! In addition to "Andromeda", "Tokyo Night" and the famous "Dracula" that you already know!&lt;/p&gt;

&lt;p&gt;Here are the links, choose the one you prefer! Everyone is amazing&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=miguelsolorio.min-theme" rel="noopener noreferrer"&gt;Min Theme&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F70m45vh79lagpuocik1f.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%2F70m45vh79lagpuocik1f.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ahmadawais.shades-of-purple" rel="noopener noreferrer"&gt;Shades of Purple (Super Dark)&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F06x5ezvmgtn6lj5qco2i.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%2F06x5ezvmgtn6lj5qco2i.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=EliverLara.andromeda" rel="noopener noreferrer"&gt;Andromeda&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F9htytjvfb8xbb4u1czfi.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%2F9htytjvfb8xbb4u1czfi.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=enkia.tokyo-night" rel="noopener noreferrer"&gt;Tokyo Night&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F1eshia9wtyeyiusq52dg.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%2F1eshia9wtyeyiusq52dg.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=dracula-theme.theme-dracula" rel="noopener noreferrer"&gt;Dracula&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F8ug6mfjpqjrfz4az7n35.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%2F8ug6mfjpqjrfz4az7n35.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  🗂️- FILE ICONS
&lt;/h1&gt;

&lt;p&gt;Currently, I'm using 'vscode-icons", which I really like! However, one that goes REALLY well with this theme is "Symbols", which follows the minimalist aesthetic!&lt;/p&gt;

&lt;p&gt;These two are the ones I recommend! It's up to you to choose!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons" rel="noopener noreferrer"&gt;vscode-icons&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F2x00eht1h713kcrlvq3w.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%2F2x00eht1h713kcrlvq3w.png" alt=" " width="226" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=miguelsolorio.symbols" rel="noopener noreferrer"&gt;Symbols&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F9q1ncm9c5mk3kwuwsnre.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%2F9q1ncm9c5mk3kwuwsnre.png" alt=" " width="208" height="434"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  🅰️- VSCODE FONTS
&lt;/h1&gt;

&lt;p&gt;This is the BEST FONT I found, called "JeiBrains Mono"!&lt;/p&gt;

&lt;p&gt;It is a very complete font for devs, containing EVERYTHING you need, such as fontLigatures, Nerd Fonts, etc...&lt;/p&gt;

&lt;p&gt;Another good one is Geist Mono, launched by Versel, which also contains ALL OF THIS&lt;/p&gt;

&lt;p&gt;You choose!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.co/uxfLfye86s" rel="noopener noreferrer"&gt;JetBrains Mono&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F061njrk3tfbwvmgmadrs.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%2F061njrk3tfbwvmgmadrs.png" alt=" " width="799" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.co/dM8MErssx2" rel="noopener noreferrer"&gt;Geist Mono&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2F845fwbj9eko947lpalgk.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%2F845fwbj9eko947lpalgk.png" alt=" " width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  ⌨️ - GENERAL SETTINGS
&lt;/h1&gt;

&lt;p&gt;This is where everything will change! I'll show you how to really make VSCode your own!&lt;/p&gt;

&lt;p&gt;Press Ctrl + Shift + P in VsCode and search for "Preferences: Open User Settings (JSON)"&lt;/p&gt;

&lt;p&gt;This is the JSON that goes into all the VS CODE configs! There's a lot to put here, &lt;a href="https://t.co/4NZUZ6o5Dd" rel="noopener noreferrer"&gt;so here is a link to the Rocketseat video explaining everything!&lt;/a&gt; (Portuguese)&lt;/p&gt;

&lt;p&gt;If you just want to get the configs, you can look at his github repository, in the description of this video&lt;/p&gt;

&lt;p&gt;If you want to leave it EXACTLY as mine is, just read it here, which is a simpler version that I customized, but it's not very different!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"symbols.hidesExplorerArrows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tabnine.experimentalAutoImports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.colorTheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dracula"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.iconTheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symbols"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JetBrains Mono"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vscode-pets.theme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"forest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.lineHeight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.startupEditor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"newUntitledFile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.renderLineHighlight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gutter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.fontLigatures"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.editor.labelFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"short"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explorer.compactFolders"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.semanticHighlighting.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"breadcrumbs.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"editor.minimap.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"workbench.statusBar.visible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apc.electron"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"titleBarStyle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hiddenInset"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"trafficLightPosition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"frame"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"window.commandCenter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apc.header"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apc.stylesheet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".title-label &amp;gt; h2"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"display: none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".editor-actions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"display: none"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".nosidebar .inline-tabs-placeholder"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"width: 75px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".pane-header"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"padding: 0 8px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".pane-body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"padding: 8px"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".split-view-view:first-child .pane-header"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"display: none !important;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".monaco-list-row"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"border-radius: 4px;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;".monaco-workbench .monaco-list:not(.element-focused):focus:before"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"display: none;"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apc.listRow"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explorer.fileNesting.enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"explorer.fileNesting.patterns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"*.ts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${capture}.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"*.js"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${capture}.js.map, ${capture}.min.js, ${capture}.d.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"*.jsx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${capture}.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"*.tsx"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${capture}.ts"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"tsconfig.json"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tsconfig.*.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"package.json"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.fontFamily"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JetBrainsMono Nerd Font"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"window.density.editorTabHeight"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"compact"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🎲- MISCELLANEOUS IMPROVEMENTS
&lt;/h1&gt;

&lt;p&gt;To improve it further, go to each panel you don't like, right-click and select "Hidden"&lt;/p&gt;

&lt;p&gt;Do this with "Overview" in Explorer, for example, with "Problems" in the terminal, "Timeline", etc...&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.amazonaws.com%2Fuploads%2Farticles%2Fg6stpbnfrdsgsat98edj.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%2Fg6stpbnfrdsgsat98edj.png" alt=" " width="355" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  😺- VS CODE PETS
&lt;/h1&gt;

&lt;p&gt;She adds PETS THAT STAY WITH YOU! There are several different animals, you can change the litter, play with them, play ball, EVERYTHING!!!&lt;/p&gt;

&lt;p&gt;BEST EXTENSION EVER!&lt;br&gt;
Leaves the aesthetics AMAZING!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://t.co/9iTa751pkA" rel="noopener noreferrer"&gt;vscode-pets&lt;/a&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.amazonaws.com%2Fuploads%2Farticles%2Fcwfzds6vxaj01mswejly.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%2Fcwfzds6vxaj01mswejly.png" alt=" " width="261" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🖥️- NOW IN TERMINALLLL
&lt;/h1&gt;

&lt;p&gt;Here, I will style the WINDOWS terminal based on &lt;a href="https://youtu.be/-G6GbXGo4wo" rel="noopener noreferrer"&gt;this video&lt;/a&gt;&lt;br&gt;
, SORRY TO THOSE WHO USE MAC/LINUX MY BAD&lt;/p&gt;

&lt;p&gt;If you want to watch his video, I highly recommend it! VERY good video!&lt;/p&gt;

&lt;h1&gt;
  
  
  🎨- TERMINAL COLOR PALETTE
&lt;/h1&gt;

&lt;p&gt;To see a theme, just choose one you like in the &lt;a href="https://windowsterminalthemes.dev" rel="noopener noreferrer"&gt;Windows Terminal Theme&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my case, I'm using the "JetBrains Dracula" theme, but when the terminal is inside VS Code, it won't make a difference lol&lt;/p&gt;

&lt;h3&gt;
  
  
  INSTRUCTIONS:
&lt;/h3&gt;

&lt;p&gt;When you find the theme you like on the website, click the "Get Theme" button, which will copy the theme&lt;/p&gt;

&lt;p&gt;In the terminal, click on the arrow -&amp;gt; settings -&amp;gt; Open JSON file (last option) and look for the value "schemes"&lt;/p&gt;

&lt;p&gt;Then, just paste the theme you had copied at the end of the Array and select it from the options! ENJOY!&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.amazonaws.com%2Fuploads%2Farticles%2F3fnt3xx45ir9kcrw8n4b.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%2F3fnt3xx45ir9kcrw8n4b.png" alt=" " width="373" height="66"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🅰️- NERD FONTSSS
&lt;/h1&gt;

&lt;p&gt;A "Nerd Font" is a font that contains dev symbols, such as the node symbol, etc... which REALLY improves the aesthetics of the terminal&lt;/p&gt;

&lt;p&gt;For the terminal font, I will be using the FiraCode Nerd Font, but you can find several others &lt;a href="https://github.com/ryanoasis/nerd-fonts/" rel="noopener noreferrer"&gt;here&lt;/a&gt;!&lt;br&gt;
(If you want, you can even use the JetBrains Mono that is already installed!)&lt;/p&gt;

&lt;p&gt;To install the font, search for it on github, download and install the font by right click + install on all of them&lt;/p&gt;

&lt;p&gt;Then, just go to the terminal and press the arrow -&amp;gt; settings -&amp;gt; Default -&amp;gt; Appearance and select the font you installed!&lt;/p&gt;

&lt;p&gt;Just restart the terminal and be happy!&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.amazonaws.com%2Fuploads%2Farticles%2Frynzasmo1sbswvzamrn4.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%2Frynzasmo1sbswvzamrn4.png" alt=" " width="680" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🎆- TERMINAL THEMES (GOOD PART)
&lt;/h1&gt;

&lt;p&gt;To put those themes in the terminal, we'll use &lt;a href="https://ohmyposh.dev" rel="noopener noreferrer"&gt;Oh-My-Posh&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;The instructions for doing everything are a little more extensive, but just read the documentation and you'll get the hang of it! Anyway, it's a shame to see the config video I posted!&lt;/p&gt;

&lt;p&gt;It offers VARIOUS themes for your terminal! What I'm using is a simple one, called "neko", just install it and run for the hug&lt;/p&gt;

&lt;p&gt;Make sure WinGet is installed first, otherwise just install the "App Installer" by searching for "WinGet" in the Microsoft Store&lt;/p&gt;

&lt;p&gt;If you have any problems with initializing the theme configuration file, a post that helped me &lt;a href="https://t.co/U2R1C3kaMa" rel="noopener noreferrer"&gt;was this one&lt;/a&gt;, on StackOverflow!&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.amazonaws.com%2Fuploads%2Farticles%2F47y0te5kah778f7ulhyi.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%2F47y0te5kah778f7ulhyi.png" alt=" " width="385" height="51"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🎲- OTHER SETTINGS
&lt;/h1&gt;

&lt;p&gt;To improve the terminal a little more, you can make some general settings in the arrow -&amp;gt; Settings -&amp;gt; Appearance&lt;/p&gt;

&lt;p&gt;Then, you can put a background image (Default-&amp;gt;Appearance), make the navigation bar transparent (acrylic mode), put a clear theme, among MANY other things&lt;/p&gt;

&lt;p&gt;Then it's up to you to explore!&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.amazonaws.com%2Fuploads%2Farticles%2Fvwvrb921g6vf4058omhb.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%2Fvwvrb921g6vf4058omhb.png" alt=" " width="679" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  😄- THANK YOU!
&lt;/h1&gt;

&lt;p&gt;That was Thread, I hope you liked it and found it a good customization for your VS Code!&lt;/p&gt;

&lt;p&gt;If you have any questions, just DM me on Twitter! I'm always available!&lt;/p&gt;

&lt;p&gt;My socials:&lt;br&gt;
&lt;a href="https://twitter.com/luciano655dev" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/luciano655dev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My projects:&lt;br&gt;
&lt;a href="https://github.com/Luciano655dev/DayKeeper" rel="noopener noreferrer"&gt;DayKeeper&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/Luciano655dev/better-format" rel="noopener noreferrer"&gt;better-format&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;

</description>
      <category>customize</category>
      <category>vscode</category>
      <category>terminal</category>
      <category>windows</category>
    </item>
  </channel>
</rss>
