<?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: Aditya Sorathiya</title>
    <description>The latest articles on DEV Community by Aditya Sorathiya (@aditya_sorathiya_069252f4).</description>
    <link>https://dev.to/aditya_sorathiya_069252f4</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%2F4023995%2F485e9466-24ea-4f21-b88a-2a5fb850b430.png</url>
      <title>DEV Community: Aditya Sorathiya</title>
      <link>https://dev.to/aditya_sorathiya_069252f4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aditya_sorathiya_069252f4"/>
    <language>en</language>
    <item>
      <title>goodAPI — An API Monitoring Dashboard Built with FastAPI, Render, and MongoDB Atlas</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Sat, 17 Oct 2026 17:13:52 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/goodapi-an-api-monitoring-dashboard-built-with-fastapi-render-and-mongodb-atlas-k69</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/goodapi-an-api-monitoring-dashboard-built-with-fastapi-render-and-mongodb-atlas-k69</guid>
      <description>&lt;p&gt;Meet &lt;strong&gt;goodAPI&lt;/strong&gt;,an API monitoring dashboard designed to help developers test endpoints, monitor HTTP responses, track response times, and understand API issues with AI-powered explanations.&lt;/p&gt;

&lt;p&gt;Built with FastAPI, MongoDB Atlas, and a Netlify-hosted frontend, goodAPI demonstrates a practical use of modern cloud infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 Highlights:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Render: Hosts the FastAPI backend and provides a straightforward way to deploy and run the API.&lt;/li&gt;
&lt;li&gt;MongoDB Atlas: Stores user accounts, API monitors, and monitoring results in a cloud-hosted database.&lt;/li&gt;
&lt;li&gt;API monitoring: Test endpoints, check HTTP status codes, measure response times, and compare results against expected status codes.&lt;/li&gt;
&lt;li&gt;AI-powered explanations: Uses Groq to explain API responses and suggest debugging steps.&lt;/li&gt;
&lt;li&gt;Authentication: Google sign-in and protected, user-specific monitors.&lt;/li&gt;
&lt;li&gt;Netlify: Hosts the frontend separately from the backend.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Demo at&lt;/strong&gt;: &lt;a href="https://goodapi.netlify.app" rel="noopener noreferrer"&gt;https://goodapi.netlify.app&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/sorathiya903/healthy-api" rel="noopener noreferrer"&gt;https://github.com/sorathiya903/healthy-api&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is to make API testing, monitering and debugging more accessible while demonstrating how Render and MongoDB Atlas can work together in a real-world developer tool.&lt;/p&gt;

&lt;p&gt;Built as an independent student developer project. Feedback and suggestions are welcome!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I built an AI game that forces you to close this tab and go outside 🌿 (Built with Client-Side WASM)</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Thu, 08 Oct 2026 13:09:29 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/i-built-an-ai-game-that-forces-you-to-close-this-tab-and-go-outside-built-with-client-side-wasm-4460</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/i-built-an-ai-game-that-forces-you-to-close-this-tab-and-go-outside-built-with-client-side-wasm-4460</guid>
      <description>&lt;p&gt;Every developer knows the feeling. You sit down to solve "one quick bug," and suddenly it's 11:00 PM, your eyes are bloodshot, and you haven't seen a tree in three days. &lt;/p&gt;

&lt;p&gt;As a Class 10 student developer, I wanted to build something for the Hacktoberfest Week 1 "Touch Grass" challenge that addresses this head-on. Most software is engineered to trap your attention inside a viewport. I wanted to build an app where the screen's only job is to get you away from it.&lt;/p&gt;

&lt;p&gt;Introducing &lt;strong&gt;NatureMate — Touch Grass Edition&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎮 &lt;strong&gt;Live Game:&lt;/strong&gt; &lt;a href="https://naturemate.netlify.app" rel="noopener noreferrer"&gt;https://naturemate.netlify.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📂 &lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/sorathiya903/nature-mate" rel="noopener noreferrer"&gt;https://github.com/sorathiya903/nature-mate&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎮 How the Game Works
&lt;/h2&gt;

&lt;p&gt;Instead of generating a boring digital checklist, NatureMate turns the real world into an active gaming arena:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Accept a Quest:&lt;/strong&gt; The app randomly generates a real-world object for you to discover (a bicycle, a bench, a dog, a backpack).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step Outside:&lt;/strong&gt; You actually have to stand up, open your door, and walk into your neighborhood or local park.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point &amp;amp; Verify:&lt;/strong&gt; Use your mobile browser's camera to capture a frame of the target object.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-Device AI Verification:&lt;/strong&gt; A localized computer vision model reviews the frame and rewards you with XP, coins, and streak multipliers if you found it!&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧠 Architecting Client-Side AI (No API Keys, Zero Server Costs)
&lt;/h2&gt;

&lt;p&gt;When planning this app, I wanted to avoid a bulky cloud backend. Pulling inspiration from my previous encrypted project ecosystem (&lt;strong&gt;PasteDB&lt;/strong&gt;), privacy and speed were my main priorities. &lt;/p&gt;

&lt;p&gt;Instead of routing camera frames to an external API, NatureMate handles machine learning entirely inside the browser's execution thread:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Engine:&lt;/strong&gt; Built cleanly using &lt;strong&gt;Astro&lt;/strong&gt;, modern CSS variables, and vanilla JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Core ML Layer:&lt;/strong&gt; Powered by &lt;strong&gt;Transformers.js&lt;/strong&gt; bound to an &lt;strong&gt;ONNX Runtime Web / WebAssembly (WASM)&lt;/strong&gt; layer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Model:&lt;/strong&gt; A lightweight, quantized &lt;strong&gt;YOLOS-tiny&lt;/strong&gt; model that maps out 43 distinct object classes directly inside your device's memory footprint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the analysis is 100% local, it functions seamlessly on mobile browsers without lagging out your cellular data or logging your camera stream to a server. &lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Gamifying Healthy Habits
&lt;/h2&gt;

&lt;p&gt;To keep loops interesting, I built in real arcade mechanics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;❤️ &lt;strong&gt;3 Lives System:&lt;/strong&gt; Skipping an unachievable object drops a life. Failing a snapshot doesn't. Hit 0 lives, and it's Game Over.&lt;/li&gt;
&lt;li&gt;⏱️ &lt;strong&gt;Touch Grass Run:&lt;/strong&gt; A separate 10-minute sprint challenge where you are tasked with identifying a specific subset of objects before the countdown clock self-destructs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🤝 Let's Connect!
&lt;/h2&gt;

&lt;p&gt;I would love to get your feedback! Open up the live link on your phone, step outside your room for five minutes, and let me know if the model tags your targets correctly. &lt;/p&gt;

&lt;p&gt;If you like the architecture, feel free to drop a ⭐ on the &lt;a href="https://%20github.com/sorathiya903/nature-mate" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt; or open an issue if you want to help me add custom object classes!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your Screen Can Have One Job: Get You Outside</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Thu, 08 Oct 2026 10:02:52 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/your-screen-can-have-one-job-get-you-outside-5fgb</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/your-screen-can-have-one-job-get-you-outside-5fgb</guid>
      <description>&lt;h2&gt;
  
  
  I Built a Game That Wants You to Stop Playing It
