<?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: VIMAL KUMAR</title>
    <description>The latest articles on DEV Community by VIMAL KUMAR (@vimal).</description>
    <link>https://dev.to/vimal</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%2F360160%2Ff3eee05b-ea8c-44b8-a0fe-841ca719cb89.png</url>
      <title>DEV Community: VIMAL KUMAR</title>
      <link>https://dev.to/vimal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vimal"/>
    <language>en</language>
    <item>
      <title>Bloom &amp; Nurture: A Private Pregnancy Companion Built with Gemma 2 for a Friend</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Sat, 03 Oct 2026 08:08:43 +0000</pubDate>
      <link>https://dev.to/vimal/bloom-nurture-a-private-pregnancy-companion-built-with-gemma-2-for-a-friend-2f8i</link>
      <guid>https://dev.to/vimal/bloom-nurture-a-private-pregnancy-companion-built-with-gemma-2-for-a-friend-2f8i</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;A few weeks ago, I was catching up with a close friend who recently entered her second trimester (15 weeks along). As we talked about her journey, what struck me most was how much daily mental coordination pregnancy requires—managing fluctuating energy levels, staying on top of hydration, remembering daily vitamins, and navigating constant questions about what her body and baby are experiencing each week.&lt;br&gt;
To support her through this special chapter, I built &lt;strong&gt;Bloom &amp;amp; Nurture&lt;/strong&gt;—a warm, all-in-one pregnancy companion web app powered by open-source AI (Google Gemma 2). &lt;br&gt;
Designed to be gentle, intuitive, and easy to use for anyone without any technical setup, Bloom &amp;amp; Nurture brings together all the essential daily tools an expectant mother needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ask Gemma AI (A Compassionate 24/7 Companion)&lt;/strong&gt;:
A conversational companion tuned specifically for pregnancy. Whenever she wonders about sudden twinges, safe exercises, nutrition ideas, or sleep positions, she can chat freely with Gemma. It responds with medical warmth, structuring its answers in clear, beautiful bullet points with bold highlights and essential safety guidance on when to consult her doctor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personalized Week-by-Week Guide (Weeks 1 to 40)&lt;/strong&gt;:
The app automatically detects her current stage (Week 15, Trimester 2) and puts her exact week right on screen. She can see:

&lt;ul&gt;
&lt;li&gt;Her baby's adorable fruit size comparison (like an &lt;strong&gt;Apple 🍎&lt;/strong&gt; at Week 15!).&lt;/li&gt;
&lt;li&gt;Exact length (~10.1 cm) and weight (~70 g) milestones.&lt;/li&gt;
&lt;li&gt;What baby is doing inside (sensing light through the tummy, bones hardening from cartilage).&lt;/li&gt;
&lt;li&gt;What mom's body is experiencing, along with doctor-approved self-care tips.&lt;/li&gt;
&lt;li&gt;Quick filters to explore past or future trimesters whenever she wants.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smart Hydration &amp;amp; Daily Vitamin Tracker&lt;/strong&gt;:
Staying well-hydrated is critical for maintaining healthy amniotic fluid levels and preventing muscle cramps. The app includes:

&lt;ul&gt;
&lt;li&gt;A visual hydration progress ring.&lt;/li&gt;
&lt;li&gt;Quick one-tap water logging (+250ml, +500ml).&lt;/li&gt;
&lt;li&gt;Soothing audio chimes and configurable reminder intervals.&lt;/li&gt;
&lt;li&gt;A clean checklist for prenatal vitamins, iron, and calcium.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Essential Labor &amp;amp; Care Tools&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kick Counter&lt;/strong&gt;: A calming tool ready for when she starts feeling active kicks, ensuring healthy fetal movements within 2 hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contraction Timer&lt;/strong&gt;: A simple one-tap timer that measures duration and intervals, automatically calculating whether contractions meet the clinical &lt;strong&gt;"5-1-1 Rule"&lt;/strong&gt; (5 minutes apart, 1 minute long, for 1 hour) so parents know when to head to the hospital.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hospital Bag Checklist&lt;/strong&gt;: A categorized, interactive checklist covering essentials for mom, baby, and birth partner.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private &amp;amp; Hassle-Free by Design&lt;/strong&gt;:
The app requires no account creation, passwords, or complex configurations. Everything saves instantly and safely to her device, and the AI runs directly on open weights for complete personal privacy.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Web App&lt;/strong&gt;: &lt;a href="https://pregnancy-sxq4.onrender.com/" rel="noopener noreferrer"&gt;pregnancy-sxq4.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/vimal-verma/bloom" rel="noopener noreferrer"&gt;github.com/vimal-verma/bloom&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Screenshots &amp;amp; Highlights:
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1. Daily Journey Dashboard (Week 15 • Apple 🍎)
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Personalized stage tracker with daily countdown, baby fruit size comparison, trimester progress bar, and today's schedule at a glance.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg3ilccy8xf983w1ujpf0.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%2Fg3ilccy8xf983w1ujpf0.png" alt="My Journey Dashboard" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Ask Gemma AI (Private Obstetric Companion)
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Tuned specifically with obstetric and maternal guidelines. Answers questions about symptoms, nutrition, and fetal development in clean, structured Markdown bullet points with medical safety disclaimers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5uoor2u3bh9a0munzrix.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%2F5uoor2u3bh9a0munzrix.png" alt="Ask Gemma AI" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Daily Hydration &amp;amp; Prenatal Medicine Tracker
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Helps prevent cramps and maintain amniotic fluid levels with interactive glass logging, customizable reminder schedules, soothing audio chimes, and prenatal vitamin checklists.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo1r7du1kvrlhwef4cg8j.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%2Fo1r7du1kvrlhwef4cg8j.png" alt="Hydration &amp;amp; Medicine Tracker" width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Week-by-Week Visual Pregnancy Guide (Weeks 1 to 40)
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Automatically detects and centers on mom's active week. Explores baby anatomy milestones, maternal body changes, and practical self-care tips for every stage of pregnancy.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7nfd6x2bhswpji64k35l.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%2F7nfd6x2bhswpji64k35l.png" alt="Week by Week Guide" width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  5. Maternal Care Tools
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Practical peace-of-mind tools including a Fetal Movement &amp;amp; Kick Counter (2-hour window logging), a Contraction Timer with automatic clinical **5-1-1 Rule&lt;/em&gt;* triage indicator, and a Hospital Bag Checklist.*&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%2F1e4k3rz7kesmh3xouxde.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%2F1e4k3rz7kesmh3xouxde.png" alt="Care Tools" width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The complete source code is open source and available on GitHub:&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vimal-verma" rel="noopener noreferrer"&gt;
        vimal-verma
      &lt;/a&gt; / &lt;a href="https://github.com/vimal-verma/Bloom" rel="noopener noreferrer"&gt;
        Bloom
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;🌸 Bloom &amp;amp; Nurture — Pregnancy &amp;amp; Daily Wellness Companion&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;A gentle, compassionate, and &lt;strong&gt;100% private pregnancy companion&lt;/strong&gt; powered by open-source AI (&lt;strong&gt;Google Gemma 2 via Ollama&lt;/strong&gt;). Built with love for an expectant friend at Week 15 (Trimester 2).&lt;/p&gt;


&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://nextjs.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9138ed5c9d68e701d0ae3e717feac0067aaed3ed20f08485c81521669c95b55b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6578742e6a732d31362e332d626c61636b3f6c6f676f3d6e6578742e6a73" alt="Next.js 16"&gt;&lt;/a&gt;
&lt;a href="https://react.dev/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/82feaf9256cac388a4616c479605e24b8a78e6f70c8d43f76e7190b51b92bc6c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742d31392e322d626c75653f6c6f676f3d7265616374" alt="React 19"&gt;&lt;/a&gt;
&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b6e60d1c77025303d41274ab6f8fcd75c63fecb27480826c7af7a7bebd4b988d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f41492d47656d6d615f325f283242292d726f73653f6c6f676f3d676f6f676c65" alt="Gemma 2"&gt;&lt;/a&gt;
&lt;a href="https://tailwindcss.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/bd6ea6db89c1d8df815a8e0d774704c9093881afa576d62492014a6c6d57efb8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5461696c77696e645f4353532d76342d3338626466383f6c6f676f3d7461696c77696e64637373" alt="Tailwind CSS"&gt;&lt;/a&gt;
&lt;a href="https://pregnancy-sxq4.onrender.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/713c4d9a35b3574abaa2cffc9d421847085602cf6e409d0a9f212857734731a0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4465706c6f792d52656e6465722d3436653362373f6c6f676f3d72656e646572" alt="Render Deploy"&gt;&lt;/a&gt;
&lt;a href="https://pregnancy-sxq4.onrender.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/8a19d11fe00c241f4cbc665992a6edd92427d7b0937ac904b7f61842e0617701/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6976655f4170702d707265676e616e63792d2d737871342e6f6e72656e6465722e636f6d2d726f7365" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://github.com/vimal-verma/Bloom#privacy--open-source-advantage" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f43f0461a3b7f840eeba507029e416e970f6e621139eea7a28fbdb75f7ba1b95/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507269766163792d3130302532355f4c6f63616c5f265f507269766174652d656d6572616c64" alt="Privacy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live Web App&lt;/strong&gt;: &lt;a href="https://pregnancy-sxq4.onrender.com/" rel="nofollow noopener noreferrer"&gt;https://pregnancy-sxq4.onrender.com/&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/vimal-verma/bloom" rel="noopener noreferrer"&gt;https://github.com/vimal-verma/bloom&lt;/a&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📸 App Showcase&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;1. Daily Journey Dashboard (Week 15 • Apple 🍎)&lt;/h3&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Personalized stage tracker with daily countdown, baby fruit size comparison, trimester progress bar, and today's schedule at a glance.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/vimal-verma/Bloom/public/screenshot-journey.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fvimal-verma%2FBloom%2FHEAD%2Fpublic%2Fscreenshot-journey.png" alt="My Journey Dashboard"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;2. Ask Gemma AI (Private Obstetric Companion)&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Tuned specifically with obstetric and maternal guidelines. Answers questions about symptoms, nutrition, and fetal development in clean, structured Markdown bullet points with medical safety disclaimers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/vimal-verma/Bloom/public/screenshot-chat.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fvimal-verma%2FBloom%2FHEAD%2Fpublic%2Fscreenshot-chat.png" alt="Ask Gemma AI"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;3. Daily Hydration &amp;amp; Prenatal Medicine Tracker&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Helps prevent cramps and maintain amniotic fluid levels with interactive glass logging, customizable reminder schedules, soothing audio chimes, and prenatal vitamin checklists.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/vimal-verma/Bloom/public/screenshot-hydration.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fvimal-verma%2FBloom%2FHEAD%2Fpublic%2Fscreenshot-hydration.png" alt="Hydration &amp;amp; Medicine Tracker"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;4. Week-by-Week Visual Pregnancy Guide (Weeks&lt;/h3&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vimal-verma/Bloom" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
Repository highlights:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/vimal-verma/pregnancy/blob/master/Modelfile" rel="noopener noreferrer"&gt;&lt;code&gt;Modelfile&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;: Custom Ollama configuration fine-tuning Gemma 2:2b into a specialized pregnancy assistant (&lt;code&gt;pregnancy-gemma&lt;/code&gt;) with obstetric safety guardrails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/vimal-verma/pregnancy/blob/master/app/api/chat/route.js" rel="noopener noreferrer"&gt;&lt;code&gt;app/api/chat/route.js&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;: Resilient streaming API endpoint supporting dual providers: local Ollama inference and Google Gemini 2.0 Flash fallback with automatic model discovery and streaming SSE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/vimal-verma/pregnancy/blob/master/app/components/MarkdownRenderer.jsx" rel="noopener noreferrer"&gt;&lt;code&gt;app/components/MarkdownRenderer.jsx&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;: Custom Tailwind-styled Markdown engine rendering bold highlights, clean headings, and bullet points.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/vimal-verma/pregnancy/blob/master/render.yaml" rel="noopener noreferrer"&gt;&lt;code&gt;render.yaml&lt;/code&gt;&lt;/a&gt;&lt;/strong&gt;: One-click blueprint deployment for Render.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  1. The Core: Open-Source AI with Gemma 2 &amp;amp; Ollama
&lt;/h3&gt;

