This is a submission for the DEV April Fools Challenge
What I Built
dave-watch — 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.
Did Dave just push a commit where every function has a docstring that starts with "Certainly!"? Roasted.
Did Dave's team just come last in a 48-hour hackathon where the only other team was two sleep-deprived undergrads? Absolutely roasted.
The notifications look like this:
Demo
$ dave-watch --target="dave@company.com" --hackathon-feed=devpost
👀 dave-watch is running. Watching Dave.
(Dave does not know he is being watched.)
(This will not take long.)
[09:14] ✅ No activity. Dave is in a meeting explaining
why last sprint's tickets aren't done.
[09:47] 🚨 AI COMMIT DETECTED
Commit: "refactor user service (cleanup)"
Author: Dave <dave@company.com>
Red flags found: 7
• Docstring begins with "Certainly! Here's the..."
• 3 nested try/catch blocks that all do the same thing
• A comment that says "This is O(n log n) I think"
• Variable: 'optimized_and_clean_final_v2_FINAL'
• Dave pushed this 4 minutes after opening the file
🎤 ROAST: "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."
[11:30] 🚨 HACKATHON RESULT DETECTED
Event: HackIndia Regional 2025
Teams: 18
Dave's team placed: 17th
Team above Dave: A solo 19-year-old who built
a Chrome extension that makes
fonts slightly more italic.
Dave's post-mortem: "We were too ambitious"
🎤 ROAST: "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."
[14:02] ✅ No activity. Dave is on LinkedIn writing a post
about 'lessons learned' from the hackathon.
Dave has used the phrase 'fail forward' twice.
Dave is not failing forward. Dave is failing sideways.
Code
# dave-watch.py
# Requirements: git, python3, devpost scraper, zero mercy
import subprocess
import time
import random
AI_TELLS = [
"Certainly! Here",
"As an AI language model",
"I hope this helps!",
"Here's the refactored",
"optimized_and_clean_final",
"# This function does", # nobody writes this naturally
"handle error here",
"TODO: fix this later",
"it works on my machine",
]
HACKATHON_ROASTS = [
"Dave's team had a pitch deck with 22 slides. Slide 1 was the title. Slide 22 was 'Thank You'. The 20 slides in between were the vision. There was no product.",
"Dave came to the hackathon with a pre-built template, renamed the variables, and called it a pivot. The judges called it something else.",
"Dave's README had a 'Getting Started' section. Step 1 was 'Install Node.js'. There was no Step 2. The app did not start.",
"Dave lost to a team who had never coded before. Their app crashed on launch. The judges said it had 'more soul'.",
"Dave described his tech stack as 'scalable, cloud-native, and AI-powered'. It was a Google Form connected to a spreadsheet.",
]
AI_ROASTS = [
"Dave has not written an original line of code since 2023. This is not an insult. This is a git log.",
"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.",
"Dave copied the AI output, ran it, it failed, pasted the error back into the AI, copied the fix, and called this 'debugging'. Dave has been doing this for 4 hours. Dave will not read the error message himself.",
"Dave's variable names are full sentences. This is because he copied the AI explanation and forgot to stop copying.",
"The AI wrote a comment saying 'you may want to handle this edge case'. Dave deleted the comment. Dave did not handle the edge case.",
]
def check_latest_commit_for_ai(repo_path, target_email):
result = subprocess.run(
["git", "log", "-1", "--author", target_email,
"--pretty=format:%H", "-p"],
cwd=repo_path, capture_output=True, text=True
)
output = result.stdout
flags = [tell for tell in AI_TELLS if tell.lower() in output.lower()]
return flags
def watch(target_email, repo_path, check_interval=300):
print(f"👀 dave-watch is running. Watching {target_email}.")
print(f" (They do not know they are being watched.)")
print(f" (This will not take long.)\n")
seen_commits = set()
while True:
flags = check_latest_commit_for_ai(repo_path, target_email)
commit_hash = subprocess.run(
["git", "log", "-1", "--author", target_email,
"--pretty=format:%H"],
cwd=repo_path, capture_output=True, text=True
).stdout.strip()
if flags and commit_hash not in seen_commits:
seen_commits.add(commit_hash)
print(f"🚨 AI COMMIT DETECTED")
print(f" Red flags: {', '.join(flags)}")
print(f"\n 🎤 ROAST: {random.choice(AI_ROASTS)}\n")
time.sleep(check_interval)
if __name__ == "__main__":
watch(
target_email="dave@company.com",
repo_path=".",
check_interval=300
)
How I Built It
Tech stack:
- Python 3 (for the git log parsing and general Dave surveillance)
-
subprocess(to run git commands with the energy of someone filing a formal complaint) - A curated list of AI tells scraped from three months of reviewing Dave's PRs
- Devpost's public results pages (parsed manually, with increasing personal investment)
- Anger
The process:
- 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.
- 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.
- I built this tool.
- The tool works. Dave does not know it exists.
- Dave has triggered it 11 times this week. It is Wednesday.
Known issues:
- The tool has no off switch, which feels appropriate.
- 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.
- 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.
Prize Category
Community Favorite — 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.
Also: HTTP 418. I am a teapot. Dave is also a teapot. Dave does not know he is a teapot.
Top comments (0)