&lt;/h2&gt;

&lt;p&gt;We've spent the last decade getting really, really good at making apps that keep you staring at your phone.&lt;/p&gt;

&lt;p&gt;Infinite scroll, autoplay, streaks that punish you for leaving. Everything is optimized for time-on-screen.&lt;/p&gt;

&lt;p&gt;So I had a dumb thought: what if I built one that does the opposite?&lt;/p&gt;

&lt;p&gt;The phone gives you the quest, but you have to look &lt;em&gt;away&lt;/em&gt; from the phone to finish it. If you keep staring at the screen, you lose.&lt;/p&gt;

&lt;p&gt;That's how &lt;em&gt;NatureMate — Touch Grass Edition&lt;/em&gt; started.&lt;/p&gt;

&lt;p&gt;Live demo: &lt;a href="https://naturemate.netlify.app" rel="noopener noreferrer"&gt;https://naturemate.netlify.app&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/sorathiya903/nature-mate/" rel="noopener noreferrer"&gt;https://github.com/sorathiya903/nature-mate/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The weird idea&lt;/p&gt;

&lt;p&gt;The core loop is intentionally backwards.&lt;/p&gt;

&lt;p&gt;Most games are: screen -&amp;gt; eyes on screen -&amp;gt; reward.&lt;/p&gt;

&lt;p&gt;NatureMate is: screen -&amp;gt; eyes OFF screen -&amp;gt; reward.&lt;/p&gt;

&lt;p&gt;I open the app and it says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Find a bench outside.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's it. That's the quest.&lt;/p&gt;

&lt;p&gt;I can't tap the bench. I can't buy the bench. I have to physically get up, go outside, and find a real bench in the real world. The phone becomes the quest giver, and the street becomes the game board.&lt;/p&gt;

&lt;p&gt;It's a small shift, but it changes how you walk. You start noticing things. "Oh, there's a fire hydrant. I didn't know we had one on this street."&lt;/p&gt;

&lt;p&gt;So what do you actually do?&lt;/p&gt;

&lt;p&gt;It’s stupidly simple, which is why it works on mobile.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You get one quest: &lt;code&gt;Find a bicycle outside.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;You go outside.&lt;/li&gt;
&lt;li&gt;You point your camera at a bicycle.&lt;/li&gt;
&lt;li&gt;You press &lt;em&gt;Capture &amp;amp; Verify&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;On-device AI checks that one frame and says yes or no.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If it says yes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✓ THING FOUND! bicycle detected — 84% — +50 XP +16 🌱&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You get XP, coins, your streak goes up, and that object is gone forever. You’ll never get “bicycle” again in this run.&lt;/p&gt;

&lt;p&gt;If it says no:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not quite... I couldn't confidently find a bicycle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No life lost. You just try again from a better angle.&lt;/p&gt;

&lt;p&gt;That’s the whole game. One quest at a time. 43 possible things to find. No repeats.&lt;/p&gt;
&lt;h2&gt;
  
  
  The interesting technical part
&lt;/h2&gt;

&lt;p&gt;I didn't want to send camera frames to a server. That feels creepy for a game that asks you to point your camera at the real world, and it would be laggy outdoors.&lt;/p&gt;

&lt;p&gt;Everything runs in the browser with Transformers.js.&lt;/p&gt;

&lt;p&gt;The model is &lt;code&gt;Xenova/yolos-tiny&lt;/code&gt; — a tiny YOLOS object detection model quantized to &lt;code&gt;q8&lt;/code&gt; so it actually loads on a phone. It's about 24MB, cached after the first load.&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;detector&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;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;object-detection&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="s2"&gt;Xenova/yolos-tiny&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;dtype&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;q8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="na"&gt;progress_callback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;handleProgress&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important rule I set for myself:&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;CAMERA PREVIEW ≠ AI INFERENCE&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;The video element is just a preview. No detection runs while you’re walking around. Only when you press Capture does it do this:&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;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;drawImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;video&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;h&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;dataUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toDataURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;image/jpeg&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.65&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;results&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;detector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One button press = one frame = one inference. That’s it. It keeps the phone cool, saves battery, and feels intentional — you’re choosing to ask the AI “is this it?”&lt;/p&gt;

&lt;p&gt;YOLOS is trained on COCO, so it can actually detect 80 real things. I limited the game to 43 that make sense outdoors and that the model can reliably see: bench, bicycle, car, person, dog, chair, bottle, potted plant, bus, truck, motorcycle, bird, cat, backpack, umbrella, frisbee, skateboard, traffic light, stop sign, kite... you get the idea.&lt;/p&gt;

&lt;p&gt;I &lt;em&gt;really&lt;/em&gt; wanted “tree” but COCO doesn’t have tree. So &lt;code&gt;potted plant&lt;/code&gt; is the closest we get. I kept the display names separate from detector labels so I don’t lie about what the AI is checking:&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="err"&gt;id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"potted plant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;detectorLabel:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"potted plant"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;title:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"plant"&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;p&gt;If the model says &lt;code&gt;bench&lt;/code&gt; with &amp;gt;30% confidence, you pass. If not, you don’t. No faking.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why lives and no repeats?
&lt;/h2&gt;

&lt;p&gt;Early versions felt like a demo, not a game. You could just spam “skip” until you got an easy one.&lt;/p&gt;

&lt;p&gt;So I added constraints that make it feel like an adventure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;3 lives.&lt;/em&gt; Shown as SVG hearts. Skipping a quest costs exactly one life. Failing detection costs zero.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;No repeats, ever.&lt;/em&gt; Found it? It goes into &lt;code&gt;foundObjects&lt;/code&gt;. Skipped it? Into &lt;code&gt;skippedObjects&lt;/code&gt;. Both go into &lt;code&gt;usedObjects&lt;/code&gt;. The next quest is always &lt;code&gt;OBJECTS.filter(o =&amp;gt; !usedObjects.has(o.id))&lt;/code&gt;. Guarantee.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;43 unique targets.&lt;/em&gt; So you can actually “complete” it. Progress is &lt;code&gt;12 / 43 FOUND&lt;/code&gt;, not an endless loop.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;XP, coins, streak.&lt;/em&gt; Small dopamine hits, but the real reward is you went outside.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The no-repeats rule changed everything. It stopped being “find a chair again” and started feeling like a collection journal. You’re not grinding, you’re clearing the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  Touch Grass Run
&lt;/h2&gt;

&lt;p&gt;This is my favorite mode.&lt;/p&gt;

&lt;p&gt;You press &lt;em&gt;🏃 Touch Grass Run&lt;/em&gt; and normal mode pauses completely. Separate state, separate timer, no contamination.&lt;/p&gt;

