<?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: BlinkNBuild</title>
    <description>The latest articles on DEV Community by BlinkNBuild (@blinknbuild).</description>
    <link>https://dev.to/blinknbuild</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3790157%2F10cb3bd8-de59-48bd-b71c-e01ca00218c2.jpg</url>
      <title>DEV Community: BlinkNBuild</title>
      <link>https://dev.to/blinknbuild</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/blinknbuild"/>
    <language>en</language>
    <item>
      <title>I'm an ECE Student Who Vibe Codes Hardware Projects — Here's What Google I/O 2026 Actually Changed for Me</title>
      <dc:creator>BlinkNBuild</dc:creator>
      <pubDate>Thu, 21 May 2026 19:12:46 +0000</pubDate>
      <link>https://dev.to/blinknbuild/im-an-ece-student-who-vibe-codes-hardware-projects-heres-what-google-io-2026-actually-changed-1628</link>
      <guid>https://dev.to/blinknbuild/im-an-ece-student-who-vibe-codes-hardware-projects-heres-what-google-io-2026-actually-changed-1628</guid>
      <description>&lt;p&gt;&lt;em&gt;Submitted as part of the &lt;a href="https://dev.to/challenges/google-io-writing-2026-05-19"&gt;Google I/O 2026 Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Most Google I/O recaps look the same: benchmark tables, pricing comparisons, model spec sheets.&lt;/p&gt;

&lt;p&gt;This one won't.&lt;/p&gt;

&lt;p&gt;I'm an Electronics &amp;amp; Communication Engineering student and the person behind &lt;a href="https://youtube.com/@BlinkNBuild" rel="noopener noreferrer"&gt;BlinkNBuild&lt;/a&gt;, a YouTube channel where I build ESP32, Arduino, and Raspberry Pi projects. I also vibe code a lot: browser-based OLED pixel editors, circuit diagram tools, IoT dashboards — all shipped from a single HTML file to Netlify on zero budget.&lt;/p&gt;

&lt;p&gt;When I watched the Google I/O 2026 developer keynote, I wasn't evaluating these announcements as an ML researcher or a senior web developer. I was asking one question: &lt;strong&gt;does any of this actually change what I can build on a Tuesday night with no sleep and a free API tier?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the first time in a while — yes. Genuinely.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Shift That Actually Matters
&lt;/h2&gt;

&lt;p&gt;Something Sundar Pichai said in the keynote stuck with me:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"We've transitioned from AI that simply assists you, to agents that can independently navigate complex tasks across your entire workflow."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you've spent time babysitting an LLM through a multi-step project — manually copy-pasting between steps, correcting it after every tool call, re-explaining context it forgot — you know exactly why this matters. The gap between "AI that helps" and "AI that owns a task" is enormous in practice. Google just made a serious move toward closing it.&lt;/p&gt;

&lt;p&gt;Here's what actually shipped, and why I think it matters for builders like us.&lt;/p&gt;




&lt;h2&gt;
  
  
  Gemini 3.5 Flash: The First Flash That Beats a Pro Model
&lt;/h2&gt;

&lt;p&gt;This is the headline announcement, and it deserves more than a spec table.&lt;/p&gt;

&lt;p&gt;The Flash series has always been the "fast and cheap" tier — you trade capability for speed and cost. Gemini 3.5 Flash breaks that tradeoff entirely. It outperforms Gemini 3.1 Pro on coding and agentic benchmarks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;76.2%&lt;/strong&gt; on Terminal-Bench 2.1 (coding) vs 70.3% for 3.1 Pro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1656 Elo&lt;/strong&gt; on GDPval-AA (real-world agentic tasks)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;83.6%&lt;/strong&gt; on MCP Atlas (tool-use reliability)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;84.2%&lt;/strong&gt; on CharXiv Reasoning (multimodal understanding)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Meanwhile it runs at &lt;strong&gt;4× the speed of comparable frontier models&lt;/strong&gt; with a price of &lt;strong&gt;$1.50/$9 per 1M tokens&lt;/strong&gt; — less than half what GPT-5.5 costs for the same output.&lt;/p&gt;

&lt;p&gt;For a student building hobby projects on a free or low-cost API plan, that last sentence is everything.&lt;/p&gt;

&lt;p&gt;The context window is 1M tokens (1,048,576 to be exact), with dynamic thinking on by default — meaning the model auto-allocates extra compute when the problem is hard and skips it when it's simple. You don't tune this. It just works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One honest caveat:&lt;/strong&gt; there's a regression on 128k long-context retrieval (MRCR v2 dropped 7.6 points versus the preview). If you're doing RAG over massive multi-hundred-page documents, that's worth knowing. For the typical IoT/maker project — sensor code, dashboard logic, firmware debugging — it's not relevant. 3.5 Flash is still the best thing in the Flash tier by a wide margin.&lt;/p&gt;

