<?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: Siba</title>
    <description>The latest articles on DEV Community by Siba (@flawsom).</description>
    <link>https://dev.to/flawsom</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%2F1124137%2F9d80b516-b230-4c58-a7a0-8773773d369f.png</url>
      <title>DEV Community: Siba</title>
      <link>https://dev.to/flawsom</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flawsom"/>
    <language>en</language>
    <item>
      <title>I built an OpenAI-compatible API on top of Gemini's web protocol. Here's the war.</title>
      <dc:creator>Siba</dc:creator>
      <pubDate>Sun, 09 Aug 2026 12:38:02 +0000</pubDate>
      <link>https://dev.to/flawsom/i-built-an-openai-compatible-api-on-top-of-geminis-web-protocol-heres-the-war-26b6</link>
      <guid>https://dev.to/flawsom/i-built-an-openai-compatible-api-on-top-of-geminis-web-protocol-heres-the-war-26b6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Gemini Web2API&lt;/strong&gt; — a self-hosted, OpenAI-compatible API server that talks to Google's Gemini &lt;strong&gt;web&lt;/strong&gt; interface instead of the paid API. Zero API keys, zero billing, running entirely on your own machine. It sounds like a weekend hack. It wasn't. This is the story of the 405 war, the stale-cookie problem, and why the whole thing now heals itself.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What's in the box: 8 Gemini models behind one OpenAI-compatible surface, 15 HTTP endpoints, SSE streaming, multimodal input, tool calling, an MV3 browser extension, a self-healing watchdog, and 515 tests across 16 suites.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Rhu2GKVBGng"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  The premise, and the problem nobody warns you about
&lt;/h2&gt;

&lt;p&gt;The official Gemini API is pay-per-token. The Gemini &lt;em&gt;web&lt;/em&gt; app is free — and it's just an HTTP endpoint. Bridge the two: accept OpenAI-style requests locally, translate them into Gemini's internal &lt;code&gt;StreamGenerate&lt;/code&gt; protocol, stream back token-by-token. Free Gemini, anywhere your code can make an HTTP call.&lt;/p&gt;

&lt;p&gt;The naive version works for about an hour. Then three things start breaking, in order of increasing obscurity:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;HTTP 405 Method Not Allowed&lt;/strong&gt; on &lt;em&gt;every&lt;/em&gt; request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP 400&lt;/strong&gt; from a token the server scraped itself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Silent degradation&lt;/strong&gt;: cookies expire, streams die mid-sentence, and nothing tells you why.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each one turned out to be a protocol war. Here's how each was won.&lt;/p&gt;




&lt;h2&gt;
  
  
  War 1: the 405s and the rotating build label
&lt;/h2&gt;

&lt;p&gt;The first sign of trouble is the one in the title — &lt;code&gt;405 Method Not Allowed&lt;/code&gt; from Google, on a POST that worked five minutes ago. Retry? Same 405. Restart the server? Same 405. It's not your code, your method, or your cookies.&lt;/p&gt;

&lt;p&gt;The culprit is Google's &lt;strong&gt;build label&lt;/strong&gt; (&lt;code&gt;BL&lt;/code&gt;): a string that changes whenever Google ships a new build of the Gemini web client — think &lt;code&gt;boq_assistant-bard-web-server_20260803.06_p0&lt;/code&gt;. Every StreamGenerate request must embed the &lt;em&gt;current&lt;/em&gt; BL, and when yours goes stale, Google answers 405. New builds deploy constantly, so a hardcoded BL is a time bomb with a fuse measured in hours.&lt;/p&gt;

&lt;p&gt;The first fix was to scrape the latest BL from the page's own JS bundle. That works — until the &lt;em&gt;scraper&lt;/em&gt; breaks because Google renamed the chunk, which is a second, slower time bomb.&lt;/p&gt;

