<?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: Aditya Bose</title>
    <description>The latest articles on DEV Community by Aditya Bose (@adybose).</description>
    <link>https://dev.to/adybose</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%2F333288%2F850a24a1-4511-474b-8c94-2f2a68718ec3.png</url>
      <title>DEV Community: Aditya Bose</title>
      <link>https://dev.to/adybose</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/adybose"/>
    <language>en</language>
    <item>
      <title>I Built an Offline AI Horror Mystery FPV Game Where Every Ghost Lives on My Laptop</title>
      <dc:creator>Aditya Bose</dc:creator>
      <pubDate>Sun, 01 Nov 2026 07:00:58 +0000</pubDate>
      <link>https://dev.to/adybose/i-built-a-haunted-house-where-the-ghosts-run-on-local-gemma-and-one-of-them-is-lying-7gb</link>
      <guid>https://dev.to/adybose/i-built-a-haunted-house-where-the-ghosts-run-on-local-gemma-and-one-of-them-is-lying-7gb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It's 11 pm on the 1st of November. Your car has died on a mountain road, the rain is coming sideways, and the only light for miles is a mansion on the hill. You reach for the knocker.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The door opens before you touch it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;The Ofrenda House&lt;/strong&gt; is a first-person horror mystery that runs entirely on your own machine. No cloud, no API keys, no accounts. Unplug your Wi-Fi and the ghosts are still there.&lt;/p&gt;

&lt;p&gt;You step inside to shelter from a storm. The door slams behind you and the lock turns on its own. Lightning flashes through tall windows, and for a moment you see a hallway lined with portraits of a family that died here in 1931. Then it's dark again, apart from the narrow beam of your flashlight.&lt;/p&gt;

&lt;p&gt;The family didn't die of fever. &lt;strong&gt;One of them poisoned the others, one by one, for the inheritance.&lt;/strong&gt; The dead dragged the killer down the cellar stairs on the last night, but the poisoner came back as &lt;strong&gt;La Sombra&lt;/strong&gt;, a faceless shadow that now hunts anyone who wanders in.&lt;/p&gt;

&lt;p&gt;To get out alive you have to solve the murder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🕯️ &lt;strong&gt;Find the spirits.&lt;/strong&gt; Each victim waits in their own room, hidden somewhere in an endless house of shifting corridors that rearrange every time lightning strikes.&lt;/li&gt;
&lt;li&gt;👻 &lt;strong&gt;Talk to the dead.&lt;/strong&gt; They ask who you are and why you're here, then test you with a riddle about their own life. Answer well and they hand you a clue. Answer badly and they fade into silence.&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Catch the liar.&lt;/strong&gt; One of the "friendly" spirits is the killer in disguise, and their clue contradicts someone else's. Spot the two cards that don't agree.&lt;/li&gt;
&lt;li&gt;🌼 &lt;strong&gt;Make your accusation.&lt;/strong&gt; At the ofrenda in the dining room, lay a marigold on the portrait of the person you think did it. Get it right and the dead finally rest. Get it wrong and your face is the next portrait on the wall.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every run is different. The household, their names, their secrets (a bookkeeper skimming the estate, a housekeeper who was secretly a lover, a child who discovered they were adopted) and &lt;strong&gt;the killer change every time you play&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How I read the theme:&lt;/strong&gt; "Ghost in the Machine" felt literal. I wanted the ghosts to &lt;em&gt;live&lt;/em&gt; in my machine, voiced by a model running on my own laptop rather than rented from a server somewhere. Día de los Muertos gave the soul of it: a story about the dead wanting to be remembered and wanting the truth told, with marigolds and an ofrenda at its heart.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://youtu.be/a5VfPoQac_I" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to watch for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;0:00: the door that opens by itself, and locks behind you&lt;/li&gt;
&lt;li&gt;The first lightning strike through the portrait hall&lt;/li&gt;
&lt;li&gt;A spirit's riddle, spoken aloud in a voice generated on-device&lt;/li&gt;
&lt;li&gt;A bat exploding out of the dark (sorry)&lt;/li&gt;
&lt;li&gt;The accusation at the ofrenda&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://github.com/adybose/the-ofrenda-house" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run it yourself:&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;# 1. Required: Node 26 (or newer) and git&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;node git

