<?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: Tanmay Katke</title>
    <description>The latest articles on DEV Community by Tanmay Katke (@tanmaykatke).</description>
    <link>https://dev.to/tanmaykatke</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%2F4161165%2F96befaab-021d-4ace-9379-f163eff4ff73.jpg</url>
      <title>DEV Community: Tanmay Katke</title>
      <link>https://dev.to/tanmaykatke</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanmaykatke"/>
    <language>en</language>
    <item>
      <title>unPhone: The Only App That Levels You Up for Logging Off</title>
      <dc:creator>Tanmay Katke</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:32:46 +0000</pubDate>
      <link>https://dev.to/tanmaykatke/unphone-the-only-app-that-levels-you-up-for-logging-off-3f0k</link>
      <guid>https://dev.to/tanmaykatke/unphone-the-only-app-that-levels-you-up-for-logging-off-3f0k</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;unPhone&lt;/strong&gt; for my friends, and honestly for me too. We're all one tap away from a chatbot that's always awake, never judges, and always has something to say. It's easy to tell an AI about a bad week before telling a person. Real conversations feel riskier: what if it's awkward, what if I don't know what to say, what if no one asks?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;unPhone is an app that gets people off their screens and into real conversations that feel easier, safer, and more supportive.&lt;/strong&gt; The AI inside it is a coach that sends you &lt;em&gt;toward&lt;/em&gt; people. It's never a companion to talk to.&lt;/p&gt;

&lt;p&gt;One rule shapes everything: &lt;strong&gt;you only earn XP by meeting someone in person.&lt;/strong&gt; Talking to the AI earns nothing.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Check-in:&lt;/strong&gt; two people scan each other's QR codes. Each phone signs a confirmation with the other person's ID, and XP only lands when &lt;em&gt;both&lt;/em&gt; confirm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conversation coach:&lt;/strong&gt; before a hangout, it finds openers for the situation and Gemma tailors them. Afterwards, a private three-tap reflection gives you two sentences of feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rehearsal:&lt;/strong&gt; practice a hard conversation with Gemma playing the other person, then get a quest to try it with a real one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quests:&lt;/strong&gt; small daily real-world challenges at your comfort level, verified by offline GPS or a check-in with the friend you did them with.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Listening Circle:&lt;/strong&gt; 3–5 people, phones face-down, a timer per speaker, gentle nudges for the listeners, and one question at the end: did you feel heard?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The game:&lt;/strong&gt; your hero faces &lt;strong&gt;Grumblegloom the Scroll Ogre&lt;/strong&gt;, who hoards glowing screens. Your stats come only from real life, so the only way to beat him is to go outside.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Safety:&lt;/strong&gt; a 988 button on every screen, and crisis wording is handled by fixed rules, not the model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It solves a simple problem for my friends: it makes the first step toward a real person a little smaller, and it rewards taking it.&lt;/p&gt;

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

&lt;p&gt;*&lt;em&gt;Demo Video: *&lt;/em&gt;&lt;br&gt;
  &lt;iframe src="https://www.youtube.com/embed/FcNVbuwLTDc" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it on Android:&lt;/strong&gt; &lt;a href="https://github.com/tanmaykatke21/unPhone/releases/latest" rel="noopener noreferrer"&gt;Download the APK&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install it, open it, and allow installs from your browser when asked. Rehearsal and tailored openers download the on-device Gemma model (2.6 GB, one time, Wi-Fi recommended) from inside the app.&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%2Ft60o88ypltr5zb4nuw2r.jpeg" 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%2Ft60o88ypltr5zb4nuw2r.jpeg" alt=" " width="738" height="1600"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F01vldi0vzbkbgy44z55s.jpeg" 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%2F01vldi0vzbkbgy44z55s.jpeg" alt=" " width="738" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&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/tanmaykatke21" rel="noopener noreferrer"&gt;
        tanmaykatke21
      &lt;/a&gt; / &lt;a href="https://github.com/tanmaykatke21/unPhone" rel="noopener noreferrer"&gt;
        unPhone
      &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;unPhone&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;An app that gets people off their screens and into real conversations that feel easier, safer, and more supportive.&lt;/p&gt;
