<?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: Samridhi Gupta</title>
    <description>The latest articles on DEV Community by Samridhi Gupta (@justsamridhi).</description>
    <link>https://dev.to/justsamridhi</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%2F4151827%2F095687a2-1d82-4678-bd41-092ea9e4c9da.png</url>
      <title>DEV Community: Samridhi Gupta</title>
      <link>https://dev.to/justsamridhi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/justsamridhi"/>
    <language>en</language>
    <item>
      <title>🌶️ 11 PM. 47 Tabs. A 9 AM Deadline. And One Tiny Sloth to Save My Sanity. 🦥</title>
      <dc:creator>Samridhi Gupta</dc:creator>
      <pubDate>Sat, 24 Oct 2026 11:26:22 +0000</pubDate>
      <link>https://dev.to/justsamridhi/11-pm-47-tabs-a-9-am-deadline-and-one-tiny-sloth-to-save-my-sanity-2hgg</link>
      <guid>https://dev.to/justsamridhi/11-pm-47-tabs-a-9-am-deadline-and-one-tiny-sloth-to-save-my-sanity-2hgg</guid>
      <description>&lt;h1&gt;
  
  
  🦥 I Built a Sloth for My 47 Tabs. Here's Why My Browser Needed One.
&lt;/h1&gt;

&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 — Week 3: Slow and Steady&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I opened a tutorial to learn one thing.&lt;/p&gt;

&lt;p&gt;Forty minutes later, I had six new tabs, three half-read explanations, and absolutely no idea how to do the thing I'd opened the tutorial for.&lt;/p&gt;

&lt;p&gt;One article linked to another. That one assumed I understood something else. The documentation explained the API but sent me down a rabbit hole of unfamiliar terminology.&lt;/p&gt;

&lt;p&gt;I wasn't learning anymore. I was collecting browser tabs like they were going to give me extra marks.&lt;/p&gt;

&lt;p&gt;And somewhere in that mess, I noticed the absurdity of it all:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I could find an explanation for almost anything online, yet extracting the one thing I actually needed was becoming a task of its own.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I didn't want AI to write my assignments or think for me. I wanted it to help me get my bearings—to show me the central idea, separate important points from the noise, and help me see how everything connected.&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%2Fvtx5sljt0zdgfnycvgru.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%2Fvtx5sljt0zdgfnycvgru.png" alt="Tech Stack" width="800" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Slothy&lt;/strong&gt;. 🦥&lt;/p&gt;

&lt;p&gt;Slothy is an open-source Chrome extension that uses &lt;strong&gt;Gemma 3 4B through Ollama&lt;/strong&gt; to transform webpage content into a gist, key takeaways, action items, and a visual mind map—all through local AI inference.&lt;/p&gt;

&lt;p&gt;Open the page. Click &lt;strong&gt;Get the gist&lt;/strong&gt;. Start with the big picture instead of fighting your way through the entire wall of text.&lt;/p&gt;

&lt;p&gt;No hosted AI inference API in the core summarization workflow. No need to copy the article into another AI website.&lt;/p&gt;

&lt;p&gt;Just the page you're trying to understand, and a little sloth helping you make sense of it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Because sometimes, the hardest part of learning isn't finding the answer. It's finding your way through everything surrounding it.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🦥 1. What I Built: A Sloth for Information Overload
&lt;/h2&gt;

&lt;p&gt;Slothy is designed around one simple interaction: turn a long webpage into something easier to navigate.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Get the gist&lt;/strong&gt;, and Slothy organizes the model's response into four views.&lt;/p&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;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;The Gist&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Presents the central idea in a concise summary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key Takeaways&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pulls out the main points worth remembering.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Action Items&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Turns the content into practical next steps.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Visual Mind Map&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shows relationships between ideas in a visual format.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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%2Fztatqxjx7lw5628nzxb2.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%2Fztatqxjx7lw5628nzxb2.png" alt="Slothy reading interface" width="800" height="430"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The idea isn't to replace reading. It's to give readers a starting point—to help them understand the structure of an article before deciding where to spend their attention.&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%2F0ilsaelnlyy46s0q3hsw.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%2F0ilsaelnlyy46s0q3hsw.png" alt="Slothy's summary and reading views" width="517" height="726"&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%2Fptzryrcqvc9huds458bw.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%2Fptzryrcqvc9huds458bw.png" alt="Visual Map" width="577" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why a sloth?
&lt;/h3&gt;

&lt;p&gt;A sloth felt like the right mascot for a tool about slowing down.&lt;/p&gt;

&lt;p&gt;The visual identity follows the same principle: warm cream backgrounds, dark-brown typography, muted olive-green accents, and a friendly leafy mascot.&lt;/p&gt;

&lt;p&gt;The product should feel calm even when the page you're reading isn't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slow down. Get the gist.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's Slothy in one sentence.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎬 2. Demo: From Webpage to Gist
&lt;/h2&gt;

&lt;p&gt;Slothy runs as a Chrome extension connected to a local Ollama instance.&lt;/p&gt;

&lt;p&gt;The basic workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a webpage you want to understand.&lt;/li&gt;
&lt;li&gt;Open Slothy and start the summarization workflow.&lt;/li&gt;
&lt;li&gt;Let Gemma process the extracted page content locally.&lt;/li&gt;
&lt;li&gt;Explore the gist, key takeaways, action items, and mind map.&lt;/li&gt;
&lt;/ol&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%2Fc4bcvktvmt2ix05k4j3l.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%2Fc4bcvktvmt2ix05k4j3l.png" alt="Slothy in action — reading results and visual mind map" width="496" height="751"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There isn't a hosted demo in this submission. Slothy is designed to run locally, so you can try it by installing the extension and configuring Ollama on your own machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 3. The Code: Open Source, Not a Black Box
&lt;/h2&gt;

&lt;p&gt;Slothy lives in your browser, but its language model runs on your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/justsamridhi/Slothy" rel="noopener noreferrer"&gt;Explore Slothy on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To try it, you'll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google Chrome with developer mode enabled.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt; installed and running.&lt;/li&gt;
&lt;li&gt;The Gemma model pulled locally using &lt;code&gt;ollama pull gemma3:4b&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The Slothy extension loaded into Chrome and configured to connect to your local Ollama endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once the local model is available, Slothy can send the extracted webpage content to Ollama and present the generated reading results in the extension.&lt;/p&gt;

&lt;p&gt;The setup requires a compatible local environment and enough system resources to run the model. The benefit is that the core summarization workflow doesn't depend on a hosted AI inference API.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ 4. How I Built It: From Browser Tab to Structured Output
&lt;/h2&gt;

&lt;p&gt;I wanted Slothy to be more than a pretty interface wrapped around an AI API. The interesting engineering challenge was connecting webpage extraction, local inference, output handling, and the user interface into one coherent workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  The architecture
&lt;/h3&gt;

