<?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: Rishabh Gupta</title>
    <description>The latest articles on DEV Community by Rishabh Gupta (@rishabh_gupta_d47fcf7f10f).</description>
    <link>https://dev.to/rishabh_gupta_d47fcf7f10f</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%2F4160527%2F7ebfbb42-042a-4b31-aaf2-af8d95337186.png</url>
      <title>DEV Community: Rishabh Gupta</title>
      <link>https://dev.to/rishabh_gupta_d47fcf7f10f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rishabh_gupta_d47fcf7f10f"/>
    <language>en</language>
    <item>
      <title>GetOffCode🌿 — Your Best Debugging Tool Might Be a Break</title>
      <dc:creator>Rishabh Gupta</dc:creator>
      <pubDate>Sun, 11 Oct 2026 19:44:38 +0000</pubDate>
      <link>https://dev.to/rishabh_gupta_d47fcf7f10f/touchgrass-your-best-debugging-tool-might-be-a-break-4bbk</link>
      <guid>https://dev.to/rishabh_gupta_d47fcf7f10f/touchgrass-your-best-debugging-tool-might-be-a-break-4bbk</guid>
      <description>&lt;h1&gt;
  
  
  GetOffCode 🌿 — Your Best Debugging Tool Might Be a Break
&lt;/h1&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;p&gt;Developers spend a lot of time thinking about how to make software faster, how to debug more efficiently, and how to write better code. But there's another question we don't always ask ourselves:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should we do when continuing to work is no longer helping us make progress?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;strong&gt;GetOffCode&lt;/strong&gt;: an AI-powered cognitive-reset companion for developers that uses lightweight browser activity signals to evaluate when a break might help.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;Live website:&lt;/strong&gt; &lt;a href="https://getoffcode.tech" rel="noopener noreferrer"&gt;https://getoffcode.tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎥 &lt;strong&gt;Watch the demo:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=ki9WYvnFCS4&amp;amp;t=19s" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ki9WYvnFCS4&amp;amp;t=19s&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/RishabhGupta949/GetOffCode-Hacktoberfest" rel="noopener noreferrer"&gt;https://github.com/RishabhGupta949/GetOffCode-Hacktoberfest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⬇️ &lt;strong&gt;Download the extension:&lt;/strong&gt; &lt;a href="https://getoffcode.tech/downloads/touchgrass-extension.zip" rel="noopener noreferrer"&gt;https://getoffcode.tech/downloads/touchgrass-extension.zip&lt;/a&gt;&lt;/p&gt;




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

&lt;p&gt;GetOffCode is a browser extension backed by a Python/FastAPI service and an AI integration. Its purpose is simple: help developers notice potentially unproductive work patterns and make it easier to step away from the screen before they spend even more time repeating the same actions.&lt;/p&gt;

&lt;p&gt;Think about a familiar debugging session.&lt;/p&gt;

&lt;p&gt;You encounter a bug. You inspect the code, search for an explanation, open another tab, compare two possible solutions, and return to the editor. The bug is still there, so you repeat the process. You switch between documentation, search results, your editor, and perhaps a conversation with an AI coding assistant.&lt;/p&gt;

&lt;p&gt;At some point, you may no longer be making meaningful progress. But because you're focused on solving the problem, you don't necessarily notice how long you've been sitting there or how frequently you're switching contexts.&lt;/p&gt;

&lt;p&gt;A normal break timer can help with regular breaks, but it follows a schedule. It doesn't necessarily consider the activity taking place in the browser.&lt;/p&gt;

&lt;p&gt;GetOffCode explores a different approach: &lt;strong&gt;use activity as context, ask an AI model to evaluate that context, and let the user decide what to do next.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The extension observes lightweight activity signals, including tab-switching patterns and active/idle state. Relevant activity summaries are sent to the hosted backend, where the application coordinates evaluation and the AI recommendation.&lt;/p&gt;

