<?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: Emani Sai Shanmukha Srinivas</title>
    <description>The latest articles on DEV Community by Emani Sai Shanmukha Srinivas (@solomon1029).</description>
    <link>https://dev.to/solomon1029</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%2F3779934%2F2362f993-d0c5-410f-8dd1-2c42b67ad8c6.png</url>
      <title>DEV Community: Emani Sai Shanmukha Srinivas</title>
      <link>https://dev.to/solomon1029</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/solomon1029"/>
    <language>en</language>
    <item>
      <title>Aetheria: Chronicles of the Party</title>
      <dc:creator>Emani Sai Shanmukha Srinivas</dc:creator>
      <pubDate>Sun, 07 Jun 2026 18:27:46 +0000</pubDate>
      <link>https://dev.to/solomon1029/aetheria-chronicles-of-the-party-4h6h</link>
      <guid>https://dev.to/solomon1029/aetheria-chronicles-of-the-party-4h6h</guid>
      <description>&lt;p&gt;What I Built&lt;br&gt;
Aetheria is a visual, AI-driven tabletop roleplaying game (RPG) designed to simulate the experience of playing Dungeons &amp;amp; Dragons with a virtually infinite, dynamic Dungeon Master. By combining deep generative narrative with on-the-fly cinematic image synthesis, the application creates a continuous, immersive, and highly responsive adventure.&lt;/p&gt;

&lt;p&gt;Key Features&lt;br&gt;
Dynamic Campaign Generation: The game begins by randomly selecting from over 50 unique scenarios (ranging from steampunk fantasy to Eldritch horror escapes) and architectural visual styles (e.g., Studio Ghibli cel-shaded, gritty realistic dark fantasy). No two adventures start exactly the same way.&lt;/p&gt;

&lt;p&gt;Intelligent AI Dungeon Master: Powered by an advanced language model, the "DM" evaluates the environmental context, party composition, character stats, the chosen action, and the outcome of a 20-sided dice roll to yield contextual story events, character dialogues, and branching decision paths.&lt;/p&gt;

&lt;p&gt;Flexible Party Modes: * Local Multiplayer: Build a custom party of heroes and pass the device with friends.&lt;/p&gt;

&lt;p&gt;Solo vs. The World: Play as a single human protagonist alongside three fully autonomous AI-driven companions who take their own unprompted turns.&lt;/p&gt;

&lt;p&gt;Freedom of Action: Players aren’t restricted to predefined buttons. You can select one of the DM's contextual "Suggested Paths" or type completely custom actions—from attempting to barter with an ancient sphinx to charging recklessly at an undead giant.&lt;/p&gt;

&lt;p&gt;Cinematic Visual Continuity: With every story beat, the application generates a stunning 16:9 cinematic image representing the exact moment and location in the game. It uses previous scene descriptions as context to maintain environmental consistency turn-to-turn.&lt;/p&gt;

&lt;p&gt;Immersive Physics-Based Dice: Taking action summons a highly polished, animated 3D-simulated 20-sided die using dynamic lighting, tumbling physics, and magic circle particle effects.&lt;/p&gt;

&lt;p&gt;Journey Map &amp;amp; Persistence: The application actively auto-saves every campaign state locally. Players can abandon, revisit, resume, or delete any ongoing adventure from their "Journey Map" hub.&lt;/p&gt;

&lt;p&gt;Image Demo&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.amazonaws.com%2Fuploads%2Farticles%2Fwv6nz09ezx2d6ou6ovej.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.amazonaws.com%2Fuploads%2Farticles%2Fwv6nz09ezx2d6ou6ovej.jpeg" alt=" " width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enjoy this video walk-through demonstrating party creation, a dynamic combat encounter with an unpredictable D20 roll, and the real-time generation of our cinematic environment!&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
&lt;a href="https://github.com/Sai-Emani25/Atheria" rel="noopener noreferrer"&gt;https://github.com/Sai-Emani25/Atheria&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How I Built It&lt;br&gt;
The application is built as a completely serverless, client-side React SPA leveraging modern browser APIs and Google's Gemini SDK for its backend logic.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Frontend Core &amp;amp; UI/UX
Framework: React 19 + TypeScript. Chosen for strict type safety over complex entity management (GameState, Player records, classes).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Build Tool: Vite, configured for high-performance module bundling and seamless local development.&lt;/p&gt;

&lt;p&gt;Styling: Tailwind CSS. The app features a custom design system (relying heavily on negative space, absolute positioning, glow filters, and z-index layering) without writing raw CSS. It leverages precise typographic selections including the Cinzel (serif/fantasy context), Spectral, and Inter fonts.&lt;/p&gt;

&lt;p&gt;Animation System: motion/react (Framer Motion). This drives the physics, scaling, rotations, and staggered entrance timings. The DiceRoller component specifically utilizes complex keyframe manipulation (rotate: [0, -720, -710, -720]) and AnimatePresence to render a realistic, weighty physical die tumbling across the screen.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generative AI Engine (The "Backend")
Aetheria essentially uses Google's foundational models as its game engine, integrated via the @google/genai TypeScript SDK:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;[User Action + D20 Roll] &lt;br&gt;
       │&lt;br&gt;
       ▼&lt;br&gt;
┌────────────────────────────────────────┐&lt;br&gt;
│  Gemini 3.1 Pro (Narrative Engine)     │ ──► Generates Story &amp;amp; Visual Prompt&lt;br&gt;
└────────────────────────────────────────┘&lt;br&gt;
       │&lt;br&gt;
       ▼&lt;br&gt;
┌────────────────────────────────────────┐&lt;br&gt;
│  Gemini 2.5 Flash Image (Visual Engine)│ ──► Generates 16:9 Cinematic Image&lt;br&gt;
└────────────────────────────────────────┘&lt;/p&gt;

&lt;p&gt;Narrative Engine (Gemini 3.1 Pro Preview): * Structured Output (JSON Mode): The system relies on strict JSON schema enforcing. When a player rolls, the DM passes the complete contextual state (party health, previous locations, the dice roll, user intent) into Gemini 3.1 Pro. The model is constrained to return a heavily typed JSON object containing the narrative update, stat modifiers (damage/healing), and exactly 3-4 string suggestions for the next turn.&lt;/p&gt;

&lt;p&gt;Prompt Engineering: The DM is strictly instructed to keep dialogue punchy and respond to the specific weight of the D20 roll (where 1 is catastrophic and 20 is miraculous).&lt;/p&gt;

&lt;p&gt;Visual Engine (Gemini 2.5 Flash Image): * The narrative engine generates a purely descriptive "Visual Prompt" representing the outcome. This text is piped into the Gemini Flash image model.&lt;/p&gt;

&lt;p&gt;Continuity Injection: The prompt is dynamically wrapped with the campaign's randomly selected art style, the list of current heroes in the room, and the previous image prompt to ensure the model doesn't spontaneously shift the setting or lighting from one frame to the next.&lt;/p&gt;

&lt;p&gt;The model returns a raw base64 image data payload, which React renders natively without round-tripping to cloud storage bins to keep latency incredibly low.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;State Management &amp;amp; Persistence
React Context &amp;amp; Hooks: Standard useState orchestrates the monolithic GameState object, ensuring single-source-of-truth rendering.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Local Storage Sync: Given the complexity of the object traversing (narrative history, gold, stat updates, massive base64 images), the component intercepts changes using useEffect and serializes the active states into localStorage. The loadJourneys logic scans the native browser storage for keys matching aetheria_journey_* to reconstruct the complete Journey Map grid.&lt;/p&gt;

&lt;p&gt;Prize Category&lt;br&gt;
Best Google AI Usage: Aetheria showcases the depth of the @google/genai SDK by orchestrating a dual-model pipeline entirely on the client side. By leveraging Gemini 3.1 Pro's strict JSON mode for deterministic state mechanics alongside Gemini 2.5 Flash Image's contextually aware visual synthesis, the application transforms a large language model into a fully capable, real-time procedural game engine.&lt;/p&gt;