&lt;p&gt;I tested it immediately via AI Studio after the keynote. I gave it a prompt to generate Arduino sensor code with a web dashboard interface. The output was noticeably more structured and the code ran first-try in a way that older Flash models didn't always manage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For makers and side-project builders:&lt;/strong&gt; if you're still on 3.1 Pro for budget reasons, you can now get better results at lower cost. That's a direct upgrade.&lt;/p&gt;




&lt;h2&gt;
  
  
  Google AI Studio: More Than a Key Generator
&lt;/h2&gt;

&lt;p&gt;I'll be honest — I've always thought of AI Studio as "the place you go to get an API key." I didn't think of it as a serious development environment.&lt;/p&gt;

&lt;p&gt;I/O 2026 changed that framing entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native Android vibe coding&lt;/strong&gt; is now in AI Studio. You can describe what you want, and it generates a Kotlin Android app — not a web wrapper, an actual native Android project. Combined with &lt;strong&gt;one-click deploy to Cloud Run&lt;/strong&gt; and &lt;strong&gt;Firebase integration&lt;/strong&gt;, you can go from idea to deployed app without ever leaving the browser.&lt;/p&gt;

&lt;p&gt;There's also an &lt;strong&gt;Export to Antigravity&lt;/strong&gt; button — one click and your entire project state, including all context, moves to local Antigravity development. No re-explaining, no re-scaffolding.&lt;/p&gt;

&lt;p&gt;And a &lt;strong&gt;new AI Studio mobile app&lt;/strong&gt; is available for pre-registration this week, so you can capture ideas on the go and have a prototype waiting when you get back to your desk.&lt;/p&gt;

&lt;p&gt;For someone who builds projects that need a companion app (sensor dashboards, remote control interfaces, IoT monitors), the setup overhead for native apps just collapsed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Managed Agents: The Feature I'm Most Excited to Build With
&lt;/h2&gt;

&lt;p&gt;This is the one that's going to change my actual projects.&lt;/p&gt;

&lt;p&gt;Google introduced &lt;strong&gt;Managed Agents in the Gemini API&lt;/strong&gt; — a single API call that spins up a fully provisioned agent running inside an isolated Linux container. Files and state persist across follow-up calls. The agent can reason, use tools, execute code, and iterate without you manually orchestrating every step.&lt;/p&gt;

&lt;p&gt;Why does this matter for makers?&lt;/p&gt;

&lt;p&gt;Because most IoT projects need more than one-shot generation. You want to describe a problem — "I have a noisy ADC reading from my soil moisture sensor, help me clean it and write the data to a CSV" — and have something that can &lt;em&gt;work through it&lt;/em&gt;. Run the code, see it failed, debug it, retry. Not just hand you a code block and wish you luck.&lt;/p&gt;

&lt;p&gt;Managed Agents are designed for exactly that loop. One API call. Persistent state. Real execution environment. I'm planning to build a small agent that reads ESP32 serial output and iterates on firmware fixes autonomously. That workflow was genuinely not practical before this.&lt;/p&gt;




&lt;h2&gt;
  
  
  Antigravity 2.0: The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;Underneath all of this is &lt;strong&gt;Antigravity 2.0&lt;/strong&gt; — Google's agent-first development platform, now a full three-component rebuild: a standalone desktop app, a new CLI (written in Go, replacing the old Gemini CLI), and an SDK for custom agents.&lt;/p&gt;

&lt;p&gt;A few things worth noting if you're evaluating it:&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;desktop app&lt;/strong&gt; orchestrates multiple agents in parallel, schedules background tasks, and has native voice command support. You describe a problem; specialized subagents divide the work.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Antigravity CLI&lt;/strong&gt; replaces the Gemini CLI entirely — Google is asking existing users to migrate. For makers, this is good news: you can now script around it, pipe results into your own tooling, and integrate it into terminal-based workflows naturally.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Managed Agents in the Gemini API&lt;/strong&gt; give you the Antigravity agent harness without the full local setup. One API call provisions a sandboxed Linux environment. This is the lowest-friction entry point for builders who don't want to install a full desktop tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  I Built Something With It — Here's the Receipt
&lt;/h2&gt;

&lt;p&gt;This isn't just theory. I used Antigravity 2.0 to build and ship a real project: a &lt;strong&gt;free, browser-based PDF to Image converter&lt;/strong&gt; that runs 100% offline, no server, no uploads, no account required.&lt;/p&gt;

&lt;p&gt;The entire thing — from idea to live app on Netlify — took &lt;strong&gt;under an hour&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's not a marketing claim. That's what it felt like to go from "I have a problem" to "this is deployed and usable by anyone." The old workflow would've taken me an evening at minimum: scaffolding the PDF.js rendering pipeline, debugging canvas GPU memory exhaustion on large documents, wiring the File System Access API fallback for Firefox. Antigravity handled the architecture and iteration. I steered.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live App →&lt;/strong&gt; &lt;a href="https://pdf-2-image.netlify.app/" rel="noopener noreferrer"&gt;pdf-2-image.netlify.app&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;GitHub →&lt;/strong&gt; &lt;a href="https://github.com/S-SUJAN-S/pdf-2-image" rel="noopener noreferrer"&gt;pdf-2-image source code&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The use case matters too: most AI tools (including Gemini and ChatGPT) parse PDFs as raw text streams, which silently mangles math equations, circuit diagrams, and scanned notes. Converting each page to a high-res image first — before uploading to an AI tool — fixes that entirely. It's a problem every ECE student hits.&lt;/p&gt;