&lt;p&gt;When a break suggestion is produced, the user can accept it or choose &lt;strong&gt;“Not now.”&lt;/strong&gt; Accepting opens a dedicated break experience with a countdown. The user can also return early instead of waiting for the entire suggested duration to finish. After returning, the reflection flow gives the user an opportunity to consider whether anything became clearer while they were away.&lt;/p&gt;

&lt;p&gt;This is not intended to be another productivity tool that constantly demands attention. It is an experiment in making a break feel like a natural part of the development workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: We Measure Progress, but Often Ignore the Moment We Need to Step Away
&lt;/h2&gt;

&lt;p&gt;Software development involves long periods of concentration. Sometimes those periods are productive; sometimes they turn into loops.&lt;/p&gt;

&lt;p&gt;I wanted to explore three situations in particular.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Getting stuck in a debugging loop
&lt;/h3&gt;

&lt;p&gt;A difficult issue can consume far more time than expected. A developer might try one fix, reject it, return to a previous approach, and repeat the same investigation.&lt;/p&gt;

&lt;p&gt;The difficulty is not simply the amount of time spent. It is that the person may not notice when their current approach has stopped producing useful progress.&lt;/p&gt;

&lt;p&gt;GetOffCode doesn't attempt to understand every line of code or determine whether a solution is correct. Instead, it uses browser activity patterns as contextual signals that may be worth evaluating.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Constant context switching
&lt;/h3&gt;

&lt;p&gt;Moving between tabs is a normal part of development. Documentation, Stack Overflow, GitHub, issue trackers, dashboards, and editors all have legitimate roles.&lt;/p&gt;

&lt;p&gt;The problem is not tab switching by itself. It is the pattern: frequent switches over a short period, combined with other activity signals, can be a reason to evaluate whether a short reset might be useful.&lt;/p&gt;

&lt;p&gt;GetOffCode is built around this distinction. A single tab switch shouldn't automatically mean that someone needs a break.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Forgetting to take breaks
&lt;/h3&gt;

&lt;p&gt;Traditional timers can be helpful, but they don't understand the context in which the person is working. A timer may interrupt someone who is making good progress, or it may go off at a time unrelated to the activity that prompted the need for a reset.&lt;/p&gt;

&lt;p&gt;GetOffCode experiments with using activity summaries and AI evaluation to make break suggestions more contextual.&lt;/p&gt;

&lt;p&gt;These signals are imperfect. They don't prove that someone is frustrated, mentally tired, or stuck. They simply provide information that the system can evaluate before offering a suggestion.&lt;/p&gt;

&lt;p&gt;That limitation is important: the goal is not to diagnose the developer. It is to provide a useful nudge while leaving the decision in the developer's hands.&lt;/p&gt;

&lt;h2&gt;
  
  
  How GetOffCode Works
&lt;/h2&gt;

&lt;p&gt;The core experience follows a straightforward sequence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Enable browser monitoring
&lt;/h3&gt;

&lt;p&gt;The user installs the extension and reviews its requested browser permissions. When monitoring is enabled, the extension observes lightweight activity-related signals.&lt;/p&gt;

&lt;p&gt;The extension uses Chrome's Manifest V3 APIs, including tab and idle-related capabilities. This allows it to reason about browser activity without requiring the user to run a separate application alongside the browser.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Build an activity summary
&lt;/h3&gt;

&lt;p&gt;Rather than treating each individual event as proof of a problem, the system evaluates activity in context.&lt;/p&gt;

&lt;p&gt;Signals such as tab-switch frequency, session duration, and active/idle state can help characterize what has been happening in the browser. The application combines activity handling with its existing evaluation logic.&lt;/p&gt;

&lt;p&gt;This step matters because raw events are not conclusions. Switching tabs may mean that someone is researching effectively, comparing implementations, or simply navigating between ordinary work tasks.&lt;/p&gt;

&lt;p&gt;The system needs context before it can make a useful recommendation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Send relevant context to the hosted backend
&lt;/h3&gt;

&lt;p&gt;The browser extension communicates with the FastAPI backend deployed on Render.&lt;/p&gt;

