Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TinyInvRegister

TinyInvRegister helps independent consultants quickly generate business documents — Quote, Proforma Invoice, Invoice, Receipt, and Credit Note — from simple TOML files.

It is intentionally small: no subscriptions, no watermarks, no account lockouts, no cloud. Everything stays on your system. It is not a full accounting package and does not try to be one. The goal is to get the paperwork done without complicated headaches.

Your workspace is just plain TOML files and generated PDFs. It is git-friendly, easy to back up (copy, zip, rsync, cloud drive of your choice), and easy to share with an accountant.

A sample generated PDF is included at output/sample-invoice.pdf so you can see what the rendered documents look like without running anything.

Quick start

# Build
cargo build --release

# Create a workspace (default: ~/tinyinvregister)
./target/release/tir init

# Edit companies/acme.toml with your company details
# Edit customers/globex.toml with your customer details

# Create and render a document
./target/release/tir render invoices/my-invoice.toml

# Output: output/<company>/<year>/<month>/<doc-number>.pdf

Commands

tir init [--path <dir>]
tir render <file> [--company <name>] [--output <path>]
tir convert <file> --to <type> [--output <path>]
tir list [--type <type>] [--company <name>]

Run tir --help or tir <command> --help for detailed help.

init — Create workspace

tir init                    # creates ~/tinyinvregister
tir init --path ~/my-ws     # creates at custom path

Creates:

  • config.toml — counters and document registry
  • companies/ — company profiles (with sample)
  • customers/ — customer profiles (with sample)
  • quotes/, invoices/, proforma/, receipts/, credit-notes/ — document folders
  • templates/ — 5 Typst templates (quote, invoice, proforma, receipt, credit-note)
  • fonts/ — bundled Nunito font
  • assets/ — place your logo files here
  • output/ — generated PDFs (gitignored)

render — Generate PDF

tir render invoices/globex.toml
tir render invoices/globex.toml --company company-b
tir render invoices/globex.toml --output ~/Desktop/invoice.pdf

Reads the document TOML, resolves company and customer profiles, calculates tax and totals, renders a PDF.

Output path: output/<company>/<year>/<month>/<doc-number>.pdf

Example: output/acme/2026/07/INV-0000000001.pdf

convert — Change document type

tir convert quotes/globex.toml --to invoice
# → creates invoices/globex.toml with type changed to invoice

tir convert quotes/globex.toml --to proforma
# → creates proforma/globex.toml

Creates a new TOML file with the type changed. Does not render PDF — run tir render on the new file after.

list — View all documents

tir list                      # all documents
tir list --type invoice        # only invoices

Output:

Number             Date       Type         Customer             Status    Amount
----------------------------------------------------------------------------------------
INV-0000000001     2026-07-15 invoice      globex               sent      ₹50,000
QT-0000000001      2026-07-14 quote        globex               draft     ₹50,000

Workspace layout

~/tinyinvregister/
├── config.toml                          # counters + registry
├── companies/
│   └── acme.toml                        # company profile
├── customers/
│   └── globex.toml                      # customer profile
├── quotes/                              # quote TOML files
├── invoices/                            # invoice TOML files
├── proforma/                            # proforma TOML files
├── receipts/                            # receipt TOML files
├── credit-notes/                        # credit note TOML files
├── templates/                           # Typst templates (editable)
│   ├── quote.typ
│   ├── invoice.typ
│   ├── proforma.typ
│   ├── receipt.typ
│   └── credit-note.typ
├── fonts/                               # custom fonts
│   ├── Nunito-Regular.ttf
│   └── Nunito-Bold.ttf
├── assets/                              # logos and images
│   └── acme-logo.svg
├── output/                              # generated PDFs (gitignored)
│   └── acme/
│       └── 2026/
│           └── 07/
│               └── INV-0000000001.pdf
└── .gitignore                           # excludes output/*.pdf

Company profile (companies/acme.toml)

name = "Acme Technologies Pvt Ltd"
gstin = "36AABCA1234D1Z5"              # optional — omit for tax-exempt
country = "India"
state = "Telangana"                    # used for GST (same state = CGST/SGST, different = IGST)
address = "Sample Address"
phone = "+91-9000012345"
website = "www.acme.example"
email = "[email protected]"

[tax]
default_rate = 18                      # optional — omit if no GST

[bank]
name = "Example Bank"
account_number = "000000123456"
ifsc = "EXMP0000123"
swift = "EXMPINBB001"                  # optional, for international
branch = "Sample Branch"               # optional
paypal_email = "[email protected]"  # optional

[theme]
font = "Nunito"                        # optional — from fonts/ or system
primary_color = "#000000"              # default black — change to your brand color
table_border_color = "#DDDDDD"         # table cell borders
line_color = "#000000"                 # separator lines
logo = "assets/acme-logo.svg"          # optional — path relative to workspace