&lt;p&gt;Here's the path a webpage takes through Slothy:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webpage → Content extraction → Local Gemma inference → Response parsing → Reading interface&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fozmygi8n4vdqxwesxx9z.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%2Fozmygi8n4vdqxwesxx9z.png" alt="Slothy architecture and technical workflow" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each stage has a distinct responsibility.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chrome extension&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides the browser interface and initiates the workflow.&lt;/td&gt;
&lt;td&gt;Keeps the experience close to the content being read.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Content extraction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Collects relevant text from the active webpage.&lt;/td&gt;
&lt;td&gt;Gives the model useful input instead of an entire page's interface clutter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama + Gemma 3 4B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Processes the extracted content locally.&lt;/td&gt;
&lt;td&gt;Avoids a hosted inference API in the core summarization workflow.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Response parsing and validation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Converts the model's response into usable application data.&lt;/td&gt;
&lt;td&gt;Helps prevent malformed output from breaking the interface.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reading interface&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Presents the gist, takeaways, action items, and mind map.&lt;/td&gt;
&lt;td&gt;Turns generated text into a more navigable reading experience.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The technology stack
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Role in Slothy&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;&lt;/td&gt;
&lt;td&gt;Open-weight language model for summarization and structured reading output.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ollama&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Runs the model locally and exposes its local API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chrome Manifest V3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Defines the browser extension and its permissions and behavior.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Handles the extension workflow and application logic.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HTML and CSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Build and style the extension interface.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Native SVG&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Renders the visual mind map.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Chrome storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Supports browser-local extension settings and data where implemented.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  The engineering decisions behind the interface
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Extract content before asking the model to summarize it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A webpage contains more than the article itself: navigation, menus, footers, and other elements can get in the way. The extraction stage aims to give the model relevant reading content rather than blindly treating the entire page as useful input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Keep inference local.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Slothy communicates with Ollama on the local machine, using its local API endpoint. The extension doesn't need a hosted model API to generate its core summaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Treat model output as data that needs handling.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Language models don't always return perfectly structured responses. When an application expects specific fields, the response must be interpreted and checked before the interface relies on it.&lt;/p&gt;

&lt;p&gt;This is an important distinction: generating a response is one problem; turning that response into reliable application behavior is another.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Make the result easier to navigate.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The output isn't limited to a paragraph of generated text. Slothy separates the gist, key takeaways, and action items, and presents relationships between ideas through a visual mind map.&lt;/p&gt;

&lt;p&gt;That makes the interface a reading aid rather than just another chat window.&lt;/p&gt;

&lt;h3&gt;
  
  
  The lesson I took away
&lt;/h3&gt;

&lt;p&gt;Building Slothy reinforced an important engineering principle:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A useful AI application depends on more than the model. It depends on the entire pipeline around it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Input quality affects the response. Output structure affects the interface. Local setup affects whether the experience works at all.&lt;/p&gt;

&lt;p&gt;The model is only one part of the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 5. Why Open Innovation Matters: Your Reading Shouldn't Need a Cloud Address
&lt;/h2&gt;

&lt;p&gt;A research paper. A client brief. A recruiter's message. A technical document you haven't fully understood yet.&lt;/p&gt;

&lt;p&gt;Webpages can contain information people would prefer not to send to a remote AI service.&lt;/p&gt;

&lt;p&gt;I wanted to explore a different architecture.&lt;/p&gt;

&lt;p&gt;Slothy uses &lt;strong&gt;Gemma 3 4B through Ollama&lt;/strong&gt;, allowing the model to process extracted webpage content locally on the user's machine.&lt;/p&gt;

&lt;p&gt;There is no Slothy cloud server in the core summarization workflow.&lt;/p&gt;

&lt;p&gt;That isn't just a privacy slogan. It's an architectural decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  What open-weight AI makes possible
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benefit&lt;/th&gt;
&lt;th&gt;What it means for Slothy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local inference&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The installed model processes content on the user's machine.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No hosted inference API bill&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The core summarization workflow doesn't require a paid hosted model API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;More control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Users manage their local model and runtime environment.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inspectable code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Developers can examine the extension and contribute improvements.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Room to experiment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The local model can be changed when the application supports the selected model and output format.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Local inference isn't magic. It uses your computer's resources, requires model installation, and can be slower or more demanding on some machines. Local processing also doesn't automatically guarantee that every part of an application is private; permissions, dependencies, and data handling still matter.&lt;/p&gt;

&lt;p&gt;But it gives developers another way to build AI applications—one in which a hosted inference provider doesn't have to sit at the center of every interaction.&lt;/p&gt;

&lt;p&gt;Open source makes the next step possible: other developers can inspect the implementation, learn from the design, adapt it, and help improve it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The future of AI shouldn't be limited to whoever can afford another API bill. Sometimes, all you need is an open model, your own machine, and an idea worth building.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 6. Building with an Agent—and Making the Work Traceable with Entire
&lt;/h2&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%2Fvh1ffbzav6ka09knbt6w.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%2Fvh1ffbzav6ka09knbt6w.png" alt="Slothy brand identity — Slow down. Get the gist." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Slothy wasn't built by writing one perfect prompt and watching a finished product appear.&lt;/p&gt;

&lt;p&gt;It took an iterative approach: define the problem, build a piece, test the behavior, inspect what breaks, and refine the implementation.&lt;/p&gt;

&lt;p&gt;I used &lt;strong&gt;Antigravity as my coding agent&lt;/strong&gt; and integrated &lt;strong&gt;Entire&lt;/strong&gt; into the repository to capture agent activity and connect checkpoints to Git commits.&lt;/p&gt;

&lt;p&gt;Why did that matter?&lt;/p&gt;

&lt;p&gt;Because AI-assisted development introduces a second problem alongside writing code: understanding how a change came to exist, what prompted it, and whether the resulting implementation actually works.&lt;/p&gt;

&lt;h3&gt;
  
  
  From agent activity to a Git checkpoint
&lt;/h3&gt;

&lt;p&gt;I configured Entire's Antigravity hooks and verified the installation using &lt;code&gt;entire doctor&lt;/code&gt;. Entire recorded checkpoint activity, and my first verified checkpoint was linked to commit &lt;code&gt;07fb197&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Document Slothy measurements and add agent workflow notes&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That gave me a concrete link between captured agent activity and a version-controlled change—not just a claim that an agent had done some work.&lt;/p&gt;

&lt;p&gt;The screenshots in this post show the relevant workflow and evidence. The important distinction is that a checkpoint and a successful Git commit establish traceability for that recorded change; they don't automatically prove that every earlier debugging conversation was captured.&lt;/p&gt;

&lt;h3&gt;
  
  
  When confident reports weren't enough
&lt;/h3&gt;

&lt;p&gt;While debugging Slothy, I encountered a frustrating problem: on a long Wikipedia page, the model returned only two tokens, yet the interface displayed a misleading summary card. Later, even when the model generated a substantial response, the extension crashed with a &lt;code&gt;ReferenceError&lt;/code&gt; because &lt;code&gt;renderMindmapSvg()&lt;/code&gt; was missing.&lt;/p&gt;