&lt;p&gt;You get 6 random targets and 10 minutes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;10:00 — Find: bench, car, dog, bottle, kite, bus&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same camera, but now it’s checking against the Run target, not your main quest. One capture can knock out multiple Run items if they’re in the same photo. Find all 6 before the timer hits zero and you get a little arcade-style win screen.&lt;/p&gt;

&lt;p&gt;When Run ends — whether you win, time out, or hit Exit — your normal adventure is restored exactly where you left it. No lives lost, no objects marked as found unless you actually found them in normal mode.&lt;/p&gt;

&lt;p&gt;Building that isolation was the hardest bug hunt. At first Run was modifying &lt;code&gt;foundObjects&lt;/code&gt; and people would lose quests permanently. Now it’s &lt;code&gt;state.runMode&lt;/code&gt; boolean: if true, Capture goes to the Run path, Skip is disabled.&lt;/p&gt;

&lt;p&gt;Building it wasn’t completely straightforward&lt;/p&gt;

&lt;p&gt;A few things that actually bit me:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1. Mobile browsers are picky.&lt;/em&gt; iOS Safari will kill your camera stream if you don’t &lt;code&gt;playsinline&lt;/code&gt; and &lt;code&gt;muted&lt;/code&gt;, and it hates multiple &lt;code&gt;getUserMedia&lt;/code&gt; calls. One stream, reuse it.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2. Model loading UX.&lt;/em&gt; On 4G, 24MB feels big. I had to build a real progress bar from &lt;code&gt;progress_callback&lt;/code&gt; — loaded/total per file — instead of fake percentages. The steps “Loading AI engine → Downloading model → Caching → Preparing camera → Adventure ready” actually reflect real events.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3. Stale state.&lt;/em&gt; Capture is async. If you generate a new quest while inference is running, you could compare results against the &lt;em&gt;new&lt;/em&gt; quest. Fix: capture the quest at the start:&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;questAtCapture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quest&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;//... await detector()&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;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;quest&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;questAtCapture&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="c1"&gt;// game was reset&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;4. Busy lock.&lt;/em&gt; Without a &lt;code&gt;busy&lt;/code&gt; flag, people double-tap Capture and get double XP. Now it’s &lt;code&gt;if(busy) return&lt;/code&gt; + &lt;code&gt;try/finally&lt;/code&gt; so the button never stays stuck.&lt;/p&gt;

&lt;p&gt;None of these are groundbreaking ML problems. They’re just the unsexy mobile web problems that make a demo feel like a real product.&lt;/p&gt;

&lt;p&gt;The part I like most&lt;/p&gt;

&lt;p&gt;Most apps compete to keep you.&lt;/p&gt;

&lt;p&gt;NatureMate uses 30 seconds of your attention to get rid of you.&lt;/p&gt;

&lt;p&gt;The best session isn’t “I played for 2 hours.” It’s:&lt;/p&gt;

&lt;p&gt;“I opened it, got ‘Find a bird’, went to the balcony, actually saw a bird, and closed the app.”&lt;/p&gt;

&lt;p&gt;The longer you play, the less you should look at this page. That’s the point.&lt;/p&gt;

&lt;p&gt;I built it because I wanted a reason to walk that wasn’t “close your rings” or “10k steps.” A little quest that makes you look up.&lt;/p&gt;

&lt;p&gt;Try it&lt;/p&gt;

&lt;p&gt;If you’re curious:&lt;/p&gt;

&lt;p&gt;Live demo: &lt;a href="https://naturemate.netlify.app" rel="noopener noreferrer"&gt;https://naturemate.netlify.app&lt;/a&gt;&lt;br&gt;
Repo: &lt;a href="https://github.com/sorathiya903/nature-mate/" rel="noopener noreferrer"&gt;https://github.com/sorathiya903/nature-mate/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No account, no backend, no upload. Just open it on your phone, give it camera permission, and give it a quest.&lt;/p&gt;

&lt;p&gt;Go outside. See if the AI agrees with you.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building PasteDB: A Bulletproof Code-Sharing Platform Powered by FastAPI and OpenAI's gpt-oss-20b</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:07:38 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/building-pastedb-a-bulletproof-code-sharing-platform-powered-by-fastapi-and-openais-gpt-oss-20b-1ij</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/building-pastedb-a-bulletproof-code-sharing-platform-powered-by-fastapi-and-openais-gpt-oss-20b-1ij</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;PasteDB&lt;/strong&gt;, a lightweight code-sharing platform designed to make sharing code blocks seamless. To take it a step further for this challenge, I integrated an &lt;strong&gt;"Explain This Code"&lt;/strong&gt; AI assistant layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who I built it for:&lt;/strong&gt; I built this feature specifically for my developer friends and peers who are learning to code. Often, when we share raw code snippets over chat platforms, beginners struggle to understand the core logic without context. PasteDB now automatically analyzes any shared snippet at the click of a button, acting as an on-demand mentor.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Live Link:&lt;/strong&gt; &lt;a href="https://pastedb.netlify.app" rel="noopener noreferrer"&gt;https://pastedb.netlify.app&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backend API:&lt;/strong&gt; &lt;a href="https://pastedb-rw62.onrender.com" rel="noopener noreferrer"&gt;https://pastedb-rw62.onrender.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Here is the official open-source repository for PasteDB:&lt;br&gt;
&lt;a href="https://github.com/sorathiya903/pastedb" rel="noopener noreferrer"&gt;https://github.com/sorathiya903/pastedb&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;PasteDB is engineered using a robust, free-tier distributed stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla JavaScript, HTML and CSS hosted on &lt;strong&gt;Netlify&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; &lt;strong&gt;FastAPI (Python)&lt;/strong&gt; hosted on a free-tier &lt;strong&gt;Render&lt;/strong&gt; instance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; &lt;strong&gt;MongoDB Atlas&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Overcoming Infrastructure Limits with Open-Weight AI
&lt;/h3&gt;

&lt;p&gt;The biggest engineering hurdle was Render's strict &lt;strong&gt;512MB RAM constraint&lt;/strong&gt; on the free tier. Running even a small 350MB model locally on the backend would trigger an Out-of-Memory (OOM) crash once the Python dependencies and KV caches loaded. &lt;/p&gt;

&lt;p&gt;To solve this, I decoupled the compute by making outbound streaming requests to &lt;strong&gt;Groq's cloud infrastructure&lt;/strong&gt; to tap into the official open-weight &lt;strong&gt;OpenAI Model&lt;/strong&gt; model. This leaves a 0MB memory footprint on Render while generating lightning-fast, structured Markdown explanations for the user.&lt;/p&gt;
&lt;h3&gt;
  
  
  Bulletproof Quota Protection
&lt;/h3&gt;

&lt;p&gt;To protect my public API quota from malicious spam or heavy judging traffic, I engineered a zero-RAM, custom in-memory &lt;strong&gt;IP Rate Limiter&lt;/strong&gt; directly inside the FastAPI routing layer. It limits users to 3 requests per minute per IP, protecting the app against HTTP 429 exhaustion while keeping the experience completely smooth and available for the judges.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# A snippet of my custom rate-limiter guarding the open-weight pipeline
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open innovation was the entire foundation of this project. Relying on premium, closed-source corporate APIs forces developers into commercial paywalls, rigid token meters, and strict monetization loops from day one. &lt;/p&gt;