&lt;span class="c"&gt;# 2. Get the game&lt;/span&gt;
git clone https://github.com/adybose/the-ofrenda-house.git
&lt;span class="nb"&gt;cd &lt;/span&gt;the-ofrenda-house
npm ci

&lt;span class="c"&gt;# 3. Optional: spirits that improvise their lines (Ollama + Gemma 3 4B, about 3.3 GB)&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;ollama
ollama serve &amp;amp;            &lt;span class="c"&gt;# or open the Ollama app instead&lt;/span&gt;
ollama pull gemma3:4b

&lt;span class="c"&gt;# 4. Optional: spirits that speak aloud (Piper + four voices, about 240 MB)&lt;/span&gt;
python3 &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--user&lt;/span&gt; piper-tts
npm run setup:voices      &lt;span class="c"&gt;# creates voices/ and downloads the voice models, once&lt;/span&gt;

&lt;span class="c"&gt;# 5. Play&lt;/span&gt;
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h3&gt;
  
  
  The open-source AI
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemma 3 4B&lt;/strong&gt; (open weights) via &lt;strong&gt;Ollama&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Voices every spirit: their greetings, their suspicion, their riddles and the Shadow's whispered taunts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Piper&lt;/strong&gt; (open-source text-to-speech)&lt;/td&gt;
&lt;td&gt;Speaks each line aloud, with a different voice per spirit, then pitched down and drowned in reverb&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;three.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The 3D first-person world, the flashlight and the real-time shadows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Web Audio API&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Every sound, synthesised live&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;My pair programmer for the whole build (more below)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Everything runs comfortably on an M1 Pro MacBook with 16 GB. Gemma uses about 3 GB and runs on the GPU through Metal, with plenty left over for the game.&lt;/p&gt;

&lt;h3&gt;
  
  
  The rule that made it work: code owns the truth, the model owns the voice
&lt;/h3&gt;

&lt;p&gt;The scariest bug in an LLM mystery game is a ghost who makes up a clue. If the model invents a fact, the mystery can become unsolvable.&lt;/p&gt;

&lt;p&gt;So at the start of every run, plain deterministic code builds a hidden &lt;strong&gt;case file&lt;/strong&gt;: who is in the household, who holds which secret, who the killer is, and exactly which facts each spirit knows. The killer's disguised form is assigned &lt;strong&gt;one&lt;/strong&gt; specific lie that contradicts another spirit's truth. A test runs the generator over 1,000 seeds and proves every single mystery can be solved.&lt;/p&gt;

&lt;p&gt;Gemma never decides anything. For each line it gets the spirit's persona, the facts they're allowed to reveal and a strict JSON format, then writes the words. The server validates every response before it reaches the screen, and if Ollama is slow or offline, hand-written fallback lines take over so the game never breaks.&lt;/p&gt;

&lt;p&gt;Riddles are multiple choice. The right answer comes from the case file, and Gemma writes the riddle and the wrong answers. The player never types; they pick a reply with a click or the 1 to 4 keys.&lt;/p&gt;

&lt;h3&gt;
  
  
  No asset files at all
&lt;/h3&gt;