&lt;p&gt;During this process, some agent reports claimed that files had been created or fixes completed when the actual files and diffs told a different story.&lt;/p&gt;

&lt;p&gt;I learned to verify claims against the source code, Git changes, browser Console and Network tab, and Ollama's runtime information rather than trusting a confident explanation.&lt;/p&gt;

&lt;p&gt;Entire made it possible to inspect recorded agent activity alongside a commit, but I also encountered a limitation: its logs reported a transcript-preparation failure because the Antigravity IDE transcript path was outside the directory it expected.&lt;/p&gt;

&lt;p&gt;I therefore don't treat the checkpoint as proof that the complete conversation was captured. I documented the earlier debugging separately in &lt;code&gt;docs/AGENT_SESSION.md&lt;/code&gt;, distinguishing my notes from Entire-captured activity.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I learned
&lt;/h3&gt;

&lt;p&gt;Entire was useful not because it made AI-generated work automatically trustworthy, but because it gave me a way to inspect and connect recorded activity with a real Git change.&lt;/p&gt;

&lt;p&gt;The process reinforced three habits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inspect the diff.&lt;/strong&gt; A confident explanation isn't evidence that a file changed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test the behavior.&lt;/strong&gt; A generated response isn't proof that the interface handles it correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the history honest.&lt;/strong&gt; A recorded checkpoint is useful, but its limitations should be visible too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, the best use of Entire is to make agent-assisted development &lt;strong&gt;traceable, inspectable, and easier to question&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And that fits the same principle behind Slothy: useful AI should help people understand what is happening, not ask them to accept a black box on faith.&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%2Fsreis4qevwr482ggevem.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%2Fsreis4qevwr482ggevem.png" alt=" " width="799" height="345"&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%2Fsh54rs8zccy53pitcn7q.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%2Fsh54rs8zccy53pitcn7q.png" alt=" " width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🏆 7. Prize Categories
&lt;/h2&gt;

&lt;p&gt;I'm submitting Slothy for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma:&lt;/strong&gt; Gemma 3 4B powers Slothy's local webpage summarization workflow through Ollama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slow and Steady:&lt;/strong&gt; Slothy encourages a more deliberate way to process information: start with the big picture, understand the key ideas, and decide what to do next.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Entire:&lt;/strong&gt; I integrated Entire's Antigravity hooks into my repository, verified the setup, and linked a recorded checkpoint to a Git commit. The process also taught me to be transparent about the limits of transcript capture instead of overstating what the evidence proves.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🦥 One Less Rabbit Hole
&lt;/h2&gt;

&lt;p&gt;Slothy started with a small frustration: opening a tutorial to learn one thing and ending up lost in ten other tabs.&lt;/p&gt;

&lt;p&gt;I built it because I wanted a tool that could help me find the thread connecting all that information—without handing the entire task of understanding over to AI.&lt;/p&gt;

&lt;p&gt;It's a work in progress, but it represents what I care about as a developer: building useful tools, experimenting with open-source AI, and learning by making things real.&lt;/p&gt;

&lt;p&gt;If you've ever opened a tutorial and forgotten why you opened it in the first place, you understand the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here's to fewer rabbit holes, clearer thinking, and taking the slow lane when it matters.&lt;/strong&gt; 🦥&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with Gemma 3 4B, Ollama, JavaScript, and a browser full of ideas.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/justsamridhi/Slothy" rel="noopener noreferrer"&gt;&lt;strong&gt;Explore Slothy on GitHub →&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>🚨 That APK Looks Innocent. Let's Interrogate It.</title>
      <dc:creator>Samridhi Gupta</dc:creator>
      <pubDate>Sun, 18 Oct 2026 20:34:50 +0000</pubDate>
      <link>https://dev.to/justsamridhi/that-apk-looks-innocent-lets-interrogate-it-3137</link>
      <guid>https://dev.to/justsamridhi/that-apk-looks-innocent-lets-interrogate-it-3137</guid>
      <description>&lt;h1&gt;
  
  
  APK-Xray: Evidence-First Android Security Analysis, Enhanced by AI
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;An APK named &lt;em&gt;Wedding Invitation.apk&lt;/em&gt; arrives on WhatsApp. It looks harmless—but a malicious app disguised as a wedding invitation can steal contacts, SMS messages, bank OTPs, and notification data. CERT-In's Cyber Swachhta Kendra documented this threat in its June 2025 &lt;a href="https://www.csk.gov.in/alerts/SpyMax_android_malware.html" rel="noopener noreferrer"&gt;SpyMax Android malware alert&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The scale of the problem matters, too: &lt;strong&gt;India recorded 86,420 cybercrime cases in 2023&lt;/strong&gt;, according to NCRB data published by the Ministry of Home Affairs. (&lt;a href="https://www.mha.gov.in/" rel="noopener noreferrer"&gt;Ministry of Home Affairs&lt;/a&gt; · &lt;a href="https://www.ncrb.gov.in/" rel="noopener noreferrer"&gt;National Crime Records Bureau&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That raises a question: &lt;strong&gt;before installing an APK, how can we understand what it might be capable of doing?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's why I built &lt;strong&gt;APK-Xray&lt;/strong&gt;, an evidence-based Android APK security analyzer.&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%2F62owhqycz95yesmvomz1.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%2F62owhqycz95yesmvomz1.png" alt="APK-Xray interface showing the main Android APK security analysis experience" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It extracts security-relevant metadata, including permissions and application components, then evaluates them using explicit detection rules. The goal is to make potential risks easier to investigate by showing the evidence behind each finding—not simply producing another alarming warning.&lt;/p&gt;