&lt;p&gt;If you want the full technical writeup (PDF.js rendering loop, canvas memory management, File System Access API), I've covered it &lt;a href="https://dev.to/blinknbuild/i-built-a-free-pdf-to-image-converter-that-runs-100-in-your-browser-2f0"&gt;in detail here&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Building Next
&lt;/h2&gt;

&lt;p&gt;Based on what shipped at I/O 2026, here's what I'm immediately trying:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ESP32 firmware debug agent&lt;/strong&gt; — using Managed Agents to read serial output, identify errors, and iterate on fixes autonomously, without me manually copy-pasting error messages back and forth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android companion app&lt;/strong&gt; — using AI Studio's Kotlin vibe coding to generate a native sensor dashboard, deployed with one click to Cloud Run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Antigravity CLI pipeline&lt;/strong&gt; — a terminal-scripted subagent workflow that takes a GitHub README, extracts a bill of materials, and auto-generates an Instructables-style writeup&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these were practical to build before this week.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Honest Take
&lt;/h2&gt;

&lt;p&gt;Google I/O 2026 wasn't one moonshot announcement. It was a lot of things getting meaningfully better at the same time — the model, the tooling, the agent infrastructure, the developer experience — in a way that adds up to a real shift in what a solo builder can accomplish.&lt;/p&gt;

&lt;p&gt;The old Flash tradeoff (speed vs. capability) is gone. The old AI Studio limitation (great for prompts, not for building) is gone. The old agent friction (manually orchestrate everything yourself) is shrinking fast.&lt;/p&gt;

&lt;p&gt;For ECE students, makers, and side-project builders on a tight budget: this is the best the Gemini stack has ever been, and it's available right now on the free tier.&lt;/p&gt;

&lt;p&gt;Go build something.&lt;/p&gt;




&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;Gemini 3.5 Flash on Google AI Studio&lt;/a&gt; — free tier, no credit card required&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://antigravity.google" rel="noopener noreferrer"&gt;Antigravity 2.0&lt;/a&gt; — agent-first dev platform (desktop + CLI + SDK)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.googleblog.com/all-the-news-from-the-google-io-2026-developer-keynote/" rel="noopener noreferrer"&gt;Google I/O 2026 Developer Keynote recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pdf-2-image.netlify.app/" rel="noopener noreferrer"&gt;PDF to Image Converter&lt;/a&gt; — the project I shipped with Antigravity in under an hour&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://youtube.com/@BlinkNBuild" rel="noopener noreferrer"&gt;BlinkNBuild on YouTube&lt;/a&gt; — where I document builds like the ones described above&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;What's the first thing you'd build with Managed Agents + Gemini 3.5 Flash? Drop it in the comments — I'm especially curious what the embedded and IoT folks here are thinking.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>googleiochallenge</category>
      <category>ai</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Built a Free PDF to Image Converter That Runs 100% in Your Browser 🖼️⚡</title>
      <dc:creator>BlinkNBuild</dc:creator>
      <pubDate>Thu, 21 May 2026 18:34:18 +0000</pubDate>
      <link>https://dev.to/blinknbuild/i-built-a-free-pdf-to-image-converter-that-runs-100-in-your-browser-2f0</link>
      <guid>https://dev.to/blinknbuild/i-built-a-free-pdf-to-image-converter-that-runs-100-in-your-browser-2f0</guid>
      <description>&lt;p&gt;Ever uploaded a &lt;strong&gt;PDF with math equations to ChatGPT or Gemini&lt;/strong&gt; and watched it completely butcher the formula?&lt;/p&gt;

&lt;p&gt;That kept happening to me with ECE study notes. The AI was hallucinating integrals and matrix expressions. Turns out most AI tools parse PDFs as &lt;strong&gt;text streams&lt;/strong&gt; — not images — so anything visual (equations, diagrams, scanned pages) breaks silently.&lt;/p&gt;

&lt;p&gt;The fix is simple: convert each PDF page to a high-res image and upload that instead. AI vision models handle it perfectly via OCR.&lt;/p&gt;

&lt;p&gt;The problem? Every existing tool either charges you, asks you to sign up, or &lt;strong&gt;uploads your file to their server.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I built the tool I needed. 100% offline. Zero uploads. Open source.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live App →&lt;/strong&gt; &lt;a href="https://pdf-2-image.netlify.app/" rel="noopener noreferrer"&gt;pdf-2-image.netlify.app&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;GitHub →&lt;/strong&gt; &lt;a href="https://github.com/S-SUJAN-S/pdf-2-image" rel="noopener noreferrer"&gt;github.com/S-SUJAN-S/pdf-2-image&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Why AI Misreads Your PDFs
&lt;/h2&gt;