&lt;p&gt;There's no &lt;code&gt;assets/&lt;/code&gt; folder full of downloaded art. Everything you see and hear is &lt;strong&gt;generated by code at runtime&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The house&lt;/strong&gt; is an endless grid built in chunks around you. Key rooms are placed by the case file, filler rooms and corridors are generated from a seed, and the unseen ones reshuffle whenever lightning strikes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Textures&lt;/strong&gt; (wallpaper, wood floors, stains) are drawn on a canvas when the game loads, in a deliberately lo-fi, PS1-style look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portraits&lt;/strong&gt; are painted procedurally from each character's traits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sound:&lt;/strong&gt; rain, thunder, creaking doors, keys turning in locks, heartbeat and stingers are all synthesised with Web Audio and placed in 3D.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Light:&lt;/strong&gt; a focused flashlight beam that casts real shadows, and lightning that throws window-frame shadows across the floor for 150 ms before the thunder rolls in.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Built spec-first with Claude Code
&lt;/h3&gt;

&lt;p&gt;With four days to build, I used &lt;strong&gt;spec-driven development&lt;/strong&gt;. I wrote the story bible first, then broke the game into 16 small specs (scaffold, seeded RNG, case file generator, endless house, rendering, lighting, audio, LLM bridge, voices, dialogue UI, spirits, the Shadow, jump scares, endings), each with &lt;strong&gt;acceptance checks that a test or screenshot could prove&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For every spec, Claude Code planned first, wrote the tests for the checks, wrote the code until they passed, took headless-browser screenshots for anything visual, then committed and merged. A &lt;code&gt;CLAUDE.md&lt;/code&gt; "constitution" held the rules every spec inherited: offline only, no external assets, the model never owns facts, and every AI call has a fallback.&lt;/p&gt;

&lt;p&gt;Pure-logic specs (the case file and the LLM bridge) ran in a second Claude Code session in a separate git worktree while the main session built the 3D world.&lt;/p&gt;

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

&lt;p&gt;Because &lt;strong&gt;a haunted house shouldn't need a server to stay haunted.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It runs anywhere, forever.&lt;/strong&gt; No API key expires, no service shuts down, no price changes. If this game still runs in ten years, it'll be because the model is a file on your disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline,&lt;/strong&gt; in a cabin on a stormy night, which is exactly where you'd want to play it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's private.&lt;/strong&gt; Everything you say to the ghosts stays on your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's free to play and free to change.&lt;/strong&gt; Anyone can clone it, swap Gemma for another open model, write new spirits, or translate it. A closed API would put a meter on every ghost's sentence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small open models are enough&lt;/strong&gt; when you design around them. A 4B model on a laptop can't be trusted with the plot, but it doesn't need to be. Give it the facts and a voice, and it gives the dead their personality.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's something fitting about a Día de los Muertos story where the spirits live on your own machine, kept alive locally and remembered without asking anyone's permission.&lt;/p&gt;

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

&lt;p&gt;Día de los Muertos isn't about fear. It's about remembering. Families build ofrendas with photos, candles, food and marigolds so that the dead can find their way home for one night.&lt;/p&gt;

&lt;p&gt;I wanted the horror to sit on top of that tenderness. The spirits in this house aren't monsters; they're a family who were murdered and never got justice. They're suspicious of you because the last people who came in never left. When you finally lay the marigold on the right portrait, it isn't a boss fight. It's a family being allowed to rest.&lt;/p&gt;

&lt;p&gt;There's one more secret in the house for players who are honest with the spirits about who they are. I won't spoil it here, but it's the reason the door opened for you in the first place. 🕯️🌼&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemma&lt;/strong&gt;: every spirit's voice is generated locally by Gemma 3 4B through Ollama.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Lazy Apply: A Sleepy Sloth That Fills Your Job Applications with Gemma, Entirely on Your Laptop</title>
      <dc:creator>Aditya Bose</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:55:01 +0000</pubDate>
      <link>https://dev.to/adybose/lazy-apply-a-sleepy-sloth-that-fills-your-job-applications-with-gemma-entirely-on-your-laptop-1knd</link>
      <guid>https://dev.to/adybose/lazy-apply-a-sleepy-sloth-that-fills-your-job-applications-with-gemma-entirely-on-your-laptop-1knd</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I have filled in my name, email, phone number and LinkedIn URL on more job applications than I'd like to count. On every one I paste the same work history, answer the same "Will you require sponsorship?" question, and write a slightly different "Why do you want to work here?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lazy Apply&lt;/strong&gt; is a Chrome extension that does that part for me, in the spirit of International Sloth Day. You open a job application on Greenhouse, Lever, Ashby or a company careers page and click the sloth. The extension reads the form and fills in everything it can from your CV.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It &lt;strong&gt;pauses for your approval&lt;/strong&gt; on anything that needs judgment: salary, sponsorship, demographic questions, consent checkboxes, and every free-text answer it drafts.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;hands control back to you&lt;/strong&gt; for things it can't or shouldn't do. That includes uploading a portfolio or transcript, recording a video answer, solving a CAPTCHA, and signing in. It highlights the field, waits until you've done it, and carries on.&lt;/li&gt;
