<?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: Georgel</title>
    <description>The latest articles on DEV Community by Georgel (@georgel3d17288).</description>
    <link>https://dev.to/georgel3d17288</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%2F3675730%2F22ec1558-fddd-46b5-bf19-0231c5611f9d.jpg</url>
      <title>DEV Community: Georgel</title>
      <link>https://dev.to/georgel3d17288</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/georgel3d17288"/>
    <language>en</language>
    <item>
      <title>The 403 Error That Was Quietly Hiding In Plain Sight</title>
      <dc:creator>Georgel</dc:creator>
      <pubDate>Tue, 21 Jul 2026 13:45:45 +0000</pubDate>
      <link>https://dev.to/georgel3d17288/the-403-error-that-was-quietly-hiding-in-plain-sight-3b4j</link>
      <guid>https://dev.to/georgel3d17288/the-403-error-that-was-quietly-hiding-in-plain-sight-3b4j</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Smash Stories&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;Five months ago I shipped a feature I was genuinely proud of: anonymous auth for ReCode, so people could get persistent history and cross-device sync without ever creating an account. No signup friction, no passwords, just show up and your work is there next time. It worked. It kept working, quietly, for months.&lt;/p&gt;

&lt;p&gt;Then one day I noticed something small and strange: my Firebase Auth console had &lt;strong&gt;694 anonymous users&lt;/strong&gt;. For an app with a handful of real daily sessions. That's not a rounding error — that's a ghost town of accounts nobody ever used, and somewhere in there, mine kept multiplying too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Fix (That Wasn't)
&lt;/h2&gt;

&lt;p&gt;The symptom was simple to describe and infuriating to pin down: after being idle for a while — tab closed, laptop asleep overnight — reopening the app sometimes handed me a &lt;em&gt;brand new&lt;/em&gt; identity. Not an error. Not a crash. Just... a different UID than the one I'd been using an hour before, with all my saved history sitting orphaned under the old one.&lt;/p&gt;

&lt;p&gt;My IndexedDB drafts never budged, not once in months — which was the first real clue. Whatever was breaking wasn't storage getting wiped. It was &lt;em&gt;identity&lt;/em&gt; quietly splitting.&lt;/p&gt;

&lt;p&gt;I found bug #1 fast: my &lt;code&gt;initializeAuth()&lt;/code&gt; function registered a new &lt;code&gt;onAuthStateChanged&lt;/code&gt; listener every time it was called, and never unsubscribed. If it got called twice before the first anonymous sign-in resolved — which happened routinely between app mount and my API client's lazy fallback — both listeners could see &lt;code&gt;user: null&lt;/code&gt; and both fire their own &lt;code&gt;signInAnonymously()&lt;/code&gt;. Two calls, two accounts, from one visit. Textbook race condition.&lt;/p&gt;

&lt;p&gt;I fixed it: cache the in-flight promise so every caller shares one attempt, unsubscribe immediately so a listener can never double-fire. Deployed it. Watched the Firebase console. Felt very good about myself for about an hour.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going Back to Basics
&lt;/h2&gt;

&lt;p&gt;Then it happened again. Same day. Both dev &lt;em&gt;and&lt;/em&gt; production got fresh, uninvited users — after the fix was confirmed live.&lt;/p&gt;

&lt;p&gt;That's the moment a bug stops being annoying and starts being interesting. I made myself rule things out one at a time instead of guessing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not React Strict Mode double-invoking effects — it happened in production too, where Strict Mode doesn't run.&lt;/li&gt;
&lt;li&gt;Not Vercel serving a different preview domain — checked the exact URL each time.&lt;/li&gt;
&lt;li&gt;Not a dev server port mismatch silently changing my browser origin.&lt;/li&gt;
&lt;li&gt;Not incognito, not a cookie-autodelete extension, not a Chrome privacy setting (I actually went and found the exact toggle I suspected — it only handles permission revocation, not storage).&lt;/li&gt;
&lt;li&gt;Not Firebase's own anonymous-account cleanup — that setting wasn't even switched on in my project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every single lead was a dead end. Which meant the real cause was somewhere I hadn't looked yet — and the only way to find it was to stop theorizing and start logging.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Reveal
&lt;/h2&gt;

&lt;p&gt;I ripped out the bare &lt;code&gt;catch {}&lt;/code&gt; blocks that had been quietly swallowing the real error this whole time, and logged everything: every &lt;code&gt;onAuthStateChanged&lt;/code&gt; transition, every &lt;code&gt;signInAnonymously&lt;/code&gt; failure code, with timestamps.&lt;/p&gt;

&lt;p&gt;Then I waited for it to happen again.&lt;/p&gt;

&lt;p&gt;When it did, the console handed me the answer in one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Failed to load resource: the server responded with a status of 403 ()
securetoken.googleapis.com
[authState] null — no user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;securetoken.googleapis.com&lt;/code&gt;. Token Service. Not sign-in — &lt;em&gt;refresh&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I went and checked my Firebase browser API key's restrictions in Google Cloud Console. Months earlier, doing the responsible thing, I'd locked it down to only the APIs I thought my app actually used: Cloud Firestore, Identity Toolkit, Gemini. Reasonable. Except Firebase's SDK refreshes your session by calling Token Service &lt;em&gt;on your behalf&lt;/em&gt;, silently, in the background — a dependency that never appears anywhere in my own code, so I never thought to allow it.&lt;/p&gt;

&lt;p&gt;Every session worked fine right up until the SDK actually needed to refresh it. Then: 403. Silently rejected. &lt;code&gt;onAuthStateChanged&lt;/code&gt; reports no user. My own code — reasonably, given what it could see — decides nobody's signed in and mints a fresh identity. Rinse, repeat, every single morning, for five months.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;Two lines of actual insight, in the end:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The code fix&lt;/strong&gt; — cache the auth promise, unsubscribe properly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;+ let authReadyPromise = null;
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;  export const initializeAuth = () =&amp;gt; {
&lt;span class="gi"&gt;+   if (authReadyPromise) return authReadyPromise;
+   authReadyPromise = new Promise((resolve, reject) =&amp;gt; {
&lt;/span&gt;&lt;span class="gd"&gt;-   return new Promise((resolve, reject) =&amp;gt; {
-     onAuthStateChanged(auth, (user) =&amp;gt; {
&lt;/span&gt;&lt;span class="gi"&gt;+     const unsubscribe = onAuthStateChanged(auth, (user) =&amp;gt; {
+       unsubscribe();
&lt;/span&gt;        if (user) resolve(user);
        else {
          signInAnonymously(auth)
            .then(({ user }) =&amp;gt; resolve(user))
&lt;span class="gd"&gt;-           .catch(reject);
&lt;/span&gt;&lt;span class="gi"&gt;+           .catch((error) =&amp;gt; { authReadyPromise = null; reject(error); });
&lt;/span&gt;        }
      });
    });
&lt;span class="gi"&gt;+   return authReadyPromise;
&lt;/span&gt;  };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The actual root cause&lt;/strong&gt; — no code at all. Just adding &lt;strong&gt;Token Service API&lt;/strong&gt; to my key's allowed list, right next to Firestore and Identity Toolkit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cleanup
&lt;/h2&gt;

&lt;p&gt;Fixing the leak doesn't un-orphan the 694 accounts it already left behind. I wrote a small Admin SDK script to page through every user in batches of 1000, filter down to the anonymous ones, and bulk-delete everything except the two UIDs I actually use — clearing five months of accidental sprawl in one run instead of clicking through 14 pages of a console table by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The bug that actually mattered here was never in my JavaScript. It was in a security decision I was proud of — locking down an API key to "only what my app calls" — that quietly broke a dependency I never knew existed, because I never call it directly. Firebase does.&lt;/p&gt;

&lt;p&gt;The bigger lesson: when something breaks intermittently and every obvious cause checks out clean, that's not a sign to guess harder. It's a sign to stop guessing and start logging the thing you assumed couldn't be the problem. The 403 had been sitting right there in the network tab the entire five months. I just hadn't been watching for it.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
    </item>
    <item>
      <title>The 403 That Was Quietly Cloning My Users Every Morning</title>
      <dc:creator>Georgel</dc:creator>
      <pubDate>Tue, 21 Jul 2026 13:41:54 +0000</pubDate>
      <link>https://dev.to/georgel3d17288/the-403-that-was-quietly-cloning-my-users-every-morning-1ckf</link>
      <guid>https://dev.to/georgel3d17288/the-403-that-was-quietly-cloning-my-users-every-morning-1ckf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/bugsmash"&gt;DEV's Summer Bug Smash: Clear the Lineup&lt;/a&gt; powered by &lt;a href="https://sentry.io/" rel="noopener noreferrer"&gt;Sentry&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Overview
&lt;/h2&gt;

&lt;p&gt;ReCode is a web-based AI code tool — conversion, analysis, and SQL/language transforms — built so people can just show up and use it without creating an account first. Under the hood, every visitor is authenticated anonymously through Firebase so their run history, per-tool drafts, and settings persist across sessions, and there's a 6-character code-based sync flow so someone can pick up an in-progress session on a second device.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bug Fix or Performance Improvement
&lt;/h2&gt;

&lt;p&gt;For about 5 months — since I first shipped the anonymous-auth and sync feature — the app had a bug that never threw a visible error, never showed up in any log I was watching, and quietly fragmented users' identities anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; after leaving the app idle for a while (closing the tab, stepping away, letting a laptop sleep overnight), reopening it would sometimes show a &lt;em&gt;brand new&lt;/em&gt; anonymous user. The old saved history was still sitting in Firestore — just unreachable, because the currently signed-in UID had silently changed underneath it. Local IndexedDB drafts, which don't key off the user at all, were always intact, which is actually what pointed me toward "this is an identity problem, not a storage problem."&lt;/p&gt;

&lt;p&gt;By the time I went looking, my Firebase Auth console had &lt;strong&gt;694 anonymous user accounts&lt;/strong&gt; for an app with a tiny handful of real daily sessions.&lt;/p&gt;

&lt;p&gt;There turned out to be two separate bugs stacked on top of each other:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A race condition in the client-side auth bootstrap.&lt;/strong&gt; &lt;code&gt;initializeAuth()&lt;/code&gt; registered a fresh &lt;code&gt;onAuthStateChanged&lt;/code&gt; listener on every call and never unsubscribed. If it was called more than once before the first anonymous sign-in resolved — which happened routinely, since it's invoked both on app mount and lazily by the API client — each firing that still saw &lt;code&gt;user === null&lt;/code&gt; kicked off its &lt;em&gt;own&lt;/em&gt; &lt;code&gt;signInAnonymously()&lt;/code&gt;. Two calls in quick succession meant two brand-new Firebase accounts, from a single visit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A misconfigured GCP API key restriction.&lt;/strong&gt; The bigger one. My Firebase browser API key had its allowed APIs deliberately locked down (good security practice) to Cloud Firestore, Identity Toolkit, and Gemini — but not &lt;strong&gt;Token Service API&lt;/strong&gt;. Identity Toolkit covers sign-in itself, but &lt;em&gt;refreshing&lt;/em&gt; an existing session is a separate call to &lt;code&gt;securetoken.googleapis.com&lt;/code&gt;, and it was getting rejected with a flat &lt;code&gt;403&lt;/code&gt; every time. The cached session worked fine short-term, but the moment the SDK actually needed to refresh it — exactly the "came back after being idle" case — the refresh silently failed, &lt;code&gt;onAuthStateChanged&lt;/code&gt; reported no user, and my own code (reasonably, given what it could see) treated that as "nobody's signed in" and minted a fresh anonymous account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;PR / commit: &lt;code&gt;https://github.com/Georgel0/ReCode/commit/69511539d07793956c37abb57e9e49513ba98911&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The race-condition fix, in &lt;code&gt;lib/firebase/client.js&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight diff"&gt;&lt;code&gt;&lt;span class="gi"&gt;+ let authReadyPromise = null;
&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;  export const initializeAuth = () =&amp;gt; {
&lt;span class="gi"&gt;+   if (authReadyPromise) return authReadyPromise;
+
+   authReadyPromise = new Promise((resolve, reject) =&amp;gt; {
&lt;/span&gt;&lt;span class="gd"&gt;-   return new Promise((resolve, reject) =&amp;gt; {
-     onAuthStateChanged(auth, (user) =&amp;gt; {
&lt;/span&gt;&lt;span class="gi"&gt;+     const unsubscribe = onAuthStateChanged(auth, (user) =&amp;gt; {
+       unsubscribe(); // only ever resolve once per attempt
&lt;/span&gt;        if (user) {
          resolve(user);
        } else {
          signInAnonymously(auth)
            .then(({ user }) =&amp;gt; resolve(user))
&lt;span class="gd"&gt;-           .catch((error) =&amp;gt; {
-             console.error("Auth Error:", error);
-             reject(error);
-           });
&lt;/span&gt;&lt;span class="gi"&gt;+           .catch((error) =&amp;gt; {
+             console.error("Auth Error:", error);
+             authReadyPromise = null; // allow a retry on next call
+             reject(error);
+           });
&lt;/span&gt;        }
      });
    });
&lt;span class="gi"&gt;+   return authReadyPromise;
&lt;/span&gt;  };
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API-key fix wasn't a code change at all — it was adding &lt;strong&gt;Token Service API&lt;/strong&gt; to the key's allowed API list, in Google Cloud Console → Credentials → API restrictions, alongside Firestore and Identity Toolkit.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Improvements
&lt;/h2&gt;

&lt;p&gt;Because the symptom was intermittent and two separate bugs were compounding, I worked through it by ruling out causes one at a time rather than guessing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confirmed it wasn't React Strict Mode double-invoking effects in dev, since it reproduced in production too, where Strict Mode doesn't apply.&lt;/li&gt;
&lt;li&gt;Confirmed it wasn't Vercel's multiple preview/production domains, by checking the exact URL each time it happened.&lt;/li&gt;
&lt;li&gt;Confirmed it wasn't a dev-server port mismatch (Next.js silently bumping ports changes the browser origin, and therefore the IndexedDB scope).&lt;/li&gt;
&lt;li&gt;Confirmed it wasn't a browser privacy setting, a cookie-autodelete extension, or an incognito session.&lt;/li&gt;
&lt;li&gt;Confirmed it wasn't Firebase's own anonymous-account auto-cleanup — that setting wasn't even enabled on the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once I logged every &lt;code&gt;onAuthStateChanged&lt;/code&gt; transition and every &lt;code&gt;signInAnonymously&lt;/code&gt; error code instead of swallowing them in a bare &lt;code&gt;catch {}&lt;/code&gt;, the real cause showed up immediately in the network tab: a &lt;code&gt;403&lt;/code&gt; from &lt;code&gt;securetoken.googleapis.com&lt;/code&gt;. That's what led me to the API key restriction.&lt;/p&gt;

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

&lt;p&gt;Fixing the root cause stops new orphans from being created, but it doesn't clean up the ones already there — so I also wrote a small Admin SDK script to bulk-delete the ~694 anonymous accounts that had piled up over 5 months, in batches of 1000 via &lt;code&gt;listUsers&lt;/code&gt;/&lt;code&gt;deleteUsers&lt;/code&gt;, explicitly excluding the UIDs I'm actively using.&lt;/p&gt;

&lt;p&gt;The interesting lesson: locking an API key down to "only what the app calls" is good practice, but Firebase SDKs make calls on your behalf that never appear anywhere in your own code — token refresh being the obvious one in hindsight, invisible until you actually watch the network tab for long enough to see a session go stale.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>bugsmash</category>
    </item>
    <item>
      <title>600 Commits Later: I Built an AI Developer Workbench, but Do Someone Actually Need This?</title>
      <dc:creator>Georgel</dc:creator>
      <pubDate>Thu, 02 Jul 2026 17:21:10 +0000</pubDate>
      <link>https://dev.to/georgel3d17288/600-commits-later-i-built-an-ai-developer-workbench-but-do-someone-actually-need-this-4je2</link>
      <guid>https://dev.to/georgel3d17288/600-commits-later-i-built-an-ai-developer-workbench-but-do-someone-actually-need-this-4je2</guid>
      <description>&lt;p&gt;For the last 6 months, I’ve been head-down building a project called ReCode.&lt;/p&gt;

&lt;p&gt;But when you build in a silo for half a year, it’s easy to get tunnel vision. I am at a crossroads where I need to step back and ask the community for a brutal reality check.&lt;/p&gt;

&lt;p&gt;What is ReCode?&lt;br&gt;
At its core, ReCode is a development ecosystem and AI workbench. My goal was to create a hybrid platform—bridging a SaaS dashboard with a self-hosted, "Bring Your Own Model" setup for developers and teams who cannot legally (or safely) paste proprietary code into public AI endpoints.&lt;/p&gt;

&lt;p&gt;Instead of building another generic chat interface(which im really trying NOT to), I focused doing the basic boring tasks and the problem of forgetful AI web tabs interfaces. Of course there are things like Cursor and Claude Code, but i dont use them.&lt;/p&gt;

&lt;p&gt;Here is what the engine actually handles right now:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Enterprise Mock Data Factory&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Generating realistic, interconnected mock data is usually a massive headache. ReCode parses your SQL DDL, Prisma schema, or TypeScript interfaces and generates production-ready, relational mock data. It automatically maps foreign keys to primary keys across multiple tables and applies chronological/mathematical behavioral rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AI Code Analysis &amp;amp; Security Auditor&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;It runs a full-spectrum health report covering:&lt;/p&gt;

&lt;p&gt;Security Audits, Complexity, Architecture Review and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Universal Translation &amp;amp; Refactoring&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Migrating logic across languages (e.g., Python to TypeScript, C++ to Rust).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;The Reality Check I Need From You&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tooling market right now is heavily dominated by inline IDE AI (Cursor, Windsurf, GitHub Copilot). I know that developers hate breaking their flow to open a browser tab.&lt;/p&gt;

&lt;p&gt;So, here is the question I am wrestling with before I write another line of code:&lt;/p&gt;

&lt;p&gt;Does a dedicated, privacy-focused workbench solve a friction point you actually hit in your daily workflow? Or is having an AI chat tab right inside your IDE genuinely enough for you?&lt;/p&gt;

&lt;p&gt;Would you use a standalone tool for heavy-lifting tasks like generating relational database seeds or running a deep architectural audit?&lt;/p&gt;

&lt;p&gt;Would local-model self-hosting actually get you to use this, or is that still not enough?&lt;/p&gt;

&lt;p&gt;I’m looking for cold, honest feedback. If I need to pivot this into an IDE extension, or if I should double down on the self-hosted privacy angle, I want to hear it.&lt;/p&gt;

&lt;p&gt;Tear it apart in the comments. Thanks for your time!&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>discuss</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>ReCode: The AI-Powered Workspace for Web Development</title>
      <dc:creator>Georgel</dc:creator>
      <pubDate>Fri, 26 Dec 2025 14:45:35 +0000</pubDate>
      <link>https://dev.to/georgel3d17288/recode-the-ai-powered-workspace-for-web-development-1dac</link>
      <guid>https://dev.to/georgel3d17288/recode-the-ai-powered-workspace-for-web-development-1dac</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/mux-2025-12-03"&gt;DEV's Worldwide Show and Tell Challenge Presented by Mux&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ReCode&lt;/strong&gt; is an AI-powered productivity hub designed specifically for web developers or any other person interested. It solves the "tab-overload" and "overwhelmed" problems by centralizing essential development tools into one organized interface, helping developers stay focused and write better code faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Pitch Video
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://stream.mux.com/gTlyythoN01D5QLRReHSOFTjttP7wVo3W7JJGBvQFztQ" rel="noopener noreferrer"&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%2Fpv1gz9ecgaz0xaj5lw3k.gif" alt="Watch Video"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🎥 &lt;strong&gt;Click here to watch the video on Mux&lt;/strong&gt;

&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://stream.mux.com/gTlyythoN01D5QLRReHSOFTjttP7wVo3W7JJGBvQFztQ" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;stream.mux.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://recode-alpha.vercel.app/" rel="noopener noreferrer"&gt;recode-alpha.vercel.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repo:&lt;/strong&gt; &lt;a href="https://github.com/Georgel0/ReCode" rel="noopener noreferrer"&gt;Georgel0/ReCode&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Tools:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Code Generator:
&lt;/h3&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%2Fmbg2k2wheabfni7pkug3.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%2Fmbg2k2wheabfni7pkug3.png" alt="Code Generator"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's basic AI generated code but stripped of all comments, explanation and other things AI might output.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Code Convertor:
&lt;/h3&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%2Fhn7mvokh6oxbv5e4newq.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%2Fhn7mvokh6oxbv5e4newq.png" alt="Code Convertor"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;There are 11 coding languages you can choose to convert between.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI Analysis:
&lt;/h3&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%2Fik7l3w2bqc0k9jt66gm4.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%2Fik7l3w2bqc0k9jt66gm4.png" alt="AI Analysis"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Here the AI can explain to you what a piece of code dose, can help you if you didn't catch something.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CSS Frameworks Convertor
&lt;/h3&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%2Fehkv659zawde4xgk13fb.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%2Fehkv659zawde4xgk13fb.png" alt="CSS Frameworks"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can choose between Tailwind, Bootstrap, SASS and LESS to convert your CSS to something you prefere more.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ReCode has more tools but it's up to you to explore and use them!
&lt;/h3&gt;




&lt;h2&gt;
  
  
  The Story Behind It
&lt;/h2&gt;

&lt;p&gt;As a beginner in web development, I often found myself overwhelmed. I would have dozens of tabs open—documentation, Stack Overflow, AI chats, and tutorials—leading to unorganized code, feeling overwhelmed and a fragmented workflow. &lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;ReCode&lt;/strong&gt; to be the "all-in-one" assistant I wish I had when I started. By bringing these tools together, ReCode helps developers transition from being "scattered" to being "structured."&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Highlights
&lt;/h2&gt;

&lt;p&gt;To ensure the app was fast, scalable, and modern, I chose a powerful tech stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React + Vite for a lightning-fast user interface and modular component architecture.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Node.js for efficient server-side logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database &amp;amp; Auth:&lt;/strong&gt; Firebase for real-time data handling and secure user authentication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Engine:&lt;/strong&gt; Grok API to power the intelligent coding assistance features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Video Hosting:&lt;/strong&gt; Powered by &lt;strong&gt;Mux&lt;/strong&gt;, ensuring high-quality, seamless video delivery for the platform's demo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I designed the architecture to be highly modular, making it easy to implement new features and maintainable for future growth.&lt;/p&gt;




&lt;h3&gt;
  
  
  About the Developer
&lt;/h3&gt;

&lt;p&gt;I am a solo developer on a mission to make ReCode the ultimate tool for developers at all levels—from beginners taking their first steps to pros looking for a more streamlined workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ready to improve your workspace?
&lt;/h2&gt;

</description>
      <category>devchallenge</category>
      <category>muxchallenge</category>
      <category>showandtell</category>
      <category>video</category>
    </item>
    <item>
      <title>Stop Letting Your "Useless" Side Projects Die on Your Hard Drive 📦</title>
      <dc:creator>Georgel</dc:creator>
      <pubDate>Thu, 25 Dec 2025 14:34:14 +0000</pubDate>
      <link>https://dev.to/georgel3d17288/stop-letting-your-useless-side-projects-die-on-your-hard-drive-5d1g</link>
      <guid>https://dev.to/georgel3d17288/stop-letting-your-useless-side-projects-die-on-your-hard-drive-5d1g</guid>
      <description>&lt;p&gt;&lt;strong&gt;Why I built The Digital Junk Drawer and why I want your tiny apps to live there.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’ve all been there.&lt;br&gt;
You have a weird idea for a mini-game, a niche calculator, or a CSS experiment. You spend four hours coding it, you get it working, you smile at the screen... and then you close the editor.&lt;br&gt;
That project never sees the light of day because it feels "too small" for a dedicated repository or a full domain.&lt;br&gt;
I decided to change that.&lt;/p&gt;

&lt;p&gt;Introducing: &lt;strong&gt;The Digital Junk Drawer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Digital Junk Drawer is a curated, community-driven collection of micro-web apps, classic games, and digital oddities, literally anything. Some are helpful, some are time-wasters, and all are built out of pure curiosity.&lt;/p&gt;

&lt;p&gt;Why go Open Source?&lt;br&gt;
I realized that my "junk drawer" of code isn't unique. Thousands of developers have these "digital dust-collectors" sitting in their &lt;em&gt;/projects&lt;/em&gt; folder.&lt;br&gt;
I wanted to create a place where we can all toss our tiny experiments into one big, interactive pile. By turning this into an open-source project, I'm hoping to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provide a home for projects that don't "fit" anywhere else.&lt;br&gt;
Help beginners get their first-ever Pull Request merged in a friendly, low-pressure environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build a nostalgic gallery of what web devs can do with just a bit of HTML, CSS, and JS.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How You Can Contribute&lt;/strong&gt; (It’s easy!)&lt;br&gt;
I’ve streamlined the process so you don't have to spend hours setting up a dev environment.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fork the repo.&lt;/li&gt;
&lt;li&gt;Drop your HTML (keep CSS/JS internal for simplicity) into the /HTMLs folder.&lt;/li&gt;
&lt;li&gt;Add a thumbnail to /Images.
Link it in the index.html.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it. Submit a PR, and your app is suddenly part of a global collection hosted on Vercel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Goal&lt;/strong&gt;&lt;br&gt;
I want this to become the internet’s most interesting drawer. I want people to click around and find things they didn't know they needed (or definitely didn't need, but enjoyed anyway).&lt;/p&gt;

&lt;p&gt;Check out the live site: &lt;a href="https://the-digital-junk-drawer.vercel.app/" rel="noopener noreferrer"&gt;https://the-digital-junk-drawer.vercel.app/&lt;/a&gt;&lt;br&gt;
Contribute on GitHub: &lt;a href="https://github.com/Georgel0/The-Digital-Junk-Drawer-" rel="noopener noreferrer"&gt;https://github.com/Georgel0/The-Digital-Junk-Drawer-&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What's sitting in your /projects folder right now that deserves a spot in the drawer? Let me know in the comments!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