&lt;p&gt;The backend coordinates activity evaluation, application state, and AI requests. This separation also means the extension doesn't need to contain the AI provider's API credentials.&lt;/p&gt;

&lt;p&gt;The hosted architecture is an intentional part of the user experience: people who install the published extension should not have to install Python or operate their own backend server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Let AI evaluate whether a break might help
&lt;/h3&gt;

&lt;p&gt;The application sends relevant activity context for AI evaluation. The model is used to support contextual recommendations rather than merely firing a notification whenever a fixed timer expires.&lt;/p&gt;

&lt;p&gt;The important distinction is between detecting a signal and deciding what to recommend.&lt;/p&gt;

&lt;p&gt;An activity signal can identify a pattern worth examining. The AI can evaluate the supplied context and contribute to the recommendation, including the suggested break. That recommendation is still an estimate, not a guarantee that the user needs a break.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Give control back to the user
&lt;/h3&gt;

&lt;p&gt;When a suggestion is available, the user can choose to take a break or select &lt;strong&gt;“Not now.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a central product decision. The extension should help someone make a decision, not take over their work session.&lt;/p&gt;

&lt;p&gt;If the person is in the middle of a productive debugging session, they can continue. If a short reset seems useful, they can accept the suggestion.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Provide a dedicated break experience
&lt;/h3&gt;

&lt;p&gt;Accepting a suggestion opens a dedicated break screen. The screen displays a countdown and supports returning before the suggested duration has elapsed.&lt;/p&gt;

&lt;p&gt;The user doesn't have to wait for the full countdown if they are ready to continue working.&lt;/p&gt;

&lt;p&gt;When they return, the existing reflection flow asks them to consider whether anything clicked while they were away. This helps connect the break back to the original task rather than treating the break as an isolated timer.&lt;/p&gt;

&lt;p&gt;The complete loop is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser activity → Contextual evaluation → AI break suggestion → User decision → Break → Return and reflection.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Just Use a Normal Timer?
&lt;/h2&gt;

&lt;p&gt;A timer is useful when the user wants a predictable schedule. It is easy to understand and simple to operate.&lt;/p&gt;

&lt;p&gt;GetOffCode explores a different question: can activity context make a break suggestion more relevant?&lt;/p&gt;

&lt;p&gt;A rigid timer primarily asks, “Has enough time passed?”&lt;/p&gt;

&lt;p&gt;An activity-aware system asks, “Given the signals available right now, is this a useful moment to suggest a break?”&lt;/p&gt;

&lt;p&gt;The second question is harder. It requires gathering context, deciding which signals matter, integrating an AI model, and handling the result within a browser extension without interrupting unrelated functionality.&lt;/p&gt;

&lt;p&gt;It also introduces uncertainty. Browser activity is not a direct measure of productivity. A developer may switch between many tabs because they are making progress, or remain on one tab while being completely stuck.&lt;/p&gt;

&lt;p&gt;That is why GetOffCode treats the model's output as a suggestion. It does not claim that AI can reliably identify every unproductive loop, and it does not force the user to accept a recommendation.&lt;/p&gt;

&lt;p&gt;The project is an exploration of contextual break suggestions, not a claim that AI can measure human focus perfectly.&lt;/p&gt;

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

&lt;p&gt;The project is divided into a browser extension, a backend, and a public landing page.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Chrome Extension — The User Experience
&lt;/h3&gt;

&lt;p&gt;The extension uses &lt;strong&gt;Chrome Manifest V3&lt;/strong&gt;, with JavaScript, HTML, and CSS.&lt;/p&gt;

&lt;p&gt;The extension is responsible for browser activity signals, extension interactions, the break experience, and the return flow. Its manifest declares the permissions needed for the implemented browser behavior, including storage, alarms, idle state, tabs, scripting, and active-tab access.&lt;/p&gt;

&lt;p&gt;The user-facing experience includes the extension popup, a break suggestion, the dedicated break screen, and the reflection flow.&lt;/p&gt;