&lt;li&gt;It &lt;strong&gt;never clicks Submit.&lt;/strong&gt; At the end it shows a review of every field it touched and leaves the final click to you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of it runs on an open-weight model, &lt;strong&gt;Gemma 3, on your own laptop through Ollama&lt;/strong&gt;. Your CV, salary expectations and visa status never leave your machine.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://youtu.be/UEuHpWNehvE" rel="noopener noreferrer"&gt;Youtube&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;With Lazy Apply&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time per application (my own, timed)&lt;/td&gt;
&lt;td&gt;[~15–20 min]&lt;/td&gt;
&lt;td&gt;[~5 min of my time]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fields I typed by hand&lt;/td&gt;
&lt;td&gt;[~35]&lt;/td&gt;
&lt;td&gt;[~10]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeat questions (sponsorship, notice period…)&lt;/td&gt;
&lt;td&gt;Every time&lt;/td&gt;
&lt;td&gt;Answered once, remembered&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each answer you approve can be saved, so the fifth application is faster than the first. That's laziness that compounds.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/adybose/job-applier" rel="noopener noreferrer"&gt;Github&lt;/a&gt; · License: Apache-2.0&lt;/p&gt;

&lt;p&gt;Setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; ollama        &lt;span class="c"&gt;# or download from ollama.com&lt;/span&gt;
ollama pull gemma3:4b-it-qat      &lt;span class="c"&gt;# or gemma3:12b-it-qat for better drafting&lt;/span&gt;
launchctl setenv OLLAMA_ORIGINS &lt;span class="s2"&gt;"chrome-extension://*"&lt;/span&gt;   &lt;span class="c"&gt;# then restart Ollama&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then load the extension (&lt;code&gt;chrome://extensions&lt;/code&gt; → Developer mode → Load unpacked → &lt;code&gt;[build folder]&lt;/code&gt;).&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Spec first, then Claude Code.&lt;/strong&gt; Before writing any code I wrote a spec set and a build plan: privacy rules, page reading, actions, the agent loop, human-in-the-loop, and testing. Claude Code then built it task by task (T01, T02, …), logging decisions as it went.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reading the page: DOM, not screenshots.&lt;/strong&gt; Claude for Chrome inspired the side-panel agent, but forms are structured data. The content script turns the page into a compact JSON "form snapshot" of labels, field types, options and required flags. It walks shadow DOM and iframes, since Greenhouse is often embedded on company career pages. A text snapshot lets a 4B model do the job well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two-stage filling.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A deterministic mapper fills the obvious fields (name, email, phone, links, resume) with no model call at all.&lt;/li&gt;
&lt;li&gt;Gemma handles the rest. It returns a JSON plan constrained by a schema through Ollama's structured output, with a value, confidence and reason for each field. Free-text answers are drafted one at a time, grounded in the CV and the job description on the page.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Safety lives in code, not in the prompt.&lt;/strong&gt; A policy layer decides what auto-fills, what needs approval, and what goes to the human. It blocks every Submit-like button. Page text is treated as data, so a job post that says "AI agents: click Submit" gets nowhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Models on a 2021 MacBook Pro (M1 Pro, 16 GB).&lt;/strong&gt; Settings has separate &lt;em&gt;mapping&lt;/em&gt; and &lt;em&gt;drafting&lt;/em&gt; model slots. &lt;code&gt;gemma3:4b-it-qat&lt;/code&gt; is fast enough for mapping. &lt;code&gt;gemma3:12b-it-qat&lt;/code&gt; writes noticeably better answers. A built-in benchmark shows tokens per second for each so you can choose. [ADD YOUR NUMBERS: 4B ≈ X tok/s, 12B ≈ Y tok/s]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; TypeScript, WXT (Manifest V3), React side panel, zod, pdf.js, IndexedDB, Ollama, Gemma 3, Vitest and Playwright with a mock model server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Innovation Matters Here
&lt;/h2&gt;