&lt;p&gt;By utilizing open-weight ecosystem components like &lt;strong&gt;Llama 3.1&lt;/strong&gt;, I was able to build a completely free, highly scalable utility tool for my friends. Open innovation democratizes AI execution, proving that independent developers can ship fully secured AI tools without a massive corporate budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;I am entering PasteDB into the following categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grand Prize Category&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source AI / Open-Weight Model Integration:&lt;/strong&gt; I successfully deployed a 21B open-weight reasoning model pipeline (&lt;code&gt;gpt-oss-20b&lt;/code&gt;) across a modern full-stack ecosystem consisting of &lt;strong&gt;Netlify&lt;/strong&gt; (Frontend), &lt;strong&gt;FastAPI on Render&lt;/strong&gt; (Backend), and &lt;strong&gt;MongoDB Atlas&lt;/strong&gt; (Database). Offloading the inference compute allowed me to seamlessly integrate this open-weight powerhouse while staying perfectly within Render’s free-tier memory constraints.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
    </item>
    <item>
      <title>I built an E2EE paste utility with 12K users (1,800+ commits). Is a local HTML/CSS/JS Android wrapper a good idea?</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Mon, 28 Sep 2026 14:49:14 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/i-built-an-e2ee-paste-utility-with-12k-users-1800-commits-is-a-local-htmlcssjs-android-52m0</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/i-built-an-e2ee-paste-utility-with-12k-users-1800-commits-is-a-local-htmlcssjs-android-52m0</guid>
      <description>&lt;p&gt;Hey DEV community! 👋 &lt;/p&gt;

&lt;p&gt;I'm a 10th-grade self-taught developer, and for the past several months, I've been working as a one-man army (handling coding, testing, DevOps, and SEO) on my project: &lt;strong&gt;&lt;a href="https://pastedb.netlify.app" rel="noopener noreferrer"&gt;PasteDB&lt;/a&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;To give you an idea of the scale, the ecosystem currently spans across a web interface, an npm CLI tool (&lt;code&gt;pastedb-cli&lt;/code&gt;), two SDKs (Node.js/Python), and a live VS Code Marketplace extension. The core repository alone has over &lt;strong&gt;1,800+ verified commits&lt;/strong&gt;, and we just crossed &lt;strong&gt;12,000+ active users&lt;/strong&gt; completely organically. &lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Our Current Tech Stack (Running at ₹0)
&lt;/h3&gt;

&lt;p&gt;Because I am a student, I've architected everything to run smoothly on cloud free-tiers with a strict ₹0 maintenance budget:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vanilla HTML, CSS, JavaScript (Hosted on Netlify)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; FastAPI / Python (Deployed on Render's free tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; MongoDB Atlas (Free tier cluster) + Cloudinary for images&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔐 The Core Problem &amp;amp; Features
&lt;/h3&gt;

&lt;p&gt;PasteDB isn't just a standard text dump. It features client-side &lt;strong&gt;End-to-End Encryption (E2EE)&lt;/strong&gt; where encryption keys never touch my database server. It also supports automated "Burn After Read" pastes, an in-viewer code execution engine, automatic rolling version control history (up to 10 versions), and a 3-finger gesture-based Nearby Transfer protocol and many more…&lt;/p&gt;




&lt;h3&gt;
  
  
  📱 The Upcoming Milestone: A Native Android App
&lt;/h3&gt;

&lt;p&gt;Now that my 1st-term school exams are wrapping up, my next major goal during vacation is to launch an official &lt;strong&gt;PasteDB Android App&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Because I want to minimize development time, maintain our tight browser-side cryptographic logic, and ensure the app loads instantly on slow networks, I am planning to build a &lt;strong&gt;Local Hybrid Architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of pulling the UI over the internet, my plan is to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Embed our exact web &lt;code&gt;index.html&lt;/code&gt;, &lt;code&gt;style.css&lt;/code&gt;, and crypto-heavy &lt;code&gt;script.js&lt;/code&gt; files directly inside the Android project's &lt;code&gt;assets/&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;Build a lightweight &lt;strong&gt;Kotlin wrapper&lt;/strong&gt; using Jetpack Compose.&lt;/li&gt;
&lt;li&gt;Use Android's view container to render the UI entirely from local disk storage via &lt;code&gt;loadUrl("file:///android_asset/index.html")&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Point all fetch requests in the JS script to the absolute Render URL of our FastAPI backend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means &lt;strong&gt;no web browser layout is involved for the user&lt;/strong&gt;, and the application interface will load instantaneously without costing a rupee in frontend bandwidth.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤔 My Question to Senior Engineers: Is this a good idea?
&lt;/h3&gt;

&lt;p&gt;Since this is my first time deep-diving into Android deployment, I want to know your thoughts on this approach. Specifically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Security &amp;amp; Cryptography:&lt;/strong&gt; Our client-side E2EE relies entirely on browser-based JS crypto execution. Will loading these scripts locally via &lt;code&gt;file:///&lt;/code&gt; inside an Android WebView introduce any native sandbox security leaks or quirks?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Performance Constraints:&lt;/strong&gt; Are there significant performance penalties for letting local vanilla JS handle DOM updates inside a Kotlin wrapper compared to writing a completely native Kotlin UI?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hardware Access:&lt;/strong&gt; Will the local asset container successfully allow hardware-level access if I request native Android permissions (like Location/Bluetooth for our Nearby Transfer feature, or Camera access for scanning QR codes)?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'd love to hear your feedback, architectural warnings, or library recommendations (should I stick to standard Android WebViews, or explore engines like QuickJS for the crypto backend?). &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Drop your advice in the comments below!&lt;/em&gt; 👇&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>webdev</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Hardware Limits Couldn't Stop Me From Building PasteDB</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Wed, 23 Sep 2026 09:49:41 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/hardware-limits-couldnt-stop-me-from-building-pastedb-24b8</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/hardware-limits-couldnt-stop-me-from-building-pastedb-24b8</guid>
      <description>&lt;p&gt;I built PasteDB, an open-source developer tool, largely using a damaged bleeding smartphone. This is the story of building software despite hardware limitations and why imperfect hardware doesn't have to stop you from learning, coding, creating and SHIPPING.&lt;/p&gt;

&lt;p&gt;The real image today (23/9/2026)&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%2Fqjbo8be4safymwzdqiz0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqjbo8be4safymwzdqiz0.jpg" alt="Bleedin Phone - PasteDB" width="800" height="1067"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The image was clicked with my father's phone&lt;/p&gt;

</description>
      <category>buildinpublic</category>
      <category>showdev</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I searched “pastebin cli” on Google... and i got my project??? 🔎</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Sun, 20 Sep 2026 14:33:41 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/i-searched-pastebin-cli-on-google-and-i-got-my-project-4fn6</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/i-searched-pastebin-cli-on-google-and-i-got-my-project-4fn6</guid>
      <description>&lt;p&gt;One of those small milestones that feels surprisingly big. 🚀&lt;/p&gt;