&lt;p&gt;The real fix is &lt;strong&gt;probe-before-apply&lt;/strong&gt;. When a request 405s, the server doesn't guess: it takes the candidate BLs it knows about and sends a &lt;em&gt;minimal&lt;/em&gt; probe request against each one. The first candidate that does &lt;strong&gt;not&lt;/strong&gt; return 405 is committed and used for the retry. A bad BL is never applied — the probe is cheap, the retry is atomic, and the server converges to the correct build without any hardcoded knowledge of Google's deployment schedule.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request -&amp;gt; 405
   └─&amp;gt; probe BL₁ ── 405 ─┐
   └─&amp;gt; probe BL₂ ── 200 ─┴─&amp;gt; adopt BL₂, retry request -&amp;gt; 200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also counts consecutive 405s (&lt;code&gt;bl_405_count&lt;/code&gt; in &lt;code&gt;/health&lt;/code&gt;). One 405 is an event; three in a row is a &lt;em&gt;storm&lt;/em&gt;, and that's a different signal — more on that in War 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  War 2: the &lt;code&gt;at&lt;/code&gt; token Google won't accept from you
&lt;/h2&gt;

&lt;p&gt;Deeper in the protocol is the XSRF &lt;code&gt;at&lt;/code&gt; token — a short-lived, per-session value signed into the page. A fresh server scrapes it from the page HTML and... Google rejects it with &lt;strong&gt;400&lt;/strong&gt;. The page-scraped token isn't valid for API use; only the token the &lt;em&gt;session&lt;/em&gt; actually negotiated works. This one is nasty because it's intermittent: the server works fine while the extension is running (the extension holds a live session), then a brand-new instance with a fresh scrape 400s on its very first request.&lt;/p&gt;

&lt;p&gt;The fix is a &lt;strong&gt;session probe&lt;/strong&gt;: when the server boots with no usable token, it sends an &lt;code&gt;at&lt;/code&gt;-less request. Google's own error response names the expected token — so the server recovers it from the rejection itself. No guessing, no scraping the wrong layer, and a brand-new instance streams out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  War 3: stale cookies, and the watchdog that heals it
&lt;/h2&gt;

&lt;p&gt;Cookie-based auth has a shelf life. Google rotates session cookies, and when they go stale you get a wall of failures that looks like a network problem but is actually an auth problem. The first version of this project failed exactly like that — confusing connection errors, no signal, users stranded.&lt;/p&gt;

&lt;p&gt;Today the system &lt;em&gt;knows&lt;/em&gt; when cookies are dying and fixes them without a human:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The server exposes &lt;strong&gt;&lt;code&gt;/health&lt;/code&gt;&lt;/strong&gt; with the cookie's file mtime, so "cookie age" is a first-class metric (&lt;code&gt;cookie.age_sec&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;watchdog process&lt;/strong&gt; polls &lt;code&gt;/health&lt;/code&gt;. If cookie age exceeds a threshold (default 24h), it logs a warning and triggers a refresh via the extension — debounced (4h between warnings, 30min between refreshes) and persisted to &lt;code&gt;watchdog-state.json&lt;/code&gt;, so a reboot doesn't immediately re-trigger a refresh you already did.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;MV3 browser extension&lt;/strong&gt; polls the server's refresh endpoint, opens a &lt;em&gt;minimized&lt;/em&gt; window to the real sign-in page, completes the flow, and uploads the fresh &lt;code&gt;cookie.txt&lt;/code&gt; back. The whole cycle is observable: the server flag flips, the extension completes it, the file's mtime updates, and &lt;code&gt;/health&lt;/code&gt; shows age ≈ 0.&lt;/li&gt;
&lt;li&gt;The 405 storm counter feeds the same loop: three consecutive 405s means "cookies are stale," so the watchdog treats it as a refresh trigger, not just a log line.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a server that runs for weeks unattended. That's not a brag — it's the difference between "a hack" and "a service."&lt;/p&gt;

&lt;h2&gt;
  
  
  The SSE protocol: correctness under failure
&lt;/h2&gt;

&lt;p&gt;Streaming is where this protocol earns its keep. An OpenAI-compatible &lt;code&gt;/v1/chat/completions&lt;/code&gt; with &lt;code&gt;stream: true&lt;/code&gt; must emit &lt;code&gt;text/event-stream&lt;/code&gt; with &lt;code&gt;data:&lt;/code&gt; frames and a terminating &lt;code&gt;data: [DONE]&lt;/code&gt; — and a mid-stream upstream failure is the moment most bridges quietly break. The classic failure mode: the upstream dies mid-sentence, the bridge writes a &lt;em&gt;raw JSON error object&lt;/em&gt; into the response after already sending &lt;code&gt;200&lt;/code&gt; + SSE headers, and every OpenAI client on earth chokes on malformed SSE.&lt;/p&gt;