Logo setup

  1. Place your logo file in the assets/ folder (e.g., assets/acme-logo.svg)
  2. Reference it in your company profile: logo = "assets/acme-logo.svg"
  3. Supported formats: SVG, PNG, GIF, JPEG
  4. The logo appears at the top-left of every document
  5. Logo is optional — if not set, the space is left blank

Colors

All colors are configurable per company in the [theme] section. Defaults are black and white.

Field Default Usage
primary_color #000000 Header line, titles, table header background, totals, labels
table_border_color #DDDDDD Table cell borders
line_color #000000 Separator lines in totals section

To use your brand color, just change primary_color:

[theme]
primary_color = "#2563EB"              # blue

GST (Indian tax)

GST is automatically detected based on company and customer location:

Scenario Tax shown
Company has GSTIN, customer same state CGST + SGST (split equally)
Company has GSTIN, customer different state IGST (full rate)
Company has GSTIN, customer outside India No tax section
Company has no GSTIN No tax section
Tax rate = 0 No tax section

To override the customer's state for GST purposes, use place_of_supply in the document:

[document]
place_of_supply = "Karnataka"          # overrides customer state for GST determination

GST is optional. Simply omit gstin from the company profile and no tax section appears.

Customer profile (customers/globex.toml)

name = "Globex Media Pvt Ltd"
gstin = "36AABGM5678H1Z9"              # optional
country = "India"
state = "Telangana"                    # used for GST determination
address = "Sample Address"
email = "[email protected]"       # optional

Document TOML

[document]
type = "invoice"                       # quote, proforma, invoice, receipt, credit-note
date = "2026-07-15"                    # required (YYYY-MM-DD)
due_date = "2026-07-29"                # optional (auto-calculated from payment_terms)
expires_on = "2026-08-14"              # for quotes
currency = "INR"                       # required (ISO 4217)
number = "INV-0000000001"              # optional — auto-generated if omitted
payment_terms = "Net 30"              # optional — auto-calculates due_date
status = "draft"                       # optional — for local tracking only: draft, sent, paid, overdue, cancelled (not shown on PDF)
reference = "QT-0000000001"            # optional — link to quote/proforma/invoice
place_of_supply = "Karnataka"          # optional — overrides customer state for GST
unit_label = "Qty"                     # optional (default: Qty)
price_label = "Price"                  # optional (default: Price)
timeline = "5 Working Days"            # optional
notes = "Thanks for your business."    # optional
footer = "For queries reach out."      # optional — replaces default footer

[company]
name = "acme"                          # company name (matches companies/<name>.toml)

[customer]
name = "globex"                        # customer name (matches customers/<name>.toml)

[tax]
rate = 18                              # optional — overrides company default_rate

[discount]
type = "percentage"                    # percentage or fixed
value = 10                             # 10% or ₹10,000

[[items]]
description = "Web Application Security Testing"
qty = 1
price = 110000
hsn = "998314"                         # optional — HSN/SAC code shown in table

[[items]]
description = "Code Review"
qty = 2
price = 5000

Document numbering

  • Numbers auto-generated if number is omitted
  • Per-company, per-type counters (acme/quote, acme/invoice, etc.)
  • Prefixes: QT (quote), PI (proforma), INV (invoice), RCT (receipt), CN (credit note)
  • Re-rendering the same file keeps the same number (registry prevents duplicates)
  • New files get the next number

Cross-document references

Use reference to link documents:

  • Invoice based on a quote: reference = "QT-0000000001"
  • Invoice based on a proforma: reference = "PI-0000000001"
  • Receipt for an invoice: reference = "INV-0000000001"
  • Credit note for an invoice: reference = "INV-0000000001"

The reference appears on the PDF in the document info section.

Payment terms

When payment_terms is set and due_date is not, the due date is auto-calculated:

Terms Due date
Net 7 date + 7 days
Net 15 date + 15 days
Net 30 date + 30 days
Net 45 date + 45 days
Net 60 date + 60 days
Due on receipt same as date
COD same as date

If both payment_terms and due_date are set, the explicit due_date is used.

Templates

Templates are Typst files in templates/. You can edit them to customize the PDF layout.

All colors come from the company profile ([theme] section) — templates contain no hardcoded color defaults.

If you want full control, install Typst locally and edit any template in templates/. You can also add your own templates and use them by setting the document type to the template file name (without .typ). For example, place templates/my-invoice.typ in your workspace and use type = "my-invoice" in your document TOML.

Bundled Nunito font is used by default. Place custom fonts in fonts/ and reference them in the company profile.

License

ISC

About

A tiny CLI based quote and invoice generation tool for independednt consultants. Not an accounting software

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages