<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Sahil Tiwari]]></title><description><![CDATA[Sahil Tiwari]]></description><link>https://sahiltiwari.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 09:20:04 GMT</lastBuildDate><atom:link href="https://sahiltiwari.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[I Built an Offline QR Contact Sharing App Because I Can't Spell Under Pressure]]></title><description><![CDATA[There's a specific kind of embarrassment that happens at networking events.
You meet someone. The conversation goes well. They ask for your Instagram or email. You start typing it out loud while they ]]></description><link>https://sahiltiwari.hashnode.dev/i-built-linkly-offline-qr-contact-sharing-app</link><guid isPermaLink="true">https://sahiltiwari.hashnode.dev/i-built-linkly-offline-qr-contact-sharing-app</guid><category><![CDATA[React Native]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Android]]></category><category><![CDATA[Expo]]></category><category><![CDATA[showdev]]></category><category><![CDATA[TypeScript]]></category><dc:creator><![CDATA[Sahil Tiwari]]></dc:creator><pubDate>Sat, 27 Jun 2026 08:37:30 GMT</pubDate><content:encoded><![CDATA[<p>There's a specific kind of embarrassment that happens at networking events.</p>
<p>You meet someone. The conversation goes well. They ask for your Instagram or email. You start typing it out loud while they fumble with their phone's keyboard. You spell something wrong. They spell something wrong. Someone says "wait, is that an underscore or a hyphen?" By the end of it, one of you has the wrong contact saved and neither of you follows up.</p>
<p>Maybe not to you, but at least this happened to me a couple of times. Not a crisis, not a life-ruining problem — just a small friction point that felt dumb to keep repeating in 2026.</p>
<p>So I built <strong>Linkly</strong>.</p>
<hr />
<h3>What it is</h3>
<p>Linkly is an offline-first Android app for sharing your professional profile via QR code. You create a profile once — name, phone, email, WhatsApp, any links you want. The app generates a QR. Someone scans it with Linkly, they get a full preview of your profile, and can save it locally on their device.</p>
<p>No internet. No accounts on their end. No typing. Just scan → preview → save.</p>
<p>The entire interaction takes about four seconds if both people know what they're doing. Maybe eight if one of them is being politely slow.</p>
<hr />
<h3>Why I built it</h3>
<p>Honest answer: I needed a real project.</p>
<p>My college project was an e-commerce website I mostly assembled from YouTube tutorials and GitHub. It worked, kind of, and I learned things from it — but it wasn't something I'd confidently show someone and say "I built this." It was a learning exercise dressed up as a project.</p>
<p>I wanted to build something small but complete. Something with actual product thinking behind it, not just technical checkboxes. Something that would look different from the pile of todo apps and weather apps that every fresher submits alongside their resume.</p>
<p>The QR contact idea fit. It was small enough to actually finish, real enough to actually use, and technical enough to show what I could do with React Native, state management, local storage, and TypeScript — without needing a backend or a cloud budget.</p>
<p>Look, nobody was suffering. Nobody filed a complaint. This isn't a problem that kept me up at night. But it was mildly annoying, I knew how to fix it, and I needed a project anyway. So here we are.</p>
<hr />
<h3>How it's built</h3>
<p>The stack: React Native with Expo, NativeWind for styling, Zustand for state, MMKV for local encrypted storage, and TypeScript throughout.</p>
<p>A few decisions worth explaining:</p>
<ul>
<li><p><strong>Offline-first wasn't a constraint, it was the point.</strong> If the app needs internet to share a contact, it's already failed at its core premise. Networking events have bad Wi-Fi. Conferences have worse. Everything — profile creation, QR generation, scanning, saving contacts — works with airplane mode on.</p>
</li>
<li><p><strong>MMKV over AsyncStorage.</strong> AsyncStorage is fine for small things, but MMKV is significantly faster and supports encryption natively. For something storing personal contact data, that felt like the right call.</p>
</li>
<li><p><strong>Direct APK distribution.</strong> No Play Store. Updates are handled via a self-hosted JSON file on Vercel that the app checks manually. This sounds more complicated than it is — it's just a fetch call and a version comparison. The upside is zero approval delays and full control over releases.</p>
</li>
<li><p><strong>QR payload is encrypted.</strong> The contact data embedded in the QR is AES-encrypted using a key stored in SecureStore. Someone pointing a generic QR scanner at it gets ciphertext, not your phone number.</p>
</li>
</ul>
<hr />
<h3>What I'd do differently</h3>
<p>Honestly, not much at this stage — the things that felt incomplete during build got fixed before shipping. What comes next depends on feedback. Haptics, biometric lock, maybe more platform icons — but I'd rather add what people actually need than build features into the void.</p>
<p>If you have a suggestion that's actually useful, I'm listening.</p>
<hr />
<h3>What it taught me</h3>
<p>Building a complete product — even a small one — is a different skill from building features. You have to think about the first-run experience, edge cases, what happens when the user taps back at the wrong moment, how data gets cleared if something goes wrong.</p>
<p>A todo app teaches you React. A real project teaches you everything around React that tutorials skip.</p>
<p>Linkly is live, installable, and actually works. That last part sounds obvious but it isn't — most side projects don't make it there.</p>
<hr />
<p><a href="https://linkly-website.vercel.app/">Download Linkly</a></p>
<p><a href="https://github.com/sahiltiwaridev/linkly">Source</a></p>
<p>For feedback, suggestions, or just to say something actually useful — <a href="https://portfolio-six-chi-kmc4bfrxcz.vercel.app/">My Portfolio</a></p>
]]></content:encoded></item></channel></rss>