&lt;p&gt;I also explored AI-assisted explanations to make technical findings easier to understand, while keeping evidence—not AI-generated claims—at the center of the analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The principle: Don't just flag a potential risk. Show the evidence behind it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;APK-Xray is a static analysis tool, not a guarantee of safety. It helps investigate an APK's declared capabilities, but cannot establish everything the app might do at runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React + TypeScript + Vite&lt;/strong&gt; for a responsive, component-based interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;APK upload and analysis workflow&lt;/strong&gt; with clear loading, error, and report states.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infographic security reports&lt;/strong&gt; with finding cards, donut visualizations, pipeline steps, and progress indicators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evidence-focused findings&lt;/strong&gt; that help users understand detected APK capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multilingual interface&lt;/strong&gt; with an English/Hindi selector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Light and dark themes&lt;/strong&gt; for a flexible viewing experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reusable UI components&lt;/strong&gt; with automated tests using Vitest and React Testing Library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Production-ready build&lt;/strong&gt; verified through TypeScript checks and Vite.&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%2F8udjk21xlycoe6byp7mn.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%2F8udjk21xlycoe6byp7mn.png" alt="APK-Xray frontend screenshot showing the security report interface" width="800" height="381"&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%2Fi45qes38a45apvwlduo2.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%2Fi45qes38a45apvwlduo2.png" alt="APK-Xray interface screenshot showing report details" width="800" height="381"&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%2Fvvi2xvy0cva7asf9t93g.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%2Fvvi2xvy0cva7asf9t93g.png" alt="APK-Xray interface screenshot showing additional frontend components" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1ayNjhGjtRvw6qJ3BiKz4q05MR_GYAqPb/view?usp=sharing" rel="noopener noreferrer"&gt;Watch the APK-Xray Demo&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Explore the source code:&lt;/strong&gt; &lt;a href="https://github.com/justsamridhi/APK-Xray" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to inspect the codebase with AI-assisted repository analysis? &lt;a href="https://gitingest.com/justsamridhi/apk-xray" rel="noopener noreferrer"&gt;Explore APK-Xray on Gitingest&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Structure
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APK-Xray/
├── backend/
│   ├── api.py                  # FastAPI endpoints and request handling
│   ├── parser/
│   │   └── apk_parser.py       # APK metadata extraction
│   ├── scoring.py              # Deterministic security rules and scoring
│   ├── gemma.py                # AI explanation integration
│   ├── report_builder.py       # Structured report generation
│   ├── report_store.py         # Report persistence
│   ├── sentry_setup.py         # Observability configuration
│   ├── schema/
│   │   └── report.schema.json  # Report contract
│   └── test_*.py               # Backend and integration tests
├── frontend/
│   └── src/
│       ├── api.ts              # Backend communication
│       ├── App.tsx             # Main application interface
│       ├── report.ts           # Report handling
│       └── components/         # Reusable UI components
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The backend owns APK parsing, deterministic detection, scoring, report validation, optional Gemma explanations, and persistence. The React + TypeScript frontend handles uploads and presents the resulting security report.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔗 Try APK-Xray
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://apk-xray.vercel.app/" rel="noopener noreferrer"&gt;https://apk-xray.vercel.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend Health Check:&lt;/strong&gt; &lt;a href="https://apk-xray.onrender.com/api/health" rel="noopener noreferrer"&gt;https://apk-xray.onrender.com/api/health&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source Code:&lt;/strong&gt; &lt;a href="https://github.com/justsamridhi/APK-Xray" rel="noopener noreferrer"&gt;https://github.com/justsamridhi/APK-Xray&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gitingest Repository View:&lt;/strong&gt; &lt;a href="https://gitingest.com/justsamridhi/apk-xray" rel="noopener noreferrer"&gt;https://gitingest.com/justsamridhi/apk-xray&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The live frontend lets you explore the APK-Xray interface, while the source code provides access to the implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; The health-check endpoint confirms backend availability, not that every analysis or AI integration is functioning correctly. APK-Xray performs static analysis; APKs are not installed or executed.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 The Problem: Security Warnings Aren't Enough
&lt;/h2&gt;

&lt;p&gt;An APK requesting sensitive permissions isn't automatically malicious. A messaging app may legitimately need access to contacts, while an unrelated utility requesting SMS access deserves closer scrutiny.&lt;/p&gt;

&lt;p&gt;The challenge is understanding &lt;strong&gt;which capabilities an app declares, why they matter, and what evidence supports a potential risk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;APK-Xray approaches this through three core ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evidence over assumptions:&lt;/strong&gt; Extract APK metadata and connect findings to explicit detection rules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explainable findings:&lt;/strong&gt; Make technical security signals easier to understand without presenting suspicion as proof.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI with boundaries:&lt;/strong&gt; Use AI-assisted explanations to improve readability, not to replace static analysis or invent evidence.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to label every APK as safe or dangerous. It's to give developers and security learners a clearer starting point for investigating what an Android application may be capable of doing.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ How APK-Xray Works
&lt;/h2&gt;

&lt;p&gt;APK-Xray transforms an Android APK into a structured, evidence-backed security report through four stages.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Extract — Understand the APK
&lt;/h3&gt;

&lt;p&gt;The uploaded APK is parsed to extract security-relevant metadata, including declared permissions and application components.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Analyze — Evaluate Potential Risks
&lt;/h3&gt;

&lt;p&gt;A rule-based detection engine evaluates the extracted metadata against explicit security rules. Each finding connects a potential risk to observable evidence rather than relying on vague warnings.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Explain — Make Findings Understandable
&lt;/h3&gt;

&lt;p&gt;AI-assisted explanations help translate technical findings into clearer language. The AI provides context; the extracted metadata and detection rules remain the basis of the analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Report — Present Actionable Findings
&lt;/h3&gt;

&lt;p&gt;The results are organized into a structured report that helps users understand flagged capabilities, inspect supporting evidence, and decide what deserves further investigation.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Workflow, at a Glance
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;APK Upload → Metadata Extraction → Rule-Based Analysis → AI-Assisted Explanation → Structured Security Report&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The core principle:&lt;/strong&gt; AI can explain the evidence, but it doesn't replace it.&lt;/p&gt;

&lt;p&gt;APK-Xray uses static analysis, so it identifies potential risks from the APK's available metadata. It does not guarantee that an app is safe or establish every behavior that might occur at runtime.&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%2Fkfbs8p4rquw9dgl8ymjo.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%2Fkfbs8p4rquw9dgl8ymjo.png" alt="APK-Xray report screenshot showing security findings and supporting evidence extracted from an APK" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🛠️ Engineering Decisions That Matter
&lt;/h2&gt;

&lt;p&gt;Building APK-Xray wasn't just about detecting suspicious permissions. It was about making the analysis &lt;strong&gt;traceable, structured, and honest about uncertainty&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Deterministic Detection Over Black-Box Judgments
&lt;/h3&gt;

&lt;p&gt;Explicit rules evaluate extracted APK metadata, making findings easier to inspect and reproduce. A permission alone isn't proof of malicious intent; combinations of capabilities and contextual evidence matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Separate Detection from Explanation
&lt;/h3&gt;

&lt;p&gt;The rule engine produces findings, while Google Gemma helps explain them in accessible language. This separation keeps AI-generated text from becoming the sole basis for a security verdict.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Structured Reports Over Vague Alerts
&lt;/h3&gt;

&lt;p&gt;A consistent JSON report makes findings easier to validate, display, test, and potentially integrate into other tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Static Analysis with Clear Boundaries
&lt;/h3&gt;

&lt;p&gt;APK-Xray examines available package metadata without executing the application. It can identify declared capabilities and rule matches, but it cannot guarantee safety or reveal every runtime behavior.&lt;/p&gt;

&lt;p&gt;These decisions reflect the principle behind the project: &lt;strong&gt;a useful security tool should explain not only what it flags, but also what its evidence can—and cannot—prove.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 What's Innovative About APK-Xray?
&lt;/h2&gt;