&lt;p&gt;When you upload a PDF to most AI tools, they extract raw text — the same way &lt;code&gt;pdftotext&lt;/code&gt; works. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LaTeX / math equations&lt;/strong&gt; → garbled unicode or skipped entirely&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scanned textbook pages&lt;/strong&gt; → blank (no text layer at all)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit diagrams, annotated figures&lt;/strong&gt; → completely invisible to the text parser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The moment you switch to image input, the AI switches to its vision model + OCR pipeline. It reads everything — equations, handwriting, diagrams — accurately.&lt;/p&gt;


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

&lt;p&gt;&lt;strong&gt;PDF to Image&lt;/strong&gt; is a single-page web app. Drop a PDF. Get images. Nothing leaves your device.&lt;/p&gt;
&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;100% Private&lt;/strong&gt; — all processing runs inside the browser using &lt;code&gt;PDF.js&lt;/code&gt; + HTML5 Canvas. No server, no uploads, ever.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;4 Quality Levels&lt;/strong&gt; — 1× (72 DPI) to 4× Ultra HD (288 DPI)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;PNG and JPEG output&lt;/strong&gt; — choose based on your use case&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Direct Folder Save&lt;/strong&gt; — saves all pages straight to a local folder using the Web File System Access API (no 50-click download loops)&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;ZIP Download&lt;/strong&gt; — package every page into one archive with a single click via &lt;code&gt;JSZip&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Memory-Safe Rendering&lt;/strong&gt; — explicit canvas + worker cleanup after each page so even 200-page PDFs don't crash your tab&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Drag &amp;amp; Drop&lt;/strong&gt; — works on the whole page&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Lightbox Gallery&lt;/strong&gt; — click any converted page to zoom in&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Works fully offline&lt;/strong&gt; after first load&lt;/li&gt;
&lt;/ul&gt;


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

&lt;p&gt;No frameworks. No build step. No &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Structure&lt;/td&gt;
&lt;td&gt;Semantic HTML5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logic&lt;/td&gt;
&lt;td&gt;Vanilla JavaScript (ES6+)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling&lt;/td&gt;
&lt;td&gt;Pure CSS3 with custom properties + backdrop-filter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PDF Engine&lt;/td&gt;
&lt;td&gt;Mozilla &lt;code&gt;PDF.js&lt;/code&gt; v3.11.174&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Archiving&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;JSZip&lt;/code&gt; v3.10.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Icons&lt;/td&gt;
&lt;td&gt;FontAwesome v6.4.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The entire app is ~1,537 lines across 3 files. Open &lt;code&gt;index.html&lt;/code&gt; and it just works.&lt;/p&gt;


&lt;h2&gt;
  
  
  How It Works — Core Rendering Loop
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;PDF.js&lt;/code&gt; renders each page onto a hidden &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;. That canvas gets exported as a PNG/JPEG &lt;code&gt;Blob&lt;/code&gt;. That's it.&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="c1"&gt;// PDF never leaves the browser — loaded from ArrayBuffer&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pdfDocument&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pdfjsLib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getDocument&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;arrayBuffer&lt;/span&gt; &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;pageNum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;pageNum&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;pdfDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;numPages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;pageNum&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pdfDocument&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pageNum&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Scale controls DPI: 1.0 = 72 DPI, 4.0 = 288 DPI&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;viewport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getViewport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;scaleValue&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;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;viewport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;viewport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;canvasContext&lt;/span&gt;&lt;span class="p"&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;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;viewport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;viewport&lt;/span&gt;
  &lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nx"&gt;promise&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="s1"&gt;image/png&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.95&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Release GPU backing store immediately — critical for large PDFs&lt;/span&gt;
  &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cleanup&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;canvas.width = 0&lt;/code&gt; after each page is the important bit. Without it, rendering 100+ pages back-to-back exhausts GPU memory and crashes the tab around page 30–40.&lt;/p&gt;




&lt;h2&gt;
  
  
  Direct Folder Save
&lt;/h2&gt;

&lt;p&gt;Instead of downloading 50 individual files, you pick a local folder and all pages save directly into it — one click, zero prompts. This uses the &lt;strong&gt;File System Access API&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;saveImagesToLocalFolder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dirHandle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;showDirectoryPicker&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;imgObj&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;convertedImages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fileHandle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;dirHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getFileHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imgObj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&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;writable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fileHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createWritable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imgObj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;blob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Supported on Chrome/Edge 86+. Firefox users fall back to the ZIP download automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Actual Workflow
&lt;/h2&gt;

&lt;p&gt;Here's how I use it now when studying:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;a href="https://pdf-2-image.netlify.app/" rel="noopener noreferrer"&gt;pdf-2-image.netlify.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Drop the PDF (textbook chapter, scanned notes, whatever)&lt;/li&gt;
&lt;li&gt;Set quality to &lt;strong&gt;2× (144 DPI)&lt;/strong&gt; — sharp text, reasonable file size&lt;/li&gt;
&lt;li&gt;Save to folder or grab the ZIP&lt;/li&gt;
&lt;li&gt;Upload images directly to Gemini / ChatGPT&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The difference in how accurately the AI reads the content is significant — especially for anything with equations, diagrams, or handwriting.&lt;/p&gt;




&lt;h2&gt;
  
  
  Challenges Building This
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Memory management on large PDFs&lt;/strong&gt; was the hardest part. Browsers don't garbage-collect canvas GPU memory fast enough when rendering 100+ pages sequentially. Spent a while debugging why 150-page PDFs froze the tab — the fix was aggressively calling &lt;code&gt;canvas.width = 0&lt;/code&gt; and &lt;code&gt;page.cleanup()&lt;/code&gt; after every single render.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File System Access API edge cases&lt;/strong&gt; — permission revocation mid-save, network drives, cross-origin restrictions. Required proper error handling and graceful fallback to individual Blob downloads.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run It Locally in 30 Seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/S-SUJAN-S/pdf-2-image.git
&lt;span class="nb"&gt;cd &lt;/span&gt;pdf-2-image
python &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8000
&lt;span class="c"&gt;# Open http://localhost:8000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No npm. No config. Any static HTTP server works — it's just HTML, CSS, and JS.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open Source — PRs Welcome
&lt;/h2&gt;

&lt;p&gt;MIT licensed. Things I'd love help with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page range selection (e.g. convert only pages 5–12)&lt;/li&gt;
&lt;li&gt;Multi-PDF batch processing&lt;/li&gt;
&lt;li&gt;WEBP output format&lt;/li&gt;
&lt;li&gt;Firefox File System Access API support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fork it → &lt;a href="https://github.com/S-SUJAN-S/pdf-2-image" rel="noopener noreferrer"&gt;github.com/S-SUJAN-S/pdf-2-image&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Live App: &lt;a href="https://pdf-2-image.netlify.app/" rel="noopener noreferrer"&gt;pdf-2-image.netlify.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📦 GitHub: &lt;a href="https://github.com/S-SUJAN-S/pdf-2-image" rel="noopener noreferrer"&gt;github.com/S-SUJAN-S/pdf-2-image&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📺 Channel: &lt;a href="https://youtube.com/@BlinkNBuild" rel="noopener noreferrer"&gt;youtube.com/@BlinkNBuild&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Have you run into the PDF math problem with AI tools? Or do you have a different workflow for feeding study material to AI? Drop it in the comments — would love to hear what's working for you. 👇&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Built a Free OLED Pixel Editor for Arduino &amp; ESP32 🖊</title>
      <dc:creator>BlinkNBuild</dc:creator>
      <pubDate>Sun, 19 Apr 2026 05:15:17 +0000</pubDate>
      <link>https://dev.to/blinknbuild/i-built-a-free-oled-pixel-editor-for-arduino-esp32-31a5</link>
      <guid>https://dev.to/blinknbuild/i-built-a-free-oled-pixel-editor-for-arduino-esp32-31a5</guid>
      <description>&lt;p&gt;I kept converting OLED bitmaps manually for every Arduino project — drawing on graph paper, counting pixels, writing byte arrays by hand.&lt;/p&gt;

&lt;p&gt;So I built a tool that does all of it visually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔴 Live → &lt;a href="https://oled-pixel-editor.netlify.app" rel="noopener noreferrer"&gt;oled-pixel-editor.netlify.app&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;⭐ GitHub → &lt;a href="https://github.com/S-SUJAN-S/oled-pixel-editor" rel="noopener noreferrer"&gt;S-SUJAN-S/oled-pixel-editor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;📺 Watch the full tutorial on how to use this:&lt;/p&gt;

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




&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Think MS Paint — but every pixel maps directly to a pixel on your SSD1306 OLED display.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15 shape tools&lt;/strong&gt; — circle, ellipse, triangle, star, arrow and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selection system&lt;/strong&gt; — move, resize, copy, paste, crop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;16 resolution presets&lt;/strong&gt; — 128×64, 128×32, 96×16 and more + custom up to 1024×1024&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export as PNG, CSV, C Array, or a complete Arduino sketch (.ino)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;80-step undo/redo&lt;/strong&gt;, touch + pinch-zoom support&lt;/li&gt;
&lt;li&gt;Single HTML file — no install, works offline&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The export that actually matters
&lt;/h2&gt;

&lt;p&gt;Click &lt;strong&gt;Arduino Sketch&lt;/strong&gt; → get a complete &lt;code&gt;.ino&lt;/code&gt; ready to flash:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clearDisplay&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;drawBitmap&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="n"&gt;myBitmap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SSD1306_WHITE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;display&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open in Arduino IDE → Upload. Done.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Currently configured for &lt;strong&gt;ESP8266 NodeMCU&lt;/strong&gt;. Multi-board support (ESP32, Uno, Nano) is on the roadmap.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Image import — auto-dither PNG/JPG to monochrome&lt;/li&gt;
&lt;li&gt;[ ] Video import — frame-by-frame OLED animations&lt;/li&gt;
&lt;li&gt;[ ] Multi-board export — ESP32, Arduino Uno/Nano, STM32&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;It's free, open source, and I'm actively building on it.&lt;br&gt;
If you use OLED displays in your projects, give it a try and let me know what you think 👇&lt;/p&gt;

&lt;p&gt;&lt;em&gt;— Sujan, &lt;a href="https://www.youtube.com/@BlinkNBuild" rel="noopener noreferrer"&gt;BlinkNBuild&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Vibe Coded a Balloon Popping Game Using Claude AI 🎈</title>
      <dc:creator>BlinkNBuild</dc:creator>
      <pubDate>Tue, 17 Mar 2026 04:00:00 +0000</pubDate>
      <link>https://dev.to/blinknbuild/i-vibe-coded-a-balloon-popping-game-using-claude-ai-2l42</link>
      <guid>https://dev.to/blinknbuild/i-vibe-coded-a-balloon-popping-game-using-claude-ai-2l42</guid>
      <description>&lt;h2&gt;
  
  
  What I Built 🎮
&lt;/h2&gt;

&lt;p&gt;A fully playable &lt;strong&gt;balloon popping arcade game&lt;/strong&gt; that runs entirely in the browser — built using &lt;strong&gt;Claude AI&lt;/strong&gt; (vibe coding). No React, no libraries, no build tools. Just one &lt;code&gt;index.html&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;🎈 &lt;strong&gt;Play it live → &lt;a href="https://balloon-blaster.netlify.app" rel="noopener noreferrer"&gt;balloon-blaster.netlify.app&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
💻 &lt;strong&gt;Code → &lt;a href="https://github.com/S-SUJAN-S/balloon-blaster" rel="noopener noreferrer"&gt;github.com/S-SUJAN-S/balloon-blaster&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;

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







&lt;h2&gt;
  
  
  What is Vibe Coding?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Vibe coding&lt;/strong&gt; = you describe what you want to an AI, it builds it, you iterate, you ship.&lt;/p&gt;

&lt;p&gt;No boilerplate. No setup. No framework debates. Just:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Describe the idea&lt;/li&gt;
&lt;li&gt;Let the AI build it&lt;/li&gt;
&lt;li&gt;Test, tweak, ship&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I used &lt;strong&gt;Claude AI&lt;/strong&gt; for the entire thing — and honestly it was a great experience.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's in the Game
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🎯 3 balloon sizes with different point values&lt;/li&gt;
&lt;li&gt;💥 Combo multiplier system&lt;/li&gt;
&lt;li&gt;⚡ 8 power-ups — Rapid Fire, Shield, Tri-Shot, Freeze, Extra Life, Bomb, Double Score, Laser&lt;/li&gt;
&lt;li&gt;🎆 Particle burst effects on every pop&lt;/li&gt;
&lt;li&gt;🌠 Animated star background with meteor streaks&lt;/li&gt;
&lt;li&gt;📱 Mobile touch support&lt;/li&gt;
&lt;li&gt;💾 High score saved locally&lt;/li&gt;
&lt;li&gt;🔊 Sound effects — all synthesized in-browser, zero audio files&lt;/li&gt;
&lt;li&gt;3 difficulty levels — Easy, Medium, Hard&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Honestly? I just described what I wanted to Claude AI and iterated.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Make a balloon shooting game in a single HTML file, portrait canvas, with a shooter at the bottom, balloons falling from the top, combo system, and power-ups"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From there it was just:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testing what worked&lt;/li&gt;
&lt;li&gt;Describing what to fix or add&lt;/li&gt;
&lt;li&gt;Deploying to Netlify with a drag and drop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total time from idea to live URL — a couple of hours.&lt;/p&gt;




&lt;h2&gt;
  
  
  Run It Locally
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/S-SUJAN-S/balloon-blaster.git
&lt;span class="nb"&gt;cd &lt;/span&gt;balloon-blaster
&lt;span class="c"&gt;# Just open index.html in your browser&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No &lt;code&gt;npm install&lt;/code&gt;. No config. Just open and play.&lt;/p&gt;




&lt;h2&gt;
  
  
  Deploy in 30 Seconds
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;&lt;a href="https://netlify.com" rel="noopener noreferrer"&gt;netlify.com&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Drag your &lt;code&gt;index.html&lt;/code&gt; onto the drop zone&lt;/li&gt;
&lt;li&gt;Done — live URL instantly&lt;/li&gt;
&lt;/ol&gt;




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

&lt;p&gt;Vibe coding is a real workflow. You don't need to understand every line to ship something fun and working. The key is knowing &lt;strong&gt;what&lt;/strong&gt; you want to build clearly enough to describe it — the AI handles the how.&lt;/p&gt;

&lt;p&gt;Drop a &lt;strong&gt;comment&lt;/strong&gt; if you want me to do a proper walkthrough of the vibe coding process — I'll make a full video on &lt;a href="https://www.youtube.com/@BlinkNBuild" rel="noopener noreferrer"&gt;BlinkNBuild&lt;/a&gt;!&lt;/p&gt;