&lt;p&gt;The rules, enforced and tested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Never raw JSON after 200.&lt;/strong&gt; If the upstream fails mid-stream, the server emits a &lt;em&gt;valid SSE error frame&lt;/em&gt; followed by &lt;code&gt;data: [DONE]&lt;/code&gt;. Clients that respect the protocol see a clean, parseable stream that ends; nothing hangs, nothing crashes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;stream_options.include_usage&lt;/code&gt; ordering.&lt;/strong&gt; When requested, the usage chunk must appear &lt;em&gt;before&lt;/em&gt; &lt;code&gt;[DONE]&lt;/code&gt; and after the final content chunk. OpenAI clients validate this ordering; getting it wrong silently drops token-usage stats.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client disconnect is a first-class event.&lt;/strong&gt; &lt;code&gt;BrokenPipeError&lt;/code&gt; / &lt;code&gt;ConnectionResetError&lt;/code&gt; from a client that hit stop isn't an error — it's a signal. The stream handler catches it, stops upstream work, and releases resources instead of logging a stack trace and leaking a thread.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each of these has a dedicated test file (&lt;code&gt;test_sse.py&lt;/code&gt;) that drives a fake upstream through every failure mode — mid-stream death, abort, disconnect — and asserts the exact byte-level output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hardest part: images through a web protocol
&lt;/h2&gt;

&lt;p&gt;Text streaming through an undocumented protocol is one thing; &lt;strong&gt;multimodal&lt;/strong&gt; is another. Sending an image means uploading bytes to Google's upload endpoint, attaching the returned reference to the prompt, and navigating the fact that some accounts simply reject uploaded images (Google answers with an error info code, not a network failure).&lt;/p&gt;

&lt;p&gt;The design that survives reality is the &lt;strong&gt;image bridge&lt;/strong&gt;: the server &lt;em&gt;parks&lt;/em&gt; the image request, and the browser extension — which holds a real, signed-in session — claims it, re-attaches the image in an actual browser context, and POSTs the result back. The server's &lt;code&gt;/health&lt;/code&gt; reports the bridge slot's age, so a &lt;em&gt;stuck&lt;/em&gt; claim (extension crashed, window died) is &lt;strong&gt;auto-expired&lt;/strong&gt; by the watchdog instead of blocking the next request for the full timeout. Every result carries the extension's version, so a stale extension can be detected without a live test.&lt;/p&gt;

&lt;h2&gt;
  
  
  The testing discipline
&lt;/h2&gt;

&lt;p&gt;This project has &lt;strong&gt;515 tests across 16 suites&lt;/strong&gt; — and the suites that matter are the ones that &lt;em&gt;simulate the enemy&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;test_sse.py&lt;/code&gt; — byte-level SSE assertions against a fake upstream.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;test_watchdog.py&lt;/code&gt; — 84 tests on the decision logic (debounce, cooldowns, persistence) as a pure function.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;test_proxy_fallback.py&lt;/code&gt; / &lt;code&gt;test_multimodal_proxy.py&lt;/code&gt; — proxy-down → direct → fallback ordering with a mocked transport.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;test_image_bridge*.py&lt;/code&gt; — the park/claim/expire cycle, including stale-claim expiry.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;bundle drift check&lt;/strong&gt;: the single-file &lt;code&gt;gemini_web2api.py&lt;/code&gt; and the &lt;code&gt;gemini_web2api/&lt;/code&gt; package must never diverge — a bundler script regenerates one from the other, and CI fails if they differ.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rule I landed on after getting burned: &lt;em&gt;if you can't test the failure, you can't ship the fix.&lt;/em&gt; Every war above ended with a test file named after the battle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture, at a glance
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your AI app (OpenAI SDK) ──&amp;gt; /v1/chat/completions
        │