&lt;p&gt;The AI is a coach that sends you toward people. It is never a companion to talk to. Everything runs on the phone: no account, no sign-up, no server holding your data.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What's in the app&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;AI on the phone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Check-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Two people scan each other's QR. Each phone signs a confirmation containing the other's ID, and XP is added only when both confirm within 2 minutes. 50 XP for a new person, 20 for a repeat meeting, once per person per day.&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quests&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A daily quest at your comfort level (1 to 5). Solo quests are verified by GPS (offline, against bundled spots or anywhere you haven't done a quest). Social quests complete through a check-in.&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Conversation coach&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Before a hangout: hybrid search&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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/tanmaykatke21/unPhone" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;Everything a user says or does stays on their phone.&lt;/strong&gt; No account, no sign-up, no server holding anyone's data. Your identity is an Ed25519 key pair created on first launch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open-source AI, running on the device&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 E2B&lt;/strong&gt; (open weights, Apache 2.0) runs fully on-device through &lt;strong&gt;LiteRT-LM&lt;/strong&gt;, Google's open-source on-device runtime, via a small Kotlin native module bridged into React Native. It loads on first use (GPU, falling back to CPU) and unloads after two idle minutes to save battery and heat. It powers opener tailoring, rehearsal role-play, post-hangout feedback and Listening Circle nudges. On my Galaxy S21 FE a rehearsal reply takes about 2 seconds, offline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MediaPipe's Universal Sentence Encoder&lt;/strong&gt; creates 100-dimension embeddings on the phone. I checked that the phone produces the same vectors as my Mac for the same sentence, so the library and user searches share one space.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite with FTS5 and sqlite-vec&lt;/strong&gt; (via op-sqlite) does &lt;strong&gt;hybrid search&lt;/strong&gt; on the phone: keyword ranks and vector ranks merged with Reciprocal Rank Fusion. Searching "coffee" finds café openers even though none of them contain the word.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Guardrails for a small model&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every prompt asks for short output, replies are trimmed to two sentences, and Gemma's JSON is parsed defensively (code fences, numbered lists, stray markdown). If Gemma is slow or returns junk, the app quietly falls back to the human-written library, so the UI never hangs. Crisis wording is caught by fixed rules before the model is ever called.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tiger Data holds the public content library&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;At build time, a Python script used Claude to generate 394 openers, quests and listening phrases, tagged by type and comfort level, and embedded them with the same encoder the phone uses. They live in one Tiger Data Postgres table with &lt;strong&gt;pgvector&lt;/strong&gt; (HNSW index) and a generated &lt;strong&gt;tsvector&lt;/strong&gt; column (GIN index), so one table serves both halves of hybrid search. The phone gets a snapshot. &lt;strong&gt;No user data ever touches the database:&lt;/strong&gt; Tiger Data is the shared, public half, and the phone is the private half.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signed check-ins without a server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each phone's QR carries its public key and a random nonce. After scanning, a phone signs &lt;code&gt;from | to | their nonce | timestamp&lt;/code&gt; with tweetnacl. XP is awarded only when a valid signature addressed to &lt;em&gt;you&lt;/em&gt;, for &lt;em&gt;this&lt;/em&gt; session, arrives within two minutes. Replays, stale QRs, tampered signatures and confirmations meant for someone else are rejected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shipping it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The APK fetches Gemma once through Android's DownloadManager (background, resumable, saved as a &lt;code&gt;.part&lt;/code&gt; file and renamed only when complete). After that, everything works offline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran the whole app in Jest against a real SQLite engine with FTS5 and sqlite-vec loaded, with Gemma, the camera and GPS simulated: 16 end-to-end flows, from onboarding through check-ins, quests, the ogre battle, the model download and a migration of an older database. With only one phone, a small Python script plays the second phone during check-in testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; React Native 0.87 (TypeScript), Kotlin, LiteRT-LM, MediaPipe Tasks, op-sqlite + sqlite-vec, tweetnacl, react-native-vision-camera, Tiger Data (Postgres + pgvector).&lt;/p&gt;

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

&lt;p&gt;Because the whole point of unPhone is that &lt;strong&gt;nobody should be watching.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Someone rehearsing a hard conversation, or writing "it felt awkward and I talked too much" after a hangout, is being vulnerable. With a closed API, every one of those words leaves the phone, gets logged on someone else's server, and costs money per request. Open weights changed what I could promise: &lt;strong&gt;Gemma runs on the device, offline, for free, forever.&lt;/strong&gt; There's no usage bill that grows with every lonely user, no outage that breaks the app, and no terms of service that can change underneath it.&lt;/p&gt;

&lt;p&gt;And there's a fitting irony: the model is good at conversation, and the app uses it to teach you to need it less.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Gemma&lt;/li&gt;
&lt;li&gt;Tiger Data&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