&lt;p&gt;I searched Google for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;pastebin cli&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And PasteDB CLI appeared on the first page of results.&lt;/p&gt;

&lt;p&gt;Google is showing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“PasteDB CLI – Pastebin Command Line Tool for Developers”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The result appears below Google's AI Overview.&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%2Falr369lxv2a3lvevk34l.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%2Falr369lxv2a3lvevk34l.png" alt=" " width="800" height="1579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PasteDB is an open-source developer-focused paste platform I've been building, and the CLI lets developers work with pastes directly from their terminal.&lt;/p&gt;

&lt;p&gt;It supports things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create pastes&lt;/li&gt;
&lt;li&gt;Read pastes&lt;/li&gt;
&lt;li&gt;Update pastes&lt;/li&gt;
&lt;li&gt;Delete pastes&lt;/li&gt;
&lt;li&gt;Explore pastes&lt;/li&gt;
&lt;li&gt;Work with the PasteDB API directly from the terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What makes this milestone exciting to me isn't just seeing my project's name in Google.&lt;/p&gt;

&lt;p&gt;It's that someone searching for a generic term like &lt;strong&gt;“pastebin cli”&lt;/strong&gt; can potentially discover a project I built.&lt;/p&gt;

&lt;p&gt;It's a small SEO/discoverability milestone, but for an indie/student developer, these little moments are really motivating. 😄&lt;/p&gt;

&lt;p&gt;PasteDB:&lt;br&gt;
&lt;a href="https://pastedb.netlify.app" rel="noopener noreferrer"&gt;https://pastedb.netlify.app&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Have you ever had a project unexpectedly start appearing for generic searches? I'd love to hear about it.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The API Worked Locally. Then Production Broke It. 💀</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Wed, 16 Sep 2026 11:58:31 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/the-api-worked-locally-then-production-broke-it-26fb</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/the-api-worked-locally-then-production-broke-it-26fb</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────┐
│ 🧪 API HEALTH CHECK                  │
├──────────────────────────────────────┤
│                                      │
│ 💻 Local                             │
│    GET /api/test                     │
│    → 200 OK ✅                       │
│                                      │
│ ☁️ Production                        │
│    GET /api/test                     │
│    → 500 Internal Server Error 💀    │
│                                      │
└──────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's where the debugging began.&lt;/p&gt;

&lt;p&gt;Locally, everything was working exactly as expected. The API responded correctly, the frontend connected, and there were no obvious errors. But after deployment, something had changed. &lt;/p&gt;

&lt;p&gt;So what broke? &lt;/p&gt;

&lt;p&gt;You know that feeling when everything works perfectly on localhost?&lt;/p&gt;

&lt;p&gt;The API responds.&lt;br&gt;
The frontend gets the data.&lt;br&gt;
Authentication works.&lt;br&gt;
You test it five times.&lt;/p&gt;

&lt;p&gt;So you deploy it.&lt;/p&gt;

&lt;p&gt;And suddenly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;💥 500 Internal Server Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing changed.&lt;/p&gt;

&lt;p&gt;Except… everything.&lt;/p&gt;

&lt;p&gt;The classic situation&lt;/p&gt;

&lt;p&gt;During development, I had something like:&lt;/p&gt;

&lt;p&gt;Frontend → localhost API → Database&lt;/p&gt;

&lt;p&gt;I tested the endpoint and got exactly what I expected.&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;"success"&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;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello from the API"&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;p&gt;Perfect.&lt;/p&gt;

&lt;p&gt;Then I deployed the backend.&lt;/p&gt;

&lt;p&gt;Frontend → Production API → Database&lt;/p&gt;

&lt;p&gt;And the frontend started throwing errors.&lt;/p&gt;

&lt;p&gt;The worst part?&lt;/p&gt;

&lt;p&gt;The API worked when I tested some endpoints manually.&lt;/p&gt;

&lt;p&gt;That made it even more confusing.&lt;/p&gt;

&lt;p&gt;So what actually changed?&lt;/p&gt;

&lt;p&gt;A production environment isn't just your local computer moved to the internet.&lt;/p&gt;

&lt;p&gt;There are a lot of things that can be different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Environment variables&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CORS configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Database connection strings&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HTTPS vs HTTP&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Allowed origins&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;File paths&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Case-sensitive filenames&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dependency versions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python/Node versions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Proxy configuration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Authentication cookies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API URLs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deployment-specific filesystem behavior&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One tiny assumption in development can become a production bug.&lt;/p&gt;

&lt;p&gt;One of my favorite examples: environment variables&lt;/p&gt;

&lt;p&gt;Locally, you might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;API_URL&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything works.&lt;/p&gt;

&lt;p&gt;But your deployed frontend might still be trying to call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the user's browser, localhost means their computer, not your server.&lt;/p&gt;

&lt;p&gt;So your API isn't even being contacted.&lt;/p&gt;

&lt;p&gt;That bug can be surprisingly easy to miss if you're only testing locally.&lt;/p&gt;

&lt;p&gt;Another one: CORS&lt;/p&gt;

&lt;p&gt;You might test your frontend and backend locally with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:5500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then production becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://myapp.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://api.myapp.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your backend needs to know that the production frontend is allowed to make requests.&lt;/p&gt;

&lt;p&gt;A configuration that worked locally isn't necessarily correct for production.&lt;/p&gt;

&lt;p&gt;And then there's the database 😭&lt;/p&gt;

&lt;p&gt;Your local machine might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mongodb://localhost:27017/mydb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production obviously can't use your laptop's MongoDB.&lt;/p&gt;

&lt;p&gt;So you replace it with a hosted database connection string.&lt;/p&gt;

&lt;p&gt;Then you discover:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Authentication failed.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Connection refused.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Network access denied.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The API code itself might be completely fine.&lt;/p&gt;

&lt;p&gt;The environment around it isn't.&lt;/p&gt;

&lt;p&gt;The lesson I learned&lt;/p&gt;

&lt;p&gt;When something breaks after deployment, don't immediately rewrite the endpoint.&lt;/p&gt;

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

&lt;p&gt;"What is different between local and production?"&lt;/p&gt;

&lt;p&gt;I now mentally go through something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Environment variables
        ↓
API URL
        ↓
CORS
        ↓
Database
        ↓
Authentication
        ↓
Dependencies
        ↓
File paths
        ↓
HTTPS / proxy
        ↓
Production logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only after checking those do I start changing application code.&lt;/p&gt;

&lt;p&gt;Production is a different environment&lt;/p&gt;

&lt;p&gt;This is probably one of the biggest lessons I've learned while building web projects.&lt;/p&gt;

&lt;p&gt;"It works on my machine" isn't the end of testing.&lt;/p&gt;

&lt;p&gt;It's actually the beginning of a new type of debugging.&lt;/p&gt;