Gemini Web2API server ──&amp;gt; Gemini web (StreamGenerate)
        │  ├─ BL probe-before-apply (405 war)
        │  ├─ session-probe `at` token (400 war)
        │  ├─ proxy plan: proxy → direct → fallbacks
        │  └─ cookie age + 405 streak in /health
        ▼
Watchdog ──&amp;gt; stale cookies? ──&amp;gt; extension refresh (minimized window)
        └──&amp;gt; 405 storm? ──────&amp;gt; same refresh loop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The honest caveats
&lt;/h2&gt;

&lt;p&gt;This is an &lt;strong&gt;unofficial&lt;/strong&gt; bridge. It talks to Google's web interface, which is not a public API: it can break when Google changes anything, it's governed by Google's Terms of Service, and it's a personal-server tool — not a commercial product. Use it at your own risk, and don't build a business on someone else's free tier. What it &lt;em&gt;is&lt;/em&gt;: a serious study in protocol reverse-engineering, failure-mode engineering, and self-healing systems — all of it tested, observable, and open source.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Gemini Web2API&lt;/strong&gt; · &lt;a href="https://github.com/flawsom/Gemini-api" rel="noopener noreferrer"&gt;github.com/flawsom/Gemini-api&lt;/a&gt; · MIT-style open source · self-hosted · Docker + Cloudflare Worker deploy targets&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The 405s are gone, the cookies refresh themselves, and the streams never lie. Building it took a war; running it takes nothing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>Free resources that helped me master React as a Self Taught Web Developer</title>
      <dc:creator>Siba</dc:creator>
      <pubDate>Mon, 24 Jul 2023 07:16:35 +0000</pubDate>
      <link>https://dev.to/flawsom/free-resources-that-helped-me-master-react-as-a-self-taught-web-developer-1oej</link>
      <guid>https://dev.to/flawsom/free-resources-that-helped-me-master-react-as-a-self-taught-web-developer-1oej</guid>
      <description>&lt;h2&gt;
  
  
  React? Why?
&lt;/h2&gt;

