An AI-powered worklog generator that reads git commit logs from your projects and summarizes them into daily, weekly, and monthly worklogs using any OpenAI-compatible LLM. Features include English-to-Chinese translation with technical term preservation, human-in-the-loop review for iterative polishing, and cascading data fallback for weekly/monthly reports.
uv syncCopy the example config files and fill in your values:
cp config/config.yaml.example config/config.yaml
cp config/projects.txt.example config/projects.txtEdit config/config.yaml:
git_username: "Your Name"
openai_api_key: "sk-your-api-key"
openai_base_url: "https://your-openai-compatible-endpoint/v1"
model_name: "your-model-name" # e.g., qwen3-coder-plus, gpt-4o, etc.Edit config/projects.txt — add your project paths (one per line):
/Users/me/workspace/project-a
/Users/me/workspace/project-b
⚠️ Security:config/config.yaml,config/projects.txt, andoutput/are gitignored to prevent leaking sensitive data.
uv run python main.py daily # today
uv run python main.py daily --date 2026-03-04 # specific date
uv run python main.py daily --no-translate # skip translationuv run python main.py weekly # current week
uv run python main.py weekly --date 2026-03-04 # week containing this dateWeekly worklogs use existing daily worklogs when available, falling back to raw git commits for missing days.
uv run python main.py monthly # current month
uv run python main.py monthly --date 2026-03-04 # month containing this dateMonthly worklogs cascade: weekly worklogs → daily worklogs → git commits.
After generating a worklog, you'll enter an interactive review loop:
y— Approve and save the worklogn— Provide feedback; the LLM will polish the worklog based on your inputk— Add conservative keywords (technical terms that should not be translated). These are persisted to yourconfig.yamlfor future runsq— Discard and exit without saving
Templates are in the templates/ directory using Jinja2 syntax:
templates/daily.md— Daily worklog templatetemplates/weekly.md— Weekly worklog templatetemplates/monthly.md— Monthly worklog template
You can customize these templates to match your preferred worklog format.
Technical terms like Apache Spark, Kubernetes, Docker, etc. are preserved during translation. You can extend the list in two ways:
- Add to
config/config.yamlunderconservative_keywords - Add on-the-fly during the review loop by pressing
k
Built with LangChain + LangGraph:
chill/graph.py— LangGraph StateGraph workflow (collect → rewrite → translate → summarize → render → review → polish/save)chill/git_reader.py— Git log extraction via subprocess (captures commit subject + body)chill/rewriter.py— Two-stage commit message rewriter (default filter + custom rules)chill/llm_client.py— LangChain ChatOpenAI wrapper (compatible with any OpenAI-compatible API)chill/translator.py— Placeholder-based translation with keyword preservationchill/template_engine.py— Jinja2 template renderingmain.py— Click CLI entry point
A local copy is also saved at docs/workflow.png.
Mermaid source
graph LR
START --> collect_data
collect_data --> rewrite_node
rewrite_node --> translate_node
translate_node --> summarize
summarize --> render_template
render_template --> human_review
human_review -->|approve| save_output
human_review -->|request changes| polish
human_review -->|add keywords| translate_node
human_review -->|quit| END
polish --> human_review
save_output --> END
Generated worklogs are saved to:
output/
├── daily/ # e.g., 2026-03-04.md
├── weekly/ # e.g., 2026-03-02_to_06.md
└── monthly/ # e.g., 2026-03.md
- milestone1: summarize worklogs from git commit messages with HITL for final review and polishing. ✅
- milestone2:
add customizable git message rewriters✅, support logging llm interaction merics (token input / generated, requests) - milestone3: fault tolerance (persist intermediate result) during review loop, support retry llm interaction with network issues, ask user for confirmation if overwriting existing files
- milestone3: make okr-oriented worklogs, with reference to user's okr docs
- milestone3: mimic user's writing style after learning from user's previous manually-written worklogs