&lt;p&gt;Local development tells you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The code can work."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Production testing tells you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"The entire system works together."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And those are two very different things.&lt;/p&gt;




&lt;p&gt;What's the strangest "works locally, breaks in production" bug you've encountered?&lt;/p&gt;

&lt;p&gt;I'd love to hear the weird ones. 👇&lt;/p&gt;

</description>
      <category>programming</category>
      <category>api</category>
      <category>backend</category>
      <category>devops</category>
    </item>
    <item>
      <title>My Computer Teacher Marked My Correct Answer Wrong — So I Investigated It</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Mon, 14 Sep 2026 16:32:49 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/my-computer-teacher-marked-my-correct-answer-wrong-so-i-investigated-it-4nc2</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/my-computer-teacher-marked-my-correct-answer-wrong-so-i-investigated-it-4nc2</guid>
      <description>&lt;p&gt;My Computer Teacher Marked My Correct Answer Wrong — So I Investigated It&lt;/p&gt;

&lt;p&gt;A few days before my Class 9 annual exams, something happened during a computer science test that I still remember.&lt;/p&gt;

&lt;p&gt;It wasn't a huge incident. It was just one MCQ worth one mark.&lt;/p&gt;

&lt;p&gt;But that one mark taught me something much more valuable: being a student doesn't mean you should stop questioning an answer when you have evidence that something is wrong.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This story is completely unrelated to my PasteDB project. It is a personal experience from my Class 9 computer science test.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The 19/20&lt;/p&gt;

&lt;p&gt;It was March, a few days before our Class 9 annual examinations.&lt;/p&gt;

&lt;p&gt;Our computer science teacher conducted a 20-mark test containing 20 multiple-choice questions.&lt;/p&gt;

&lt;p&gt;A few days later, we received our papers.&lt;/p&gt;

&lt;p&gt;I got 19/20.&lt;/p&gt;

&lt;p&gt;Everything looked normal until I reached Question 8.&lt;/p&gt;

&lt;p&gt;The question was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which of the following is not a limitation of a mobile phone?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There were four options. I don't remember options A and B exactly, but the two relevant options were:&lt;/p&gt;

&lt;p&gt;C. Memory&lt;/p&gt;

&lt;p&gt;D. Network&lt;/p&gt;

&lt;p&gt;I had selected D. Network.&lt;/p&gt;

&lt;p&gt;But my answer had been marked wrong.&lt;/p&gt;

&lt;p&gt;According to the answer key, C. Memory was considered correct.&lt;/p&gt;

&lt;p&gt;I immediately wondered:&lt;/p&gt;

&lt;p&gt;How could network not be a limitation of a mobile phone?&lt;/p&gt;

&lt;p&gt;I decided to ask about it.&lt;/p&gt;




&lt;p&gt;Going to the Staff Room&lt;/p&gt;

&lt;p&gt;I took my computer paper and went to the staff room with two of my friends.&lt;/p&gt;

&lt;p&gt;There were two teachers there — my computer teacher and my maths teacher.&lt;/p&gt;

&lt;p&gt;One of my friends had come to discuss his maths paper. After his discussion was finished, he left.&lt;/p&gt;

&lt;p&gt;My other friend stayed with me.&lt;/p&gt;

&lt;p&gt;I showed my computer teacher Question 8 and asked whether my mark could be reconsidered.&lt;/p&gt;

&lt;p&gt;Initially, she didn't change it.&lt;/p&gt;

&lt;p&gt;Instead, she opened the textbook to check the topic.&lt;/p&gt;

&lt;p&gt;She was looking through one chapter, but I remembered that the relevant topic was actually in another chapter. I pointed that out.&lt;/p&gt;

&lt;p&gt;Eventually, she found the question in the textbook exercise.&lt;/p&gt;

&lt;p&gt;And that's where the real discussion started.&lt;/p&gt;




&lt;p&gt;The Debate&lt;/p&gt;

&lt;p&gt;My teacher believed that Memory was the answer.&lt;/p&gt;

&lt;p&gt;I explained why I believed Network was the correct answer.&lt;/p&gt;

&lt;p&gt;My reasoning was simple:&lt;/p&gt;

&lt;p&gt;A mobile phone depends on network connectivity for many communication-related functions. Lack of network connectivity can therefore be a limitation.&lt;/p&gt;

&lt;p&gt;Meanwhile, I didn't understand how memory itself could be considered the answer to a question asking what is not a limitation.&lt;/p&gt;

&lt;p&gt;We went back and forth for quite some time.&lt;/p&gt;

&lt;p&gt;I wasn't trying to disrespect my teacher.&lt;/p&gt;

&lt;p&gt;I simply couldn't make the explanation fit with what I understood from the textbook.&lt;/p&gt;

&lt;p&gt;Eventually, after the discussion had gone on for quite a while, my teacher increased my mark.&lt;/p&gt;

&lt;p&gt;So I got my 20/20.&lt;/p&gt;

&lt;p&gt;I thought that was the end of it.&lt;/p&gt;

&lt;p&gt;It wasn't.&lt;/p&gt;




&lt;p&gt;My Friend Had the Same Answer&lt;/p&gt;

&lt;p&gt;The next working day, my friend came to me.&lt;/p&gt;

&lt;p&gt;He had also selected D. Network.&lt;/p&gt;

&lt;p&gt;He told me that he should receive the mark too.&lt;/p&gt;

&lt;p&gt;I agreed.&lt;/p&gt;

&lt;p&gt;But I suggested something slightly different.&lt;/p&gt;

&lt;p&gt;Instead of simply asking the teacher to give him the mark, I told him to ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If this exact question appears in the annual examination, which option should we select?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That question mattered.&lt;/p&gt;

&lt;p&gt;Because getting one mark back was one thing.&lt;/p&gt;

&lt;p&gt;Knowing the correct answer for the actual examination was much more important.&lt;/p&gt;

&lt;p&gt;My friend asked the teacher about it.&lt;/p&gt;

&lt;p&gt;The answer he got was still C. Memory.&lt;/p&gt;

&lt;p&gt;And I couldn't understand it.&lt;/p&gt;

&lt;p&gt;If the question appeared in our annual exam, I didn't want to knowingly select an answer I believed was technically incorrect.&lt;/p&gt;




&lt;p&gt;Taking the Question to the Principal&lt;/p&gt;

&lt;p&gt;It was examination time, so teachers were busy with invigilation and other responsibilities.&lt;/p&gt;

&lt;p&gt;My friend's paper wasn't resolved immediately.&lt;/p&gt;

&lt;p&gt;So I decided to ask someone else.&lt;/p&gt;

&lt;p&gt;I went to the principal during dispersal.&lt;/p&gt;

&lt;p&gt;I explained that I had a doubt regarding a previous computer science unit test.&lt;/p&gt;

&lt;p&gt;At first, the principal was understandably annoyed because it was exam time and I was bringing up an old test.&lt;/p&gt;

&lt;p&gt;But once I explained the actual issue, she said that it would be clarified.&lt;/p&gt;

&lt;p&gt;I went home.&lt;/p&gt;

