Meeting-to-Action is a small CLI tool that converts raw meeting notes (.md or .txt) into a clean, actionable checklist containing tasks, optional owners, and optional due dates.
- One CLI command:
parse - Input: one
.md/.txtfile, or a directory of notes files - Extraction of action items from bullets and sentences
- Optional extraction of owner and due date only when obvious
- Output: one markdown file with a standardized checklist format
- Basic terminal summary
- Unit tests for parser and formatter
- Web UI
- Database
- Authentication/authorization
- Third-party integrations
- Audio transcription
- OCR/PDF parsing
- Multilingual support
- Advanced NLP confidence scoring
- Background jobs
- Cloud deployment
- Python 3.11+
python3 -m venv .venv
source .venv/bin/activate
pip install -e .For the full local validation pass, install the dev extra:
pip install -e ".[dev]"meet2action parse notes.md --out actions.mdTo produce machine-readable JSON instead of markdown:
meet2action parse notes.md --format json --out actions.jsonWithout --out, the CLI writes beside the input:
meet2action parse notes.md
# writes notes_actions.md next to notes.md
meet2action parse notes.md --format json
# writes notes_actions.json next to notes.mdYou can also batch-parse a directory of notes files:
meet2action parse ./notes
meet2action parse ./notes --recursive
meet2action parse ./notes --format json --out-dir ./parsedSingle-file input must be a local .md or .txt file.
Expected validation failures return a non-zero exit code and do not write an output file:
meet2action parse /tmp/missing.txt --out actions.md
# Error: input file does not exist: /tmp/missing.txtmeet2action parse notes.csv --out actions.md
# Error: input file must be .md or .txt.venv/bin/pytest
.venv/bin/ruff check .
.venv/bin/python -m build
meet2action parse tests/fixtures/notes_sample.txt --out actions.md
meet2action parse tests/fixtures/notes_sample.txt --format json --out actions.jsonpython -m build uses an isolated build environment by default, so the build backend dependencies must be available locally or installable from the current environment.
- Alice to draft kickoff agenda by 2099-01-15.
Please send vendor shortlist by Friday.
Bob will follow up with legal.
General discussion about roadmap.
# Action Items
- [ ] Draft kickoff agenda (owner: Alice, due: 2099-01-15)
- [ ] Send vendor shortlist (due: Friday)
- [ ] Follow up with legal (owner: Bob)With --format json:
{
"total_lines": 4,
"candidate_lines": 3,
"actions": [
{ "task": "Draft kickoff agenda", "owner": "Alice", "due_date": "2099-01-15" },
{ "task": "Send vendor shortlist", "owner": null, "due_date": "Friday" },
{ "task": "Follow up with legal", "owner": "Bob", "due_date": null }
]
}If no actionable lines are found, the CLI still writes a valid checklist file:
# Action Items
_No action items found._The parser uses deterministic, conservative rules:
- Action candidates are lines with clear action cues (for example:
to,will,send,review,prepare,follow up). - Owner is extracted only for obvious formats:
Alice to ...Alice will ...Alice: ...@Alice ...
- Due date is extracted only for obvious formats:
by YYYY-MM-DDordue YYYY-MM-DD(must be a real calendar date)by Mondayordue Friday(weekday names)
- Discussion/status context lines (for example
Discussion:orWe will discuss ...) are intentionally ignored to reduce false positives. - Generic context labels like
Topic:,FYI:, andBackground:are ignored unless they clearly match an obvious action-owner pattern. - Leading
Pleaseis removed from task text when present as politeness.
meet2action/
├── src/meet2action/
│ ├── cli.py
│ ├── formatter.py
│ ├── models.py
│ └── parser.py
└── tests/
├── fixtures/notes_sample.txt
├── test_cli_helpers.py
├── test_e2e_parse.py
├── test_formatter.py
└── test_parser.py