&lt;p&gt;The innovation isn't simply using AI to scan an APK. It's &lt;strong&gt;separating evidence-based detection from AI-assisted interpretation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;APK-Xray is built around three ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evidence-first security:&lt;/strong&gt; Explicit detection rules connect potential risks to extracted APK metadata instead of relying on unexplained AI-generated verdicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI that explains, not decides:&lt;/strong&gt; Google Gemma can help translate technical findings into understandable explanations, while the underlying analysis remains grounded in extracted evidence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reports developers can inspect:&lt;/strong&gt; Structured findings make the output easier to review, validate, and build upon.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Frontend Design Exploration
&lt;/h3&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%2Fh95dgiduceqc20ww30ra.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%2Fh95dgiduceqc20ww30ra.png" alt="APK-Xray dashboard screenshot illustrating the application's security analysis interface and report presentation" width="526" 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%2Fbc1azlytbp3w2qrirbdh.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%2Fbc1azlytbp3w2qrirbdh.png" alt="APK-Xray interface screenshot showing additional report details and the evidence-based analysis experience" width="794" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 From Open-Source Project to Potential Side Hustle
&lt;/h3&gt;

&lt;p&gt;For independent Android developers, small development teams, and security educators, understanding an APK's declared capabilities can be a useful part of a security review.&lt;/p&gt;

&lt;p&gt;APK-Xray explores how that analysis could become a developer-focused service: upload an APK, inspect potential risks, understand why a rule was triggered, and review a structured report.&lt;/p&gt;

&lt;p&gt;The longer-term opportunity is to expand this into features such as historical report comparison, batch analysis, and multilingual explanations—subject to implementation and validation.&lt;/p&gt;

&lt;p&gt;I'm not claiming paying customers or proven market demand yet. The next step is to put APK-Xray in front of real developers, learn which parts of the workflow save them time, and validate whether the tool solves a problem worth paying for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The bigger idea:&lt;/strong&gt; make Android security findings easier to understand without making them less rigorous.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 Inside the Build: Agent Tracing with Sentry
&lt;/h2&gt;

&lt;p&gt;To understand what happens during an APK analysis request, I instrumented APK-Xray's FastAPI backend with &lt;strong&gt;Sentry tracing&lt;/strong&gt;. Instead of treating &lt;code&gt;/api/upload&lt;/code&gt; as a single operation, I added spans around key stages of the pipeline so I could inspect their execution times, relationships, and status.&lt;/p&gt;

&lt;h3&gt;
  
  
  How the Tracing Works
&lt;/h3&gt;

&lt;p&gt;When an APK is uploaded, the backend processes the request through several stages. Sentry records these operations as spans within the parent HTTP transaction.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;What it tracks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;http.server&lt;/code&gt; — &lt;code&gt;/api/upload&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Overall request duration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;apk.parse&lt;/code&gt; — Parse APK manifest&lt;/td&gt;
&lt;td&gt;APK metadata extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;apk.report&lt;/code&gt; — Build and validate report&lt;/td&gt;
&lt;td&gt;Report construction and validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ai.lifecycle&lt;/code&gt; — AI explanation workflow&lt;/td&gt;
&lt;td&gt;Execution status of the explanation workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;apk.persist&lt;/code&gt; — Persist report to SQLite&lt;/td&gt;
&lt;td&gt;Database persistence time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;trace waterfall&lt;/strong&gt; shows how these operations relate to the parent request, while the &lt;strong&gt;span explorer&lt;/strong&gt; exposes individual durations and recorded attributes.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the Traces Revealed
&lt;/h3&gt;

&lt;p&gt;One captured &lt;code&gt;/api/upload&lt;/code&gt; transaction completed in &lt;strong&gt;13.70 ms&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Span&lt;/th&gt;
&lt;th&gt;Recorded duration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall HTTP transaction&lt;/td&gt;
&lt;td&gt;13.70 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report persistence to SQLite&lt;/td&gt;
&lt;td&gt;Approximately 9.88 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manifest parsing&lt;/td&gt;
&lt;td&gt;Less than 1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Report construction and validation&lt;/td&gt;
&lt;td&gt;Less than 1 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These measurements come from one captured request, not a general performance benchmark.&lt;/p&gt;

&lt;p&gt;The traces also showed an &lt;em&gt;AI explanation not configured&lt;/em&gt; state in some executions. This helped distinguish a recorded workflow from an external AI integration that was actually configured and running.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;Sentry helps me inspect execution paths, investigate latency, and identify where further debugging is needed. For a security-focused application, I also want observability to respect privacy: operational telemetry should not unnecessarily expose uploaded APK contents or sensitive information.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trace Evidence
&lt;/h3&gt;

&lt;p&gt;The following screenshots show the actual instrumentation from three perspectives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trace overview:&lt;/strong&gt; Recorded spans across multiple requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request waterfall:&lt;/strong&gt; The parent transaction and its child operations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Span explorer:&lt;/strong&gt; Individual span attributes and durations.&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%2Fqk3f2i2adj39call8qq7.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%2Fqk3f2i2adj39call8qq7.jpeg" alt="Sentry trace overview showing recorded backend transactions and spans for APK-Xray" width="800" height="389"&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%2Fumwvpv4qz2kupx9t7jvq.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%2Fumwvpv4qz2kupx9t7jvq.jpeg" alt="Sentry trace waterfall showing the parent HTTP request and its child operations in the APK-Xray backend" width="800" height="382"&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%2F1fcigtm63lgnkkox5egf.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%2F1fcigtm63lgnkkox5egf.jpeg" alt="Sentry span explorer showing individual operation attributes and recorded execution durations" width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Together, they provide evidence that APK-Xray's backend has instrumented analysis stages and that the recorded traces can be inspected. They do not, by themselves, prove that every external AI integration is active in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Google Gemma 4: AI That Explains the Evidence
&lt;/h2&gt;

&lt;p&gt;Most security tools can flag a suspicious permission. APK-Xray takes the next step: helping users understand what that finding means, without letting AI invent the evidence.&lt;/p&gt;

&lt;p&gt;Here's how &lt;strong&gt;Gemma 4 fits into the actual analysis pipeline&lt;/strong&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Static analysis comes first.&lt;/strong&gt; Androguard extracts APK manifest metadata, and APK-Xray's deterministic rules identify security-relevant indicators and calculate the exposure score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma receives normalized evidence.&lt;/strong&gt; When configured, the Gemma 4 integration sends the extracted evidence and relevant app facts to the model—not the original APK.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The model generates explanations.&lt;/strong&gt; Gemma returns structured claims with evidence IDs and explanations in both English and Hindi. Each claim distinguishes between what the evidence supports, what something could indicate, and what cannot be proven.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The backend validates the response.&lt;/strong&gt; Claims referencing unknown evidence IDs are rejected, and the expected output structure and both language explanations are checked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The report remains usable if AI fails.&lt;/strong&gt; If Gemma is unavailable or its response fails validation, APK-Xray preserves the deterministic findings and score rather than relying on an invalid AI response.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Why This Design Matters
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;APK-Xray's deterministic engine&lt;/th&gt;
&lt;th&gt;Gemma 4&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Extracted evidence and rule matches&lt;/td&gt;
&lt;td&gt;Human-readable explanations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Controls findings, severity, and score&lt;/td&gt;
&lt;td&gt;Produces evidence-linked claims&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Establishes what the analysis observed&lt;/td&gt;
&lt;td&gt;Explains what those observations may mean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remains available if AI fails&lt;/td&gt;
&lt;td&gt;Is an optional explanation layer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This separation is deliberate. &lt;strong&gt;Gemma cannot add evidence, change a finding's severity, or modify the exposure score.&lt;/strong&gt; It never receives the APK itself.&lt;/p&gt;

