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.
# 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>.pdftir 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.
tir init # creates ~/tinyinvregister
tir init --path ~/my-ws # creates at custom pathCreates:
config.toml— counters and document registrycompanies/— company profiles (with sample)customers/— customer profiles (with sample)quotes/,invoices/,proforma/,receipts/,credit-notes/— document folderstemplates/— 5 Typst templates (quote, invoice, proforma, receipt, credit-note)fonts/— bundled Nunito fontassets/— place your logo files hereoutput/— generated PDFs (gitignored)
tir render invoices/globex.toml
tir render invoices/globex.toml --company company-b
tir render invoices/globex.toml --output ~/Desktop/invoice.pdfReads 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
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.tomlCreates a new TOML file with the type changed. Does not render PDF — run tir render on the new file after.
tir list # all documents
tir list --type invoice # only invoicesOutput:
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
~/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
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- Place your logo file in the
assets/folder (e.g.,assets/acme-logo.svg) - Reference it in your company profile:
logo = "assets/acme-logo.svg" - Supported formats: SVG, PNG, GIF, JPEG
- The logo appears at the top-left of every document
- Logo is optional — if not set, the space is left blank
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" # blueGST 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 determinationGST is optional. Simply omit gstin from the company profile and no tax section appears.
name = "Globex Media Pvt Ltd"
gstin = "36AABGM5678H1Z9" # optional
country = "India"
state = "Telangana" # used for GST determination
address = "Sample Address"
email = "[email protected]" # optional[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- Numbers auto-generated if
numberis 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
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.
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 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.
ISC