<?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: Tapas Kar</title>
    <description>The latest articles on DEV Community by Tapas Kar (@tapas_kar).</description>
    <link>https://dev.to/tapas_kar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3879616%2F1d612f94-88d3-4871-9e4e-56c45deadd5e.jpg</url>
      <title>DEV Community: Tapas Kar</title>
      <link>https://dev.to/tapas_kar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tapas_kar"/>
    <language>en</language>
    <item>
      <title>I built an app that lets you chat with your past self — using your real messages</title>
      <dc:creator>Tapas Kar</dc:creator>
      <pubDate>Thu, 16 Apr 2026 04:25:24 +0000</pubDate>
      <link>https://dev.to/tapas_kar/i-built-an-app-that-lets-you-chat-with-your-past-self-using-your-real-messages-4bfl</link>
      <guid>https://dev.to/tapas_kar/i-built-an-app-that-lets-you-chat-with-your-past-self-using-your-real-messages-4bfl</guid>
      <description>&lt;p&gt;I texted my 22-year-old self last night.&lt;/p&gt;

&lt;p&gt;He told me about a hackathon project I'd completely forgotten. He used slang I haven't used in years. He was worried about things that don't matter anymore — and passionate about things I've since abandoned.&lt;/p&gt;

&lt;p&gt;He wasn't an AI pretending to be me. He &lt;em&gt;was&lt;/em&gt; me — reconstructed from 47,000 real messages I'd sent between 2014 and 2018.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;Pratibmb&lt;/strong&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%2Fraw.githubusercontent.com%2Ftapaskar%2FPratibmb%2Fmain%2Fdocs%2Fscreenshots%2F01_chat_ready.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%2Fraw.githubusercontent.com%2Ftapaskar%2FPratibmb%2Fmain%2Fdocs%2Fscreenshots%2F01_chat_ready.png" alt="Pratibmb chat interface showing a conversation with your past self"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;I was cleaning up my phone storage and found a WhatsApp export from college. Reading through those messages was surreal. The person writing them was recognizably me — same humor, same anxieties — but also someone I'd never be again.&lt;/p&gt;

&lt;p&gt;I thought: &lt;em&gt;what if I could actually talk to that version of myself?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Not a generic chatbot. Not "based on your journal entries." I wanted something that had read every message I'd ever sent and could respond the way I actually used to talk — the exact slang, the emoji patterns, the way I'd dodge serious questions with a joke.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;




&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Pratibmb is a 4-step pipeline that runs entirely on your machine:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Import your messages
&lt;/h3&gt;

&lt;p&gt;Export your chat history from any of 8 platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WhatsApp&lt;/strong&gt; — plain text export&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facebook Messenger&lt;/strong&gt; — JSON from Download Your Information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instagram DMs&lt;/strong&gt; — JSON from Download Your Information&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gmail&lt;/strong&gt; — MBOX from Google Takeout&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iMessage&lt;/strong&gt; — reads the local &lt;code&gt;chat.db&lt;/code&gt; directly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Telegram&lt;/strong&gt; — JSON export from Desktop app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Twitter / X&lt;/strong&gt; — JavaScript archive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discord&lt;/strong&gt; — JSON via DiscordChatExporter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app auto-detects the format. Drop the file, it figures out the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Embed everything locally
&lt;/h3&gt;

&lt;p&gt;Every message gets converted into a semantic vector using &lt;a href="https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF" rel="noopener noreferrer"&gt;Nomic Embed Text v1.5&lt;/a&gt; (84 MB model, runs via llama.cpp). These embeddings are stored in a local SQLite database — no vector database dependency, no Pinecone, no cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Build your profile
&lt;/h3&gt;

&lt;p&gt;A local LLM (&lt;a href="https://huggingface.co/bartowski/google_gemma-3-4b-it-GGUF" rel="noopener noreferrer"&gt;Gemma 3 4B Instruct&lt;/a&gt;, quantized to 2.5 GB) analyzes your message corpus and extracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relationships&lt;/strong&gt; — who you talked to, how close you were, what you discussed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Life events&lt;/strong&gt; — career changes, moves, breakups, milestones (with confidence scores)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interests&lt;/strong&gt; — what you cared about and when&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication style&lt;/strong&gt; — your abbreviations, emoji habits, sentence patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Year summaries&lt;/strong&gt; — what each year of your life looked like through your messages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This profile grounds the AI's responses in your actual history.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Chat with your past self
&lt;/h3&gt;