&lt;p&gt;When it comes to web development and to be precise - JavaScript frameworks / libraries, React.js is always the one that most people think of first. According to &lt;a href="https://2022.stateofjs.com/en-us/libraries/front-end-frameworks/"&gt;State of JS 2022&lt;/a&gt;, React is the most used frontend framework by web developers since the last 6+ years. React still continues to be the the first choice of beginners and it’s popularity lies in the fact that when it comes to frameworks being used in production - React outperforms every other framework by usage, so no matter how imperfect it might be, React is not going to go anywhere, anytime soon.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OIRmzHU_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38dfdr3tqr9uvsf840ob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OIRmzHU_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/38dfdr3tqr9uvsf840ob.png" alt="State of JS 2022" width="800" height="531"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But no matter how good the tech might be, it’s always difficult as a beginner to get started with learning it and crossing the learning curve. The over saturation of content around React and it’s ecosystem contributes to this confusion. There are tons of resources (including the free ones) present right now all over the web for learning React, which is a good thing, but quality should always come before quantity. In this article, I’m writing about the resources that helped me to master React and the tools built around it. I’ll only be writing about the resources which I think beginners are most likely to benefit from and all of the resources are free.&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Resources / Courses
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;React in 100 seconds by &lt;a href="https://youtube.com/@Fireship"&gt;Fireship&lt;/a&gt; &lt;br&gt;
&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/Tn6-PIqc4UM"&gt;
&lt;/iframe&gt;
&lt;br&gt;
This video by Fireship is the best resource to get a grasp over React basics and get familiar with the way you work using React. The video is concise and to -the-point, a no-nonsense simple introduction to React for everyone.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free React course by &lt;a href="https://scrimba.com/"&gt;Scrimba&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sotXCC6x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/adc2opwo0v0q63v7ha7y.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sotXCC6x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/adc2opwo0v0q63v7ha7y.jpeg" alt="scrimba react course" width="800" height="415"&gt;&lt;/a&gt;&lt;br&gt;
This free course is created by the Scrimba team with one of the best instructors I have learnt from - &lt;a href="https://twitter.com/bobziroll"&gt;Bob Ziroll&lt;/a&gt;, this course can be done by anyone who has a basic grasp over JavaScript - though, it’s not recommended to dive right into React without knowing JavaScript well. The course is composed of 4 modules and 152 interactive sessions along with 8 projects that you’ll be building alongside learning React.&lt;br&gt;
This course is one of the best courses out there for learning the React - enough to get you started with it. The way of teaching Bob uses is very easy to understand, and Scrimba’s interactive coding sessions make it 100x more powerful than any other course.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free React beginner course by &lt;a href="https://twitter.com/kentcdodds"&gt;Kent C. Dodds&lt;/a&gt; on &lt;a href="https://egghead.io/"&gt;egghead.io&lt;/a&gt; &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xsfbaHCJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nqmvw8b3z1s5zgm831m5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xsfbaHCJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nqmvw8b3z1s5zgm831m5.jpeg" alt="kent's react course" width="800" height="387"&gt;&lt;/a&gt;&lt;br&gt;
Kent is one of the best instructors out there when it comes to React, and it doesn’t matter if you’re a beginner or an intermediate, this course is a fun ride along the basics of React. You are going to enjoy this course for sure and you won’t regret doing it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The correct way to create a React project, video by &lt;a href="https://twitter.com/t3dotgg"&gt;Theo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/o9TJWEPc0Lk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;This video is a must for all beginners starting to learn React where Theo has explained why you should not use &lt;a href="https://create-react-app.dev/"&gt;create-react-app&lt;/a&gt; to scaffold a React app and also talks about the better alternatives available for the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  Articles / Blogs / Other Resources
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Awesome list for React on &lt;a href="https://github.com/enaqx/awesome-react"&gt;GitHub&lt;/a&gt;&lt;br&gt;
This is one of the best places to find out about different react based things and utilities according to your needs. I use it all the time to find out about libraries and other tools to make my React project building process easier and efficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;React Beta Documentation&lt;br&gt;
Trust me when I say it, the React beta docs are so good that you might actually not need to do any course for getting a good grasp over it. And there’s a reason to it - the &lt;a href="https://beta.reactjs.org/"&gt;React Beta Docs&lt;/a&gt; include interactive examples and along with visual diagrams. They also include a lot of challenges to test your understanding on the topics.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Kent’s Blogs on &lt;a href="https://dev.to/asheeshh/%5Bhttps://kentcdodds.com/blog?q=react%5D(https://kentcdodds.com/blog?q=react)"&gt;React.js&lt;/a&gt;&lt;br&gt;
As I already mentioned before, Kent is one of the person I really admire and I feel like his blogs are a work of art, everything is explained so well as if he was sitting right beside you and explaining the thing, though the topics he writes about might sometimes tend to be advanced.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/asheeshh/%5Bhttps://overreacted.io/%5D(https://overreacted.io/)"&gt;Overreacted.io&lt;/a&gt; by &lt;a href="https://twitter.com/dan_abramov"&gt;Dan Abramov&lt;/a&gt;&lt;br&gt;
This is Dan Abramov’s personal blog, where he writes about React and everything in between. Dan is a core member at React and the creator of Redux. It’s a must read blog to get some in depth knowledge about React.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Blogs on &lt;a href="https://dev.to/flawsom/"&gt;Dev.to about React&lt;/a&gt;&lt;br&gt;
Last but not least, the #React tagged blogs on &lt;a href="https://dev.to/"&gt;Dev.to&lt;/a&gt; really make a wonderful resource for learning and building with React. There are literally tons of Blogs available there and tons more waiting to be written!&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I think I shared quite enough resources for any beginner to start their React journey. But, please remember this - &lt;em&gt;No matter how many resources you’re using or how many courses you’re learning from, all of it won’t amount to nothing if you don’t implement what you’re learning on a project. Please, please, please - build as much as possible because that’s the only way to get practical knowledge.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now as I’m about to end this blog, I hope I was able to provide a valuable resource for the React and the Web Dev ecosystem. In case you find something wrong here or would like to suggest something, please just leave a comment below - I’ll make sure I get to it.&lt;/p&gt;

&lt;p&gt;Thank a lot for reading if you made it till here, I really appreciate it ❤️&lt;/p&gt;

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