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.

~5s to invoice
0 subscriptions
MIT licensed
zsh — ~/Documents/Invoices
$ 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
$ 
yinv
Invoice N° 2026-04 Date: 2026-04-01
Due: 2026-04-30

From

Nicolas Ferry
Independent 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
Total Due €19,500
PDF · Rendered

§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

Stars on GitHub

Built in the open, for developers who invoice from the terminal.

MIT License

Use it commercially, modify it, redistribute it. No strings attached.

Built for the terminal

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.

01

Set your invoice directory

Tell yinv where to keep your invoices. This is a one-time setup that persists across sessions.

zsh
$ yinv config set invoices.dir ~/Documents/Invoices
✓ wrote ~/.config/yinv/config.toml
02

Configure your default client

Set a default client so yinv knows who to bill. You can override this per-invoice anytime.

zsh
$ yinv config set client.default acme
✓ wrote ~/.config/yinv/config.toml
03

Create a new invoice

Run yinv new. It forks last month's YAML, bumps the date and reference, and opens it in your $EDITOR.

zsh
$ yinv new
→ forking  March2026.yaml
→ opening  April2026.yaml  in $EDITOR
04

Edit the YAML

Adjust line items, days, amounts. The YAML is human-readable and version-controllable.

zsh
# April2026.yaml
invoice: "2026-04"
client: acme
items:
  - desc: "Backend consulting"
    days: 8
    rate: 1500
05

Save — PDF is ready

Save the file. yinv renders the PDF automatically. Next month, run yinv new again and repeat.

zsh
→ 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.

First run

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 setup
# 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
Every month

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.

Monthly run
# 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.

setup

Homebrew install

One brew command and you're running. No Python environment, no pip, no virtualenv overhead.

brew install yinv
format

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
output

PDF rendering

yinv renders clean, professional PDFs from your YAML. Consistent layout, every time.

✓ April2026.pdf · 2 pages
automation

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

Config file

A single TOML config at ~/.config/yinv/config.toml stores all your preferences.

~/.config/yinv/config.toml
license

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.

tree ~/Documents/Invoices
~/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."

Source of truth

The YAML file is the invoice. The PDF is derived from it. Delete the PDF and re-render anytime.

Version control friendly

Commit your YAML files. Diff them. Roll back. Your entire invoice history in git.

No lock-in

Everything is open-format. Take your files, open them in any text editor, move them anywhere.