DEV Community

Cover image for I Automated My Meeting Minutes, Contract Drafts, and Reports With a CLI — Here's the Whole Setup
张洲诚(Zack.ZHANG)
张洲诚(Zack.ZHANG)

Posted on

I Automated My Meeting Minutes, Contract Drafts, and Reports With a CLI — Here's the Whole Setup

Every Monday I used to lose half a day to paperwork that isn't my actual job: minutes from client calls, yet another statement of work, compressing a six-page memo for my manager, and the delicate "we're going to be late" email.

Last week I moved all of it into my terminal. This is the full setup — every command included.

Why not just use a chat tab?

I did, for months. The problem isn't quality, it's repetition: paste the transcript, re-explain the format, copy the result, times ten files. And the meeting bots (Otter, Fireflies, Fathom — all genuinely good) only cover meetings inside their ecosystems. My phone recordings from on-site interviews? Nobody's job.

Two properties fix this, and both are terminal-native:

  1. Prompts become files — my minutes template and contract clause list live in --system strings I wrote once
  2. Files are first-class inputs — recordings, CSVs, parameter sheets go straight into commands; ten inputs is a for loop

Setup (2 minutes)

Node.js 18+, then:

npm install -g bailian-cli
bl auth login
Enter fullscreen mode Exit fullscreen mode

The CLI is bl, Alibaba Cloud Model Studio's command-line tool. Grab a free API key here — the free tier covered my whole week. Docs on the Model Studio CLI page.

Office paperwork pipeline: recordings, parameter files and CSVs flow through transcribe and generate commands into minutes, contracts and reports

Recording → minutes, two commands

Transcribe (local path works, it uploads for you — --diarization separates speakers, and you want that for multi-person calls):

bl speech recognize --url workshop-0728.m4a --language en --diarization --speaker-count 4 --out transcript.json
Enter fullscreen mode Exit fullscreen mode

Generate, with the format pinned:

bl text chat --system "You are a minutes assistant. From the transcript produce formal minutes: attendees, discussion summary by topic, decisions, and action items with owner and due date. Mark anything not present in the transcript as [TBC]. Never invent details." --message "$(cat transcript.json)"
Enter fullscreen mode Exit fullscreen mode

Lesson #1: my first run skipped --diarization and the minutes attributed a decision to the wrong person.
Lesson #2: "Never invent details" is load-bearing. Without it, the model helpfully fabricated a deadline nobody said out loud. With it, I got an honest [TBC].

Ten contract drafts in one loop

Eighty percent of my SOW never changes. So: one parameter file per client in contracts/, then:

for f in contracts/*.txt; do bl text chat --max-tokens 8000 --system "You are a contract drafting assistant. From the given parameters draft a software development services agreement with these clauses in order: parties, scope of work, timeline and milestones, payment terms, acceptance criteria, intellectual property, confidentiality, maintenance, liability, dispute resolution. Formal register. Output Markdown." --message "$(cat $f)" > "draft-$(basename $f .txt).md"; done
Enter fullscreen mode Exit fullscreen mode

Lesson #3: the default 4096-token output cap truncated a long draft mid-liability-clause. --max-tokens 8000 fixed it.

Obligatory honesty: these are drafts for legal review, not signable contracts. My lawyer adjusted wording in three clauses and shipped it. Reviewing beats writing from scratch — that's the entire win, and it's enough.

The rest of the pile

Same pattern everywhere — format in --system, content in --message:

bl text chat --model qwen-turbo --message "Summarize this memo in under 200 words. You must preserve all deadlines and responsible departments: $(cat compliance-memo.txt)"
Enter fullscreen mode Exit fullscreen mode
bl text chat --system "You are a retail data analyst. Structure: overview, monthly trends, anomalies, actionable recommendations. Every claim must cite specific figures from the data. No unsupported statements." --message "12 months of sales data follows: $(cat sales-2025.csv)"
Enter fullscreen mode Exit fullscreen mode
bl text chat --message "Rewrite this email to be professional, courteous and concise while keeping the meaning. Explain each change and why: $(cat draft-email.txt)"
Enter fullscreen mode Exit fullscreen mode

Lesson #4: summaries go to qwen-turbo (the cheap tier — fractions of a cent, totally sufficient); contracts and reports stay on the default model. Budget model for volume, better model for precision.

Lesson #5: "every claim must cite specific figures" turned the report from fluent filler into an actual analysis — it even flagged the March return-rate spike unprompted.

The week's ledger

Before: about six hours of manual paperwork per week. After: about forty minutes through the terminal pipeline

Task Before After
Minutes from a 90-min recording ~1.5 h ~20 min (mostly transcription wait)
Ten contract drafts Half a day Minutes + legal review
Summaries / formulas / emails 10–30 min each 1–2 min each

Spend check (one-time bl auth login --console needed):

bl usage free --sort remaining
bl usage stats --days 30
Enter fullscreen mode Exit fullscreen mode

~40 text calls, mostly inside the free tier. Coffee money at list rates.

Honest scorecard

Great for: recurring paperwork — SOWs, minutes, monthly reports. The prompt files compound; they're assets, not chats.
Skip it if: you draft two contracts a year and live entirely inside Zoom's ecosystem. The built-in bots are your shorter path.
Never its job: legal judgment, final responsibility for numbers. It converts "write from scratch" into "review and edit" — accountability stays human.

Free tier is here if you want to try. Start with whichever task annoys you most — mine was Monday's minutes.

What's the paperwork task you'd automate first? Curious what other people's worst offenders are. 👇

Top comments (0)