Tutorials & Guides
How to Build a Git-to-Slack Daily Standup Summariser Using Gemini 1.5 Flash and Node.js
Ditch the tedious manual morning standup prep. Learn how to build a local Node.js script that fetches your daily git commits, uses Gemini 1.5 Flash to write a clean summary, and posts it directly to Slack.
Updated 10/14/2026
Stop Writing Daily Standups by Hand
Let’s be honest: morning standups are a bit of a chore. If your team uses Slack for asynchronous updates, you probably find yourself staring at a blank text box every morning, trying to remember what on earth you actually did yesterday. You open your terminal, run a messy git log, and try to translate raw commit hashes into human-friendly bullet points.
We can do better. By combining a quick Node.js script with the lightning-fast, highly cost-effective Gemini 1.5 Flash model, you can fully automate this process. This tutorial will walk you through building a CLI utility that grabs your local git commits from the past 24 hours, categorises them, writes a sparkling daily standup update, and pushes it directly to your team's Slack channel.
It is a simple, highly practical automation designed to make your daily developer workflow tick like a Swiss clock.
Why Gemini 1.5 Flash?
For simple utility tasks like summarising text or structured classification, using massive, expensive frontier models is complete overkill. Gemini 1.5 Flash is incredibly cheap, boasts massive speed advantages, and handles structured prompts beautifully.
Before you start, make sure you have: * Node.js (v18 or higher) installed on your machine. * A Gemini API key (which you can grab for free on Google AI Studio). If you encounter any configuration hurdles, check out our hub at /platforms/gemini/articles for troubleshooting guides. * A Slack Incoming Webhook URL for the channel where you want to post your updates.
Step 1: Setting Up the Node.js Project
Create a new directory for your tool, initialisation the project, and install the official Google Gen AI SDK.
`bash
mkdir git-standup-bot
cd git-standup-bot
npm init -y
npm install @google/gen-ai dotenv
`
Create a .env file in the root of your project to keep your API keys safe:
`env
GEMINI_API_KEY=your_gemini_api_key_here
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/your/webhook/url
GIT_AUTHOR_EMAIL=your.email@example.com
`
Step 2: Extracting Your Git Commits
We need to run a shell command from our Node script to fetch all git commits authored by you over the past 24 hours. We’ll use Node's native child_process module for this.
Create a file named index.js and add the following code to extract local repository commits:
`javascript
import { execSync } from 'child_process';
import dotenv from 'dotenv';
dotenv.config();
function getRecentCommits() { const authorEmail = process.env.GIT_AUTHOR_EMAIL; if (!authorEmail) { console.error('Error: Please specify GIT_AUTHOR_EMAIL in your .env file.'); process.exit(1); }
try {
// Fetch commits from the last 24 hours
const command = git log --since='24 hours ago' --author='${authorEmail}' --pretty=format:'%h - %s (%ar)';
const commits = execSync(command).toString().trim();
return commits;
} catch (error) {
console.error('Failed to run git log. Are you inside a git repository?', error.message);
process.exit(1);
}
}
`
This simple command returns a clean, formatted list of your hashes, commit messages, and relative times.
Step 3: Writing the Prompt and Calling Gemini
Now we need to pass these commits to Gemini 1.5 Flash. We don't want a generic copy-paste of the commit log; we want a smart summary that groups work into logic blocks (e.g., Features, Bug Fixes, Internal/Refactoring) and writes it in a professional, warm team voice.
If you want to tweak this prompt structure later for different styles (like funny or hyper-minimalist), you can build custom system instructions using our free interactive tool at /prompts.
Let's add the Gemini integration to our index.js file:
`javascript
import { GoogleGenAI } from '@google/gen-ai';
async function generateStandupSummary(commitLog) { if (!commitLog) { return 'Yesterday: Plotted world domination (or just did some deep planning—no commits found!).\nToday: Diving back into code.'; }
const ai = new GoogleGenAI({ apiKey: process.env.GEMINI_API_KEY });
const systemInstruction = ` You are an elite, highly efficient developer assistant. Your job is to read a raw list of git commit messages and translate them into a clean, professional, daily standup status message for Slack. Format the output exactly like this: Yesterday: • [Short, high-level summary of a feature or fix instead of raw commits] • [Another summary bullet point if applicable] Today: • [Inferred logical next steps based on the commit history] `;
try {
const response = await ai.models.generateContent({
model: 'gemini-1.5-flash',
contents: Here are my commits from the past 24 hours:\n\n${commitLog},
config: {
systemInstruction,
temperature: 0.3,
}
});
return response.text;
} catch (error) {
console.error('Error calling Gemini API:', error.message);
process.exit(1);
}
}
`
By leveraging the native context and low-latency nature of the Flash model (more about this model on our platform hub at /platforms/gemini), we get a beautifully formatted response in under a second.
Step 4: Posting the Summary to Slack
With our neat markdown summary generated, the final step is to dispatch it straight to your team's Slack channel via an incoming webhook.
Add this final helper function and the main execution flow to index.js:
`javascript
async function postToSlack(text) {
const webhookUrl = process.env.SLACK_WEBHOOK_URL;
if (!webhookUrl) {
console.log('\nGenerated Standup Summary (Slack webhook not configured):\n');
console.log(text);
return;
}
try { const response = await fetch(webhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ text }), });
if (response.ok) { console.log('Successfully posted standup update to Slack!'); } else { console.error('Failed to post to Slack. Status:', response.status); } } catch (error) { console.error('Error sending request to Slack:', error.message); } }
async function run() { console.log('Fetching local commits...'); const rawCommits = getRecentCommits(); console.log('Generating AI standup summary...'); const summary = await generateStandupSummary(rawCommits); console.log('Sending update...'); await postToSlack(summary); }
run();
`
Running Your Standup Bot
Make sure your .env variables are correctly populated, jump into any active local git repository on your machine, and run the script:
`bash
node index.js
`
Within seconds, your Slack channel will show a crisp, professional, bullet-pointed summary of what you did yesterday and what you are likely working on today. No manual list-writing, no formatting hassle, and zero cognitive load before your first morning coffee.
Keep going
Build something with the prompt generator, decode the jargon in the glossary, or compare the tools on our platform deep-dives.
Which AI should I use for this?
Tickd is independent and not affiliated with any AI company.