<?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: Shivam Singh</title>
    <description>The latest articles on DEV Community by Shivam Singh (@thshivam).</description>
    <link>https://dev.to/thshivam</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%2F4154836%2Fafc3be95-ec59-44dc-ac2a-79e1798c5112.jpg</url>
      <title>DEV Community: Shivam Singh</title>
      <link>https://dev.to/thshivam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thshivam"/>
    <language>en</language>
    <item>
      <title>LastWhisper : Search your voice</title>
      <dc:creator>Shivam Singh</dc:creator>
      <pubDate>Fri, 30 Oct 2026 12:32:48 +0000</pubDate>
      <link>https://dev.to/thshivam/lastwhisper-search-your-voice-622</link>
      <guid>https://dev.to/thshivam/lastwhisper-search-your-voice-622</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&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;LastWhisper&lt;/strong&gt;, a local-first voice memory archive that helps people preserve, search, and revisit the stories hidden inside their recordings.&lt;/p&gt;

&lt;p&gt;The idea behind it is simple: a voice recording can outlive the moment, place, or even the person who created it. That felt like a natural interpretation of &lt;strong&gt;Ghost in the Machine&lt;/strong&gt;. The “ghost” is not an AI pretending to be someone. It is the real voice, story, and memory that already exists inside the recording. The machine simply helps you find it again.&lt;/p&gt;

&lt;p&gt;With LastWhisper, a user can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Import WAV, MP3, M4A, or FLAC recordings into a private local archive.&lt;/li&gt;
&lt;li&gt;Transcribe audio locally with open Whisper inference.&lt;/li&gt;
&lt;li&gt;Read timestamped transcript segments and click one to seek the original audio.&lt;/li&gt;
&lt;li&gt;Search naturally, even without remembering the exact words used in the recording.&lt;/li&gt;
&lt;li&gt;Inspect genuine transcript evidence instead of receiving an invented answer.&lt;/li&gt;
&lt;li&gt;Open a search result at its exact source timestamp.&lt;/li&gt;
&lt;li&gt;Save important evidence as a memory and add a personal title or note.&lt;/li&gt;
&lt;li&gt;Rebuild the semantic index without requiring a separate vector database.&lt;/li&gt;
&lt;li&gt;Optionally generate transcript-grounded summaries with a locally configured Ollama model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The default setup does not require a hosted transcription API, embedding API, cloud LLM, analytics service, or remote storage.&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/Th-Shivam" rel="noopener noreferrer"&gt;
        Th-Shivam
      &lt;/a&gt; / &lt;a href="https://github.com/Th-Shivam/Lastwhisper" rel="noopener noreferrer"&gt;
        Lastwhisper
      &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;LastWhisper&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;LastWhisper is a local-first voice memory archive. It imports personal audio, transcribes it with open-source Whisper inference, indexes transcript evidence with local sentence-transformer embeddings, and lets people search, replay, and save source-grounded memories.&lt;/p&gt;
