StandupGuy (standupguy)
Kill the tracker trap without leaking data.
Engineers lose up to 2/5 of the week to reporting busywork — duplicating
updates across Jira, Slack, Confluence, and slide decks. AI note-takers are
cloud SaaS with data-leak concerns. standupguy is the local-first
alternative: it reads your git history (ground truth) and drafts your
standup notes, weekly summary, and sprint-review bullets as Markdown.
Your history never leaves your laptop — except to the model endpoint
you configure (Ollama on localhost by default).
Install
Zero dependencies — Python 3.10+ stdlib only.
git clone <repo> && cd standupguy
# no-install alias (run from the repo root):
alias standupguy="python3 -m standupguy"
# or: pip install . # provides the `standupguy` console script
Usage
standupguy # yesterday's digest (deterministic, offline)
standupguy --week # last 7 days
standupguy --sprint # sprint-review bullets
standupguy --since 2026-10-01 # custom range
standupguy --draft # LLM prose: Yesterday / Today / Blockers
standupguy --format json # machine-readable digest
standupguy --author "teammate@co" # filter (default: your git user)
standupguy --all # everyone
standupguy --push-slack # POST to AUTOSTANDUP_SLACK_WEBHOOK
standupguy mcp # MCP server on stdio
standupguy serve # HTTP bridge for Activepieces / workflow tools
Activepieces
standupguy serve exposes the digest over HTTP so Activepieces' HTTP
Request piece can pull it on a schedule:
standupguy serve --root /path/to/repo # localhost:8765
GET /digest?since=yesterday&author=&format=json|markdownGET /week?author=&format=json|markdownGET /health
workflows/activepieces-standup-digest.json
is a documented flow definition (it's a human-readable spec, not a native
export — build it in Activepieces by adding the steps in order; the file
carries the exact config for each step and setup notes at the top):
weekday 9am Schedule trigger → HTTP Request → Branch (skip quiet days) →
Slack. Connect your Slack connection, set the channel, done. The same
serve endpoints work from n8n's HTTP Request node too — nothing in the
bridge is platform-specific.
Example output:
# Standup — myrepo
_since 2026-10-14_
## Shipped
### Features
- add login flow (1 files) `6785c87`
### Fixes
- null pointer on logout (1 files) `8ce2731`
## In progress (uncommitted)
- `wip.py`
## Blockers
_none reported — fill in yours_
How it works
- Digest mode (default): pure Python, fully offline. Commits grouped by
conventional-commit prefix (feat/fix/docs/refactor/test/chore); merge
commits surface as shipped PRs;
git statusfeeds the In-progress section. - Draft mode (
--draft): sends the digest to your local model via an OpenAI-compatible endpoint and gets back Yesterday/Today/Blockers prose. Configure with env vars (Ollama defaults shown):
export AUTOSTANDUP_BASE_URL="http://localhost:11434/v1"
export AUTOSTANDUP_MODEL="llama3.1"
# freellmapi works too — it's OpenAI-compatible:
export AUTOSTANDUP_BASE_URL="https://api.freellmapi.com/v1"
export AUTOSTANDUP_API_KEY="<your key>"
- MCP server: exposes
what_did_i_ship {since?, author?, root?}so your coding agent can answer "what did I ship this week" from local git. - Push:
--push-slackPOSTs the Markdown to a Slack incoming webhook (URL from the flag orAUTOSTANDUP_SLACK_WEBHOOK). Commit-derived text is sanitized before posting: control characters stripped, lines truncated at 500 chars, and@channel/@here/@everyoneneutralized to[at]channel-style text — so a hostile commit message can never ping the channel or inject payloads. Jira/Confluence push is intentionally not built in — paste the Markdown, keep your tokens out of another integration.
Date handling
Bare dates and words are normalized to explicit midnight (2026-10-14 →
2026-10-14 00:00, yesterday → yesterday 00:00) because git's date parser
treats them as noon — silently dropping morning commits.
Tests
python3 -m unittest discover -s tests # 36 tests, no network, no model
License
TBD
Metadata
Release files for standupguy 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| standupguy-0.1.0.tar.gz | 19.9 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| standupguy-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.8 kB
Release files / standupguy-0.1.0.tar.gz
| Download URL | standupguy-0.1.0.tar.gz |
|---|---|
| Size | 19.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8479a99a2c12685a2c9d6d99e11282e2bb5833745a48fd6278798d9c9d903d40
|
|
BLAKE2b-256 checksum How to use checksums |
6210d8b7f82d1200809dddd743bb153f4d062b9552835bd01fced33537f6f43a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / standupguy-0.1.0-py3-none-any.whl
| Download URL | standupguy-0.1.0-py3-none-any.whl |
|---|---|
| Size | 16.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
da3433f82ca89da63dce5428b1b3f5db6bef0f7c6e840bf1185fad1a7671ac80
|
|
BLAKE2b-256 checksum How to use checksums |
a517bc0636db9aad6f07dd9d21a8c80bce8fc85303b164c6c3c4b49beab442bd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for standupguy 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.