&lt;p&gt;For example, if an APK declares SMS-reading permissions, the rules engine can flag that capability. Gemma can help explain why it deserves scrutiny—but that permission alone does not prove the application is malicious.&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%2F5exmqyaob0h51852w8bm.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%2F5exmqyaob0h51852w8bm.png" alt="Diagram illustrating how Gemma 4 works in APK-Xray, from static APK analysis and normalized evidence to validated English and Hindi explanations" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The integration also supports English and Hindi explanations, making technical findings more accessible to a wider range of users.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The principle behind APK-Xray: let rules establish the evidence, let AI explain it, and never confuse an explanation with proof.&lt;/strong&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Sentry — Agent Tracing &amp;amp; Observability
&lt;/h3&gt;

&lt;p&gt;APK-Xray uses Sentry tracing to make the backend analysis pipeline observable at the request and operation level. Traces capture stages including &lt;code&gt;http.server&lt;/code&gt; (&lt;code&gt;/api/upload&lt;/code&gt;), &lt;code&gt;apk.parse&lt;/code&gt;, &lt;code&gt;apk.report&lt;/code&gt;, &lt;code&gt;ai.lifecycle&lt;/code&gt;, and &lt;code&gt;apk.persist&lt;/code&gt;. This provides visibility into request execution, parsing, report construction, AI-explanation handling, and SQLite persistence.&lt;/p&gt;

&lt;p&gt;In one captured trace, the request completed in &lt;strong&gt;13.70 ms&lt;/strong&gt;, with SQLite persistence accounting for approximately &lt;strong&gt;9.88 ms&lt;/strong&gt;. These traces help identify performance bottlenecks and investigate failures across the pipeline. The captured telemetry also shows when AI explanations are not configured, helping distinguish deterministic analysis from optional AI functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Google Gemma 4 — Evidence-Grounded Security Explanations
&lt;/h3&gt;

&lt;p&gt;Gemma 4 provides the natural-language explanation layer on top of APK-Xray's deterministic security analysis. The backend sends normalized application facts and security evidence to the configured model endpoint—not the raw APK file.&lt;/p&gt;

&lt;p&gt;The model generates structured explanations in English and Hindi, linked to evidence IDs and constrained to the classifications &lt;code&gt;Can&lt;/code&gt;, &lt;code&gt;Could&lt;/code&gt;, and &lt;code&gt;Cannot Prove&lt;/code&gt;. The backend validates the response structure and evidence references before accepting the output. Unknown evidence IDs and invalid responses are rejected.&lt;/p&gt;

&lt;p&gt;Crucially, &lt;strong&gt;Gemma explains findings; it does not perform the underlying rule-based detection or determine the exposure score&lt;/strong&gt;. If the model is unavailable or its response fails validation, the deterministic report remains available.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Render — Cloud Deployment for the Analysis API
&lt;/h3&gt;

&lt;p&gt;APK-Xray's backend is deployed on Render using &lt;strong&gt;FastAPI and Python&lt;/strong&gt;, connecting the deployed React + TypeScript frontend to the static-analysis pipeline. The API exposes endpoints for health checks, APK uploads, and report retrieval:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;GET /api/health&lt;/code&gt; — checks backend availability.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;POST /api/upload&lt;/code&gt; — accepts and processes an APK for analysis.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;GET /api/report&lt;/code&gt; — retrieves the generated report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The upload workflow validates file properties, processes the APK using Androguard, evaluates deterministic security rules, and constructs a structured report. APKs are analyzed statically; they are not installed or executed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live endpoints:&lt;/strong&gt; &lt;a href="https://apk-xray.onrender.com/api/health" rel="noopener noreferrer"&gt;Backend Health Check&lt;/a&gt; · &lt;a href="https://apk-xray.vercel.app/" rel="noopener noreferrer"&gt;Deployed Application&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. GitHub Copilot — AI-Assisted Engineering
&lt;/h3&gt;

&lt;p&gt;GitHub Copilot supports the development workflow through AI-assisted coding, implementation exploration, and testing. For a security-analysis project, the important distinction is between assistance during development and behavior in the shipped application: Copilot is a development tool, not part of APK-Xray's runtime detection pipeline.&lt;/p&gt;

&lt;p&gt;The core analysis remains explicit and testable through Python rules, structured report generation, and schema validation. This separation keeps security findings auditable instead of relying on an opaque, AI-generated verdict.&lt;/p&gt;

&lt;h2&gt;
  
  
  👥 Team
&lt;/h2&gt;

&lt;p&gt;Built by &lt;strong&gt;Samridhi Gupta&lt;/strong&gt; — project design, implementation, and integration of the APK-Xray analysis pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributor:&lt;/strong&gt; Aditya Modani (&lt;a href="https://dev.to/modapk06"&gt;DEV: @modapk06&lt;/a&gt;).&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>SUNDEBT: I Made My Phone Charge Me Rent in Sunlight</title>
      <dc:creator>Samridhi Gupta</dc:creator>
      <pubDate>Fri, 09 Oct 2026 10:30:11 +0000</pubDate>
      <link>https://dev.to/justsamridhi/sundebt-i-made-my-phone-charge-me-rent-in-sunlight-4laf</link>
      <guid>https://dev.to/justsamridhi/sundebt-i-made-my-phone-charge-me-rent-in-sunlight-4laf</guid>
      <description>&lt;h2&gt;
  
  
  SUNDEBT ☀️ — Earn Your Screen Time
&lt;/h2&gt;

&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;I open my phone to check one notification, and somehow, thirty minutes disappear.&lt;/p&gt;

&lt;p&gt;I didn't want to build another app that shames me for scrolling or simply locks me out. I wanted to flip the idea:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if I had to earn my screen time by spending time outside?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question became &lt;strong&gt;SUNDEBT — Earn Your Screen Time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SUNDEBT turns outdoor time and movement into a currency for screen time. Spend time outside, earn Sun Minutes, pay off your Sun Debt, and unlock screen time through the Scroll Gate. Along the way, Sol, a companion powered by a local AI model, suggests small outdoor missions to get you moving.&lt;/p&gt;