&lt;p&gt;No hosted transcription, embedding, LLM, analytics, or telemetry service is required. Model files may need a one-time download before offline use.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Private local audio archive for WAV, MP3, M4A, and FLAC files.&lt;/li&gt;
&lt;li&gt;CPU-first transcription with &lt;code&gt;faster-whisper&lt;/code&gt;, language detection, progress, retry, and cancellation.&lt;/li&gt;
&lt;li&gt;Native playback and timestamped transcript segments that seek into the source audio.&lt;/li&gt;
&lt;li&gt;Optional source-grounded summaries through a user-configured local Ollama model.&lt;/li&gt;
&lt;li&gt;Local semantic search with normalized sentence-transformer embeddings stored in SQLite.&lt;/li&gt;
&lt;li&gt;Evidence snippets with recording IDs, segment IDs, dates, and source timestamps.&lt;/li&gt;
&lt;li&gt;Saved memories with immutable source evidence plus editable titles and notes.&lt;/li&gt;
&lt;li&gt;Rebuildable, transcript-revision-aware search index.&lt;/li&gt;
&lt;li&gt;Additive migration support for existing Phase 1, Phase 2, and early Phase 3 databases.&lt;/li&gt;
&lt;li&gt;Responsive…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/Th-Shivam/Lastwhisper" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native CPU installation instructions.&lt;/li&gt;
&lt;li&gt;Docker Compose with persistent archive and model-cache volumes.&lt;/li&gt;
&lt;li&gt;Architecture and privacy diagrams.&lt;/li&gt;
&lt;li&gt;Model and third-party license documentation.&lt;/li&gt;
&lt;li&gt;CI, dependency audits, migration coverage, and offline unit tests.&lt;/li&gt;
&lt;li&gt;A separate opt-in integration test for real cached AI models.&lt;/li&gt;
&lt;li&gt;Contribution, security, and code-of-conduct documentation for public open-source development.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The frontend uses &lt;strong&gt;React, TypeScript, Vite, Tailwind CSS, and Lucide&lt;/strong&gt;. It communicates with a loopback &lt;strong&gt;FastAPI&lt;/strong&gt; backend. &lt;strong&gt;SQLAlchemy and SQLite&lt;/strong&gt; persist recordings, transcript segments, semantic chunks, saved memories, and embedding metadata. Original audio is stored outside the web root under generated UUID filenames.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local transcription
&lt;/h3&gt;

&lt;p&gt;LastWhisper uses &lt;strong&gt;faster-whisper&lt;/strong&gt; with &lt;strong&gt;CTranslate2&lt;/strong&gt;. The verified default path uses the pinned SYSTRAN &lt;code&gt;faster-whisper-base&lt;/code&gt; conversion on CPU with &lt;code&gt;int8&lt;/code&gt; compute.&lt;/p&gt;

&lt;p&gt;The worker stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detected language.&lt;/li&gt;
&lt;li&gt;Ordered transcript text.&lt;/li&gt;
&lt;li&gt;Start and end timestamps for every source segment.&lt;/li&gt;
&lt;li&gt;Processing progress and safe retry/cancellation state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clicking a transcript segment sets the audio player to that segment's real Whisper timestamp.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local semantic search
&lt;/h3&gt;

&lt;p&gt;For retrieval, LastWhisper uses &lt;strong&gt;sentence-transformers&lt;/strong&gt; with the Apache-2.0 &lt;code&gt;paraphrase-multilingual-MiniLM-L12-v2&lt;/code&gt; model pinned to an immutable revision.&lt;/p&gt;

&lt;p&gt;Long transcripts are split into bounded overlapping chunks. Every chunk remains linked to its recording and contributing transcript segment IDs. The generated 384-dimensional vectors are normalized and stored directly in SQLite as little-endian float32 BLOBs alongside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model and revision metadata.&lt;/li&gt;
&lt;li&gt;Vector dimension.&lt;/li&gt;
&lt;li&gt;Transcript fingerprint.&lt;/li&gt;
&lt;li&gt;Source segment IDs.&lt;/li&gt;
&lt;li&gt;Faithful source text.&lt;/li&gt;
&lt;li&gt;Start and end timestamps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Search embeds the query locally, computes cosine similarity, applies a configurable threshold, and returns ranked transcript evidence. The score is presented as a ranking signal—not a probability or guarantee of correctness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Source-grounded memories
&lt;/h3&gt;

&lt;p&gt;Saving a result creates an immutable snapshot of the source evidence while keeping a foreign-key link to a real transcript segment. Users can edit only the memory title and personal note; editing never rewrites the transcript.&lt;/p&gt;

&lt;p&gt;Deleting a recording cascades through its transcript segments, semantic index, and saved memories. Re-transcription requires explicit confirmation because replacing source segment IDs can invalidate memories tied to the old transcript.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verification
&lt;/h3&gt;

