Open source CLI · MIT License
Generate invoices from your command line.
Stop wrestling with invoice tools. yinv turns a YAML file into a clean PDF and sets up next month's — all from your terminal.
$ yinv config set client.default acme ✓ wrote ~/.config/yinv/config.toml $ yinv new → forking March2026.yaml → opening April2026.yaml in $EDITOR ✓ April2026.pdf rendered · 2 pages $
From
Nicolas FerryIndependent Consultant
nicolas@example.com
Paris, France
Bill To
Acme Inc.Accounts Payable
billing@acme.com
San Francisco, CA
| Description | Days | Rate | Amount |
|---|---|---|---|
| Backend architecture consulting | 8 | €1,500/d | €12,000 |
| API design & documentation | 3 | €1,500/d | €4,500 |
| Code review & mentoring | 2 | €1,500/d | €3,000 |
§01 · Open Source
Free and open
source. Forever.
MIT LICENSE
yinv is MIT-licensed. Read the code, fork it, adapt it to your workflow. Pull requests welcome.
View on GitHub →Why open source matters
Built in the open, for developers who invoice from the terminal.
Use it commercially, modify it, redistribute it. No strings attached.
No Electron. No web app. No subscription. A single CLI binary.
§02 · Why yinv
Invoicing that fits how you work.
Built for developers and consultants who live in the terminal.
Invoicing software is overkill
Most SaaS invoicing tools are designed for teams. As a freelancer, you're paying for features you'll never touch—just to send a PDF once a month.
GUI workflows break your flow
Switching from your terminal to a browser, logging in, clicking through menus—it kills momentum. You live in the command line, your invoicing tool should too.
Every month you repeat yourself
Copy last month's invoice. Update the date, the reference, maybe a line item. Rename. Export. Every single month, manually. There has to be a better way.
Your data shouldn't live in someone else's cloud
Invoice data is sensitive. Financial records belong in your filesystem, under version control, not locked in a SaaS database you can't export cleanly.
§03 · How it works
Three commands. One workflow.
Set up once. Run yinv new every month. That's the entire loop.
Set your invoice directory
Tell yinv where to keep your invoices. This is a one-time setup that persists across sessions.
$ yinv config set invoices.dir ~/Documents/Invoices ✓ wrote ~/.config/yinv/config.toml
Configure your default client
Set a default client so yinv knows who to bill. You can override this per-invoice anytime.
$ yinv config set client.default acme ✓ wrote ~/.config/yinv/config.toml
Create a new invoice
Run yinv new. It forks last month's YAML, bumps the date and reference, and opens it in your $EDITOR.
$ yinv new → forking March2026.yaml → opening April2026.yaml in $EDITOR
Edit the YAML
Adjust line items, days, amounts. The YAML is human-readable and version-controllable.
# April2026.yaml invoice: "2026-04" client: acme items: - desc: "Backend consulting" days: 8 rate: 1500
Save — PDF is ready
Save the file. yinv renders the PDF automatically. Next month, run yinv new again and repeat.
→ detected change in April2026.yaml ✓ April2026.pdf rendered · 2 pages → ready for next month: yinv new
§04 · Advantages
Designed for the way you already work.
Every decision made with terminal-first developers in mind.
CLI-native
No Electron, no web app. A single binary that runs wherever your shell runs. Tab-completions included.
Local-first
All data lives on your machine as plain YAML files. Git them, back them up, open them in any editor.
Repeatable
yinv new forks last month's invoice automatically. One command, consistent output, every month.
Editable
YAML is human-readable. Open the file, tweak a line item, save. The PDF re-renders instantly.
Consistent
Same template, same layout, same brand. Every invoice looks identical because they come from the same source.
Lightweight
No database. No background process. No cloud sync. Installs in seconds via Homebrew.
§05 · Monthly Workflow
Set up once. Invoice in seconds.
The entire workflow fits in one sitting. Then repeats in under a minute.
Configure everything once.
Install yinv, point it at your invoice folder, set your default client. Then create your first invoice from the built-in template.
# First time setup (once) $ brew tap nixmaldonado/yinv $ brew install yinv $ yinv config set invoices.dir ~/Documents/Invoices ✓ wrote ~/.config/yinv/config.toml $ yinv config set client.default acme ✓ wrote ~/.config/yinv/config.toml $ yinv new → creating April2026.yaml from template ✓ April2026.pdf rendered · 2 pages
One command. Done.
Run yinv new. Edit the YAML for any changes. Save. The PDF is ready. Your April invoice becomes the template for May automatically.
# Every month (30 seconds) $ yinv new → forking April2026.yaml → opening May2026.yaml in $EDITOR # edit, save… ✓ May2026.pdf rendered · 2 pages $
April → May diff
invoice: "2026-04" → "2026-05" date: 2026-04-01 → 2026-05-01 due: 2026-04-30 → 2026-05-31
§06 · Details
Everything you need. Nothing you don't.
yinv is intentionally minimal. Every feature earns its place.
Homebrew install
One brew command and you're running. No Python environment, no pip, no virtualenv overhead.
brew install yinv YAML-driven invoices
Every invoice is a plain YAML file. Version-control it, diff it, grep it. No binary blobs.
invoice: "2026-04"
client: acme PDF rendering
yinv renders clean, professional PDFs from your YAML. Consistent layout, every time.
✓ April2026.pdf · 2 pages Auto-fork next month
yinv new copies last month's invoice, bumps the date and invoice number, opens in $EDITOR.
yinv new → May2026.yaml Config file
A single TOML config at ~/.config/yinv/config.toml stores all your preferences.
~/.config/yinv/config.toml Open source
MIT licensed. Read the source, extend it, submit a PR. The tool is yours.
github.com/nixmaldonado/yinv §07 · Data layout
Plain files. No surprises.
Your invoices live exactly where you tell them to. Nothing else.
~/Documents/Invoices/ ├── config.toml ├── clients/ │ └── acme.yaml └── invoices/ ├── 2026/ │ ├── January2026.yaml │ ├── January2026.pdf │ ├── February2026.yaml │ ├── February2026.pdf │ ├── March2026.yaml │ ├── March2026.pdf │ ├── April2026.yaml │ └── April2026.pdf # that's it.
"Nothing else. No database, no index file."
The YAML file is the invoice. The PDF is derived from it. Delete the PDF and re-render anytime.
Commit your YAML files. Diff them. Roll back. Your entire invoice history in git.
Everything is open-format. Take your files, open them in any text editor, move them anywhere.