Your commit message says "fix stuff". Your future self hates you. This is a solvable problem.
MonkeyCode is an open-source project. It offers a free server option. The free tier reportedly includes a 10-million-token allowance. Disclosure: This article was prepared as part of MonkeyCode's product outreach.
This tutorial builds a CLI tool. It turns your git diff into a commit message. Total time: 30 minutes.
Why Automate Commit Messages
Commit messages are documentation. Bad messages create archaeology. You dig through code to find intent.
A model can summarize a diff instantly. It reads the changes. It writes a clear message. This saves five minutes per commit.
What You Need
- Node.js 18 or newer
- A git repository
- A free AI server URL and key
- Basic terminal skills
Get the URL and key from MonkeyCode's dashboard. Export them as environment variables.
export MONKEYCODE_URL="https://your-server.example"
export MONKEYCODE_KEY="your-key"
Step 1: Scaffold the Project
Create a new directory. Initialize npm.
mkdir commit-ai
cd commit-ai
npm init -y
touch index.mjs
Open index.mjs in your editor. Start with the imports.
import { execSync } from 'node:child_process';
Step 2: Read the Git Diff
The tool needs the staged changes. Use git diff --cached. Add --stat for context.
const diff = execSync('git diff --cached --stat && git diff --cached')
.toString()
.slice(0, 4000);
Check for an empty diff. Exit early if nothing is staged.
if (!diff.trim()) {
console.error('No staged changes. Run git add first.');
process.exit(1);
}
The 4000-character limit prevents huge diffs. Free servers have token limits. Long diffs will fail.
Step 3: Call the AI Endpoint
Build a prompt. Ask for a conventional commit message.
const prompt = `Write a conventional commit message for this diff:\n${diff}`;
Send the request to MonkeyCode's server.
const response = await fetch(process.env.MONKEYCODE_URL, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.MONKEYCODE_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
messages: [{ role: 'user', content: prompt }]
})
});
Parse the response. Different providers use different shapes.
const data = await response.json();
const message = data.choices?.[0]?.message?.content
?? data.message?.content
?? data.output?.text
?? '';
console.log(message.trim());
Step 4: Add Retry Logic
Free servers rate-limit. A 429 or 503 response means back off. Add a simple retry loop.
async function callWithRetry(prompt, retries = 3) {
for (let i = 0; i < retries; i++) {
try {
const res = await fetch(process.env.MONKEYCODE_URL, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.MONKEYCODE_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
messages: [{ role: 'user', content: prompt }]
})
});
if (res.status === 429 || res.status === 503) {
const wait = 2 ** i * 1000;
console.log(`Rate limited. Waiting ${wait}ms...`);
await new Promise(r => setTimeout(r, wait));
continue;
}
return await res.json();
} catch (err) {
console.error('Network error:', err.message);
}
}
throw new Error('Failed after retries');
}
Replace the raw fetch with this function. The exponential backoff respects the server.
Step 5: Test It
Stage your changes. Run the tool.
git add .
node index.mjs
Expected output: a commit message. Example:
feat(auth): add token refresh flow
Refresh the access token before it expires.
Handle 401 responses with a single retry.
Verify the message matches the diff. Do not trust the model blindly.
Run it ten times. Measure the success rate.
for i in $(seq 1 10); do node index.mjs; done
Record how many outputs are usable. This is your quality gate.
When to Use This
| Situation | Use it? |
|---|---|
| Small, focused commits | Yes |
| Large refactors | Review carefully |
| Generated code | No, write manually |
| Sensitive code | No, avoid sending |
Free tiers are for experiments. Use them for low-risk tasks.
Limitations
The model does not know your project history. It may invent context. Always review the message.
The free server has no SLA. It can be slow or down. This is fine for personal use. Not for a team.
Token limits apply. Long diffs will fail. Keep diffs under 4000 characters.
Who Should Skip This
Skip if you need perfect messages. Skip if your code is proprietary. Skip if you cannot review output.
Try this with MonkeyCode's free server. Thirty minutes. Your commit history will improve.
MonkeyCode provides free models that can run this workflow.
Top comments (0)