&lt;p&gt;I tested the release on a Ryzen 5 5600H with 14 GiB RAM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real Whisper &lt;code&gt;base&lt;/code&gt; CPU/int8 inference detected English and produced timestamped transcript segments.&lt;/li&gt;
&lt;li&gt;Real sentence-transformer inference produced normalized 384-dimensional embeddings.&lt;/li&gt;
&lt;li&gt;Semantic search ranked the intended recording across multiple transcript memories.&lt;/li&gt;
&lt;li&gt;Both model caches reloaded with offline flags enabled and outbound socket creation blocked.&lt;/li&gt;
&lt;li&gt;The real-model integration test passed upload, transcription, indexing, search, source attribution, memory editing, deletion cleanup, and restart persistence.&lt;/li&gt;
&lt;li&gt;38 offline backend tests passed.&lt;/li&gt;
&lt;li&gt;Two frontend DOM tests passed, including source timestamp navigation.&lt;/li&gt;
&lt;li&gt;TypeScript, ESLint, production build, Docker health checks, npm audit, pip-audit, and &lt;code&gt;git diff --check&lt;/code&gt; passed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full verification record is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Th-Shivam/Lastwhisper/blob/master/docs/VERIFICATION.md" rel="noopener noreferrer"&gt;https://github.com/Th-Shivam/Lastwhisper/blob/master/docs/VERIFICATION.md&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Voice recordings can contain identity, health information, relationships, locations, family history, and moments that were never meant to become somebody else's training or analytics data.&lt;/p&gt;

&lt;p&gt;A closed transcription or embedding API would make this archive depend on another company's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retention and privacy policy.&lt;/li&gt;
&lt;li&gt;Pricing and rate limits.&lt;/li&gt;
&lt;li&gt;Network availability.&lt;/li&gt;
&lt;li&gt;Model behavior.&lt;/li&gt;
&lt;li&gt;Product lifetime.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open models made a different architecture possible.&lt;/p&gt;

&lt;p&gt;After the model files are cached, LastWhisper can transcribe and search without uploading the recording or transcript to a hosted AI provider. The user can inspect where every result came from, replace a model, rebuild the index, back up ordinary files and SQLite, or continue using the archive even if an external service disappears.&lt;/p&gt;

&lt;p&gt;Open also made the system more honest. The application records the exact model revision and embedding dimension that produced an index. If that configuration changes, the index can be rebuilt instead of quietly comparing incompatible vectors.&lt;/p&gt;

&lt;p&gt;At the same time, I did not want to misuse the word “offline.” Initial dependency and model downloads require internet access. LastWhisper exposes cache state, supports local-files-only modes, and fails with actionable errors when required weights are unavailable instead of pretending inference succeeded.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built and release-hardened LastWhisper with meaningful AI-agent assistance through OpenCode. The process included repository audits, migration and concurrency reviews, real-model debugging, privacy hardening, frontend accessibility work, Docker verification, and adversarial release review.&lt;/p&gt;

&lt;p&gt;I have not embedded the raw private session transcript because it contains local development paths and operational details that require curation before public sharing. The public engineering trail is preserved in &lt;strong&gt;31 focused commits&lt;/strong&gt;, automated tests, the verification report, and the repository's architecture/security documentation.&lt;/p&gt;

&lt;p&gt;Commit history:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Th-Shivam/Lastwhisper/commits/master" rel="noopener noreferrer"&gt;https://github.com/Th-Shivam/Lastwhisper/commits/master&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;The most important moment in LastWhisper is not when a similarity score appears.&lt;/p&gt;

&lt;p&gt;It is when someone clicks &lt;strong&gt;Open source&lt;/strong&gt;, the recording jumps to the exact timestamp, and the original voice plays again.&lt;/p&gt;

&lt;p&gt;The model does not replace that voice. It does not impersonate it or generate a polished version of what it thinks was said. It helps the listener return to the real evidence—the pause, tone, words, and context that made the memory meaningful in the first place.&lt;/p&gt;

&lt;p&gt;That is the spirit of this project: using a machine not to manufacture a ghost, but to keep a real voice from being lost inside a forgotten audio file.&lt;/p&gt;

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

&lt;p&gt;I am entering LastWhisper for the &lt;strong&gt;overall Hacktoberfest Open-Source AI Challenge: Week 4&lt;/strong&gt; prize.&lt;/p&gt;