&lt;p&gt;One of the practical challenges was keeping the extension lifecycle reliable. A browser extension doesn't run like a single continuously active webpage. Its background service worker and its individual extension pages have different responsibilities and lifecycles.&lt;/p&gt;

&lt;p&gt;That means state and requests must be coordinated carefully. A break should not accidentally be started twice, the timer should reflect the active break state, and returning early should follow the existing return flow rather than simply closing a screen.&lt;/p&gt;

&lt;p&gt;The project went through iterative debugging to get these interactions working together.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Python and FastAPI — The Backend
&lt;/h3&gt;

&lt;p&gt;The backend uses &lt;strong&gt;Python, FastAPI, and Uvicorn&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It coordinates incoming activity summaries, application state, AI evaluation, and the break workflow. Keeping these responsibilities behind an API allows the extension to remain a relatively lightweight browser client.&lt;/p&gt;

&lt;p&gt;The backend also contains services for activity handling, session management, break behavior, snapshot handling, caching, and AI interaction.&lt;/p&gt;

&lt;p&gt;SQLite is used for application-state and related records in the current implementation. The backend configuration also includes settings for snapshots, semantic-cache similarity, the embedding model, and AI request timeouts.&lt;/p&gt;

&lt;p&gt;This structure helped keep the browser interface separate from the application logic. The extension handles the interaction with the user, while the backend coordinates evaluation and state transitions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Open-Weight AI Through OpenRouter
&lt;/h3&gt;

&lt;p&gt;GetOffCode uses an &lt;strong&gt;open-weight model through OpenRouter&lt;/strong&gt; for its hosted AI integration.&lt;/p&gt;

&lt;p&gt;I chose to keep model interaction behind FastAPI rather than embedding provider requests and credentials directly in the extension. That provides a boundary between the browser experience and the AI provider.&lt;/p&gt;

&lt;p&gt;It also makes the model layer easier to change as available models and requirements evolve. The extension does not need to be rebuilt around every provider-specific detail.&lt;/p&gt;

&lt;p&gt;This is hosted inference, not a fully local AI application. The model runs through the configured provider, and the backend communicates with it. Consequently, model availability, provider limits, network requests, and backend configuration matter to the overall experience.&lt;/p&gt;

&lt;p&gt;The application should also handle model failures honestly. An unavailable model should not be represented to the user as though an AI recommendation was successfully generated.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Render — Hosting the Backend and Website
&lt;/h3&gt;

&lt;p&gt;Both the public landing page and the FastAPI backend are deployed on &lt;strong&gt;Render&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The live website is:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://getoffcode.tech" rel="noopener noreferrer"&gt;https://getoffcode.tech&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The extension communicates with the hosted backend.&lt;/p&gt;

&lt;p&gt;This setup removes an unnecessary installation step for the end user. Someone downloading the extension doesn't need to install Python, create a virtual environment, configure a local API key, or run Uvicorn themselves.&lt;/p&gt;

&lt;p&gt;The public website explains the project and distributes the extension ZIP. Installation is handled through Chrome's extension interface rather than requiring a separate backend installation.&lt;/p&gt;

&lt;p&gt;One practical limitation is the current Render free-service configuration: after inactivity, the service can take longer to respond while it wakes up. The application also uses SQLite, so its current deployment should not be confused with a fully managed, durable production database setup.&lt;/p&gt;

&lt;p&gt;For this challenge, the objective was to get the complete browser-to-backend experience deployed and accessible while keeping the architecture understandable.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. The Landing Page and .TECH Domain
&lt;/h3&gt;

&lt;p&gt;I also built a public landing page for GetOffCode using the existing frontend project and 21st.dev components.&lt;/p&gt;

&lt;p&gt;The site introduces the problem, explains the solution, presents the product experience, and gives visitors a way to download the extension.&lt;/p&gt;

&lt;p&gt;The live domain is &lt;strong&gt;getoffcode.tech&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I wanted the project to feel like a product someone could actually discover and try, rather than only a repository with a video attached. The landing page, extension package, and hosted backend form a more complete journey from discovery to installation.&lt;/p&gt;

&lt;p&gt;The landing page and backend share the same GitHub repository, but they are deployed as separate Render services. This keeps the source code together while allowing the website and API to have their own runtime configurations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy and User Control
&lt;/h2&gt;

&lt;p&gt;A browser extension that observes activity must be clear about what it does.&lt;/p&gt;

&lt;p&gt;GetOffCode is designed around lightweight browser activity signals rather than trying to judge the contents or correctness of a developer's work. Signals provide context for a recommendation; they do not establish what the person is thinking or feeling.&lt;/p&gt;

&lt;p&gt;The extension requests browser permissions for its implemented behavior, and users should review those permissions before enabling monitoring.&lt;/p&gt;

&lt;p&gt;It is equally important to be transparent about the hosted architecture. Relevant activity summaries are sent to the backend for evaluation, and the configured AI provider participates in the request flow. This project should not be described as fully offline or as keeping every piece of activity data on the user's device.&lt;/p&gt;

&lt;p&gt;The current implementation uses backend state and cache records, so retention and persistence depend on the deployed configuration. The application should communicate these facts clearly rather than making broad promises that the technical design does not guarantee.&lt;/p&gt;

&lt;p&gt;The product also isn't intended to be an employee-surveillance tool or a medical or mental-health diagnostic system.&lt;/p&gt;

&lt;p&gt;The intention is much narrower: use relevant signals to offer a possible break, and let the developer decide whether to take it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the Real User Journey
&lt;/h2&gt;

&lt;p&gt;For this challenge, I wanted to demonstrate the actual product experience—not just a mocked screenshot of an AI interface.&lt;/p&gt;

&lt;p&gt;The live demo shows the website, extension download and installation, activity-based suggestion flow, and break screen.&lt;/p&gt;

&lt;p&gt;During my own testing, the system surfaced a summary reporting seven tab switches over the previous five minutes and suggested a five-minute walk outside. That was a useful example of the kind of contextual recommendation the product is built to make.&lt;/p&gt;

&lt;p&gt;The demo also includes the &lt;strong&gt;“Not now”&lt;/strong&gt; decision, because user control is as important as the recommendation itself.&lt;/p&gt;

&lt;p&gt;The extension has a demo mode that makes it easier to demonstrate the flow without waiting through a long work session. That mode is useful when recording or testing a predictable interaction. It should not be confused with the normal activity-monitoring behavior.&lt;/p&gt;

&lt;p&gt;I tested the extension manually in the browser and worked through issues involving the timer display, the early-return action, and application state transitions. Those debugging cycles were a reminder that a feature isn't complete just because the initial happy path works: the user must be able to dismiss a suggestion, begin a break, return early, and continue working without the application becoming stuck in an invalid state.&lt;/p&gt;

&lt;p&gt;The project is open source so other developers can inspect how these pieces are connected and contribute improvements.&lt;/p&gt;

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

&lt;p&gt;Open innovation matters to GetOffCode in two ways: the AI layer and the project itself.&lt;/p&gt;

&lt;p&gt;First, an open-weight model gives the project flexibility. The model behind the backend can be evaluated or replaced without tying the browser experience to a single proprietary model API. The FastAPI boundary makes that separation practical.&lt;/p&gt;

&lt;p&gt;Second, a public repository makes the implementation inspectable. Other developers can look at the extension, API, state handling, and landing page instead of taking a product description on trust.&lt;/p&gt;

&lt;p&gt;That is particularly relevant for a project that interacts with browser activity. Being able to review the code and understand the system's boundaries is valuable.&lt;/p&gt;

&lt;p&gt;Open source doesn't automatically guarantee privacy, correctness, or reliability. Those properties still depend on how the application is implemented, configured, deployed, and maintained. But public code makes it easier for others to ask questions, identify issues, and propose improvements.&lt;/p&gt;

&lt;p&gt;This project also helped me explore the practical work involved in taking an AI-powered idea beyond a local prototype: coordinating a browser extension and backend, handling model requests, dealing with state, deploying the services, packaging an extension, and making the installation journey accessible to someone who hasn't seen the source code before.&lt;/p&gt;