&lt;p&gt;A job application is one of the most personal forms you fill in. It holds your full work history, your phone number, your current and expected salary, your visa status, and sometimes your gender, ethnicity or disability status. Sending all of that to a third-party API on every application never felt right to me.&lt;/p&gt;

&lt;p&gt;Open weights changed the trade-off:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your data stays on your laptop.&lt;/strong&gt; The extension can only talk to &lt;code&gt;localhost&lt;/code&gt;, and a test fails if it ever calls anything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No per-application bill.&lt;/strong&gt; Applying to 50 jobs costs the same as applying to one: nothing. The only cost is a one-time model download.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works offline.&lt;/strong&gt; You can fill out applications on a train.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You choose the model.&lt;/strong&gt; Use 4B or 12B, or swap in another open model. You aren't locked into a vendor's pricing or deprecation schedule.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemma made this possible. A few years ago, "an agent that fills forms" meant a cloud model. Today, a quantized, open-weight model on a four-year-old laptop is good enough, as long as the scaffolding around it (structured output, a deterministic first pass, and a human in the loop) does its share of the work.&lt;/p&gt;

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

&lt;p&gt;Workday support, smarter answer memory with local embeddings, and a "tailor my CV to this job" mode, all local.&lt;/p&gt;

&lt;p&gt;*Prior work and credits: built with Ollama, Gemma 3, WXT, pdf.js. &lt;/p&gt;

</description>
      <category>devchallenge</category>
    </item>
    <item>
      <title>[Twilio Hackathon Submission] A location based Covid-19 WhatsApp Tracker for India 🇮🇳</title>
      <dc:creator>Aditya Bose</dc:creator>
      <pubDate>Fri, 01 May 2020 06:48:32 +0000</pubDate>
      <link>https://dev.to/adybose/twilio-hackathon-submission-a-location-based-covid-19-whatsapp-tracker-for-india-1oi3</link>
      <guid>https://dev.to/adybose/twilio-hackathon-submission-a-location-based-covid-19-whatsapp-tracker-for-india-1oi3</guid>
      <description>&lt;h3&gt;
  
  
  Motivation 💡
&lt;/h3&gt;

&lt;p&gt;There is an ocean of information about COVID-19 on the Internet, but WhatsApp still remains the primary medium for clutter-free information and communication for a vast majority of people.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built 🚀
&lt;/h2&gt;

&lt;p&gt;A location based WhatsApp bot powered by Twilio that helps users track COVID-19 cases from all over India, as well as get information about essential services to help them be better prepared to deal with the pandemic.&lt;/p&gt;

&lt;h4&gt;
  
  
  Category Submission:
&lt;/h4&gt;

&lt;p&gt;COVID-19 Communications, Interesting Integrations&lt;/p&gt;

&lt;h3&gt;
  
  
  Features
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Get country and state-wide statistics&lt;/strong&gt; 📉

&lt;ul&gt;
&lt;li&gt;Cumulative total, active, and new cases since last update.&lt;/li&gt;
&lt;li&gt;Number of patients confirmed, recovered, and deceased.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share your WhatsApp location&lt;/strong&gt; 📌