&lt;p&gt;I am not claiming a partner prize category because the core application intentionally uses local open-source components rather than adding a sponsor technology only for eligibility.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team submission:&lt;/strong&gt; Solo project.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This submission and implementation were created with meaningful AI assistance. I reviewed the technical claims, code, verification results, and final article, and will set DEV's AI disclosure to &lt;code&gt;some_ai&lt;/code&gt; before publishing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Git Out: A Local Voice Companion That Helps Developers Touch Grass</title>
      <dc:creator>Shivam Singh</dc:creator>
      <pubDate>Sun, 11 Oct 2026 10:10:16 +0000</pubDate>
      <link>https://dev.to/thshivam/git-out-a-local-voice-companion-that-helps-developers-touch-grass-1m87</link>
      <guid>https://dev.to/thshivam/git-out-a-local-voice-companion-that-helps-developers-touch-grass-1m87</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Git Out is a local-first voice companion for developers who want to think through&lt;br&gt;
technical problems without staying glued to a screen.&lt;/p&gt;

&lt;p&gt;The idea is simple: take a walk, ask a question out loud, and get a useful answer&lt;br&gt;
without opening a laptop, sending your voice to a cloud service, or losing your&lt;br&gt;
train of thought to a dozen tabs.&lt;/p&gt;

&lt;p&gt;Git Out is built for developers who are walking, commuting, taking a break, or&lt;br&gt;
working away from their desk. It can help with questions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“What is the safest way to refactor this module?”&lt;/li&gt;
&lt;li&gt;“How should I think about this pull request?”&lt;/li&gt;
&lt;li&gt;“What Git workflow should I use for this change?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app records one deliberate voice turn, transcribes it on the Android device,&lt;br&gt;
generates an answer with a local Qwen model, and reads the completed answer aloud&lt;br&gt;
with the installed Android voice.&lt;/p&gt;

&lt;p&gt;The screen is intentionally the shortest part of the experience. Pocket Mode has&lt;br&gt;
large, high-contrast controls and explicit states for &lt;strong&gt;Ready&lt;/strong&gt;, &lt;strong&gt;Listening&lt;/strong&gt;,&lt;br&gt;
&lt;strong&gt;Transcribing&lt;/strong&gt;, &lt;strong&gt;Thinking&lt;/strong&gt;, &lt;strong&gt;Speaking&lt;/strong&gt;, and &lt;strong&gt;Error&lt;/strong&gt;. There is no wake word,&lt;br&gt;
no always-on microphone, and no automatic microphone restart in the background.&lt;/p&gt;

&lt;p&gt;Git Out also includes an optional read-only GitHub workspace. When the backend is&lt;br&gt;
configured, the app can show the connected account, repositories, assigned issues,&lt;br&gt;
pull requests, and recent commits. The GitHub token stays on the server and is&lt;br&gt;
never bundled into the mobile app.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Video demo:&lt;/strong&gt; &lt;br&gt;
  &lt;/p&gt;
&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/0gf5XuV116U" width="315" height="560"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


&lt;p&gt;The demo should show:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Loading the Qwen GGUF model from Android Settings.&lt;/li&gt;
&lt;li&gt;Starting Pocket Mode and asking a question by voice.&lt;/li&gt;
&lt;li&gt;The on-device transcript appearing on screen.&lt;/li&gt;
&lt;li&gt;A local answer being generated and spoken by Android TTS.&lt;/li&gt;
&lt;li&gt;Locking or backgrounding the phone while an answer is already speaking.&lt;/li&gt;
&lt;li&gt;Returning to the app and showing that the answer remains readable.&lt;/li&gt;
&lt;li&gt;Optionally opening the GitHub tab to show repository context.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is an Android development build, so a short screen recording is the most&lt;br&gt;
useful demo format. The project is designed to be tested on a physical Android&lt;br&gt;
device because installed speech packs, TTS voices, audio focus, headset events,&lt;br&gt;
and lock-screen behavior vary by device.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The complete open-source project is available here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/Th-Shivam/GIT-OUT" rel="noopener noreferrer"&gt;Git Out on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the React Native/Expo mobile app, the FastAPI backend,&lt;br&gt;
the local AI abstraction, the Android speech and TTS integrations, GitHub API&lt;br&gt;
services, tests, and setup documentation.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Git Out is an Android-first React Native app built with Expo and a small FastAPI&lt;br&gt;
backend for the optional GitHub workspace.&lt;/p&gt;
&lt;h3&gt;
  
  
  Local AI