&lt;p&gt;The idea is simple: &lt;strong&gt;put your phone down, get moving, earn your minutes, and make screen time something you work toward.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ☀️ How It Works
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;☀️ &lt;strong&gt;Sun Sessions:&lt;/strong&gt; Start an outdoor session, put your phone down, and spend time outside. The intended experience uses available sensor signals to assess sunlight and movement.&lt;/li&gt;
&lt;li&gt;👟 &lt;strong&gt;Steps as Currency:&lt;/strong&gt; Estimated steps contribute to your Sun Minutes, turning movement into currency you can use toward screen time.&lt;/li&gt;
&lt;li&gt;✨ &lt;strong&gt;Sun Minutes:&lt;/strong&gt; Your earned minutes pay off Sun Debt first. Any remaining balance becomes spendable screen time.&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Sol:&lt;/strong&gt; A companion powered by a local AI model that suggests short outdoor missions.&lt;/li&gt;
&lt;li&gt;🌱 &lt;strong&gt;Sol's Growth:&lt;/strong&gt; Earn XP as you progress. The longer-term vision is a personalized digital forest that grows with your outdoor habits.&lt;/li&gt;
&lt;li&gt;🚪 &lt;strong&gt;Scroll Gate:&lt;/strong&gt; Adds a pause before selected web links, encouraging you to choose intentionally instead of scrolling on reflex.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SUNDEBT includes a 90-minute daily earning cap and a step-based bonus. Your wallet and session history stay in your browser, with no accounts or database.&lt;/p&gt;

&lt;p&gt;I built this for the Touch Grass challenge because I wanted to explore a different relationship with technology—not one based on guilt or punishment, but on making real-world experiences rewarding.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎬 Try SUNDEBT
&lt;/h2&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live frontend:&lt;/strong&gt; &lt;a href="https://sundebt.vercel.app/" rel="noopener noreferrer"&gt;https://sundebt.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/justsamridhi/SUNDEBT" rel="noopener noreferrer"&gt;https://github.com/justsamridhi/SUNDEBT&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 &lt;strong&gt;README and setup guide:&lt;/strong&gt; &lt;a href="https://github.com/justsamridhi/SUNDEBT/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/justsamridhi/SUNDEBT/blob/main/README.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔧 &lt;strong&gt;Merged Ollama configuration fix:&lt;/strong&gt; &lt;a href="https://github.com/justsamridhi/SUNDEBT/pull/1" rel="noopener noreferrer"&gt;https://github.com/justsamridhi/SUNDEBT/pull/1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎥 &lt;strong&gt;10-second demo:&lt;/strong&gt; &lt;a href="https://drive.google.com/file/d/1n1lla01uyaWQIj1_HAATWYPdVM77hyan/view?usp=sharing" rel="noopener noreferrer"&gt;Watch on Google Drive&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📱 A Look Inside
&lt;/h2&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%2F269kjy4ie239l68q9ca2.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%2F269kjy4ie239l68q9ca2.png" alt="SUNDEBT dashboard showing the Sun Minutes wallet, Sol companion, and outdoor mission" width="800" height="762"&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%2Fsgesprr7svmyouhu8r2n.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%2Fsgesprr7svmyouhu8r2n.png" alt="SUNDEBT outdoor mission screen with a suggested walk and Start Session button" width="800" height="758"&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%2Fjnm6xokp8fexjshmwh2n.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%2Fjnm6xokp8fexjshmwh2n.png" alt="SUNDEBT session debrief showing earned minutes, estimated steps, and session history" width="800" height="770"&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%2Frmoni8p1cs78swte0m4m.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%2Frmoni8p1cs78swte0m4m.png" alt="SUNDEBT diagnostic screen showing available browser sensor checks" width="800" height="761"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;SUNDEBT combines a mobile-first progressive web app with a local AI-guidance pipeline and durable session workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tech stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; React, TypeScript, Vite, PWA&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Express, TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent framework:&lt;/strong&gt; Mastra&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local inference:&lt;/strong&gt; Ollama with &lt;code&gt;llama3.2:3b&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow orchestration:&lt;/strong&gt; Temporal&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The AI-guidance path connects the PWA to the backend, where a Temporal workflow coordinates the session and Sol's AI activity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React PWA
   |
   v
Express API
   |
   v
Temporal Sun Session Workflow
   |
   v
Sol Activity -&amp;gt; Mastra Agent -&amp;gt; Ollama
   |
   +-- Invalid output or failure
                |
                v
      Deterministic mission fallback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🤖 Sol: Local AI That Fails Gracefully
&lt;/h3&gt;

&lt;p&gt;I wanted Sol to be helpful without making the entire application dependent on an AI response.&lt;/p&gt;

&lt;p&gt;Sol uses a Mastra agent backed by Llama 3.2 3B through Ollama. The model receives limited context, including Sun Minutes, Sun Debt, recent session durations, and time of day. Its output is parsed and validated before a mission is displayed.&lt;/p&gt;

&lt;p&gt;A safety filter rejects unsafe guidance, including medical claims and risky location suggestions. If the output is empty, malformed, invalid, unsafe, or the model is unavailable, SUNDEBT falls back to a deterministic mission.&lt;/p&gt;

&lt;p&gt;The goal wasn't just to make AI work. &lt;strong&gt;It was to make the experience useful when AI doesn't.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🐛 The Bug That Taught Me the Most
&lt;/h3&gt;

&lt;p&gt;For a while, Sol kept showing the offline mission.&lt;/p&gt;

&lt;p&gt;The app appeared to work because the fallback was reliable, but it also hid whether the AI path was actually succeeding.&lt;/p&gt;

&lt;p&gt;My local RTX 3050 has 4 GB of VRAM, and Mastra's structured-output approach caused memory problems. I switched to plain-text generation and wrote a tolerant JSON parser that strips code fences, extracts the JSON object, and validates the result.&lt;/p&gt;

&lt;p&gt;Then I discovered a timeout mismatch.&lt;/p&gt;

&lt;p&gt;I added logging for fallback reasons such as empty output, timeout, parsing, schema validation, safety rejection, and provider failure. My observations showed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cold model call:&lt;/strong&gt; approximately 7.2 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warm model call:&lt;/strong&gt; approximately 1 second&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One observed call:&lt;/strong&gt; 10 seconds&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Original Temporal Activity timeout:&lt;/strong&gt; 8 seconds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A valid response could arrive too late and be discarded.&lt;/p&gt;

&lt;p&gt;I increased the Activity timeout to 40 seconds, aligned API and frontend waits, added a startup warm-up request, and introduced a visible &lt;strong&gt;“Sol is thinking…”&lt;/strong&gt; state.&lt;/p&gt;

&lt;p&gt;That debugging process changed how I thought about reliability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A fallback can keep an application alive, but observability tells you whether the primary system is actually working.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ⏳ Why Temporal?
&lt;/h3&gt;

&lt;p&gt;A Sun Session isn't a single API request. It involves a Sun Check, phone-down phase, outdoor timer, interruptions, resumes, and completion.&lt;/p&gt;