&lt;p&gt;🎮 Play → &lt;a href="https://balloon-blaster.netlify.app" rel="noopener noreferrer"&gt;balloon-blaster.netlify.app&lt;/a&gt;&lt;br&gt;
💻 Code → &lt;a href="https://github.com/S-SUJAN-S/balloon-blaster" rel="noopener noreferrer"&gt;github.com/S-SUJAN-S/balloon-blaster&lt;/a&gt;&lt;br&gt;
📺 Watch → &lt;a href="https://www.youtube.com/@BlinkNBuild" rel="noopener noreferrer"&gt;youtube.com/@BlinkNBuild&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Claude AI ⚡ | BlinkNBuild&lt;/em&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>gamedev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Built a 3D Snake Game with Three.js — Runs in a Single HTML File</title>
      <dc:creator>BlinkNBuild</dc:creator>
      <pubDate>Mon, 02 Mar 2026 14:31:43 +0000</pubDate>
      <link>https://dev.to/blinknbuild/i-built-a-3d-snake-game-with-threejs-runs-in-a-single-html-file-1n7</link>
      <guid>https://dev.to/blinknbuild/i-built-a-3d-snake-game-with-threejs-runs-in-a-single-html-file-1n7</guid>
      <description>&lt;p&gt;I challenged myself to build a full 3D browser game with zero dependencies and no build step. Just one &lt;code&gt;index.html&lt;/code&gt; and a Three.js CDN link.&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;Serpentine&lt;/strong&gt; — a 3D snake game with WebGL graphics, particle effects, and mobile joystick support.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎮 Gameplay Demo
&lt;/h2&gt;

&lt;p&gt;

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


&lt;/p&gt;




&lt;h2&gt;
  
  
  ✨ Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;3 difficulty levels — Easy, Medium, Hard&lt;/li&gt;
&lt;li&gt;WebGL 3D graphics with particle effects on food pickup&lt;/li&gt;
&lt;li&gt;Mouse, Joystick &amp;amp; Swipe control modes&lt;/li&gt;
&lt;li&gt;Persistent high scores per difficulty&lt;/li&gt;
&lt;li&gt;Achievement toasts at score milestones&lt;/li&gt;
&lt;li&gt;Zero dependencies — pure HTML + JS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🕹️ Controls
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mouse&lt;/td&gt;
&lt;td&gt;Guide the snake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WASD / Arrows&lt;/td&gt;
&lt;td&gt;Keyboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Space&lt;/td&gt;
&lt;td&gt;Pause / Resume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;Switch control mode&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  🔗 Links
&lt;/h2&gt;

&lt;p&gt;🎮 &lt;a href="https://serpentine-game.netlify.app" rel="noopener noreferrer"&gt;Play Live → serpentine-game.netlify.app&lt;/a&gt;&lt;br&gt;
⭐ &lt;a href="https://github.com/S-SUJAN-S/serpentine-game" rel="noopener noreferrer"&gt;GitHub → github.com/S-SUJAN-S/serpentine-game&lt;/a&gt;&lt;br&gt;
🎲 &lt;a href="https://s-sujan-s.itch.io/serpentine-3d-snake" rel="noopener noreferrer"&gt;itch.io → s-sujan-s.itch.io/serpentine-3d-snake&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to fork it and build on top — the source is clean and readable!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webgl</category>
      <category>threejs</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Building a Free Markdown to PDF Converter (No Sign-ups, 100% Browser-Based)</title>
      <dc:creator>BlinkNBuild</dc:creator>
      <pubDate>Tue, 24 Feb 2026 18:58:07 +0000</pubDate>
      <link>https://dev.to/blinknbuild/building-a-free-markdown-to-pdf-converter-no-sign-ups-100-browser-based-4fek</link>
      <guid>https://dev.to/blinknbuild/building-a-free-markdown-to-pdf-converter-no-sign-ups-100-browser-based-4fek</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I was constantly frustrated with existing markdown to PDF converters. Most of them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Required sign-ups and accounts&lt;/li&gt;
&lt;li&gt;Had paywalls or subscription fees&lt;/li&gt;
&lt;li&gt;Uploaded your files to their servers (privacy concerns)&lt;/li&gt;
&lt;li&gt;Had clunky interfaces&lt;/li&gt;
&lt;li&gt;Broke formatting on code blocks or math equations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I just wanted something simple that worked in my browser without jumping through hoops. So I decided to build my own.&lt;/p&gt;

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