&lt;/h3&gt;

&lt;p&gt;The core model is &lt;strong&gt;Qwen2.5-1.5B-Instruct Q4_K_M GGUF&lt;/strong&gt;, loaded on the Android&lt;br&gt;
device with &lt;a href="https://github.com/mybigday/llama.rn" rel="noopener noreferrer"&gt;&lt;code&gt;llama.rn&lt;/code&gt;&lt;/a&gt;. The model file is&lt;br&gt;
selected and stored locally by the user; it is not bundled into the repository or&lt;br&gt;
downloaded automatically by the app.&lt;/p&gt;

&lt;p&gt;The mobile conversation path is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Voice question
    ↓
Android on-device speech recognition
    ↓
Local transcript
    ↓
Qwen GGUF through llama.rn
    ↓
Readable answer + optional Android TTS playback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Speech input and output
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;expo-speech-recognition&lt;/code&gt; checks for an installed Android on-device language
pack before recording.&lt;/li&gt;
&lt;li&gt;The app refuses to silently switch to network recognition when the requested
offline language is unavailable.&lt;/li&gt;
&lt;li&gt;A handwritten &lt;code&gt;GitOutTts&lt;/code&gt; Expo module wraps Android &lt;code&gt;TextToSpeech&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The TTS path handles exact installed voice matching, audio focus, headset
removal, stop/cancel actions, and supported media-session controls.&lt;/li&gt;
&lt;li&gt;A scoped media playback foreground service is used only while an already-started
answer is being spoken. It never starts the microphone.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pocket Mode
&lt;/h3&gt;

&lt;p&gt;Pocket Mode is a one-shot voice workflow rather than a continuous assistant. Each&lt;br&gt;
tap starts one question, and the lifecycle is guarded so stale recognition or TTS&lt;br&gt;
callbacks cannot submit an accidental second turn.&lt;/p&gt;

&lt;p&gt;The state machine makes the interaction understandable while the user is moving:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ready → Listening → Transcribing → Thinking → Speaking
                         ↘ Error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Optional GitHub workspace
&lt;/h3&gt;

&lt;p&gt;The FastAPI service uses a server-only &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; and GitHub's REST API. It&lt;br&gt;
exposes sanitized read endpoints for the authenticated user, repositories,&lt;br&gt;
assigned issues, pull requests, and commits. The mobile app only receives&lt;br&gt;
whitelisted response fields; it never receives the token.&lt;/p&gt;

&lt;p&gt;GitHub is intentionally separate from local inference. Local conversation keeps&lt;br&gt;
working when the backend or network is unavailable.&lt;/p&gt;
&lt;h3&gt;
  
  
  Visual design
&lt;/h3&gt;

&lt;p&gt;The app uses a dark, minimal skeuomorphic interface: raised cards, recessed input&lt;br&gt;
wells, tactile buttons, subtle shadows, and clear status pills. This gives the&lt;br&gt;
controls a physical-device feel without adding a heavy UI library or image assets.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open innovation is what makes Git Out fit the Touch Grass theme instead of becoming&lt;br&gt;
another cloud chat interface.&lt;/p&gt;