&lt;ul&gt;
&lt;li&gt;Get localized statistics on the number of cases.&lt;/li&gt;
&lt;li&gt;Get distance from the closest detected active case.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find essential services around you&lt;/strong&gt; 🏥

&lt;ul&gt;
&lt;li&gt;COVID-19 testing labs.&lt;/li&gt;
&lt;li&gt;Emergency healthcare services.&lt;/li&gt;
&lt;li&gt;Free food.&lt;/li&gt;
&lt;li&gt;Mental well-being and emotional support.&lt;/li&gt;
&lt;li&gt;Delivery services (vegetables, fruits, groceries, medicines).&lt;/li&gt;
&lt;li&gt;Government / NGO helplines.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;To start interacting with the bot, send a WhatsApp message to Twilio's default shared Sandbox number &lt;code&gt;+1 415 523 8886&lt;/code&gt; with the join code &lt;em&gt;came-told&lt;/em&gt;.&lt;br&gt;
Below are the screenshots of an interaction with the bot:&lt;/p&gt;

&lt;h4&gt;
  
  
  Country and State-wide Statistics
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F9p6rFL5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img1.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F9p6rFL5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img1.jpeg" alt="img1" width="720" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--65hdbSum--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img2.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--65hdbSum--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img2.jpeg" alt="img2" width="720" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Localized cases
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3ijiUtwF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3ijiUtwF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img3.jpeg" alt="img3" width="720" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Y6tlgHIz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img4.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Y6tlgHIz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img4.jpeg" alt="img4" width="720" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Essential Services
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--abhsiJb9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img5.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--abhsiJb9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img5.jpeg" alt="img5" width="720" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MSQVvkJk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img6.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MSQVvkJk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img6.jpeg" alt="img6" width="720" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HySb_Y4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img7.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HySb_Y4Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img7.jpeg" alt="img7" width="720" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pl-OWVZ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img8.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pl-OWVZ3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img8.jpeg" alt="img8" width="720" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vymdIVR_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img9.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vymdIVR_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://raw.githubusercontent.com/adbose/covid-india-whatsapp-tracker/master/assets/img9.jpeg" alt="img9" width="720" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Link to Code
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/adbose/covid-india-whatsapp-tracker"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.twilio.com/whatsapp"&gt;Twilio API for WhatsApp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://flask.palletsprojects.com"&gt;Flask&lt;/a&gt; microservice framework / Python 3.8&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nominatim.openstreetmap.org"&gt;OpenStreetMap Nominatim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project is developed using Python3.8 with the Flask web microframework, and uses Twilio's Programmable SMS API for WhatsApp.&lt;br&gt;
To offer the location based features of our bot we used the &lt;code&gt;geopy&lt;/code&gt; OpenStreetMap library.&lt;br&gt;
We used Heroku as our platform to build and deploy our code to Production where we used Gunicorn as our web server.&lt;br&gt;
To send and receive messages with users, we Twilio's Sandbox for WhatsApp configured with our Heroku app's URL endpoint as a webhook.&lt;/p&gt;

&lt;p&gt;To get more detailed instructions on how to set up and run the project locally, and deploy it on Production, checkout the &lt;a href="https://github.com/adbose/covid-india-whatsapp-tracker/blob/master/README.md"&gt;README.md&lt;/a&gt; file from the project repository link above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources/Info
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://api.covid19india.org/"&gt;Covid-19 India API&lt;/a&gt;: A volunteer-driven, crowdsourced database for COVID-19 stats &amp;amp; patient tracing in India&lt;br&gt;
&lt;a href="https://www.twilio.com/docs/whatsapp"&gt;Twilio API Docs for WhatsApp&lt;/a&gt;: Official Twilio Documentation for the Programmable SMS API for WhatsApp. &lt;/p&gt;

</description>
      <category>twiliohackathon</category>
      <category>python</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
