cd /news/ai-tools/how-i-finished-my-ai-code-reviewer-u… Β· home β€Ί topics β€Ί ai-tools β€Ί article
[ARTICLE Β· art-15805] src=dev.to pub= topic=ai-tools verified=true sentiment=↑ positive

How I Finished My AI Code Reviewer Using GitHub Copilot

A developer built Bugloo, a free AI code reviewer for students that analyzes code snippets for bugs, style issues, and improvements using FastAPI, Supabase, and Groq's llama3-70b-8192 model. The project was completed as part of the GitHub Finish-Up-A-Thon Challenge, with GitHub Copilot assisting in writing error-handling functions that convert raw Supabase and Groq error messages into human-readable responses. Bugloo is now live at bugloo.vercel.app with features including automatic language detection, user dashboards, and API documentation.

read4 min publishedMay 27, 2026

This is a submission for the GitHub Finish-Up-A-Thon Challenge

In college, nobody really reviews your code. You submit assignments, get a grade, and move on. There's no one telling you "this function is doing too much" or "you're ignoring this edge case." I got tired of that, so I built Bugloo.

Bugloo is a free AI code reviewer for students. Paste any snippet, in any language, and you get back a breakdown of bugs, style issues, improvements, a quality score, and a plain-English explanation of what your code is actually doing. The whole thing runs on FastAPI, Supabase, and Groq's llama3-70b-8192

, all free tier, no credit card.

Live demo: bugloo.vercel.app

Home Page β€” paste your code and the language is detected automatically

Review Output β€” bugs, style issues, improvements, and a quality score in one shot

Dashboard β€” every review you've run, saved to your account

API Docs β€” auto-generated by FastAPI, all endpoints documented out of the box

Honest version of where this project started: it worked on my laptop, barely. The Groq integration was functional but the rest was a mess. No real auth flow, raw Supabase error objects printing directly to the UI, manual language selection that nobody would actually use, and .pyc

files committed to Git like I had no shame.

I knew what I wanted to build. I just kept hitting friction and leaving it half-done.

Here's what I actually finished for this challenge:

highlight.js

to detect the language as you type. A badge updates in real time. Nobody has to pick from a dropdown.get_current_user

dependency on every protected route..env.example

, set up render.yaml

for deployment.Before this challenge it was a prototype I was embarrassed to share. Now it's something I'd actually put in front of a recruiter.

User pastes code
      ↓
highlight.js detects language (client-side)
      ↓
POST /api/review β†’ FastAPI
      ↓
Groq API (llama3-70b-8192) analyzes code
      ↓
Structured JSON response parsed
      ↓
Review saved to Supabase + displayed to user

I used Copilot mostly for the stuff I kept putting off because it felt tedious.

The error mapper was the clearest example. I needed a function that takes raw Supabase and Groq error messages and returns something a human can read. I wrote two cases by hand, Copilot filled in the rest. I just checked it over and adjusted a few strings.

def map_auth_error(error_msg: str) -> str:
    msg_lower = error_msg.lower()
    if any(term in msg_lower for term in ["connection", "network", "timeout", "offline", "cannot connect", "failed to connect", "unreachable"]):
        return "Authentication service is unavailable. Please try again shortly."
    if "invalid login credentials" in msg_lower or "invalid_credentials" in msg_lower:
        return "Incorrect email or password. Please try again."
    if "already registered" in msg_lower or "user_already_exists" in msg_lower:
        return "An account with this email already exists. Try logging in."
    if "weak_password" in msg_lower or "password should be at least" in msg_lower:
        return "Password must be at least 8 characters."
    if "invalid_email" in msg_lower or "valid email" in msg_lower:
        return "Please enter a valid email address."
    return "Something went wrong. Please try again."

def map_groq_error(status_code: int, error_msg: str) -> dict:
    if status_code == 400:
        return {"status": 400, "message": "Please paste at least 10 characters of code."}
    elif status_code == 504:
        return {"status": 504, "message": "The AI took too long to respond. Please try again."}
    elif status_code == 429:
        return {"status": 429, "message": "You've hit the rate limit. Please wait 30 seconds and try again."}
    elif status_code == 503:
        return {"status": 503, "message": "Couldn't reach the AI service. Check your connection and retry."}
    else:
        return {"status": 500, "message": "Internal configuration error. Please contact the admin."}

Prompt engineering was another area where Copilot saved me real time. Getting Groq to consistently return clean JSON without markdown fences or any extra text took more iteration than I expected. Copilot helped me try variations faster than I could write them myself.

The highlight.js

debounce logic for the language detection badge was also Copilot-assisted. JavaScript isn't where I'm strongest and I was avoiding that part. I described the behavior, it gave me a working implementation, I read through it, tweaked it, and moved on.

Mainly what Copilot gave me was speed on the parts I was putting off. Once those were done the project actually started feeling finished.

Built and maintained by Mohit Pandey

── more in #ai-tools 4 stories Β· sorted by recency
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain β€” perfect for shipping the agent you just read about.

$git push zahid main
β†’ Live at https://your-agent.zahid.host βœ“
Get free account β†’ Pricing
from €0/mo Β· no card required
LIVE [news/how-i-finished-my-ai…] indexed:0 read:4min 2026-05-27 Β· β€”