&lt;p&gt;The open-weight Qwen model lets the main conversation run locally on the phone.&lt;br&gt;
That makes several important things possible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Offline use:&lt;/strong&gt; after the model and Android speech/TTS data are installed, a
user can walk without Wi-Fi or mobile data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private voice conversations:&lt;/strong&gt; prompts, transcripts, and answers do not need
to leave the device for the local AI loop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model control:&lt;/strong&gt; the GGUF model is a user-owned file that can be replaced or
upgraded without rewriting the whole product around a hosted API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No per-request dependency:&lt;/strong&gt; the core experience does not require a paid API
key or a vendor's uptime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspectable building blocks:&lt;/strong&gt; the app can combine an open-weight model,
&lt;code&gt;llama.rn&lt;/code&gt;, Expo modules, native Android speech APIs, and a local-first state
machine in a way that can be inspected and changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A closed hosted API could make a quick prototype, but it would move the central&lt;br&gt;
conversation onto a remote service and make a no-signal walking workflow much less&lt;br&gt;
reliable. Open components gave me the control needed to make privacy and offline&lt;br&gt;
behavior product features rather than marketing claims.&lt;/p&gt;

&lt;p&gt;The trade-off is honest: a small on-device model has less capacity than a large&lt;br&gt;
cloud model, and loading a GGUF requires enough memory on the Android phone. Git&lt;br&gt;
Out chooses that trade-off because a private, available answer while walking is&lt;br&gt;
more useful here than a larger answer that requires a network connection.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;I am entering the overall Hacktoberfest Open-Source AI Challenge. I am not claiming&lt;br&gt;
a partner category because Git Out does not currently use partner-specific&lt;br&gt;
technology.&lt;/p&gt;
&lt;h2&gt;
  
  
  What I Verified
&lt;/h2&gt;

&lt;p&gt;The repository includes automated checks for the local AI guards, speech&lt;br&gt;
recognition behavior, TTS lifecycle, voice-conversation transitions, Pocket Mode&lt;br&gt;
state changes, and duplicate media-command handling.&lt;/p&gt;

&lt;p&gt;The final frontend checks passed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run typecheck   ✓
npm test            ✓ 50 tests passed
npx expo export --platform android   ✓
git diff --check    ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the final device demo, I will report the phone model, Android version, speech&lt;br&gt;
service, and TTS engine used. Device-specific speech, headset, background&lt;br&gt;
playback, and lock-screen behavior can vary by device, so those details are part&lt;br&gt;
of the demo notes rather than assumptions about every Android phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Git Out is a small experiment in making developer tooling less desk-bound. The&lt;br&gt;
goal is not to keep people in an AI chat window. The goal is to let them ask one&lt;br&gt;
useful question, hear a practical next step, and get back to the world outside&lt;br&gt;
the screen.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>reactnative</category>
    </item>
    <item>
      <title>Guardian — The AI Safety Companion I Built for My Friends &amp; Family</title>
      <dc:creator>Shivam Singh</dc:creator>
      <pubDate>Sun, 04 Oct 2026 19:21:09 +0000</pubDate>
      <link>https://dev.to/thshivam/guardian-the-ai-safety-companion-i-built-for-my-friends-family-1ojh</link>
      <guid>https://dev.to/thshivam/guardian-the-ai-safety-companion-i-built-for-my-friends-family-1ojh</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;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%2Fu7weuuhhvidx7s8ve2yo.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%2Fu7weuuhhvidx7s8ve2yo.png" alt="Guardian Cover Image" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This project started with a real incident.&lt;/p&gt;

&lt;p&gt;My friend Shubham got scammed on the day his pocket money arrived.&lt;/p&gt;

&lt;p&gt;He decided to buy lottery tickets and purchased two tickets for ₹1,000 each. Later, when he checked his lottery number on a website, it showed that he had supposedly won &lt;strong&gt;₹15 lakh&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Soon after, he received messages telling him that he had won the lottery and that he needed to pay &lt;strong&gt;₹2,000 through a QR code&lt;/strong&gt; to process the ₹15 lakh payment.&lt;/p&gt;

&lt;p&gt;He believed it.&lt;/p&gt;

&lt;p&gt;He paid the ₹2,000.&lt;/p&gt;

&lt;p&gt;After that, the person who had contacted him stopped responding.&lt;/p&gt;

&lt;p&gt;The lottery tickets had already cost him ₹2,000, and the additional payment added another ₹2,000, making the total loss &lt;strong&gt;₹4,000&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That incident made me think about a problem I see much more often.&lt;/p&gt;