&lt;p&gt;A completely free, browser-based markdown to PDF converter that runs 100% client-side. No servers, no data collection, no sign-ups required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it here:&lt;/strong&gt; &lt;a href="https://free-markdown-to-pdf.netlify.app/" rel="noopener noreferrer"&gt;https://free-markdown-to-pdf.netlify.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/S-SUJAN-S/free-markdown-to-pdf" rel="noopener noreferrer"&gt;https://github.com/S-SUJAN-S/free-markdown-to-pdf&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Preview&lt;/strong&gt; - See your formatted content as you type&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Syntax Highlighting&lt;/strong&gt; - Code blocks look professional with Highlight.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Math Equations&lt;/strong&gt; - LaTeX math rendering using KaTeX&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple Themes&lt;/strong&gt; - Dark mode, light mode, and high contrast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customization&lt;/strong&gt; - Adjust fonts, spacing, margins to your liking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy First&lt;/strong&gt; - Everything runs in your browser, zero data collection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Installation&lt;/strong&gt; - Just open the URL and start using it&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I kept it simple and used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React&lt;/strong&gt; (loaded via CDN)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Babel Standalone&lt;/strong&gt; (for in-browser JSX compilation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Marked.js&lt;/strong&gt; (markdown parsing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Highlight.js&lt;/strong&gt; (syntax highlighting for code)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KaTeX&lt;/strong&gt; (LaTeX math rendering)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Fonts&lt;/strong&gt; (Fraunces, DM Sans, JetBrains Mono)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire thing is a &lt;strong&gt;single HTML file&lt;/strong&gt; - no complex build process, no npm dependencies to install locally. Just clone and open!&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The workflow is super simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste your markdown content&lt;/li&gt;
&lt;li&gt;See it formatted in real-time&lt;/li&gt;
&lt;li&gt;Customize if needed (fonts, themes, spacing)&lt;/li&gt;
&lt;li&gt;Use your browser's print function to save as PDF&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since everything runs client-side, your content never leaves your browser. I literally cannot see what you're converting even if I wanted to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a Single HTML File?
&lt;/h2&gt;

&lt;p&gt;I wanted this to be as accessible as possible. Anyone should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone the repo and open &lt;code&gt;index.html&lt;/code&gt; &lt;/li&gt;
&lt;li&gt;Host it anywhere (GitHub Pages, Netlify, their own server)&lt;/li&gt;
&lt;li&gt;Modify it without needing to understand webpack or build tools&lt;/li&gt;
&lt;li&gt;Use it offline once the page loads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus, it makes the code easy to read and understand for beginners.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;p&gt;I built this originally to save formatted conversations and notes, but people can use it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Converting documentation&lt;/li&gt;
&lt;li&gt;Creating PDFs from markdown notes&lt;/li&gt;
&lt;li&gt;Formatting research papers&lt;/li&gt;
&lt;li&gt;Saving formatted conversations from AI tools&lt;/li&gt;
&lt;li&gt;Quick markdown previewing&lt;/li&gt;
&lt;li&gt;Any markdown → PDF needs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Challenges I Faced
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Math Rendering
&lt;/h3&gt;

&lt;p&gt;Getting KaTeX to work properly with various LaTeX syntax was tricky. I had to handle both inline math (&lt;code&gt;$...$&lt;/code&gt;) and display math (&lt;code&gt;$$...$$&lt;/code&gt;) correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Print Styling
&lt;/h3&gt;

&lt;p&gt;Making sure the PDF output looked exactly like the preview required a lot of CSS tweaking with &lt;code&gt;@media print&lt;/code&gt; queries.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Theme Switching
&lt;/h3&gt;

&lt;p&gt;Implementing multiple themes while maintaining consistency across all UI elements took more work than expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Code Block Formatting
&lt;/h3&gt;

&lt;p&gt;Ensuring code blocks looked good in both the preview and the final PDF required careful styling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;I'm thinking about adding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Export to Word/HTML formats&lt;/li&gt;
&lt;li&gt;Preset templates for different document types&lt;/li&gt;
&lt;li&gt;Batch conversion (multiple files at once)&lt;/li&gt;
&lt;li&gt;More theme options&lt;/li&gt;
&lt;li&gt;Table of contents generation&lt;/li&gt;
&lt;li&gt;Custom CSS injection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What features would you find useful?&lt;/strong&gt; Let me know in the comments!&lt;/p&gt;

&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;The project is fully open source with an MIT license. Feel free to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use it for any purpose&lt;/li&gt;
&lt;li&gt;Fork it and make your own version&lt;/li&gt;
&lt;li&gt;Submit PRs for improvements&lt;/li&gt;
&lt;li&gt;Report bugs or request features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Links:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Live Demo: &lt;a href="https://free-markdown-to-pdf.netlify.app/" rel="noopener noreferrer"&gt;https://free-markdown-to-pdf.netlify.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub Repo: &lt;a href="https://github.com/S-SUJAN-S/free-markdown-to-pdf" rel="noopener noreferrer"&gt;https://github.com/S-SUJAN-S/free-markdown-to-pdf&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Out!
&lt;/h2&gt;

&lt;p&gt;I'd love to hear your feedback. If you find it useful, give it a star on GitHub! And if you find bugs or have feature suggestions, open an issue.&lt;/p&gt;

&lt;p&gt;Happy converting! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you built any side projects to solve your own problems? Share them in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