&lt;p&gt;And instead of just thinking about the argument, I did something more useful.&lt;/p&gt;

&lt;p&gt;I started looking for evidence.&lt;/p&gt;




&lt;p&gt;I Went Back to the Textbook&lt;/p&gt;

&lt;p&gt;I searched through the textbook again.&lt;/p&gt;

&lt;p&gt;This time, I wasn't looking for something that would simply prove me right.&lt;/p&gt;

&lt;p&gt;I was looking for the actual explanation of the concept.&lt;/p&gt;

&lt;p&gt;And then I found it.&lt;/p&gt;

&lt;p&gt;There was a line in the textbook that supported my interpretation of the question.&lt;/p&gt;

&lt;p&gt;That was important.&lt;/p&gt;

&lt;p&gt;Now I wasn't relying only on my memory or opinion.&lt;/p&gt;

&lt;p&gt;I had a source.&lt;/p&gt;




&lt;p&gt;The Next Day&lt;/p&gt;

&lt;p&gt;When I came to class the next day, my class teacher asked me about the situation.&lt;/p&gt;

&lt;p&gt;She knew that I had taken the question to the principal.&lt;/p&gt;

&lt;p&gt;I explained what had happened.&lt;/p&gt;

&lt;p&gt;Then she checked the question independently.&lt;/p&gt;

&lt;p&gt;The answer she got was:&lt;/p&gt;

&lt;p&gt;D. Network.&lt;/p&gt;

&lt;p&gt;I also showed her the relevant line from the textbook.&lt;/p&gt;

&lt;p&gt;At that point, there was evidence from the textbook supporting my answer as well.&lt;/p&gt;

&lt;p&gt;The issue was finally clear.&lt;/p&gt;

&lt;p&gt;The original answer I had been marked wrong for was actually the answer I should have received credit for.&lt;/p&gt;




&lt;p&gt;What I Learned From One Mark&lt;/p&gt;

&lt;p&gt;Looking back, the most important part of this story isn't that I got one additional mark.&lt;/p&gt;

&lt;p&gt;It's what happened while trying to resolve the disagreement.&lt;/p&gt;

&lt;p&gt;I learned that authority doesn't automatically make an answer correct.&lt;/p&gt;

&lt;p&gt;A teacher can know far more about a subject than a student and still make an occasional mistake.&lt;/p&gt;

&lt;p&gt;A textbook can contain an unclear question.&lt;/p&gt;

&lt;p&gt;An answer key can be wrong.&lt;/p&gt;

&lt;p&gt;And a student can misunderstand something.&lt;/p&gt;

&lt;p&gt;That's why evidence matters.&lt;/p&gt;




&lt;p&gt;Don't Argue Just to Prove Yourself Right&lt;/p&gt;

&lt;p&gt;There's an important distinction here.&lt;/p&gt;

&lt;p&gt;I'm not saying students should challenge teachers about everything.&lt;/p&gt;

&lt;p&gt;And I'm definitely not saying that students should assume their teachers are wrong.&lt;/p&gt;

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

&lt;p&gt;If you believe something is technically incorrect, investigate it.&lt;/p&gt;

&lt;p&gt;Don't just say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm right."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What does the textbook say?"&lt;/p&gt;

&lt;p&gt;"What does the documentation say?"&lt;/p&gt;

&lt;p&gt;"Can I find another reliable source?"&lt;/p&gt;

&lt;p&gt;"Can I explain why I believe this answer is correct?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That changes an argument into an investigation.&lt;/p&gt;




&lt;p&gt;The Internet Makes This Even More Important&lt;/p&gt;

&lt;p&gt;As someone who enjoys computer science and software development, I've started noticing this even more.&lt;/p&gt;

&lt;p&gt;In technology, you can't always rely on someone's authority.&lt;/p&gt;

&lt;p&gt;A person might confidently tell you that an API works one way.&lt;/p&gt;

&lt;p&gt;The documentation might say otherwise.&lt;/p&gt;

&lt;p&gt;Someone might tell you a programming concept is impossible.&lt;/p&gt;

&lt;p&gt;You might test it and discover that it isn't.&lt;/p&gt;

&lt;p&gt;Someone might tell you that a particular piece of code is correct.&lt;/p&gt;

&lt;p&gt;Running it might prove otherwise.&lt;/p&gt;

&lt;p&gt;That's why one of the most valuable skills for a developer is learning to verify information.&lt;/p&gt;




&lt;p&gt;What Would You Have Done?&lt;/p&gt;

&lt;p&gt;If you were in my situation, what would you have done?&lt;/p&gt;

&lt;p&gt;Would you have:&lt;/p&gt;

&lt;p&gt;Accepted the answer and moved on?&lt;/p&gt;

&lt;p&gt;Asked the teacher again?&lt;/p&gt;

&lt;p&gt;Checked the textbook?&lt;/p&gt;

&lt;p&gt;Looked for another reliable source?&lt;/p&gt;

&lt;p&gt;Asked another teacher?&lt;/p&gt;

&lt;p&gt;Taken the issue to the principal?&lt;/p&gt;

&lt;p&gt;For me, the biggest lesson wasn't getting 20/20.&lt;/p&gt;

&lt;p&gt;It was learning that asking questions respectfully and finding evidence can be more powerful than simply arguing.&lt;/p&gt;

&lt;p&gt;And sometimes, the answer really is worth investigating.&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>education</category>
      <category>discuss</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I’m a Student Developer. Is Building Projects Actually Better Than Following Tutorials?</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Mon, 14 Sep 2026 15:33:10 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/im-a-student-developer-is-building-projects-actually-better-than-following-tutorials-28n4</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/im-a-student-developer-is-building-projects-actually-better-than-following-tutorials-28n4</guid>
      <description>&lt;p&gt;I've spent the last few months building and maintaining my own projects instead of constantly jumping between tutorials.&lt;/p&gt;

&lt;p&gt;It has been frustrating sometimes. I've had bugs that took hours to understand, deployments that broke, features that I later had to rewrite, and projects that nobody used.&lt;/p&gt;

&lt;p&gt;But I've also learned things that I don't think I would have learned by simply completing tutorials.&lt;/p&gt;

&lt;p&gt;So I'm curious:&lt;/p&gt;

&lt;p&gt;For someone learning development, what do you think is more valuable — building projects or following structured courses?&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>I Just Made PasteDB Pasts Editable Directly Inside VS Code 🚀</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Mon, 14 Sep 2026 05:07:02 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/i-just-made-pastedb-pasts-editable-directly-inside-vs-code-l2o</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/i-just-made-pastedb-pasts-editable-directly-inside-vs-code-l2o</guid>
      <description>&lt;p&gt;I just released PasteDB VS Code Extension v0.3.0, and this update adds one of the features I wanted most: Update Paste. You can now open an existing PasteDB paste in a VS Code editor, edit it like normal code, and update it with Ctrl + Shift + U — without going back to the browser. In this post, I'll share how I redesigned the update workflow and why I chose an editor-first UX.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=adityasorathiya.pastedb" rel="noopener noreferrer"&gt;PasteDB VS Code Extension&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/sorathiya903/pastedb" rel="noopener noreferrer"&gt;PasteDB on GitHub&lt;/a&gt;&lt;br&gt;