&lt;p&gt;The result is an experiment that can be tried, inspected, and extended.&lt;/p&gt;

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

&lt;p&gt;One of my biggest takeaways was that the AI model is only one part of an AI-powered product.&lt;/p&gt;

&lt;p&gt;The surrounding system matters just as much: what signals are available, how those signals are represented, when the backend is called, how errors are handled, how the result is displayed, and what happens when the user declines or returns early.&lt;/p&gt;

&lt;p&gt;A recommendation can be sensible in isolation and still create a frustrating experience if the UI shows the wrong timer, the backend state becomes inconsistent, or a button doesn't complete the expected transition.&lt;/p&gt;

&lt;p&gt;I also learned how important it is to distinguish between a demo and the normal product experience. A short demo trigger is useful for showing the workflow, but it should not become a hidden fixed threshold that determines every real-world recommendation.&lt;/p&gt;

&lt;p&gt;Finally, deployment changed how I thought about the project. A public site, extension ZIP, and hosted backend make the product easier to try, but they also introduce operational realities such as cold starts, provider availability, environment configuration, and storage limitations.&lt;/p&gt;

&lt;p&gt;These aren't reasons to avoid building an end-to-end product. They are part of building one honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try GetOffCode
&lt;/h2&gt;

&lt;p&gt;You can explore the live project here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://getoffcode.tech" rel="noopener noreferrer"&gt;https://getoffcode.tech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;⬇️ &lt;strong&gt;Extension ZIP:&lt;/strong&gt; &lt;a href="https://getoffcode.tech/downloads/touchgrass-extension.zip" rel="noopener noreferrer"&gt;https://getoffcode.tech/downloads/touchgrass-extension.zip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎥 &lt;strong&gt;Video demo:&lt;/strong&gt; &lt;a href="https://www.youtube.com/watch?v=ki9WYvnFCS4&amp;amp;t=19s" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=ki9WYvnFCS4&amp;amp;t=19s&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;GitHub repository:&lt;/strong&gt; &lt;a href="https://github.com/RishabhGupta949/GetOffCode-Hacktoberfest" rel="noopener noreferrer"&gt;https://github.com/RishabhGupta949/GetOffCode-Hacktoberfest&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🏆 &lt;strong&gt;Hacktoberfest Week 1 challenge:&lt;/strong&gt; &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;https://dev.to/challenges/hacktoberfest-week1-2026-10-05&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The extension is currently distributed as a ZIP for manual installation in Chrome. Download and extract it, open &lt;code&gt;chrome://extensions&lt;/code&gt;, enable Developer mode, choose &lt;strong&gt;Load unpacked&lt;/strong&gt;, and select the extracted folder containing &lt;code&gt;manifest.json&lt;/code&gt;. You don't need to install Python or run the backend locally; the published extension is configured to use the hosted service.&lt;/p&gt;

&lt;p&gt;If you try it, I'd love to hear about the experience. Were the suggestions relevant? Did the break flow feel natural? Were there situations where the extension interrupted you at the wrong time?&lt;/p&gt;

&lt;p&gt;Those are exactly the questions I'd like to explore through feedback and future contributions.&lt;/p&gt;

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

&lt;p&gt;I used OpenCode as an agent-assisted development workflow while building and debugging GetOffCode. The work involved iterating on the extension, backend, and landing page, then checking the real browser experience.&lt;/p&gt;

&lt;p&gt;I have not included a shareable DevRelay agent-session link in this submission.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Render&lt;/strong&gt; — the FastAPI backend and public landing page are deployed on Render.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of .TECH&lt;/strong&gt; — the live product website and extension-download experience are available at &lt;a href="https://getoffcode.tech" rel="noopener noreferrer"&gt;https://getoffcode.tech&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;GetOffCode is built around one small idea: sometimes progress means stepping away for a moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notice the loop. Take a break. Come back clearer. 🌿&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  hf26challenge #devchallenge #ai #opensource
&lt;/h1&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
