typst-business-templatesv0.3.0

Branding and languages

Company data, colours, logo, font presets and the seven languages, all set in company.json.

Every template takes the company as company:, usually json("/data/company.json"). The schema is company.schema.json; name, language, address and contact are required.

Language support depends on the template. Invoices have translated labels in all seven supported languages. Other accounting templates still contain German labels and DIN-specific formats; choosing company.language alone does not translate those labels. Running-text templates use their documented locale options. Supply your own body text in the desired language.

{
  "$schema": "https://casoon.github.io/typst-business-templates/schema/company.schema.json",
  "name": "TechVision Consulting",
  "language": "de",
  "business_owner": "Dr. Michael Hoffmann",
  "address": { "street": "Friedrichstraße", "house_number": "123", "postal_code": "10117", "city": "Berlin", "country": "Deutschland" },
  "contact": { "phone": "+49 30 12345678", "email": "info@techvision-consulting.de", "website": "www.techvision-consulting.de" },
  "tax_id": "27/456/12345",
  "vat_id": "DE345678901",
  "bank_account": { "bank_name": "Deutsche Bank", "account_holder": "TechVision Consulting GmbH", "iban": "DE89 1007 0024 0123 4567 89", "bic": "DEUTDEDB101" },
  "branding": { "accent_color": "#00B894", "primary_color": "#2D3436", "font_preset": "source-sans" },
  "default_terms": { "vat_exempt": false }
}

The accounting documents put the company into the letterhead, the return address line above the recipient (DIN 5008) and a four-column footer:

Column Fields
1 name, business_owner, address
2 contact.phone, contact.email, contact.website
3 business_owner, vat_id
4 bank_account: bank_name, account_holder, iban, bic

metadata.show_footer: false in a document’s JSON hides it. The running-text documents have their own footer with company name and address, contact, document number and page, and version or creation date; show-footer: false turns it off.

For e-invoices typstgen reads name, address, contact.email, vat_id, tax_id and bank_account from the same file.

default_terms.vat_exempt and vat_note print a VAT exemption note on invoices and credit notes, see Kleinunternehmer.

Colours and fonts

branding applies to the running-text documents (concept, contract, documentation, proposal, protocol, SLA, specification, task list, handout) and to the credentials sheet. The other accounting documents keep a fixed layout in Helvetica.

Key Default Used for
accent_color #E94B3C accent colour (header, rules, highlights)
primary_color #2c3e50 primary colour (titles, headings)
font_preset default body, heading and monospace font

Font presets

Preset Body and headings Monospace
inter Inter JetBrains Mono
roboto Roboto Roboto Mono
open-sans Open Sans Source Code Pro
lato Lato Fira Code
montserrat Montserrat Fira Code
source-sans Source Sans 3 Source Code Pro
poppins Poppins JetBrains Mono
raleway Raleway Fira Code
nunito Nunito JetBrains Mono
work-sans Work Sans Fira Code
default Helvetica Courier New

Unknown names fall back to default. The font files are in the repository’s fonts/ folder; add the folder you copy them to to font_paths in typstgen.toml. A missing font produces a warning and a fallback font, not an error.

Inside a template the logo is loaded with Typst’s image(). When the templates are imported as a package, a path would be resolved inside the package, so pass the image bytes instead:

#let company = json("/data/company.json")
#company.insert("logo", read("/data/logo.png", encoding: none))

#invoice(data: json("RE-2026-001.json"), company: company)

A path in company.json ("logo": "data/logo.png", from the project root) only works when the templates are copied into the project. The running-text templates also take logo: as content, for example logo: image("/data/logo.png", width: 4cm), which takes precedence over company.logo.

The logo is 150pt wide; logo_width (a Typst length such as "3cm") changes that for the concept and the task list. Without a logo, the accounting documents show a grey placeholder box where the logo goes.

Languages

language sets the text language (hyphenation, quotes) of every document and selects the labels from templates/locale/<language>.json:

Code Language
de German
en English
es Spanish
fr French
it Italian
nl Dutch
pt Portuguese

Translated labels — title page, table of contents, page numbers, headers — appear in the running-text documents, invoices and the credentials sheet. To change individual labels, pass your own dictionary in the shape of de.json:

#show: concept.with(
  title: "Konzept",
  company: json("/data/company.json"),
  locale: json("/data/locale-de.json"),
)

Invoices select language independently of tax treatment, layout, currency and formatting through invoice configuration. Position descriptions and supplied notes remain caller-authored text. The showcase includes all seven invoice languages.

The other accounting documents (offer, credit note, reminder, delivery note, order confirmation, quotation request, time sheet, letter) print German labels whatever the language, and the handout has German labels too. The text you write yourself is never translated.

Edit this page on GitHub · Docs for v0.3.0