&lt;p&gt;Pick a year on the slider. Ask a question. The app retrieves relevant messages from that time period using semantic search, feeds them as context to the LLM along with your profile, and generates a response in your voice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: what were my biggest dreams in college?

Pratibmb (2018): oh man, where do I start! I was convinced 
I'd build the next big startup — something that would change 
how people connect. the biggest dream was proving to myself 
I could make something people actually used.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The year slider is the key interaction — slide to 2015 and you're talking to your 2015 self. Slide to 2020 and the responses shift to match who you were then.&lt;/p&gt;




&lt;h2&gt;
  
  
  The tech stack
&lt;/h2&gt;

&lt;p&gt;I wanted this to be something anyone could run without cloud accounts or GPU rentals:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Desktop shell&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Tauri 2&lt;/strong&gt; (Rust)&lt;/td&gt;
&lt;td&gt;~5 MB binary vs 150 MB Electron, native performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI inference&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;llama.cpp&lt;/strong&gt; via llama-cpp-python&lt;/td&gt;
&lt;td&gt;Runs quantized models on CPU or Metal/CUDA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chat model&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gemma 3 4B Q4_K_M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strong instruction-following at only 2.5 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Embeddings&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Nomic Embed Text v1.5 Q4_K_M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;84 MB, fast cosine similarity search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zero-config, single-file, no server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontend&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vanilla HTML/CSS/JS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No build step, no framework churn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fine-tuning&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;LoRA&lt;/strong&gt; via MLX (macOS) or PyTorch+PEFT (Linux/Windows)&lt;/td&gt;
&lt;td&gt;Optional, makes responses sound more like you&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Architecture
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────┐
│  Tauri webview (HTML/JS)        │
│  Year slider + chat interface   │
└──────────────┬──────────────────┘
               │ Tauri commands
               ▼
┌─────────────────────────────────┐
│  Rust backend                   │
│  - Spawns llama-server process  │
│  - Owns SQLite corpus           │
│  - Streams replies to webview   │
└──────────────┬──────────────────┘
               │ HTTP (localhost:11435)
               ▼
         llama-server
    (Gemma 3 4B + Nomic Embed)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Docker. No Redis. No Postgres. One binary that spawns a local inference server and talks to it over localhost.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hardest problems I solved
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Making a 4B model sound like a specific person
&lt;/h3&gt;

&lt;p&gt;Generic LLMs sound like... generic LLMs. Even with good retrieval, the responses felt artificial. Three things fixed this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Aggressive post-processing.&lt;/strong&gt; I strip markdown formatting, remove AI-isms ("As an AI...", "Here's what I think..."), truncate to 6 sentences max, and remove surrounding quotes. Real text messages are short and messy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Profile-grounded system prompt.&lt;/strong&gt; The system prompt doesn't just say "act like this person" — it includes extracted communication patterns: typical sentence length, favorite slang, emoji frequency, how they handle serious vs. casual questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Optional LoRA fine-tuning.&lt;/strong&gt; The app extracts conversation pairs from your messages and fine-tunes a LoRA adapter (rank 8, alpha 16) on your actual writing patterns. ~20 minutes on Apple Silicon, ~30 on NVIDIA. This is optional but makes a noticeable difference — responses shift from "plausible generic" to "that's actually how I talk."&lt;/p&gt;

&lt;h3&gt;
  
  
  Thread-context retrieval
&lt;/h3&gt;

&lt;p&gt;Naive RAG retrieves individual messages, but conversations have context. If you ask "what did I think about moving to Bangalore?", the most relevant message might be "yeah I'm really nervous about it" — meaningless without the preceding messages.&lt;/p&gt;

&lt;p&gt;The retriever expands each hit to include surrounding messages in the same thread (3-message window), then groups them chronologically. The LLM sees conversation fragments, not isolated sentences.&lt;/p&gt;

&lt;h3&gt;
  
  
  SQLite + threading in a desktop app
&lt;/h3&gt;

