<?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: geekecia</title>
    <description>The latest articles on DEV Community by geekecia (@geekecia).</description>
    <link>https://dev.to/geekecia</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%2F4183293%2F3260e770-98e5-4521-8ab8-2aff478905e9.png</url>
      <title>DEV Community: geekecia</title>
      <link>https://dev.to/geekecia</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/geekecia"/>
    <language>en</language>
    <item>
      <title>Show Dev: SwiftPoker - Real-Time Planning Poker with Zero Friction &amp; No Signups</title>
      <dc:creator>geekecia</dc:creator>
      <pubDate>Wed, 14 Oct 2026 12:00:00 +0000</pubDate>
      <link>https://dev.to/geekecia/show-dev-swiftpoker-real-time-planning-poker-with-zero-friction-no-signups-3hm7</link>
      <guid>https://dev.to/geekecia/show-dev-swiftpoker-real-time-planning-poker-with-zero-friction-no-signups-3hm7</guid>
      <description>&lt;h2&gt;
  
  
  Why another Planning Poker tool?
&lt;/h2&gt;

&lt;p&gt;Sprint estimations should be quick, dynamic, and focused on requirements—not on managing passwords or waiting for everyone to create an account on a third-party website.&lt;/p&gt;

&lt;p&gt;That's why I created &lt;strong&gt;SwiftPoker&lt;/strong&gt; (&lt;a href="https://www.swiftpoker.pro" rel="noopener noreferrer"&gt;https://www.swiftpoker.pro&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  What makes it different:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Instant Access for Developers:&lt;/strong&gt; Team members join directly using a room link or QR code with zero signup required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Architecture:&lt;/strong&gt; Real-time synchronization keeps cards, timers, and stories perfectly in sync across desktop and mobile browsers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible Agile Metrics:&lt;/strong&gt; Fibonacci, Hours, T-Shirt sizes, and MoSCoW prioritization.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Analytics:&lt;/strong&gt; Immediate calculation of average, mode, and consensus rate right after reveal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installable PWA:&lt;/strong&gt; Works seamlessly on mobile and desktop without app store installs.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Built with:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 16 (App Router)&lt;/li&gt;
&lt;li&gt;React 19 &amp;amp; TypeScript&lt;/li&gt;
&lt;li&gt;Tailwind CSS&lt;/li&gt;
&lt;li&gt;Real-time Engine&lt;/li&gt;
&lt;li&gt;Progressive Web App (PWA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check it out live: &lt;a href="https://www.swiftpoker.pro" rel="noopener noreferrer"&gt;https://www.swiftpoker.pro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts, feedback, and what agile features you'd like to see next!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>agile</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building a Zero-Friction, Real-Time Planning Poker App with Next.js and WebSockets</title>
      <dc:creator>geekecia</dc:creator>
      <pubDate>Wed, 14 Oct 2026 10:07:28 +0000</pubDate>
      <link>https://dev.to/geekecia/building-a-zero-friction-real-time-planning-poker-app-with-nextjs-and-websockets-2a0k</link>
      <guid>https://dev.to/geekecia/building-a-zero-friction-real-time-planning-poker-app-with-nextjs-and-websockets-2a0k</guid>
      <description>&lt;p&gt;Every sprint refinement meeting seems to face the same unnecessary friction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Wait, which planning poker tool are we using today?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"I forgot my password, let me reset it..."&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Can you invite me to the organization first?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Wait, my screen hasn't updated yet—did everyone vote?"&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After watching our engineering team lose 10-15 minutes of productive discussion every single week just getting everyone into the same voting room, I decided to build &lt;strong&gt;&lt;a href="https://www.swiftpoker.pro" rel="noopener noreferrer"&gt;SwiftPoker&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our core design principle was simple: &lt;strong&gt;Zero friction, sub-100ms real-time sync, and no mandatory logins for voters.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is a breakdown of how we architected the system using &lt;strong&gt;Next.js (App Router)&lt;/strong&gt; and &lt;strong&gt;WebSockets&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Real-Time Problem: WebSockets over HTTP Polling
&lt;/h2&gt;

&lt;p&gt;In a live planning session, instant feedback is everything. When the facilitator clicks &lt;em&gt;"Reveal Cards"&lt;/em&gt;, every participant's screen must flip in unison.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not polling?
&lt;/h3&gt;

&lt;p&gt;Polling at 500ms intervals generates unnecessary HTTP overhead and creates a noticeable, clunky lag when voters are on mobile devices or slower connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  The WebSocket Solution
&lt;/h3&gt;

&lt;p&gt;We used Pusher Channels for real-time pub/sub. Each planning poker room operates on a dedicated channel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Client-side subscription inside room hook&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pusherClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`room-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;roomId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;player-voted&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="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;markPlayerVoted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reveal-votes&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="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RoundResults&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;flipCardsAndShowMetrics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&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;By decoupling state broadcast from page reloads, screen sync is instantaneous with imperceptible latency.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Preventing "Client-Side Cheating" with Blind Voting
&lt;/h2&gt;

&lt;p&gt;A critical aspect of planning poker is &lt;strong&gt;unbiased estimation&lt;/strong&gt;. If an engineer sees that the Tech Lead voted an &lt;code&gt;8&lt;/code&gt; or a &lt;code&gt;13&lt;/code&gt; before casting their own vote, an anchoring bias occurs.&lt;/p&gt;

&lt;p&gt;If we broadcasted the vote value over WebSockets immediately upon voting, any developer could open &lt;code&gt;DevTools &amp;gt; Network &amp;gt; WS&lt;/code&gt; and inspect incoming payloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  How we solved it:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;When a player selects a card, the client sends a &lt;code&gt;POST&lt;/code&gt; request to the backend with their encrypted/hashed vote.&lt;/li&gt;
&lt;li&gt;The WebSocket channel broadcasts a minimalist payload:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&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;"userId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"usr_abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"hasVoted"&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="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;ol&gt;
&lt;li&gt;The actual values remain secure on the server until the facilitator triggers the &lt;code&gt;reveal-votes&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;li&gt;Only upon reveal does the server compile the results, calculate metrics (consensus percentage, mode, average), and broadcast the full payload to all clients.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. Eliminating Layout Shift in Next.js
&lt;/h2&gt;

&lt;p&gt;Our landing page features an interactive room manager allowing users to either &lt;strong&gt;Create a Room&lt;/strong&gt; (with custom presets: Fibonacci, T-Shirt, Hours) or &lt;strong&gt;Join an Existing Room&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Initially, conditional unmounting in React caused slight Cumulative Layout Shift (CLS):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ Avoid: Causes layout flicker and height recalculations&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeTab&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CreateRoomForm&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;JoinRoomForm&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We refactored this to keep both views mounted, toggling visibility purely through CSS utility classes with synchronized element heights:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ Smooth: No DOM thrashing or height shifts&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeTab&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;create&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;block&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;hidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;CreateRoomForm&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activeTab&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;join&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;block&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;hidden&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;JoinRoomForm&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Zero Friction for the Team
&lt;/h2&gt;

&lt;p&gt;The most important product feature isn't code—it's UX empathy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No registration required for voters&lt;/strong&gt;: The room creator shares a link or displays a QR code.&lt;/li&gt;
&lt;li&gt;Teammates open the link on desktop or mobile, enter their name, and immediately see their voting deck.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spectator mode toggle&lt;/strong&gt;: Observers (Scrum Masters, Product Managers, or guests) can join without skewing the team's consensus statistics.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tech Stack Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend / Backend&lt;/strong&gt;: Next.js 14+ (App Router, Server Actions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling&lt;/strong&gt;: Tailwind CSS &amp;amp; Lucide Icons&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Engine&lt;/strong&gt;: WebSockets via Pusher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting&lt;/strong&gt;: Vercel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to test it with your agile team during your next refinement, it is live and free to use:&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://www.swiftpoker.pro" rel="noopener noreferrer"&gt;https://www.swiftpoker.pro&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I would love to hear feedback on the architecture and overall UX from fellow developers! What essential features does your team rely on during sprint planning?&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>Show Dev: Why I built a 100+ developer utilities suite that runs strictly in the browser</title>
      <dc:creator>geekecia</dc:creator>
      <pubDate>Wed, 14 Oct 2026 00:43:12 +0000</pubDate>
      <link>https://dev.to/geekecia/show-dev-why-i-built-a-100-developer-utilities-suite-that-runs-strictly-in-the-browser-5f8</link>
      <guid>https://dev.to/geekecia/show-dev-why-i-built-a-100-developer-utilities-suite-that-runs-strictly-in-the-browser-5f8</guid>
      <description>&lt;p&gt;We’ve all been there: you need to format a quick JSON with an API token, validate a test card for your checkout, or compare two code snippets. You Google it, click on a random portal, and immediately get hit with cookie banners, 10 flashing ads, and the uncomfortable feeling that your input is being logged by a remote server.&lt;/p&gt;

&lt;p&gt;To solve this for myself and the developer community, I built &lt;strong&gt;TipTools&lt;/strong&gt; (&lt;a href="https://tiptools.com.br" rel="noopener noreferrer"&gt;https://tiptools.com.br&lt;/a&gt;).&lt;/p&gt;




&lt;h3&gt;
  
  
  Why Client-Side Only?
&lt;/h3&gt;

&lt;p&gt;Most utility sites could be entirely static, yet they process your data on backend endpoints. On &lt;strong&gt;TipTools&lt;/strong&gt;, we made an architectural commitment:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Your data never leaves your machine:&lt;/strong&gt; Calculations, regex parsing, Luhn algorithms, and formatting run exclusively inside your browser via client-side JavaScript and native Web APIs (like Web Crypto).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant Performance:&lt;/strong&gt; Since there are zero server roundtrips, results render in the very millisecond you type or paste.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Command Palette (&lt;code&gt;Ctrl + K&lt;/code&gt; / &lt;code&gt;Cmd + K&lt;/code&gt;):&lt;/strong&gt; You don't have to navigate through endless menus. Just hit the shortcut and find what you need.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  What's included?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Data &amp;amp; Dev:&lt;/strong&gt; JSON Formatter &amp;amp; Minifier, SQL/HTML/XML/CSS formatters, Base64 encoder/decoder, JWT viewer, and Diff Checker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security &amp;amp; Testing:&lt;/strong&gt; Gateway sandbox test cards (Stripe, Cielo, Mercado Pago with approved/declined/3DS scenarios), Strong Password Generator, UUID v4/v7 generator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design &amp;amp; Media:&lt;/strong&gt; Color palette &amp;amp; HEX/RGB/HSL converter, QR Code Generator with SVG/PNG export, SVG optimizer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finance &amp;amp; Utils:&lt;/strong&gt; Currency converter, percentage calculators, and text cleaners.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework:&lt;/strong&gt; Next.js (fully static SSG export)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Styling:&lt;/strong&gt; Tailwind CSS with Dark/Light mode support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Icons:&lt;/strong&gt; Lucide React&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosting:&lt;/strong&gt; Vercel (Edge CDN)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check it out live: 👉 &lt;strong&gt;&lt;a href="https://tiptools.com.br" rel="noopener noreferrer"&gt;https://tiptools.com.br&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts: what utility is still missing that you find yourself searching for every week?&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
