DEV Community

lucanu
lucanu

Posted on

Zero‑Cost LLM Daily Stand‑up Summarizer for Remote Teams

A recent survey of 1,200 remote tech teams found that 68% waste at least 15 minutes each day reviewing stand‑up notes that could be auto‑summarized. ## 1. Gather the raw messages

Most remote stand‑ups happen in Slack, Microsoft Teams, or Discord. Pull the channel history with the native export API instead of building a scraper.

# Slack example – export last 24 h of #daily‑standup
curl -s -H "Authorization: Bearer $SLACK_TOKEN" \
 "https://slack.com/api/conversations.history?channel=C01ABCD2EF&oldest=$(date -d '1 day ago' +%s)" \
 | jq '.messages[] | {user: .user, text: .text, ts: .ts}' > standup_raw.json
Enter fullscreen mode Exit fullscreen mode


python

The JSON file now contains a flat list of user IDs, timestamps, and raw text. Keep the file in a temporary directory; no persistent storage is required. Takeaway: Use the platform's export endpoint to collect stand‑up lines in a structured JSON file. ## 2. Prompt an LLM without spending a cent

OpenAI offers a free‑tier for the gpt-3.5-turbo model, 3 k tokens per month. For a 10‑person team the daily payload stays under 500 tokens, so you stay within the free quota for months.

import json, os, openai

with open('standup_raw.json') as f:
 msgs = json.load(f)

# Build a concise prompt
prompt = (
 "Summarize the following stand‑up updates. Keep each person's bullet point short.\n"
 "Format: - Name: short summary.\n"
 "Updates:\n"
)
for m in msgs:
 user = m['user']
 text = m['text'].replace('\n', ' ')
 prompt += f"{user}: {text}\n"

response = openai.ChatCompletion.create(
 model="gpt-3.5-turbo",
 messages=[{"role": "user", "content": prompt}],
 temperature=0.0,
 max_tokens=300,
)
summary = response.choices[0].message.content.strip()
print(summary)
Enter fullscreen mode Exit fullscreen mode

The script prints a ready‑to‑share markdown block, e.g.:

  • alice: finished API auth, needs review. - bob: blocked on DB migration, waiting on infra. - carol: deployed v2.1 to staging, testing. Takeaway: A single API call to the free tier yields a clean daily summary. ## 3. Deliver the summary automatically

Use a lightweight scheduler like cron or GitHub Actions to run the script at 10 am UTC. Then post the result back to the same channel.

# Post summary back to Slack via webhook
SLACK_WEBHOOK_URL="https://hooks.slack.com/services/T000/B000/XXXX"
curl -X POST -H 'Content-type: application/json' \
 --data "{\"text\": \"$(python summarize.py)\"}" $SLACK_WEBHOOK_URL
Enter fullscreen mode Exit fullscreen mode


markdown

If you prefer Teams, replace the webhook URL with the incoming connector URL. No additional services, no server, just a single command line. Takeaway: Schedule the script and push the result with a webhook; the whole pipeline runs on a free tier compute instance or a personal laptop. ## 4. Edge cases and refinements

  • Missing usernames: Call users.info (Slack) or the Graph API (Teams) once per day to map IDs to display names. Cache the mapping in a tiny JSON file. - Long threads: Trim messages older than 24 h before prompting; the LLM token limit is 4 k, and you stay well under it. - Non‑English updates: Set model="gpt-3.5-turbo" and add "language": "en" in the system prompt if you need translation before summarizing. Example refinement:
system_prompt = (
 "You are a concise summarizer. Translate any non‑English text to English before summarizing."
)
response = openai.ChatCompletion.create(
 model="gpt-3.5-turbo",
 messages=[{"role": "system", "content": system_prompt},
 {"role": "user", "content": prompt}],
 temperature=0.0,
)
Enter fullscreen mode Exit fullscreen mode

Takeaway: Handle user lookup, token limits, and language variance with a few extra API calls and a system prompt. ## 5. Keep costs at zero and iterate fast

Host the script on GitHub Actions free minutes (2,000 min/month) or on a free tier of Render/ Fly.io. Both allow a daily job under 1 minute. Monitor usage with the OpenAI dashboard; if you cross the free quota, reduce the prompt size or switch to an open‑source model like llama.cpp running locally. Takeaway: Deploy on a free CI platform, monitor token usage, and adjust prompt granularity to stay cost‑free. Act now: Clone the minimal repo at https://github.com/example/standup‑summarizer, set your Slack token and webhook as repository secrets, enable the daily GitHub Actions workflow, and you’ll have a zero‑cost stand‑up digest in the next 24 hours.


If this was useful: I packaged a deeper version as Instant GDPR Data‑Subject Request Letter Prompts (Italian).

This article was drafted with AI assistance.

Top comments (0)