&lt;p&gt;Temporal models this progression through a &lt;code&gt;sunSessionWorkflow&lt;/code&gt;, event signals, and workflow state. Sol runs as an Activity, while reward logic handles the daily cap, step bonus, debt-first repayment, and XP.&lt;/p&gt;

&lt;p&gt;Backend tests cover duplicate event IDs and repeated completion to help prevent the same event from awarding the same reward twice.&lt;/p&gt;

&lt;p&gt;The wallet remains browser-local. Temporal stores workflow state and event history—not a cross-device account or wallet.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌱 The Vision for Sol's Digital Forest
&lt;/h2&gt;

&lt;p&gt;Sol currently has a progression system based on XP. The larger idea is to make that progress visible through a personalized digital forest.&lt;/p&gt;

&lt;p&gt;Imagine earning sunlight and movement minutes to help your digital world grow. Returning to social media during an outdoor session could put that progress at risk, making the choice to stay outside more meaningful.&lt;/p&gt;

&lt;p&gt;The forest and tree-dying mechanic are &lt;strong&gt;future ideas, not features currently implemented&lt;/strong&gt;. They represent the direction I'd like to explore next: making time away from the screen feel as rewarding as time spent on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Verification
&lt;/h2&gt;

&lt;p&gt;I ran the following checks locally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend typecheck:&lt;/strong&gt; Passed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend tests:&lt;/strong&gt; 19 passed, 0 failed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend TypeScript build:&lt;/strong&gt; Run without errors shown in the shared terminal output&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend production build:&lt;/strong&gt; Passed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tests cover Sol output validation, safety rejection, fallback and retry behaviour, event deduplication, and reward calculations.&lt;/p&gt;

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

&lt;p&gt;Open innovation gave me the freedom to experiment, inspect failures, and change the implementation instead of treating AI as a black box.&lt;/p&gt;

&lt;p&gt;With Ollama and an open-weight model, I could explore local inference within my hardware limits. Mastra provided the agent layer, while Temporal helped model a multi-stage session that needs predictable behaviour.&lt;/p&gt;

&lt;p&gt;These tools didn't remove the difficult engineering. They gave me the means to investigate it, learn from it, and build something more resilient.&lt;/p&gt;

&lt;p&gt;That's what makes open innovation valuable to me: &lt;strong&gt;the ability to understand a system, adapt it, and share what I learn.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 My GitHub Copilot Workflow
&lt;/h2&gt;

&lt;p&gt;I used GitHub Copilot's VS Code agent/chat workflow for repository inspection, scoped code changes, debugging, tests, and README updates.&lt;/p&gt;

&lt;p&gt;I used narrow prompts and explicit file scopes, asked the agent to preserve existing behaviour, and avoided automatic commits or pushes. Copilot assisted with Sol's integration and fallback path, output validation, logging, Temporal workflow reliability, reward handling, tests, and documentation.&lt;/p&gt;

&lt;p&gt;One limitation was that Copilot's command environment couldn't find PowerShell, so it couldn't execute the requested local checks. I ran the typecheck, backend tests, and production builds in my own VS Code terminal and reviewed the resulting changes myself.&lt;/p&gt;

&lt;p&gt;I also caught and corrected configuration drift between the model used by the code and the README/environment example.&lt;/p&gt;

&lt;p&gt;The process reinforced an important principle: &lt;strong&gt;AI-assisted development still needs human review, deliberate debugging, and independent verification.&lt;/strong&gt;&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Best Use of Temporal
&lt;/h3&gt;

&lt;p&gt;A multi-stage session workflow with event handling, Activity timeouts, and idempotent reward logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/justsamridhi/SUNDEBT" rel="noopener noreferrer"&gt;https://github.com/justsamridhi/SUNDEBT&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of Mastra
&lt;/h3&gt;

&lt;p&gt;A local-model agent with validated output and deterministic fallback handling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/justsamridhi/SUNDEBT" rel="noopener noreferrer"&gt;https://github.com/justsamridhi/SUNDEBT&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Use of GitHub Copilot
&lt;/h3&gt;

&lt;p&gt;Scoped agent-based development, debugging, tests, and documentation, with local verification of the resulting changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Merged configuration fix:&lt;/strong&gt; &lt;a href="https://github.com/justsamridhi/SUNDEBT/pull/1" rel="noopener noreferrer"&gt;https://github.com/justsamridhi/SUNDEBT/pull/1&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;I'd like to explore a native Android version with stronger, platform-supported app blocking, more reliable outdoor-session signals, and the digital forest concept.&lt;/p&gt;

&lt;p&gt;The frontend is deployed on Vercel. The full AI and durable-workflow path requires the backend, Temporal service and worker, and Ollama running locally. If those services or the model are unavailable, the app can continue with deterministic offline guidance and its browser-local wallet.&lt;/p&gt;

&lt;p&gt;The current web app cannot guarantee that a phone remains locked, conclusively prove outdoor presence, measure Vitamin D, or block every installed app. Browser and device support also determine which sensor readings are available.&lt;/p&gt;

&lt;p&gt;SUNDEBT is an experiment in making a small change feel rewarding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The phone can wait. Go see what's outside.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributor:&lt;/strong&gt; Aditya Modani — &lt;a href="https://dev.to/modapk06"&gt;@modapk06&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Launch Weekend challenge</title>
      <dc:creator>Samridhi Gupta</dc:creator>
      <pubDate>Tue, 06 Oct 2026 08:18:45 +0000</pubDate>
      <link>https://dev.to/justsamridhi/launch-weekend-challenge-hoh</link>
      <guid>https://dev.to/justsamridhi/launch-weekend-challenge-hoh</guid>
      <description>&lt;p&gt;Hi DEV Team,&lt;/p&gt;

&lt;p&gt;I’m reaching out regarding the Virtual Sticker Launch Weekend DEV Challenge. I participated as part of a team in the submission &lt;strong&gt;"ExpenseAI"&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Details:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Aditya4453/DEVchallenge" rel="noopener noreferrer"&gt;https://github.com/Aditya4453/DEVchallenge&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV Submission:&lt;/strong&gt; &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;https://dev.to/challenges/hacktoberfest-weekend-2026-10-01&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project was submitted as a team entry, and I am listed as a team member in the submission:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Name:&lt;/strong&gt; Samridhi Gupta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DEV Profile:&lt;/strong&gt; &lt;a class="mentioned-user" href="https://dev.to/justsamridhi"&gt;@justsamridhi&lt;/a&gt; (&lt;a href="https://dev.to/justsamridhi"&gt;https://dev.to/justsamridhi&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The challenge rules state that team submissions are supported and that collaborators’ DEV handles should be listed so the entire team can receive the completion badge. However, I have not yet received my virtual sticker for this challenge.&lt;/p&gt;

&lt;p&gt;I wanted to check whether there is any additional action required from my side, or if there is a different process for team members to be awarded the virtual sticker.&lt;/p&gt;

&lt;p&gt;Thank you for your help!&lt;/p&gt;

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