&lt;p&gt;At the heart of the application is &lt;strong&gt;Google Gemma 2 (2B)&lt;/strong&gt;, an open-weight, high-efficiency model that runs blazingly fast on consumer laptops:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Obstetric Grounding&lt;/strong&gt;: Using an Ollama &lt;code&gt;Modelfile&lt;/code&gt;, I gave Gemma 2 a tailored system personality (&lt;code&gt;Pregnancy Gemma&lt;/code&gt;). It injects dynamic trimester and gestational week context into every conversation, instructing the model to provide evidence-based reassurance while strictly enforcing clinical red-line warnings (e.g. severe bleeding, reduced fetal movement, vision changes).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Streaming Inference&lt;/strong&gt;: Connected the Next.js server-side route to Ollama's &lt;code&gt;/api/chat&lt;/code&gt; streaming endpoint, piping tokens directly to the browser with zero latency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Modern Web Architecture
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16 (App Router) + React 19 + Turbopack&lt;/strong&gt;: High-performance client-side hydration paired with lightweight server routes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt;: Crafted a calming, warm maternal color palette using soft rose golds, coral accents, glassmorphic cards, and soothing micro-interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual-Mode AI Bridge&lt;/strong&gt;: For desktop use, mothers can run Gemma completely offline on their laptop (&lt;code&gt;http://localhost:11434&lt;/code&gt;). For mobile browsing or cloud hosting, the app includes built-in Ngrok tunnel support and a Google Gemini 2.0 Flash cloud connector with automatic fallback.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Pregnancy is the ultimate test case for why open-source AI matters:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Privacy for Sensitive Health Data&lt;/strong&gt;:
Maternal health and cycle data are among the most sensitive personal data points that exist. With closed SaaS APIs, user prompts and health status are sent to remote corporate servers, where data policies can change overnight. By building around &lt;strong&gt;open-weight Gemma 2 running locally in Ollama&lt;/strong&gt;, my friend's queries and ultrasound notes &lt;strong&gt;never leave her hardware&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Operating Cost &amp;amp; Forever Free&lt;/strong&gt;:
Closed API tokens incur ongoing costs that force apps to impose subscriptions or display ads. Open weights run locally for free, meaning this tool can remain forever free for any expectant parent who needs it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailored Prompting &amp;amp; Safety Customization&lt;/strong&gt;:
With open models, developers have full authority over model behavior, temperature, system prompts, and safety rules without arbitrary content blocking or hidden moderation shifts.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;I am entering this project in the following categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  🌟 Best Use of Gemma
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Gemma 2 (&lt;code&gt;gemma2:2b&lt;/code&gt;)&lt;/strong&gt; is the foundational engine of Bloom &amp;amp; Nurture. We customized Gemma 2 using an Ollama &lt;code&gt;Modelfile&lt;/code&gt; to create a dedicated, compassionate obstetric assistant that understands fetal development, gestational weeks, and trimester nutrition, providing private, localized medical guidance right on the mother's device.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Best Use of Render
&lt;/h3&gt;

&lt;p&gt;The application is fully configured for Render with a declarative &lt;code&gt;render.yaml&lt;/code&gt; blueprint. It compiles Next.js with Turbopack and seamlessly handles webhooks, environment variables, and remote AI tunneling for 24/7 web access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handing It Over to My Friend
&lt;/h2&gt;

&lt;p&gt;When I showed the app to my friend and&lt;br&gt;
When she entered her due date, the entire interface immediately transformed for her:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Week 15 • Trimester 2 • Baby is approximately the size of an Apple 🍎!&lt;/strong&gt;&lt;br&gt;
Seeing the little apple milestone made her smile right away—she had just entered the second trimester and was excited to see what lay ahead. From there, she began exploring the features:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Testing Ask Gemma AI&lt;/strong&gt;:
She opened the chat and typed a question that had been on her mind all week:
&amp;gt; &lt;em&gt;"I'm at Week 15 and my nausea is finally fading, but I've been feeling sudden sharp twinges on the sides of my lower belly when I sneeze or get up quickly. Also, my nose has been weirdly congested. Is this normal, and when will I start feeling baby's first movements?"&lt;/em&gt;
Within seconds, Gemma generated a beautifully formatted, reassuring reply:

&lt;ul&gt;
&lt;li&gt;Clearly explaining &lt;strong&gt;Round Ligament stretching&lt;/strong&gt; as the uterus rises up out of the pelvis into the lower abdomen.&lt;/li&gt;
&lt;li&gt;Demystifying &lt;strong&gt;Pregnancy Rhinitis&lt;/strong&gt; (increased blood flow and hormones causing harmless nasal swelling) with gentle tips like using a saline spray or humidifier.&lt;/li&gt;
&lt;li&gt;Answering her kick question with excitement: explaining that first gentle fluttering movements (known as &lt;strong&gt;"quickening"&lt;/strong&gt;) usually begin between Weeks 16 and 20.&lt;/li&gt;
&lt;li&gt;Recommending good calcium intake (1,000 mg/day) to support baby's skeleton as it hardens from cartilage into bone.&lt;/li&gt;
&lt;li&gt;Concluding with clear, calming medical guidance on when to check in with her doctor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exploring the Water &amp;amp; Vitamin Tracker&lt;/strong&gt;:
She tapped the "+250ml" button, heard the gentle success chime, and watched the circular hydration ring advance toward her daily target. She was thrilled to have a clean checklist for her daily prenatal vitamins and calcium so she wouldn't have to second-guess herself later in the day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovering the Guide &amp;amp; Upcoming Care Tools&lt;/strong&gt;:
Browsing the &lt;strong&gt;Week-by-Week Guide&lt;/strong&gt;, she loved seeing what changes to expect over the next few weeks. Knowing that the app also includes a &lt;strong&gt;Kick Counter&lt;/strong&gt; ready for when her flutters begin, plus a &lt;strong&gt;Contraction Timer&lt;/strong&gt; and &lt;strong&gt;Hospital Bag Checklist&lt;/strong&gt; for later in her pregnancy, gave her an immediate feeling of preparedness.
Her reaction summed up everything I hoped to achieve:
&amp;gt; &lt;em&gt;"Having everything I need in one calm, beautiful place—from the daily water chimes to an AI that answers my questions with kindness and clear bullet points—takes so much anxiety off my shoulders. It feels like having a warm, knowledgeable companion walking with me every single day until delivery."&lt;/em&gt;
Seeing how much confidence and comfort it brought her was the most rewarding part of this challenge. It was proof that AI is at its best when it genuinely helps someone you love feel supported and cared for.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Thank you to DEV, GitHub, Hacktoberfest, and the partners for inspiring this build!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>How to Read and Write NFC Tags Directly in the Browser with the Web NFC API</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Sat, 29 Aug 2026 07:47:51 +0000</pubDate>
      <link>https://dev.to/vimal/how-to-read-and-write-nfc-tags-directly-in-the-browser-with-the-web-nfc-api-3gg6</link>
      <guid>https://dev.to/vimal/how-to-read-and-write-nfc-tags-directly-in-the-browser-with-the-web-nfc-api-3gg6</guid>
      <description>&lt;p&gt;Near Field Communication (NFC) used to require native iOS or Android mobile applications. With the &lt;strong&gt;Web NFC API&lt;/strong&gt;, modern web apps can now read and write physical NFC tags directly in the browser—no app store downloads needed!&lt;br&gt;
Whether you are building digital business cards (vCards), smart event passes, Wi-Fi credentials sharing, or hardware tap-to-pay experiences, Web NFC unlocks a whole new dimension of web-to-physical interactions.&lt;br&gt;
In this guide, we'll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📱 &lt;strong&gt;Browser &amp;amp; device support&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Reading data from NFC tags (&lt;code&gt;NDEFReader.scan&lt;/code&gt;)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✍️ &lt;strong&gt;Writing text, URLs, and vCards (&lt;code&gt;NDEFReader.write&lt;/code&gt;)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🔒 &lt;strong&gt;Locking tags to read-only (&lt;code&gt;makeReadOnly&lt;/code&gt;)&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;⚠️ &lt;strong&gt;Security &amp;amp; permission requirements&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  📱 Browser &amp;amp; Hardware Requirements
&lt;/h3&gt;

&lt;p&gt;Before writing code, keep in mind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Browser Support&lt;/strong&gt;: Currently supported natively in &lt;strong&gt;Chrome for Android&lt;/strong&gt; (v89+).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol&lt;/strong&gt;: Requires &lt;strong&gt;HTTPS&lt;/strong&gt; (&lt;code&gt;https://&lt;/code&gt;) or &lt;code&gt;localhost&lt;/code&gt; during development.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware&lt;/strong&gt;: An Android device with an active NFC chip and standard NDEF-compatible NFC tags (e.g., &lt;strong&gt;NTAG213&lt;/strong&gt;, &lt;strong&gt;NTAG215&lt;/strong&gt;, &lt;strong&gt;NTAG216&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Feature Detection
Always verify browser support before prompting the user:
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkNfcSupport&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NDEFReader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;✅ Web NFC is supported!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;⚠️ Web NFC is not available on this browser/device.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&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;ol&gt;
&lt;li&gt;Reading NFC Tags
To start scanning, instantiate NDEFReader and call .scan(). Must be triggered by a user action (e.g., a button click).
&lt;/li&gt;
&lt;/ol&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;startScanning&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&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;ndef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NDEFReader&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;ndef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;📡 NFC Scan started. Bring a tag close to your phone...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Event listener for reading NDEF messages&lt;/span&gt;
    &lt;span class="nx"&gt;ndef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;reading&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;serialNumber&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`✅ Tag Detected! Serial Number: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;serialNumber&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="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;record&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;records&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Record Type: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recordType&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`MIME Type:   &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;N/A&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle Text Records&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;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recordType&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textDecoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextDecoder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;encoding&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;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;textDecoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;gt; Text Payload: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle URL Records&lt;/span&gt;
        &lt;span class="k"&gt;else&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;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;recordType&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;textDecoder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextDecoder&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;urlContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;textDecoder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;gt; URL Payload: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;urlContent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="c1"&gt;// Handle vCards / Custom MIME Types&lt;/span&gt;
        &lt;span class="k"&gt;else&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;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mediaType&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/vcard&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;vcardText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextDecoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
          &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&amp;gt; vCard Content:\n&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;vcardText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;ndef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;readingerror&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;❌ Error reading NFC tag. Try positioning the tag closer.&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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Error starting scan: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Writing Data to NFC Tags
Writing to an NFC tag replaces existing NDEF records with new payloads.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A. Writing a Simple URL or Text&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;writeUrlToTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;urlToSave&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&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;ndef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NDEFReader&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;ndef&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="na"&gt;records&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;span class="na"&gt;recordType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;'&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;urlToSave&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;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🎉 Successfully wrote URL to NFC tag!&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Write failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="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;B. Writing a Digital Contact Card (vCard)&lt;br&gt;
You can write vCards using mediaType: 'text/vcard':&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;writeVCardToTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;contact&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;vcardPayload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BEGIN:VCARD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;VERSION:3.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;`FN:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;contact&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="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;`TEL:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;phone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;`EMAIL:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s2"&gt;`URL:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;contact&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;website&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;END:VCARD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\r\n&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;try&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;ndef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NDEFReader&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;ndef&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="na"&gt;records&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;span class="na"&gt;recordType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mime&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;mediaType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text/vcard&lt;/span&gt;&lt;span class="dl"&gt;'&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vcardPayload&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;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;📇 vCard written to NFC card successfully!&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`vCard write error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Locking Tags (Making Them Read-Only)
⚠️ Warning: Making a tag read-only is permanent and irreversible!
&lt;/li&gt;
&lt;/ol&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;lockTagPermanently&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;confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;confirm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Are you sure you want to permanently lock this tag? This cannot be undone!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;confirmed&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="k"&gt;try&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;ndef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NDEFReader&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;ndef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;makeReadOnly&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;🔒 Tag locked successfully. It can no longer be overwritten.&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Failed to lock tag: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="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;🛡️ Best Practices &amp;amp; Security&lt;br&gt;
User Gesture Requirement: Scanning and writing must be triggered by an explicit user gesture (e.g., button click).&lt;br&gt;
HTTPS Requirement: Modern Web NFC will fail on non-secure contexts (http://), except for local development (localhost).&lt;br&gt;
Handling Timeout: Use AbortController to handle scan timeouts or cancel operations if the user navigates away.&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;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;scanWithTimeout&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;ndef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;NDEFReader&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;ndef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Abort scan after 15 seconds if no tag is tapped&lt;/span&gt;
  &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;15000&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;🚀 Live Demo &amp;amp; Open Source Tools&lt;br&gt;
Want to test Web NFC directly in your browser without writing boilerplates?&lt;/p&gt;

&lt;p&gt;Check out &lt;a href="https://NfcTool.org" rel="noopener noreferrer"&gt;NfcTool.org&lt;/a&gt; — a free suite of browser-based Web NFC tools for:&lt;/p&gt;

&lt;p&gt;📖 Scanning &amp;amp; Inspecting NFC Tags&lt;br&gt;
✍️ Programming NFC Cards&lt;br&gt;
🔒 Locking &amp;amp; Formatting NDEF Payloads&lt;br&gt;
📇 Generating NFC vCards &amp;amp; QR Codes&lt;br&gt;
💬 What are you building with Web NFC?&lt;/p&gt;

&lt;p&gt;Are you experimenting with Web NFC for event check-ins, smart cards, inventory tags, or IoT devices? Share your thoughts and projects in the comments below! 👇&lt;/p&gt;

</description>
      <category>webnfc</category>
      <category>nfc</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>The "Invisible Tunnel": Host from Your Laptop via Oracle Cloud and Tailscale</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Sun, 01 Mar 2026 08:50:00 +0000</pubDate>
      <link>https://dev.to/vimal/the-invisible-tunnel-host-from-your-laptop-via-oracle-cloud-and-tailscale-18b5</link>
      <guid>https://dev.to/vimal/the-invisible-tunnel-host-from-your-laptop-via-oracle-cloud-and-tailscale-18b5</guid>
      <description>&lt;p&gt;Have you ever wanted to turn your local machine into server for your cools Projects.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll show you how to use an Oracle Cloud Free Tier instance as a "Public Gateway" to your laptop using Tailscale. No public ports open on your home router, no complex VPN configs—just a secure, encrypted tunnel.&lt;/p&gt;

&lt;p&gt;The Architecture&lt;br&gt;
We are creating a bridge.&lt;/p&gt;

&lt;p&gt;The Laptop: Runs your app (e.g., port 3000).&lt;/p&gt;

&lt;p&gt;Tailscale: Connects your laptop and VPS into a private "Tailnet."&lt;/p&gt;

&lt;p&gt;Oracle VPS: Acts as a Reverse Proxy using Nginx to take public traffic (Port 80/443) and send it down the tunnel.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. The Tailscale Magic
First, install Tailscale on both your laptop and your Oracle VPS.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://tailscale.com/install.sh | sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;tailscale up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Once both are authenticated, they will have private IPs (like 100.x.y.z). These IPs can "see" each other globally as if they were on the same Wi-Fi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2. Enable "Exit Node" (The Tunneling Part)
If your goal is to use the VPS as a tunnel for your other devices (so your home PC appears to have the VPS's IP address), you must advertise it as an exit node in your VPS:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;tailscale up &lt;span class="nt"&gt;--advertise-exit-node&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;3. Approve the Exit Node (Admin Console)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For security, Tailscale doesn't allow a device to become an exit node automatically.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open your Tailscale Admin Console.&lt;/li&gt;
&lt;li&gt;Find your VPS in the Machines list.&lt;/li&gt;
&lt;li&gt;Click the three dots (...) &amp;gt; Edit route settings.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check the box for Use as exit node and click Save.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4. How to use it on your other PC&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now that the VPS is ready, you can "tunnel" through it from your laptop or mobile:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On Windows/Mac: Click the Tailscale icon in the system tray &amp;gt; Exit Node &amp;gt; Select your VPS.&lt;/li&gt;
&lt;li&gt;On Linux: Run &lt;code&gt;tailscale up --exit-node=&amp;lt;vps-tailscale-ip&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;On Android/iOS: Open the app &amp;gt; Tap the "Exit Node" entry &amp;gt; Select your VPS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now You can run any server on any port in your local laptop&lt;br&gt;
and you can access from VPS by&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -I http://&amp;lt;laptop-tailscale-ip&amp;gt;:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will show your laptop server details&lt;br&gt;
means you have enable connection between VPS and local laptop&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5. Now you have to redirect your VPS public ip to laptop tunnel using ngnix (so anyone to your VPS public ip it will show your local server response )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install Nginx on the VPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;6. Configure Nginx on the VPS
On your VPS, create a new configuration file for your proxy:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/nginx/sites-available/tailscale-proxy
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure Nginx to Forward Traffic:&lt;br&gt;
Edit your Nginx config to "proxy" requests from the VPS public IP to your Home PC’s Tailscale IP.&lt;/p&gt;

&lt;p&gt;Nginx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Paste the following configuration into the file:

Nginx
server {
    listen 80;
    server_name _; # e.g., 1.2.3.4 or example.com _means all

    location / {
        # Redirect traffic to your Home PC's Tailscale IP
        proxy_pass http://100.10.20.30:3000; 

        # Standard proxy headers to pass user info to your app
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Optional: Handle WebSockets (useful for React/Next.js dev servers)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;7. Enable the Configuration
Link the file to the sites-enabled directory and test the Nginx syntax:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bash&lt;/p&gt;

&lt;h4&gt;
  
  
  Enable the site
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo ln -s /etc/nginx/sites-available/tailscale-proxy /etc/nginx/sites-enabled/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Test for syntax errors
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nginx -t
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  If it says "test is successful", restart Nginx
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result: When someone visits your VPS's public IP, the VPS sends that traffic through the encrypted Tailscale tunnel to your local PC.&lt;/p&gt;

&lt;p&gt;You can test by going to your VPS public IPS&lt;/p&gt;

&lt;p&gt;Use &lt;a href="https://canyouseeme.org/" rel="noopener noreferrer"&gt;https://canyouseeme.org/&lt;/a&gt; if you face issue to debug&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>devops</category>
      <category>networking</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Turn Your Laptop into a Server: Host Web Apps Locally with Coolify and Cloudflare Tunnels</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Wed, 25 Feb 2026 04:49:02 +0000</pubDate>
      <link>https://dev.to/vimal/turn-your-laptop-into-a-server-host-web-apps-locally-with-coolify-and-cloudflare-tunnels-1kkm</link>
      <guid>https://dev.to/vimal/turn-your-laptop-into-a-server-host-web-apps-locally-with-coolify-and-cloudflare-tunnels-1kkm</guid>
      <description>&lt;p&gt;Have you ever thought about using your own laptop as a server to host web apps so anyone on the internet can access them globally?&lt;/p&gt;

&lt;p&gt;Let me introduce you to a powerful combination: Cloudflare Tunnels and Coolify. Together, these tools allow you to transform your local PC into your very own Vercel, Netlify, or Heroku.&lt;/p&gt;

&lt;p&gt;If your internet connection allows for standard port forwarding, setting this up is a breeze. However, many Internet Service Providers (ISPs) use CGNAT (Carrier-Grade NAT). If you are behind CGNAT, your public IP and ports cannot be accessed from the outside world, even if you configure port forwarding on your router.&lt;/p&gt;

&lt;h4&gt;
  
  
  How to know you are behind CGNAT:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Look at your router's "WAN IP" or "Internet IP" in its settings.&lt;/li&gt;
&lt;li&gt;Go to a site like &lt;code&gt;whatsmyip.org&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the two numbers are different, you are behind CGNAT.

&lt;ul&gt;
&lt;li&gt;Common CGNAT IP range: 100.64.0.0 to 100.127.255.255.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are behind CGNAT, don't worry—that's exactly where Cloudflare Tunnels come in to save the day. Additionally, while you can deploy apps using just a Cloudflare Tunnel, Coolify is the secret ingredient if you want a beautiful, Vercel-like UI to manage and deploy multiple projects effortlessly.&lt;/p&gt;

&lt;p&gt;Let’s get started!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install Coolify
&lt;/h3&gt;

&lt;p&gt;First, we need to install Coolify. You can do this with a single command in your terminal.&lt;/p&gt;

&lt;p&gt;If you on your PC then go to terminal for VPS user SSH into your server and past below command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://cdn.coollabs.io/coolify/install.sh | &lt;span class="nb"&gt;sudo &lt;/span&gt;bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: This script will also install Docker Engine if you don't already have it&lt;/p&gt;

&lt;p&gt;Once the installation is complete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Local Machine: Open your browser and go to &lt;code&gt;http://localhost:8000&lt;/code&gt; to create your root user account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VPS Users: If you are doing this on a VPS, navigate to &lt;code&gt;http://&amp;lt;your-public-ip&amp;gt;:8000&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now you have a dashboard ready to deploy Node.js, Next.js, Python, WordPress, or any database directly on your own hardware!&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Deploy a Demo Project
&lt;/h3&gt;

&lt;p&gt;Let's deploy a demo project to see how it works.&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.amazonaws.com%2Fuploads%2Farticles%2Fkbpiohc3t9y85edz0x50.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbpiohc3t9y85edz0x50.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In Coolify, select Public Repository.&lt;/li&gt;
&lt;li&gt;Paste in your repository link. For this demo, I'll use: &lt;a href="https://github.com/vimal-verma/vimalverma.in" rel="noopener noreferrer"&gt;https://github.com/vimal-verma/vimalverma.in&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Select Docker in the Build Pack settings and click Continue.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Before hitting deploy, verify your Network section has the following values (this is crucial for linking a custom domain later):&lt;/p&gt;

&lt;p&gt;Ports Exposes: &lt;code&gt;3000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Port Mappings: &lt;code&gt;3000:3000&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Click Deploy. Once finished, Coolify will generate a link for your web app that looks something like this:&lt;br&gt;
&lt;code&gt;http://xo0gcogkks04ks4sgkk84oww.&amp;lt;your-public-ip&amp;gt;.sslip.io&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Can you access this link?
&lt;/h4&gt;

&lt;p&gt;If you are using a VPS or your ISP does not use CGNAT, this link will work immediately. Congratulations, you've just deployed an app on your self-hosted Vercel alternative!&lt;/p&gt;

&lt;p&gt;You can also access your web app locally by replacing the port. For example, if your Coolify dashboard is at &lt;code&gt;http://10.0.0.1:8000/&lt;/code&gt;, your deployed app is running at &lt;code&gt;http://10.0.0.1:3000/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;if you want to link to custom domain add a DNS record type A target your public IP then update domain value in coolify dashboard save and redeploy&lt;br&gt;
and Done&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: Bypassing CGNAT with Cloudflare Tunnels
&lt;/h3&gt;

&lt;p&gt;if that public link isn't accessible for you (likely due to CGNAT), don't worry. We are going to put your app online securely using Cloudflare Tunnels.&lt;/p&gt;

&lt;p&gt;First, download and install cloudflared from the official Cloudflare developer docs. &lt;a href="https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/downloads/" rel="noopener noreferrer"&gt;link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once installed, authenticate your local machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a new tunnel and give it a name:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel create &amp;lt;YOUR_TUNNEL_NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: This command will output a UUID. Copy this UUID, as you will need it for the configuration.&lt;/p&gt;

&lt;p&gt;Next, create a configuration file. Inside your ~/.cloudflared directory, create a config.yml file and add the following fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost:8000&lt;/span&gt;
&lt;span class="na"&gt;tunnel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;Tunnel-UUID&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;credentials-file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/root/.cloudflared/&amp;lt;Tunnel-UUID&amp;gt;.json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Route your DNS to your desired subdomain (ensure your main domain is already managed in your Cloudflare account):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel route dns &amp;lt;Tunnel-UUID or NAME&amp;gt; &amp;lt;subdomain.example.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, run the tunnel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel run &amp;lt;Tunnel-UUID or NAME&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Tip: If you have multiple tunnels, you can specify the config path using: &lt;code&gt;cloudflared tunnel --config /path/to/your/config.yml run &amp;lt;NAME&amp;gt;&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;Check the tunnel&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cloudflared tunnel info
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if you visit &lt;code&gt;subdomain.example.com&lt;/code&gt;, it will securely serve your Coolify dashboard. You can log in remotely using the same email and password you set up locally!&lt;br&gt;
Now if you want to add custom link to your subdomain then go to &lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Routing Your Custom Domain to Your App
&lt;/h3&gt;

&lt;p&gt;Now that the tunnel is active, you probably want to route traffic directly to your published app (running on port 3000) rather than just the Coolify dashboard.&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.amazonaws.com%2Fuploads%2Farticles%2F7yppay7hspwdn1yoj8ke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7yppay7hspwdn1yoj8ke.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go to your Cloudflare Dashboard:&lt;br&gt;
then Networking &amp;gt; Tunnels&lt;/p&gt;

&lt;p&gt;Your local tunnel will be visible click on that and go in routes section and click on &lt;code&gt;add routes&lt;/code&gt; then select &lt;code&gt;published application&lt;/code&gt;&lt;br&gt;
now add subdomain - &lt;code&gt;www&lt;/code&gt;&lt;br&gt;
Service URL - &lt;code&gt;http://localhost:3000&lt;/code&gt;&lt;br&gt;
and click on add route&lt;/p&gt;

&lt;p&gt;Now go in coolify dashword go inside projects and select one then go to Configuration &amp;gt; general and change domains to &lt;code&gt;www.example.com&lt;/code&gt; and save and Redeploy &lt;/p&gt;

&lt;p&gt;And you're done! Your locally hosted application is now live and accessible to the world at &lt;code&gt;www.example.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Happy self-hosting!&lt;/p&gt;

</description>
      <category>docker</category>
      <category>coolify</category>
      <category>cloud</category>
      <category>cloudskills</category>
    </item>
    <item>
      <title>My submission to Google Cloud Run Portfolio Challenge</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Mon, 26 Jan 2026 05:15:18 +0000</pubDate>
      <link>https://dev.to/vimal/my-submission-to-google-cloud-run-portfolio-challenge-4j15</link>
      <guid>https://dev.to/vimal/my-submission-to-google-cloud-run-portfolio-challenge-4j15</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/new-year-new-you-google-ai-2025-12-31"&gt;New Year, New You Portfolio Challenge Presented by Google AI&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;Hello! I'm Vimal Kumar, a dedicated Software Developer with a passion for building digital solutions that make a difference. With a bachelor's degree in computer science and years of hands-on experience, I specialize in creating robust web applications using modern technologies like React, Next.js, and Node.js.&lt;/p&gt;

&lt;h4&gt;
  
  
  In this portfolio i am trying to make it interactive and Playful,
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;I have added a Robot which follow you in each section of Portfolio and narrate you some detail about that.&lt;/li&gt;
&lt;li&gt;A terminal mode is added which can be enable by clicking on robot or setting&lt;/li&gt;
&lt;li&gt;I have added Guide Mode which can be enable through setting icon or terminal (if Guide mode is active then Robot will Show each section of Portfolio by scrolling like a Guide.)&lt;/li&gt;
&lt;li&gt;I have added mini game (in 404 page and also in home page which can be enable through setting icon or terminal)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Portfolio
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://vimalverma-in-578201670402.asia-south1.run.app/" rel="noopener noreferrer"&gt;Live link&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://vimalverma-in-578201670402.asia-south1.run.app"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;




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

&lt;p&gt;I am using Next.Js to build my Portfolio Website with help of &lt;a href="https://antigravity.google/" rel="noopener noreferrer"&gt;antigravity&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Framework: Next.js
Styling: Custom CSS
Icons: Lucide React
Animations: customized HTML5 Canvas
Language: JavaScript
Robot - SVG generated by Gemini and Customize in Figma to achieve different emotion of Robot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Here are GitHub Repo-
&lt;/h3&gt;

&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/vimal-verma" rel="noopener noreferrer"&gt;
        vimal-verma
      &lt;/a&gt; / &lt;a href="https://github.com/vimal-verma/vimalverma.in" rel="noopener noreferrer"&gt;
        vimalverma.in
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Vimal's Interactive Portfolio&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Welcome to my interactive portfolio built with Next.js! This project features a unique user experience with an interactive Robot Guide and a fully functional Terminal interface.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🤖 Interactive Robot Guide&lt;/h3&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personal Assistant&lt;/strong&gt;: A friendly robot that guides you through the portfolio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice Interaction&lt;/strong&gt;: Uses Web Speech API to speak to visitors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expressions&lt;/strong&gt;: Dynamic facial expressions (happy, excited, sleepy, confused, love).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mini-Game&lt;/strong&gt;: Catch falling energy bolts to charge the robot!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive&lt;/strong&gt;: Follows mouse movement, reacts to clicks, and dances.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;💻 System Terminal&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Command Line Interface&lt;/strong&gt;: Access portfolio sections via commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commands&lt;/strong&gt;:
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;help&lt;/code&gt;: List available commands.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;about&lt;/code&gt;, &lt;code&gt;projects&lt;/code&gt;, &lt;code&gt;skills&lt;/code&gt;, &lt;code&gt;experience&lt;/code&gt;: Navigate to sections.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;game&lt;/code&gt;: Start the mini-game.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;robot &amp;lt;expression&amp;gt;&lt;/code&gt;: Change robot expressions.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;theme&lt;/code&gt;: Toggle dark/light mode.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;message&lt;/code&gt;: Send a contact message.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;joke&lt;/code&gt;: Hear a programming joke.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;First, run the…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/vimal-verma/vimalverma.in" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  What I'm Most Proud Of
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Robot expression and emotion, which I am managed to pull&lt;/li&gt;
&lt;li&gt;Clicking on Robot will open Terminal (you can type help to list all command)&lt;/li&gt;
&lt;li&gt;emit ❤️ emoji when cursor move around robot&lt;/li&gt;
&lt;li&gt;Robot get confusion if you move cursor too Fast&lt;/li&gt;
&lt;li&gt;Robot eyes follow Cursor&lt;/li&gt;
&lt;li&gt;Robot eyes and mouth change color in each section of portfolio&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Robot dance&lt;/code&gt; command in terminal - have fun&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🤖 Interactive Robot Guide
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Personal Assistant&lt;/strong&gt;: A friendly robot that guides you through the portfolio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Voice Interaction&lt;/strong&gt;: Uses Web Speech API to speak to visitors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Expressions&lt;/strong&gt;: Dynamic facial expressions (happy, excited, sleepy, confused, love).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mini-Game&lt;/strong&gt;: Catch falling energy bolts to charge the robot!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive&lt;/strong&gt;: Follows mouse movement, reacts to clicks, and dances.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💻 System Terminal (click on robot to activate)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Command Line Interface&lt;/strong&gt;: Access portfolio sections via commands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commands&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;help&lt;/code&gt;: List available commands.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;about&lt;/code&gt;, &lt;code&gt;projects&lt;/code&gt;, &lt;code&gt;skills&lt;/code&gt;, &lt;code&gt;experience&lt;/code&gt;: 

&lt;ul&gt;
&lt;li&gt;Navigate to sections. (If terminal is not in full screen).&lt;/li&gt;
&lt;li&gt;Show details within terminal in full screen mode&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;game&lt;/code&gt;: Start the mini-game.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;robot &amp;lt;expression&amp;gt;&lt;/code&gt;: Change robot expressions.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;theme&lt;/code&gt;: Toggle dark/light mode.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;message&lt;/code&gt;: Send a contact message from terminal.&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;joke&lt;/code&gt;: Hear a programming joke.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Here are screenshot of some part of portfolio
&lt;/h3&gt;

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

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

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

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

&lt;p&gt;Here is terminal example&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.amazonaws.com%2Fuploads%2Farticles%2F9hgc1xksr6ilzdek77rk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9hgc1xksr6ilzdek77rk.png" alt="portfolio terminal"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is Lighthouse score&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.amazonaws.com%2Fuploads%2Farticles%2Fspkp7vzo7q678221tldx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fspkp7vzo7q678221tldx.png" alt="partfolio Lighthouse score"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks Dev and Google AI team.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>portfolio</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Discover BiodataMaker.org: The Ultimate Free Tool for Creating Professional Biodatas and Invitations in Minutes</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Tue, 30 Dec 2025 11:58:20 +0000</pubDate>
      <link>https://dev.to/vimal/discover-biodatamakerorg-the-ultimate-free-tool-for-creating-professional-biodatas-and-4m58</link>
      <guid>https://dev.to/vimal/discover-biodatamakerorg-the-ultimate-free-tool-for-creating-professional-biodatas-and-4m58</guid>
      <description>&lt;p&gt;In today's fast-paced world, first impressions matter—whether you're applying for a job, introducing yourself for a marriage proposal, or sharing a wedding invitation. That's where BiodataMaker.org comes in: a completely free, user-friendly online platform that lets you create stunning, professional biodatas, resumes, digital cards, and invitations without any design skills or software downloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is BiodataMaker.org?
&lt;/h2&gt;

&lt;p&gt;Launched as a simple yet powerful web tool, BiodataMaker.org is designed to make document creation effortless and accessible. "Biodata" (short for biographical data) is summarizing personal details—especially for matrimonial matches, job applications, and student profiles. This site takes the hassle out of formatting and design, delivering high-quality results instantly.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key highlights:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;100% Free: No subscriptions, watermarks, or hidden costs. Download as PDF or image anytime.&lt;/li&gt;
&lt;li&gt;No Signup Needed: Start creating right away—no accounts or logins.&lt;/li&gt;
&lt;li&gt;Privacy-First: All data processing happens in your browser; nothing is stored on servers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Standout Features That Make It a Game-Changer
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Diverse Templates: Choose from over 25 ready-made designs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marriage biodatas (Traditional, Modern, Royal, etc.).&lt;/li&gt;
&lt;li&gt;Job resumes (Professional, Creative, Minimalist).&lt;/li&gt;
&lt;li&gt;Student profiles (Fresher, Academic CV).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Invitation &amp;amp; Card Maker: Newer features include -  beautiful digital wedding/event invitations and smart digital business cards (with QR codes, social links, and customizable themes).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Easy Customization:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upload photos and crop them on the spot.&lt;/li&gt;
&lt;li&gt;Add/remove/rearrange fields.&lt;/li&gt;
&lt;li&gt;Real-time previews as you edit.&lt;/li&gt;
&lt;li&gt;Drag-and-drop studio for fully custom layouts.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How It Works (In Just 3 Steps):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select a template.&lt;/li&gt;
&lt;li&gt;Fill in your details (personal, family, education, etc.).&lt;/li&gt;
&lt;li&gt;Download or share instantly.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why It Matters in 2025
&lt;/h2&gt;

&lt;p&gt;In an era of digital matchmaking (via apps and sites) and quick job applications, a well-crafted biodata can set you apart. BiodataMaker.org democratizes this by making premium-quality designs available to everyone—for free. It's mobile-friendly, secure, and perfect for sharing on WhatsApp or email.&lt;/p&gt;

&lt;p&gt;Whether you're a parent crafting a marriage biodata, a job seeker needing a quick resume, or someone planning an event, this tool is worth bookmarking.&lt;/p&gt;

&lt;p&gt;Head over to biodatamaker.org and try it yourself—your next impressive document is just minutes away!&lt;br&gt;
Have you used BiodataMaker.org? Share your experience in the comments!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Thu, 11 Dec 2025 08:20:10 +0000</pubDate>
      <link>https://dev.to/vimal/-5c5d</link>
      <guid>https://dev.to/vimal/-5c5d</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/vimal" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F360160%2Ff3eee05b-ea8c-44b8-a0fe-841ca719cb89.png" alt="vimal"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/vimal/join-the-web-nfc-revolution-contribute-to-the-open-source-project-at-webnfcorg-4600" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Join the Web NFC Revolution: Contribute to the Open-Source Project at webnfc.org!&lt;/h2&gt;
      &lt;h3&gt;VIMAL KUMAR ・ Dec 10 '25&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webnfc&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#nfc&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webnfc</category>
      <category>nfc</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Join the Web NFC Revolution: Contribute to the Open-Source Project at NfcTool.org!</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Wed, 10 Dec 2025 10:37:52 +0000</pubDate>
      <link>https://dev.to/vimal/join-the-web-nfc-revolution-contribute-to-the-open-source-project-at-webnfcorg-4600</link>
      <guid>https://dev.to/vimal/join-the-web-nfc-revolution-contribute-to-the-open-source-project-at-webnfcorg-4600</guid>
      <description>&lt;p&gt;The Web NFC API is one of the most exciting web platform features in years. It lets web apps read and write NFC tags directly from the browser — no native app required. Imagine progressive web apps that can configure smart posters, exchange contact info, automate home devices, or even serve as digital tickets… all with a simple tap.&lt;/p&gt;

&lt;p&gt;But for Web NFC to reach its full potential, we need great documentation, examples, tools, and real-world testing across devices and browsers.&lt;/p&gt;

&lt;p&gt;That’s exactly why we created webnfc.org — an open-source hub dedicated entirely to Web NFC.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is webnfc.org Offers Today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A complete beginner-friendly Web NFC tutorial series&lt;/li&gt;
&lt;li&gt;Ready-to-run code examples (reading NDEF messages, writing tags, formatting tags, etc.)&lt;/li&gt;
&lt;li&gt;An online NFC Tag Emulator for testing without physical tags
A live Web NFC Playground where you can experiment in the browser right now&lt;/li&gt;
&lt;li&gt;Browser compatibility tables and troubleshooting guides&lt;/li&gt;
&lt;li&gt;Curated list of real-world Web NFC demos and production sites
And the best part? Everything is open source and community-driven.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  We Need Your Help to Make It Even Better!
&lt;/h2&gt;

&lt;p&gt;Whether you’re a seasoned web developer or just starting your Web NFC journey, there’s a meaningful way for you to contribute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write or Improve Tutorials &amp;amp; Docs
First-timer friendly! Even fixing a typo helps.
Add new guides (e.g., “Using Web NFC with React/Vue/Svelte”, “Secure Web NFC practices with NFC”)&lt;/li&gt;
&lt;li&gt;Contribute Code
Enhance the NFC Tag Emulator (add new tag types, better UI)
Build new playground features (real-time tag visualizer, bulk write tools)
Improve the example gallery with creative demos&lt;/li&gt;
&lt;li&gt;Share Your Real-World Projects
Submit your Web NFC-powered PWA to our showcase
Write a case study or blog post about how you used Web NFC&lt;/li&gt;
&lt;li&gt;Help with Testing &amp;amp; Bug Reports
Test on different devices (Android phones, tablets, Chromebooks)
Report browser quirks and help us keep the compatibility table up-to-date&lt;/li&gt;
&lt;li&gt;Spread the Word
Star the repo ⭐
Share webnfc.org with your followers
Give a lightning talk at your local meetup&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to Get Started (It Takes Less Than 5 Minutes)
&lt;/h2&gt;

&lt;p&gt;Visit &lt;a href="https://NfcTool.org" rel="noopener noreferrer"&gt;https://NfcTool.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the GitHub icon (or go directly to &lt;a href="https://github.com/vimal-verma/webnfc.org" rel="noopener noreferrer"&gt;https://github.com/vimal-verma/webnfc.org&lt;/a&gt;)&lt;br&gt;
Star the repository&lt;/p&gt;

&lt;p&gt;Say hello in the Discussions or Issues — we’re a friendly bunch&lt;br&gt;
Every contribution, no matter how small, moves the entire Web NFC ecosystem forward.&lt;/p&gt;

&lt;p&gt;Let’s build the definitive resource for Web NFC together.&lt;br&gt;
See you on GitHub!&lt;br&gt;
The Web NFC Community ❤️&lt;/p&gt;

&lt;h3&gt;
  
  
  P.S. Already built something cool with Web NFC? Reply to this post or open a PR — we’d love to feature your project!
&lt;/h3&gt;

</description>
      <category>webnfc</category>
      <category>nfc</category>
      <category>opensource</category>
    </item>
    <item>
      <title>My Create-React-app blog website's post appeared in google search, why?</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Fri, 11 Jun 2021 03:28:25 +0000</pubDate>
      <link>https://dev.to/vimal/my-create-react-app-blog-website-s-post-appeared-in-google-search-why-493j</link>
      <guid>https://dev.to/vimal/my-create-react-app-blog-website-s-post-appeared-in-google-search-why-493j</guid>
      <description>&lt;div class="ltag__stackexchange--container"&gt;
  &lt;div class="ltag__stackexchange--title-container"&gt;
    
      &lt;div class="ltag__stackexchange--title"&gt;
        &lt;h1&gt;
          &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7Gn-iPj_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackoverflow-logo-b42691ae545e4810b105ee957979a853a696085e67e43ee14c5699cf3e890fb4.svg" alt=""&gt;
            &lt;a href="https://stackoverflow.com/questions/67930772/my-create-react-app-blog-websites-post-appeared-in-google-search-why" rel="noopener noreferrer"&gt;
               My Create-React-app blog website's post appeared in google search, why?
            &lt;/a&gt;
        &lt;/h1&gt;
        &lt;div class="ltag__stackexchange--post-metadata"&gt;
          &lt;span&gt;Jun 11 '21&lt;/span&gt;
            &lt;span&gt;Comments: 1&lt;/span&gt;
            &lt;span&gt;Answers: 0&lt;/span&gt;
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;a class="ltag__stackexchange--score-container" href="https://stackoverflow.com/questions/67930772/my-create-react-app-blog-websites-post-appeared-in-google-search-why" rel="noopener noreferrer"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y9mJpuJP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-arrow-up-eff2e2849e67d156181d258e38802c0b57fa011f74164a7f97675ca3b6ab756b.svg" alt=""&gt;
        &lt;div class="ltag__stackexchange--score-number"&gt;
          0
        &lt;/div&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wif5Zq3z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/stackexchange-arrow-down-4349fac0dd932d284fab7e4dd9846f19a3710558efde0d2dfd05897f3eeb9aba.svg" alt=""&gt;
      &lt;/a&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--body"&gt;
    
&lt;p&gt;I was just searching my blog title in google and result blow my mind, How google can read title of my blog that render in client side.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://i.stack.imgur.com/AhghK.png" rel="nofollow noreferrer"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uN7sEpy7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.stack.imgur.com/AhghK.png" alt="vdev blog"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As i know When googlebot go to any Create-React-app website, &lt;strong&gt;it show a blank index.html&lt;/strong&gt; then how googlebot read content on my blog…&lt;/p&gt;
    
  &lt;/div&gt;
  &lt;div class="ltag__stackexchange--btn--container"&gt;
    
      &lt;a href="https://stackoverflow.com/questions/67930772/my-create-react-app-blog-websites-post-appeared-in-google-search-why" rel="noopener noreferrer"&gt;Open Full Question&lt;/a&gt;
    
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>discuss</category>
      <category>react</category>
      <category>seo</category>
    </item>
    <item>
      <title>I am considering to make Vdev.in Open Source</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Sat, 05 Jun 2021 02:30:15 +0000</pubDate>
      <link>https://dev.to/vimal/i-am-considering-to-make-vdev-in-open-source-29jp</link>
      <guid>https://dev.to/vimal/i-am-considering-to-make-vdev-in-open-source-29jp</guid>
      <description>&lt;h2&gt;
  
  
  What is Open Source ?
&lt;/h2&gt;

&lt;p&gt;Open Source is everywhere. The term “Open Source” refers to something people can modify and share because its design is publicly accessible. You can also contribute in any open source project, 28% of casual contributions to an open source are documentation, such as a typo fix, reformatting, or writing a translation.You Just need to track those issues related to the project And try to solve those issues and Open Pull Request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I am considering to make it Open Source?
&lt;/h2&gt;

&lt;p&gt;3 Months ago, i have started a Project called Vdev.in and which is mainly a portfolio and resume generator website, where you can make your own portfolio website without doing any coding, and now i am considering to make it an open source because i want to make it better with your help.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some features of Vdev.in are
&lt;/h2&gt;

&lt;p&gt;1   You can write your own blog &lt;br&gt;
2   Share your portfolio as an unique link&lt;br&gt;&lt;br&gt;
3   Download Your resume&lt;br&gt;&lt;br&gt;
4   You can add your Projects&lt;br&gt;&lt;br&gt;
5   You can add your achivements&lt;br&gt;&lt;br&gt;
6   You can connect your social media handle's&lt;br&gt;&lt;br&gt;
7   You can add some Custom CSS &lt;br&gt;
8   Receive direct messages from your audience&lt;br&gt;&lt;br&gt;
9   You can use our Vdev.in api &lt;/p&gt;

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

&lt;p&gt;I am planning to move Front end from React.js to Next.js, It is very important in SEO Point of View and many more.&lt;/p&gt;

&lt;p&gt;Thanks for reading, &lt;/p&gt;

&lt;h2&gt;
  
  
  Should i make it opensource ?
&lt;/h2&gt;

&lt;p&gt;you can reach to me from my &lt;a href="https://vdev.in/@vimal" rel="noopener noreferrer"&gt;profile&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>react</category>
    </item>
    <item>
      <title>Free Portfolio and Resume builder</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Wed, 28 Apr 2021 09:42:20 +0000</pubDate>
      <link>https://dev.to/vimal/free-portfolio-and-resume-builder-ci</link>
      <guid>https://dev.to/vimal/free-portfolio-and-resume-builder-ci</guid>
      <description>&lt;h5&gt;
  
  
  Updating portfolio is frustrating, right?
&lt;/h5&gt;

&lt;p&gt;As a developer portfolio is best place to Showcase skill, work and Achievements and It's is really valuble for your career. So we need to keep Portfolio updated and Updating portfolio is frustrating, right?&lt;br&gt;
So, we've got you covered&lt;br&gt;
We are happy to announce that &lt;a href="https://vdev.in/?ref=devto" rel="noopener noreferrer"&gt;Vdev&lt;/a&gt; is now open for Developer (still in beta), So please take a try and review how is it and how to improve it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Get your portfolio ready today
&lt;/h3&gt;

&lt;p&gt;Now you know the value of a portfolio for your career, get started on making your very own.&lt;br&gt;
Go to &lt;a href="https://vdev.in/?ref=devto" rel="noopener noreferrer"&gt;Vdev&lt;/a&gt; and Create your account and add your skills, projects and Achievements and Done Now you have your own portfolio.&lt;br&gt;
It's is really easy to update and You can Customize by adding Custom Css.&lt;/p&gt;

&lt;h3&gt;
  
  
  Already has portfolio
&lt;/h3&gt;

&lt;p&gt;Power Your portfolio with Vdev Api (Customize Your portfolio in your style with Vdev Api)&lt;br&gt;
&lt;a href="https://github.com/vdev-in/React-vdev-api-template" rel="noopener noreferrer"&gt;React vdev api template&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/vdev-in/Html-vdev-api-template" rel="noopener noreferrer"&gt;Html vdev api template&lt;/a&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  &lt;a href="https://vdev.in/?ref=devto" rel="noopener noreferrer"&gt;App link&lt;/a&gt;
&lt;/h2&gt;

</description>
      <category>portfolio</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Vdev - A portfolio and resume generator</title>
      <dc:creator>VIMAL KUMAR</dc:creator>
      <pubDate>Tue, 30 Mar 2021 10:06:38 +0000</pubDate>
      <link>https://dev.to/vimal/vdev-a-portfolio-and-resume-generator-4bd8</link>
      <guid>https://dev.to/vimal/vdev-a-portfolio-and-resume-generator-4bd8</guid>
      <description>&lt;p&gt;Hello 👋&lt;/p&gt;

&lt;p&gt;I am happy to announce my latest project Vdev (A portfolio and resume generator)&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;a href="https://vdev.in" rel="noopener noreferrer"&gt;vdev.in&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Vdev generate Your portfolio based on info you filled in form and Show your info in a nice-way&lt;/p&gt;

&lt;p&gt;Here is demo of generated Portfolio&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.amazonaws.com%2Fuploads%2Farticles%2F54vyx8c0z8hrrh6389vb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F54vyx8c0z8hrrh6389vb.png" alt="Alt Text" width="800" height="1480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is demo of resume Portfolio&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.amazonaws.com%2Fuploads%2Farticles%2Fxkvr36rtkoyq1mikyvkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxkvr36rtkoyq1mikyvkq.png" alt="Alt Text" width="800" height="1079"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Please Take a try and leave your suggestions/thoughts/opinions in the comments section.&lt;/p&gt;

</description>
      <category>resume</category>
      <category>portfolio</category>
      <category>react</category>
    </item>
  </channel>
</rss>