&lt;p&gt;Best Ode to Alan Turing: Aetheria explores the boundary of machine intelligence and human-like creativity. By tasking the AI with acting as a dynamic Dungeon Master—a role traditionally requiring immense empathy, improvisational storytelling, and rule enforcement—the game stands as a modern testament to the Turing test, creating a deeply convincing, autonomous companion for human players.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>From an Abandoned To-Do App to a Smart Productivity Engine: Upgrading Taskr into Solomon's Taskr</title>
      <dc:creator>Emani Sai Shanmukha Srinivas</dc:creator>
      <pubDate>Fri, 05 Jun 2026 18:41:19 +0000</pubDate>
      <link>https://dev.to/solomon1029/from-an-abandoned-to-do-app-to-a-smart-productivity-engine-upgrading-taskr-into-solomons-taskr-apj</link>
      <guid>https://dev.to/solomon1029/from-an-abandoned-to-do-app-to-a-smart-productivity-engine-upgrading-taskr-into-solomons-taskr-apj</guid>
      <description>&lt;p&gt;What I Built : (&lt;a href="https://github.com/Sai-Emani25/Solomon-s-Taskr" rel="noopener noreferrer"&gt;https://github.com/Sai-Emani25/Solomon-s-Taskr&lt;/a&gt;)&lt;br&gt;
I transformed my initial, bare-bones task management application, Taskr, into Solomon's Taskr—a significantly smarter, more robust productivity platform.&lt;/p&gt;

&lt;p&gt;The original project started as a standard way to log to-dos, but it lacked the intelligence to actually help manage time or prioritize effectively. With Solomon's Taskr, I wanted to build a system that doesn't just store data, but actively assists the user. Building this project means a lot to me because it represents a leap from writing basic applications to architecting intelligent, dynamic systems that solve real-world workflow bottlenecks.&lt;/p&gt;

&lt;p&gt;Demo&lt;br&gt;
Link to Final Repository:&lt;a href="https://github.com/Sai-Emani25/Solomon-s-Taskr" rel="noopener noreferrer"&gt;https://github.com/Sai-Emani25/Solomon-s-Taskr&lt;/a&gt;&lt;br&gt;
Link to Original Repository:&lt;a href="https://github.com/Sai-Emani25/Taskr" rel="noopener noreferrer"&gt;https://github.com/Sai-Emani25/Taskr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Here is a quick walkthrough of Solomon's Taskr in action!)&lt;/p&gt;

&lt;p&gt;The Comeback Story&lt;br&gt;
The original Taskr project had been sitting in my repositories, unfinished and gathering dust. It was a classic case of starting a project with good intentions but abandoning it once the basic structure was complete. It could create, read, update, and delete tasks, but that was it.&lt;/p&gt;

&lt;p&gt;For the Finish-Up-A-Thon, I decided to completely resurrect and overhaul it. Here are the key changes and implementations that turned it into Solomon's Taskr:&lt;/p&gt;

&lt;p&gt;Complete Codebase Refactoring: I stripped down the old, inefficient logic and rebuilt the architecture to be highly scalable and maintainable.&lt;/p&gt;

&lt;p&gt;Intelligent Prioritization ("The Solomon Touch"): I integrated smart features to help organize and prioritize tasks rather than just listing them chronologically. (Note: If you integrated Gemini API or LLMs here for smart tagging, explicitly mention it!)&lt;/p&gt;

&lt;p&gt;Enhanced UI/UX: I moved away from the clunky, basic interface of the original Taskr and implemented a clean, responsive dashboard that provides a real-time overview of pending and completed tasks.&lt;/p&gt;

&lt;p&gt;Optimized Data Handling: I refined how the application processes and stores data under the hood, making the transition between states and the retrieval of task history lightning-fast.&lt;/p&gt;

&lt;p&gt;My Experience with GitHub Copilot&lt;br&gt;
GitHub Copilot was an absolute game-changer for this comeback story. When reviving an old codebase, half the battle is deciphering what your past self wrote. Copilot helped me speed through the refactoring process by instantly suggesting optimized logic for outdated functions.&lt;/p&gt;

&lt;p&gt;Specifically, it accelerated my workflow when I was building out the new, complex features for Solomon's Taskr. Instead of getting bogged down writing boilerplate code for API integrations and data structures, Copilot anticipated my needs, allowing me to focus entirely on the core logic and the high-level architecture of the application. It turned hours of debugging and syntax-checking into a smooth, continuous development flow.&lt;/p&gt;

&lt;p&gt;To help me refine this template and make it perfectly accurate to your work, what specific new features, algorithms, or API integrations (such as the Gemini API) did you implement to give Solomon's Taskr its "smart" capabilities?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Supercharging ThreatOps: Why Google Cloud's Agentic AI Defense Changes the SOC Game</title>
      <dc:creator>Emani Sai Shanmukha Srinivas</dc:creator>
      <pubDate>Wed, 29 Apr 2026 03:24:58 +0000</pubDate>
      <link>https://dev.to/solomon1029/supercharging-threatops-why-google-clouds-agentic-ai-defense-changes-the-soc-game-58e3</link>
      <guid>https://dev.to/solomon1029/supercharging-threatops-why-google-clouds-agentic-ai-defense-changes-the-soc-game-58e3</guid>
      <description>&lt;p&gt;Tuning into the Google Cloud NEXT '26 keynotes this week felt like watching the future of security operations unfold in real-time. From Thomas Kurian's opening keynote on April 22 to the deep-dives in the Developer Keynote on April 23, the focus was unmistakable: the era of AI experimentation is over, and the Agentic Enterprise is officially here.  While the new Cloud Storage Rapid (hitting 15 TB/s) and the staggering scale of the new TPU 8t processors were impressive, the announcements that completely captured my attention were the launch of the Gemini Enterprise Agent Platform (the heavy-hitting evolution of Vertex AI) and the new Agentic AI Defense capabilities.  Here is my take on what these updates mean for developers building next-generation security tools, and how they perfectly align with the architecture of modern real-time SOC dashboards. The Shift to Autonomous Security Agents The most significant takeaway for security developers is Google's push towards autonomous agents for Threat Hunting and Detection Engineering. The introduction of tools like the Dark Web Intelligence agent, powered by the latest Gemini 3.1 Pro models, represents a massive leap in how we parse external events.  For developers, the new Agent Studio and Agent Development Kit (ADK) mean we are no longer just sending zero-shot prompts to an API; we are defining graph-based frameworks where specialized sub-agents collaborate to solve complex, multi-step problems in isolated, secure sandboxes.  Evolving the ThreatOps Architecture. When architecting ThreatOps, the primary goal was to create a real-time SOC dashboard that could autonomously handle threat classification and map incidents directly to the MITRE ATT&amp;amp;CK framework. The existing ingestion pipeline relies heavily on Databricks for stream processing, with the Gemini API generating the ML scoring baselines. However, orchestrating complex reasoning across high-velocity threat data can be a massive bottleneck. The announcements from Next '26 provide the exact native building blocks needed to evolve this kind of architecture : Sub-Second Inference with TPU 8i: Real-time threat classification requires absolute minimal latency. The new 8th-generation TPU 8i chips—optimized specifically for inference and reinforcement learning with their Boardfly topology—mean that ML scoring baselines can evaluate potential breaches and execute logic virtually instantaneously.  From APIs to Agentic Workflows: By migrating the current Gemini API integration over to the newly unified Gemini Enterprise Agent Platform, standard threat classification logic can be upgraded into a dedicated Detection Engineering agent. This allows the system to actively query enterprise databases like AlloyDB for historical context, maintaining a long-term understanding of previous attack patterns via the new Agent Memory Bank feature. Proactive Counter-Intelligence: Integrating the new Agent Security dashboard (powered by Security Command Center) means the platform can automatically map relationships between active agents and underlying models to scan for vulnerabilities, creating a closed-loop, proactive defense system. The Verdict: Beyond Surface-Level Automation. We are officially moving past the "reading the docs" phase of generative AI. The real power unveiled at Google Cloud NEXT '26 isn't just that the models are smarter; it's that the infrastructure is finally built to support multi-step, autonomous reasoning securely and at scale. For any developer building security pipelines, threat matrices, or enterprise dashboards, the Gemini Enterprise Agent Platform isn't just a rebrand of Vertex AI—it is a completely new paradigm for defensive engineering. I can't wait to refactor the pipeline and let these new agents loose on the data streams.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>cloudnextchallenge</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>EcoSentinel: An Agentic AI Auditor for Earth Day 🌍</title>
      <dc:creator>Emani Sai Shanmukha Srinivas</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:04:47 +0000</pubDate>
      <link>https://dev.to/solomon1029/ecosentinel-an-agentic-ai-auditor-for-earth-day-43j5</link>
      <guid>https://dev.to/solomon1029/ecosentinel-an-agentic-ai-auditor-for-earth-day-43j5</guid>
      <description>&lt;p&gt;What I Built&lt;br&gt;
EcoSentinel is an autonomous, multimodal environmental monitoring agent. It is designed to act as a "Security Operations Center (SOC) for the Planet," using vision-language models to analyze ecological data—ranging from satellite imagery to local photos of industrial waste—and generate structured remediation plans.&lt;/p&gt;

&lt;p&gt;The core objective was to move beyond static data visualization and create an agent that can "see" environmental degradation, reason about regulatory compliance, and remember the history of a specific location to track its recovery over time.&lt;/p&gt;

&lt;p&gt;Demo link - &lt;a href="https://ai.studio/apps/45fd3395-6b00-4e5a-bb79-ea18db599750" rel="noopener noreferrer"&gt;https://ai.studio/apps/45fd3395-6b00-4e5a-bb79-ea18db599750&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To test it you can try this&lt;/p&gt;

&lt;p&gt;Sector: Gran Chaco, Paraguay&lt;br&gt;
Coordinates: -21.432658, -59.578124&lt;/p&gt;

&lt;p&gt;Use the image below for the visual analysis&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.amazonaws.com%2Fuploads%2Farticles%2F02tgxoqwu3oaxx8t1f49.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.amazonaws.com%2Fuploads%2Farticles%2F02tgxoqwu3oaxx8t1f49.jpeg" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Demo of the same&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.amazonaws.com%2Fuploads%2Farticles%2Fr4fuvg61uz3zssauszix.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.amazonaws.com%2Fuploads%2Farticles%2Fr4fuvg61uz3zssauszix.png" alt=" " width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Code&lt;br&gt;
How I Built It&lt;br&gt;
The project is built on an Agentic Workflow that prioritizes perception, memory, and verifiable identity:&lt;/p&gt;

&lt;p&gt;Multimodal Perception (Google Gemini 1.5 Flash): I used Gemini 1.5 Flash via Google AI Studio to process high-resolution images. The model identifies environmental "threats" (e.g., deforestation, oil spills, or illegal dumping) and maps them against ecological standards.&lt;/p&gt;

&lt;p&gt;Long-Term Memory (Backboard): To ensure the agent isn't just reacting to a single moment in time, I integrated Backboard. This allows EcoSentinel to store past audit results, enabling "Temporal Awareness." It can compare a new image of a site to one from six months ago to verify if restoration efforts are actually working.&lt;/p&gt;

&lt;p&gt;Agent Identity (Auth0 for Agents): To prevent spoofed reports and ensure accountability, I implemented Auth0 for Agents. Every audit report generated by EcoSentinel is cryptographically signed with a unique machine-identity, making the data trustworthy for regulatory bodies.&lt;/p&gt;

&lt;p&gt;Structured Reasoning: The agent doesn't just return text; it outputs structured JSON. This allows the data to be instantly piped into a dashboard or used to trigger automated alerts for environmental agencies.&lt;/p&gt;

&lt;p&gt;Prize Categories&lt;br&gt;
Best Use of Google Gemini: Leveraged Gemini 1.5 Flash for its massive context window and multimodal capabilities to analyze complex environmental imagery and output structured audit data.&lt;/p&gt;

&lt;p&gt;Best Use of Backboard: Integrated Backboard to give the agent persistent memory across sessions, allowing it to track ecological site history.&lt;/p&gt;

&lt;p&gt;Best Use of Auth0 for Agents: Used Auth0 to provide a verifiable identity for the AI agent, ensuring that every environmental report is authenticated and auditable.&lt;/p&gt;

&lt;p&gt;Created for the Weekend Challenge: Earth Day Edition 2026.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Built a Tool That Automatically Roasts Your Teammate Every Time They Use AI or Lose a Hackathon</title>
      <dc:creator>Emani Sai Shanmukha Srinivas</dc:creator>
      <pubDate>Sat, 11 Apr 2026 13:49:18 +0000</pubDate>
      <link>https://dev.to/solomon1029/i-built-a-tool-that-automatically-roasts-your-teammate-every-time-they-use-ai-or-lose-a-hackathon-5c0h</link>
      <guid>https://dev.to/solomon1029/i-built-a-tool-that-automatically-roasts-your-teammate-every-time-they-use-ai-or-lose-a-hackathon-5c0h</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/aprilfools-2026"&gt;DEV April Fools Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;code&gt;dave-watch&lt;/code&gt; — a CLI tool that sits in the background, monitors your repo for AI-generated code commits and your team's hackathon history, and fires a personalised roast notification every single time Dave (or whoever your Dave is) does either of those things.&lt;/p&gt;

&lt;p&gt;Did Dave just push a commit where every function has a docstring that starts with "Certainly!"? &lt;strong&gt;Roasted.&lt;/strong&gt;&lt;br&gt;
Did Dave's team just come last in a 48-hour hackathon where the only other team was two sleep-deprived undergrads? &lt;strong&gt;Absolutely roasted.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The notifications look like this:&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;dave-watch &lt;span class="nt"&gt;--target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dave@company.com"&lt;/span&gt; &lt;span class="nt"&gt;--hackathon-feed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;devpost

👀 dave-watch is running. Watching Dave.
   &lt;span class="o"&gt;(&lt;/span&gt;Dave does not know he is being watched.&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;(&lt;/span&gt;This will not take long.&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;09:14] ✅ No activity. Dave is &lt;span class="k"&gt;in &lt;/span&gt;a meeting explaining
           why last sprint&lt;span class="s1"&gt;'s tickets aren'&lt;/span&gt;t &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;09:47] 🚨 AI COMMIT DETECTED
        Commit: &lt;span class="s2"&gt;"refactor user service (cleanup)"&lt;/span&gt;
        Author: Dave &amp;lt;dave@company.com&amp;gt;
        Red flags found: 7
          • Docstring begins with &lt;span class="s2"&gt;"Certainly! Here's the..."&lt;/span&gt;
          • 3 nested try/catch blocks that all &lt;span class="k"&gt;do &lt;/span&gt;the same thing
          • A comment that says &lt;span class="s2"&gt;"This is O(n log n) I think"&lt;/span&gt;
          • Variable: &lt;span class="s1"&gt;'optimized_and_clean_final_v2_FINAL'&lt;/span&gt;
          • Dave pushed this 4 minutes after opening the file

        🎤 ROAST: &lt;span class="s2"&gt;"Dave asked an AI to write his code,
                   then asked a different AI to review it,
                   then asked Slack to explain the review.
                   Dave is a middle manager who learned to git push."&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;11:30] 🚨 HACKATHON RESULT DETECTED
        Event:     HackIndia Regional 2025
        Teams:     18
        Dave&lt;span class="s1"&gt;'s team placed: 17th
        Team above Dave: A solo 19-year-old who built
                         a Chrome extension that makes
                         fonts slightly more italic.
        Dave'&lt;/span&gt;s post-mortem: &lt;span class="s2"&gt;"We were too ambitious"&lt;/span&gt;

        🎤 ROAST: &lt;span class="s2"&gt;"Dave's team had 4 people, a Figma file
                   with 38 screens, and a microservices
                   architecture for an app that showed
                   the weather. They did not show the weather.
                   They showed a loading spinner. For 3 minutes.
                   Then the tab crashed."&lt;/span&gt;

&lt;span class="o"&gt;[&lt;/span&gt;14:02] ✅ No activity. Dave is on LinkedIn writing a post
           about &lt;span class="s1"&gt;'lessons learned'&lt;/span&gt; from the hackathon.
           Dave has used the phrase &lt;span class="s1"&gt;'fail forward'&lt;/span&gt; twice.
           Dave is not failing forward. Dave is failing sideways.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# dave-watch.py
# Requirements: git, python3, devpost scraper, zero mercy
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;

&lt;span class="n"&gt;AI_TELLS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Certainly! Here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;As an AI language model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I hope this helps!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Here&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the refactored&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;optimized_and_clean_final&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;# This function does&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# nobody writes this naturally
&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;handle error here&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TODO: fix this later&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;it works on my machine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;HACKATHON_ROASTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s team had a pitch deck with 22 slides. Slide 1 was the title. Slide 22 was &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Thank You&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. The 20 slides in between were the vision. There was no product.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave came to the hackathon with a pre-built template, renamed the variables, and called it a pivot. The judges called it something else.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s README had a &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Getting Started&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; section. Step 1 was &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Install Node.js&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. There was no Step 2. The app did not start.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave lost to a team who had never coded before. Their app crashed on launch. The judges said it had &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;more soul&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave described his tech stack as &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;scalable, cloud-native, and AI-powered&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. It was a Google Form connected to a spreadsheet.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;AI_ROASTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave has not written an original line of code since 2023. This is not an insult. This is a git log.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave uses AI to write the code, AI to review the code, and AI to explain the code to himself. Dave is a project manager now. Dave does not know this.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave copied the AI output, ran it, it failed, pasted the error back into the AI, copied the fix, and called this &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;debugging&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. Dave has been doing this for 4 hours. Dave will not read the error message himself.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Dave&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s variable names are full sentences. This is because he copied the AI explanation and forgot to stop copying.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The AI wrote a comment saying &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;you may want to handle this edge case&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;. Dave deleted the comment. Dave did not handle the edge case.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_latest_commit_for_ai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
         &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--pretty=format:%H&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-p&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;
    &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tell&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;tell&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;AI_TELLS&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;tell&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;check_interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;👀 dave-watch is running. Watching &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   (They do not know they are being watched.)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   (This will not take long.)&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;seen_commits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;check_latest_commit_for_ai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;commit_hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;log&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
             &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--pretty=format:%H&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;cwd&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;commit_hash&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;seen_commits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;seen_commits&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;commit_hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🚨 AI COMMIT DETECTED&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;   Red flags: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;, &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;   🎤 ROAST: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AI_ROASTS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;check_interval&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;watch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;target_email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dave@company.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;repo_path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;check_interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;ul&gt;
&lt;li&gt;Python 3 (for the git log parsing and general Dave surveillance)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;subprocess&lt;/code&gt; (to run git commands with the energy of someone filing a formal complaint)&lt;/li&gt;
&lt;li&gt;A curated list of AI tells scraped from three months of reviewing Dave's PRs&lt;/li&gt;
&lt;li&gt;Devpost's public results pages (parsed manually, with increasing personal investment)&lt;/li&gt;
&lt;li&gt;Anger&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The process:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dave pushed a PR. The first line of every function was a docstring that began with "Certainly!". I approved it anyway. I think about this every day.&lt;/li&gt;
&lt;li&gt;Dave entered HackIndia Regional. Dave's team had a Notion doc with 6 pages of planning. Dave's team had zero pages of working code at submission time. Dave's team submitted the Notion doc.&lt;/li&gt;
&lt;li&gt;I built this tool.&lt;/li&gt;
&lt;li&gt;The tool works. Dave does not know it exists.&lt;/li&gt;
&lt;li&gt;Dave has triggered it 11 times this week. It is Wednesday.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Known issues:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tool has no off switch, which feels appropriate.&lt;/li&gt;
&lt;li&gt;It will also flag your own commits if you've ever copied from an AI. You have. I have. We don't talk about this.&lt;/li&gt;
&lt;li&gt;The hackathon scraper breaks if Dave doesn't enter under his real name. Dave once entered a hackathon as "DaVinci_Codes". The scraper found him anyway.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Community Favorite&lt;/strong&gt; — because every team has a Dave. You read this and you thought of your Dave. You smiled a specific smile. This tool is for you.&lt;/p&gt;

&lt;p&gt;Also: HTTP 418. I am a teapot. Dave is also a teapot. Dave does not know he is a teapot.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>devchallenge</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