&lt;a href="https://pastedb.netlify.app" rel="noopener noreferrer"&gt;PasteDB&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>opensource</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Making PasteDB Easier to Read: Word Wrap &amp; Font Size Controls</title>
      <dc:creator>Aditya Sorathiya</dc:creator>
      <pubDate>Fri, 11 Sep 2026 15:57:51 +0000</pubDate>
      <link>https://dev.to/aditya_sorathiya_069252f4/making-pastedb-easier-to-read-word-wrap-font-size-controls-22m3</link>
      <guid>https://dev.to/aditya_sorathiya_069252f4/making-pastedb-easier-to-read-word-wrap-font-size-controls-22m3</guid>
      <description>&lt;h3&gt;
  
  
  Hey everyone! 👋
&lt;/h3&gt;

&lt;p&gt;I'm Aditya, a student developer, and I'm building PasteDB — a paste-sharing platform for code, text, notes, logs, and more.&lt;/p&gt;

&lt;p&gt;While using PasteDB myself, I noticed a small but annoying problem.&lt;/p&gt;

&lt;p&gt;If a paste contained a very long line, the viewer would require horizontal scrolling.&lt;/p&gt;

&lt;p&gt;That isn't a huge problem for code, but for normal text, notes, documentation, or things like copied questions, it can make reading pretty uncomfortable.&lt;/p&gt;

&lt;p&gt;So I decided to improve the viewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 Introducing Word Wrap
&lt;/h2&gt;

&lt;p&gt;PasteDB's viewer now has a Word Wrap option.&lt;/p&gt;

&lt;p&gt;When word wrap is disabled, long lines stay on a single line:&lt;/p&gt;

&lt;p&gt;This is a very long line that continues and continues and requires horizontal scrolling...&lt;/p&gt;

&lt;p&gt;When enabled, the same content can automatically wrap inside the viewer:&lt;/p&gt;

&lt;p&gt;This is a very long line that continues&lt;br&gt;
and continues and now wraps naturally&lt;br&gt;
inside the available space.&lt;/p&gt;

&lt;p&gt;The important part is that this is soft wrapping.&lt;/p&gt;

&lt;p&gt;The actual paste content isn't modified.&lt;/p&gt;

&lt;p&gt;So copying the paste still gives you the original content exactly as it was.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔤 Font Size Control
&lt;/h2&gt;

&lt;p&gt;I also added a font-size slider.&lt;/p&gt;

&lt;p&gt;Instead of having only one fixed font size, you can adjust the viewer to whatever feels comfortable.&lt;/p&gt;

&lt;p&gt;Something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Small  ────────●─────────  Large
                 16px

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The selected size is applied to the paste viewer and the output area as well.&lt;/p&gt;

&lt;p&gt;This is particularly useful when viewing PasteDB on different screen sizes.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Why I put them inside "More Options"
&lt;/h2&gt;

&lt;p&gt;Initially, I considered putting both controls directly in the toolbar.&lt;/p&gt;

&lt;p&gt;But the PasteDB viewer already has several actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Copy&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Raw&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Images&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nearby Share&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding two more buttons would make the toolbar increasingly crowded, especially on mobile.&lt;/p&gt;

&lt;p&gt;So I decided to keep the main actions visible and put the reading controls inside a More Options menu.&lt;/p&gt;

&lt;p&gt;That keeps the interface cleaner while still making the settings easy to access.&lt;/p&gt;




&lt;h2&gt;
  
  
  💾 Your preference is remembered
&lt;/h2&gt;

&lt;p&gt;I didn't want users to have to enable Word Wrap every time they opened a paste.&lt;/p&gt;

&lt;p&gt;So PasteDB stores the preferences locally using localStorage.&lt;/p&gt;

&lt;p&gt;For example:&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;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pastedb_word_wrap&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="s2"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the font size is stored similarly.&lt;/p&gt;

&lt;p&gt;This means your viewer preferences can persist between paste views without requiring an account or changing the actual paste.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ A small technical challenge
&lt;/h2&gt;

&lt;p&gt;Getting word wrapping to work properly wasn't just adding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;white-space&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;pre-wrap&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PasteDB's viewer uses &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt;&lt;br&gt;
 and &lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt; elements, and the &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; originally had a min-width based on the content.&lt;/p&gt;

&lt;p&gt;That meant a very long line could force the code block to become wider than the screen.&lt;/p&gt;

&lt;p&gt;So the important part was allowing the code block to shrink to the available width:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;pre&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;min-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&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;Then the code itself can wrap:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;white-space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pre-wrap&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;overflow-wrap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;anywhere&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;Without fixing the width behavior, the "word wrap" setting doesn't really feel like word wrap.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Why these small features matter
&lt;/h2&gt;

&lt;p&gt;This isn't a huge feature.&lt;/p&gt;

&lt;p&gt;It's basically two viewer settings.&lt;/p&gt;

&lt;p&gt;But I think these are the kinds of small improvements that make a product feel much better to use.&lt;/p&gt;

&lt;p&gt;PasteDB isn't only used for code. You can paste:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;📝 Notes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💻 Source code&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📋 Logs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📄 Long text&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📚 Documentation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔗 Links&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🖼️ Images&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔐 Private/encrypted content&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the viewer needs to work well for more than just programmers looking at code.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What's next for PasteDB?
&lt;/h2&gt;

&lt;p&gt;I'm continuing to improve PasteDB and add features based on things I actually need while using it.&lt;/p&gt;

&lt;p&gt;Some of the things I've already worked on include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Syntax highlighting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Markdown preview&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Custom URLs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Paste expiration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Password-protected pastes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Image pastes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;QR sharing&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Nearby transfer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Version history&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;API access&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;End-to-end encrypted pastes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A built-in code runner&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And there are still a lot more ideas I want to experiment with.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 I'd love your feedback
&lt;/h2&gt;

&lt;p&gt;If you use PasteDB, I'd love to know:&lt;/p&gt;

&lt;p&gt;What would you improve about the viewer?&lt;/p&gt;

&lt;p&gt;Is there a feature that would make reading or sharing pastes easier?&lt;/p&gt;

&lt;p&gt;I'm especially interested in small UX improvements like this one.&lt;/p&gt;

&lt;p&gt;Thanks for reading! ❤️&lt;/p&gt;

&lt;p&gt;PasteDB: &lt;a href="https://pastedb.netlify.app" rel="noopener noreferrer"&gt;https://pastedb.netlify.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/sorathiya903/pastedb" rel="noopener noreferrer"&gt;https://github.com/sorathiya903/pastedb&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cover image is AI generated &lt;br&gt;
The real UI is like &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsszehtx5digdsibn9777.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%2Fsszehtx5digdsibn9777.png" alt="Actual UI Image" width="800" height="1579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The UI may change after time&lt;/p&gt;

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