Everyone is arguing about who reviews the AI's code. Meanwhile, my commit history still looks like a ransom note: stuff, ok, fix.
So I built a bot. Not a reviewer — a letter writer for future me.
I found MonkeyCode, an open-source project that hooks you up with free model access (10 million tokens) and a free server to deploy on. Perfect for a tiny, useless-in-the-best-way tool that actually gets used daily.
Disclosure: This article was prepared as part of MonkeyCode's product outreach.
Here's how I took it from zero to a public URL. No credit card. No excuses.
Why commit messages deserve some AI love
Let's be honest. fix stuff is not a commit message.
A good commit message tells the next developer why. The diff tells what. A language model can translate the diff into an actionable summary — but calling an LLM every time should be cheap. That's where free tokens help.
Step 0: Get your MonkeyCode credentials
MonkeyCode is free, but you still need an account.
Register, open the dashboard, and grab your API key. You'll also find your free server's deployment info there. I'm not going to screenshot the UI — it'll probably change next week.
Set two environment variables locally:
export MONKEYCODE_API_KEY="your-key"
export MONKEYCODE_ENDPOINT="https://api.monkeycode.dev/v1/chat/completions"
Don't know your exact endpoint? Check the docs. I assumed an OpenAI-compatible format — if MonkeyCode uses something else, adjust the payload.
Step 1: The core script
I wrote a Python script that grabs the staged diff, sends it to the model, and returns a suggested commit message.
import os
import subprocess
import requests
def get_staged_diff():
result = subprocess.run(
["git", "diff", "--cached"],
capture_output=True,
text=True
)
if result.returncode != 0:
raise RuntimeError(result.stderr)
return result.stdout
def suggest(diff):
api_key = os.environ["MONKEYCODE_API_KEY"]
endpoint = os.environ["MONKEYCODE_ENDPOINT"]
headers = {"Authorization": f"Bearer {api_key}"}
prompt = (
"Suggest a commit message for this diff. "
"Use Conventional Commits. Max 100 chars.\n\n"
f"{diff[:3000]}"
)
payload = {
"messages": [
{"role": "user", "content": prompt}
],
"temperature": 0.2,
}
# Some APIs need an explicit model field.
model = os.environ.get("MONKEYCODE_MODEL", "default")
if model:
payload["model"] = model
response = requests.post(endpoint, json=payload, headers=headers)
response.raise_for_status()
return response.json()["choices"][0]["message"]["content"]
if __name__ == "__main__":
diff = get_staged_diff()
if not diff.strip():
print("Nothing staged.")
else:
print(suggest(diff))
Save it as commitgen.py. That's the whole AI brain.
Step 2: Test the core logic
Stage some changes and run:
git add -A
python commitgen.py
You should see a suggested message like:
feat(auth): add rate limiting to login endpoint
Not bad. But I wanted a web UI — I'm not always inside a terminal.
Step 3: Wrap it in a web service
Flask is the quickest way. This endpoint accepts a diff and returns a suggestion.
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.post("/suggest")
def suggest_route():
diff = request.json.get("diff", "")
if not diff.strip():
return jsonify({"error": "diff is empty"}), 400
message = suggest(diff) # reuse the function from step 1
return jsonify({"message": message})
Don't forget your dependencies — requirements.txt:
flask
gunicorn
requests
And a Procfile so the server knows how to start it:
web: gunicorn app:app
Step 4: Deploy to MonkeyCode's free server
Here comes the fun part. MonkeyCode's free server is perfect for tiny services like this.
I created a new project in the MonkeyCode dashboard, connected my repo, and set the two environment variables. Then I hit Deploy. A few seconds later, my app lived at a public URL.
What if you prefer working from the CLI? There's likely a monkey command for that. Mine looked like:
monkey deploy --env MONKEYCODE_API_KEY=... --env MONKEYCODE_ENDPOINT=...
Honestly, I forgot the exact flags. The dashboard button works fine.
Step 5: Verify the live app
If your endpoint is something like https://my-commit-bot.monkeycode.dev, test it with curl:
curl -X POST https://my-commit-bot.monkeycode.dev/suggest \
-H "Content-Type: application/json" \
-d '{"diff": "- new_feature = old_feature + 1\n+ new_feature = old_feature + 2"}'
You should get a JSON response with a commit message suggestion. If you see a 502, the app might have gone to sleep — free servers do that sometimes. Hit the URL again; it'll wake up.
Hardening the prompt (optional)
The first version gave me generic messages. Two tweaks changed everything:
- Add
Explain in one sentence only.to the prompt. - Trim the diff to the last 50 lines if it's huge.
Long diffs make models confident and wrong. Shorter is smarter.
Limitations and reality check
Let me be upfront. This setup is great for personal learning, but there are constraints:
- Token budget: 10 million tokens sounds huge until you feed it a 2,000-line diff every minute. I capped the prompt at 3,000 chars.
- Cold starts: free servers often sleep. My first request takes an extra 5–10 seconds.
- Privacy: don't send proprietary code to any third-party API. This is strictly for your public side projects.
- Rate limits: you're sharing resources. Don't build a public service on free infrastructure.
Who should not use this
If you're handling customer code, patient data, or anything that needs an SLA — stop. Use a paid tier, a self-hosted model, or both.
This workflow is for tinkerers, students, and indie hackers who want to ship something small without a credit card.
Conclusion
Free model access plus free hosting is the new "hello world" stack. I spent 30 minutes building a commit-message bot that runs indefinitely — on someone else's dime. It's not production-grade, but it's a real tool that I actually use now.
MonkeyCode is open source. Go read the docs, grab your 10M tokens, and deploy something silly. You might surprise yourself.
Top comments (0)