&lt;p&gt;Tauri's async Rust backend and Python's threaded HTTP server both want to touch the database. SQLite doesn't love concurrent writes. I solved this with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;check_same_thread=False&lt;/code&gt; on the Python connection&lt;/li&gt;
&lt;li&gt;A threading &lt;code&gt;Lock&lt;/code&gt; around all write operations&lt;/li&gt;
&lt;li&gt;WAL mode for better concurrent read performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simple, but it took a few crashes to get right.&lt;/p&gt;




&lt;h2&gt;
  
  
  Privacy — not as a feature, as the architecture
&lt;/h2&gt;

&lt;p&gt;I'm tired of apps that say "we take your privacy seriously" and then ship your data to 14 third-party services.&lt;/p&gt;

&lt;p&gt;Pratibmb can't leak your data because it never has your data. The architecture makes privacy violations impossible, not just policy-prohibited:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No network calls&lt;/strong&gt; after the initial model download (~2.5 GB, one time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No telemetry.&lt;/strong&gt; No analytics. No crash reports. No "anonymous" usage data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No accounts.&lt;/strong&gt; No login. No email. Nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works with Wi-Fi off.&lt;/strong&gt; Literally turn off your internet after setup. Everything works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source&lt;/strong&gt; (AGPL-3.0). Read every line. Build from source. Audit the network calls (there are none).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your messages, embeddings, profile, and fine-tuned model all live in &lt;code&gt;~/.pratibmb/&lt;/code&gt; on your machine. Delete the folder and it's gone.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I learned building this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Small models are good enough for personal use.&lt;/strong&gt;&lt;br&gt;
Gemma 3 4B quantized to Q4_K_M runs comfortably on 8 GB RAM and produces surprisingly good responses when you give it strong retrieval context. You don't need GPT-4 for everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Tauri is genuinely great.&lt;/strong&gt;&lt;br&gt;
Coming from Electron, the difference is staggering. 5 MB binary. Instant startup. Native file dialogs. The Rust ↔ JS bridge is clean. The only pain point is the build toolchain on Windows (MSVC + WebView2 + NSIS).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. The emotional impact surprised me.&lt;/strong&gt;&lt;br&gt;
I built this as a technical project. But the first time I asked my 2016 self about a friend I'd lost touch with, and it responded with details I'd forgotten — I sat there for a while. This thing surfaces memories that photos can't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Chat exports are a mess.&lt;/strong&gt;&lt;br&gt;
WhatsApp's export format changes between OS versions. Facebook's JSON uses UTF-8 escape sequences for emoji. iMessage requires Full Disk Access and the database schema varies across macOS versions. Telegram only exports from the desktop app. I wrote 8 parsers and each one taught me something new about format hell.&lt;/p&gt;


&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Pratibmb is free, open source, and runs on macOS, Windows, and Linux.&lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://pratibmb.com" rel="noopener noreferrer"&gt;pratibmb.com&lt;/a&gt;&lt;br&gt;
📦 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/tapaskar/Pratibmb" rel="noopener noreferrer"&gt;github.com/tapaskar/Pratibmb&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;macOS 12+ / Windows 10+ / Linux (AppImage)&lt;/li&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;8 GB RAM (16 GB recommended)&lt;/li&gt;
&lt;li&gt;~3 GB disk space for models (downloaded on first launch)&lt;/li&gt;
&lt;li&gt;NVIDIA GPU optional (speeds up fine-tuning, not required for chat)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&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="c"&gt;# macOS&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;tapaskar/tap/pratibmb

&lt;span class="c"&gt;# Linux (AUR)&lt;/span&gt;
yay &lt;span class="nt"&gt;-S&lt;/span&gt; pratibmb-bin

&lt;span class="c"&gt;# Windows&lt;/span&gt;
winget &lt;span class="nb"&gt;install &lt;/span&gt;tapaskar.Pratibmb

&lt;span class="c"&gt;# Or download directly from pratibmb.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;v0.6.0&lt;/strong&gt; — Voice mode (talk to your past self, hear responses in a synthesized version of your voice)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Group chat reconstruction&lt;/strong&gt; — Bring back entire friend groups, not just yourself&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Timeline view&lt;/strong&gt; — Visual map of your relationships and life events across years&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile app&lt;/strong&gt; — React Native wrapper (local inference via llama.cpp on-device)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have old messages sitting on your phone or in a Google Takeout archive — they contain a version of you that doesn't exist anymore. Pratibmb brings them back.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>privacy</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