&lt;p&gt;My parents, relatives, and friends regularly send me messages like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Is this real?"&lt;/p&gt;

&lt;p&gt;"Should I click this link?"&lt;/p&gt;

&lt;p&gt;"They are asking for money. Is this a scam?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not everyone knows how to inspect a suspicious URL, recognize social-engineering tactics, or understand whether a payment request is legitimate.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Guardian&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Guardian is a WhatsApp-first AI safety companion that lets someone simply &lt;strong&gt;forward a suspicious message before acting on it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It can analyze:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Text messages&lt;/li&gt;
&lt;li&gt;Suspicious URLs&lt;/li&gt;
&lt;li&gt;Screenshots and images&lt;/li&gt;
&lt;li&gt;Voice notes&lt;/li&gt;
&lt;li&gt;English, Hindi, and Hinglish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of giving a complicated technical explanation, Guardian responds with three simple things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk → Why → What to do&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal isn't to replace human judgment or claim that something is "100% a scam."&lt;/p&gt;

&lt;p&gt;The goal is much simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Give people a second opinion before they click, pay, or share something sensitive.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that is where the name comes from:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before you trust it, ask Guardian.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;So I recreated the story that inspired Guardian with my friend Shubham.&lt;/p&gt;

&lt;p&gt;The video starts with me asking him:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Shubham, batao tumhare saath kya hua?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He explains how he received a message saying that he had won ₹15 lakh in a lottery, and was then asked to pay money through a QR code to process the prize.&lt;/p&gt;

&lt;p&gt;After hearing his story, I introduce the simple solution:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before paying, clicking, or sharing anything suspicious — forward it to Guardian.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then, instead of just explaining how Guardian works, I actually use it in the same video.&lt;/p&gt;

&lt;p&gt;I forward the suspicious message to Guardian and show how the entire process works from a user's perspective:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forward → Guardian analyzes → Get a simple explanation → Decide safely&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The important part is that the user doesn't need to understand AI, phishing, URLs, OCR, search APIs, or any technical details.&lt;/p&gt;

&lt;p&gt;They just need to know how to forward a message on WhatsApp.&lt;/p&gt;

&lt;p&gt;That's the experience I wanted to build for my parents, relatives, friends, and anyone who isn't comfortable evaluating suspicious digital messages themselves.&lt;/p&gt;

&lt;h3&gt;
  
  
  Video Demo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://youtu.be/9LDguc0cTao?si=9hfbhi0uaWPZ-g9O" rel="noopener noreferrer"&gt;https://youtu.be/9LDguc0cTao?si=9hfbhi0uaWPZ-g9O&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The demo shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The real problem that inspired Guardian&lt;/li&gt;
&lt;li&gt;The lottery scam scenario&lt;/li&gt;
&lt;li&gt;How Guardian identifies the risk&lt;/li&gt;
&lt;li&gt;How simple the WhatsApp interaction is&lt;/li&gt;
&lt;li&gt;How a user can get a second opinion before making a payment&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Try Guardian Yourself
&lt;/h3&gt;

&lt;p&gt;Don't just read about Guardian, try it.&lt;/p&gt;

&lt;p&gt;Send a suspicious message, link, screenshot, or voice note directly to Guardian on WhatsApp:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📱 WhatsApp: +91 9236851502&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://wa.me/qr/CIT2AOWPTOMQG1?s=v" rel="noopener noreferrer"&gt;Try Guardian on WhatsApp&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Guardian will analyze it and reply with a simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk → Why → What to do&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've ever received a message and wondered &lt;em&gt;"Is this real or a scam?"&lt;/em&gt; — send it to Guardian.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For testing, please use sample or non-sensitive messages. Never send real OTPs, passwords, banking details, or other confidential information.&lt;br&gt;
I wanted the demo to show the problem first, not just the technology.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;The complete source code is open source on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Th-Shivam/Guardian-HF2026" rel="noopener noreferrer"&gt;Guardian — GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository contains the FastAPI backend, WhatsApp Web bridge, OCR pipeline, Gemma reasoning layer, SerpApi URL verification, ElevenLabs speech-to-text integration, Sentry tracing, and deployment configuration.&lt;/p&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;WhatsApp
   ↓
Baileys WhatsApp Web Bridge
   ↓
Message normalization
   ↓
Safety signal analysis
   ↓
URL extraction + SerpApi verification
   ↓
Gemma risk reasoning
   ↓
Safe response formatting
   ↓
WhatsApp

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Guardian is built around &lt;strong&gt;Gemma, an open-weight AI model&lt;/strong&gt;, as the core reasoning layer. I use &lt;strong&gt;Gemma 3-27B Instruct&lt;/strong&gt; through an OpenAI-compatible interface, which keeps the model layer replaceable and leaves a clear path to local inference later.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3-27B Instruct&lt;/strong&gt; analyzes the message and produces a structured risk assessment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SerpApi&lt;/strong&gt; provides live web evidence when a suspicious URL needs verification.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tesseract OCR&lt;/strong&gt; extracts text from screenshots locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ElevenLabs Speech-to-Text&lt;/strong&gt; converts voice notes into text before sending them through the same Guardian pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Baileys&lt;/strong&gt; connects Guardian to WhatsApp, allowing users to simply forward suspicious messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry Agent Tracing&lt;/strong&gt; Guardian's AI workflow is also instrumented with Sentry Agent Tracing so I can see where time is spent across the pipeline.
For example, a single request can be traced across message normalization, safety analysis, URL verification, Gemma reasoning, and response formatting.&lt;/li&gt;
&lt;/ul&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%2Fxh29eevlvsmwm0eosork.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%2Fxh29eevlvsmwm0eosork.png" alt="Guardian's Sentry logs" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The backend is built with &lt;strong&gt;FastAPI&lt;/strong&gt;, while the WhatsApp bridge is built with &lt;strong&gt;Node.js&lt;/strong&gt; and deployed on &lt;strong&gt;Render&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I intentionally kept the AI layer modular. Today Guardian uses hosted Gemma through an OpenAI-compatible API, but the same architecture can be adapted to a self-hosted/local Gemma deployment without redesigning the entire application.&lt;/p&gt;

&lt;p&gt;The goal was not to build another chatbot. It was to make &lt;strong&gt;AI-powered scam checking as simple as forwarding a WhatsApp message.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Guardian deals with messages that can contain sensitive information, suspicious links, screenshots, and personal conversations. For this kind of product, I did not want the AI layer to be a completely closed and irreplaceable component.&lt;/p&gt;

&lt;p&gt;Using an &lt;strong&gt;open-weight model like Gemma&lt;/strong&gt; gives Guardian a much more flexible foundation. The model can be replaced, self-hosted, fine-tuned, or moved to local inference as the project evolves. The rest of the Guardian pipeline does not need to be redesigned around a single closed AI provider.&lt;/p&gt;

&lt;p&gt;Open innovation also makes the architecture more adaptable. Today Guardian uses hosted Gemma through an OpenAI-compatible interface, but the same reasoning layer can be connected to a self-hosted Gemma deployment in the future.&lt;/p&gt;

&lt;p&gt;For a safety-focused tool, that flexibility matters because &lt;strong&gt;privacy, cost, deployment environment, and model control can change over time&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Guardian is being entered into the following categories:&lt;/p&gt;

&lt;h3&gt;
  
  
  Featured Categories
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; — Gemma 3 27B Instruct is the core reasoning model used by Guardian to analyze suspicious messages and generate risk assessments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — Guardian's backend and WhatsApp bridge are deployed on Render.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Partner Categories
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of ElevenLabs&lt;/strong&gt; — ElevenLabs Speech-to-Text converts WhatsApp voice notes into text so they can go through the same Guardian safety pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Sentry Agent Tracing&lt;/strong&gt; — Sentry traces Guardian's AI workflow, including message processing, URL verification, Gemma reasoning, and response formatting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of SerpApi&lt;/strong&gt; — SerpApi provides live web evidence for suspicious URLs before Guardian gives its assessment.&lt;/li&gt;
&lt;/ul&gt;

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