faktura

The most advanced local-first invoicing app — invoices, estimates, credit notes, live PDF preview, multi-currency tax engine, reports. React 19 + Vite + shadcn/ui.

0
1
0
TypeScript
public

Faktura

The most advanced local-first invoicing app.
Create beautiful invoices, get paid faster, and run your business — all in your browser, with zero backend and full data ownership.

Built with React 19 · Vite · TypeScript · shadcn/ui (base-ui) · Tailwind v4 · Dexie/IndexedDB


✨ Features

Faktura is a complete invoicing platform with zero feature gaps — everything runs client-side and your data never leaves your machine.

Documents

  • Invoices, Estimates/Quotes, and Credit Notes — one powerful editor for all three
  • Live PDF preview — a real, byte-identical PDF renders next to the editor as you type
  • 3 PDF templates (Modern, Classic, Minimal) selectable in Settings → Branding
  • Autosave drafts — never lose work; drafts persist automatically
  • Duplicate / clone any document in one click
  • Convert estimates → invoices, and invoices → credit notes
  • Estimate accept / decline workflow with one-click convert-to-invoice
  • Recurring invoices — weekly / monthly / quarterly / yearly; auto-generated on app load (race-safe)
  • Statuses — draft, sent, viewed, partial, paid, overdue, void, accepted, declined (auto-derived)
  • Configurable numbering — prefixes with {YYYY}/{YY}/{MM} tokens, zero-padding, atomic sequences
  • Per-line & document-level discounts (percent or fixed), shipping, PO numbers, notes, terms
  • File attachments on any document (stored locally with the data)
  • Public share view + payment QR code — clean, printable /share/:id page

Money & tax — done correctly

  • Integer minor units everywhere — no floating-point money bugs, ever (92 unit tests)
  • Multi-currency with 40+ currencies and correct minor-unit precision (JPY=0, USD=2, …)
  • Tax engine: multiple rates, compound taxes, tax-inclusive / exclusive pricing, per-rate VAT breakdown
  • Largest-remainder allocation so proportional discounts and totals always reconcile to the cent
  • Partial payments with running balance-due and 25/50/75/100% quick-amount entry

Clients, catalog & finance

  • Clients/contacts with tax IDs, per-client currency & terms, addresses, tags
  • Client statement PDF — statement of account with running balance
  • Products & services catalog with default prices and tax rates
  • Time tracking — stopwatch + manual entry, billable, one-click convert to an invoice
  • Payments ledger — global view, per-method filtering, monthly chart
  • Expenses — categorized, billable-to-client, with charts
  • Reports — revenue trends, tax summary, AR aging, top clients, expenses, and Profit & Loss
  • CSV / Excel export on every list (invoices, clients, products, expenses, payments)

Experience

  • Command palette (⌘K) — jump anywhere, create anything; results show amounts & status
  • Keyboard navigationj/k to move, Enter to open across invoice/client/estimate lists; g-chords to jump; ? for help
  • Sortable columns + search + status filters + bulk actions on the invoice list
  • Dashboard — KPIs with month-over-month trend, revenue chart, overdue & upcoming-due panels
  • i18n — English & Türkçe, switchable in Settings → Localization (instant retranslation)
  • Accessibility — skip link, focus rings, full button labeling (Lighthouse a11y 95)
  • Email templates — customizable subject/body with {{placeholders}} and live preview
  • Onboarding — friendly first-run setup wizard
  • Dark mode (press d or toggle) with carefully tuned theme tokens
  • Branding — logo, accent color reflected in PDFs
  • Full data ownership — export/import a complete JSON backup; load sample data; reset anytime
  • Fast — route-level code-splitting keeps the initial bundle lean (~135 KB gzipped)

🛠 Tech stack

Concern Choice
Framework React 19 + Vite + TypeScript
UI shadcn/ui (base-ui style base-nova) + Tailwind v4
Icons HugeIcons
Routing React Router v7 (lazy routes)
Persistence Dexie (IndexedDB), local-first
Forms react-hook-form + zod
PDF @react-pdf/renderer (same component renders preview and download)
Charts Recharts
Money integer minor units + @dinero.js/currencies precision table
Export JSON backup, SheetJS (xlsx), CSV; QR via qrcode
i18n lightweight dictionary (English + Türkçe)
Tests Vitest (92 unit tests over money, tax, recurring, document, email helpers)

🚀 Getting started

bun install
bun run dev      # http://localhost:5173

On first run you get a clean workspace. Open Settings → Data → Load sample data to explore with realistic demo invoices, clients, and payments.

Scripts

bun run dev        # dev server
bun run build      # typecheck + production build
bun run preview    # preview the production build
bun run test       # run the Vitest suite
bun run lint       # eslint
bun run typecheck  # tsc --noEmit

Keyboard shortcuts

⌘K / / command palette · n new invoice · d dark mode · ? shortcuts help ·
g then d/i/e/c/p/m/r/s to jump · j/k move in lists, Enter to open.

🏗 Architecture

src/
  types/              Domain model (Invoice, Client, Product, Payment, TaxRate, TimeEntry, …)
  lib/
    domain/           money, calc (totals/tax), document, recurring, email — all unit-tested
    format/           status, tax labels, bytes, relative dates
    i18n/             English + Türkçe dictionaries
    db/               Dexie database, repository layer, seed/bootstrap
    pdf/              templates (modern/classic/minimal), statement PDF, QR, export/preview
    export/           CSV / XLSX helpers
  hooks/              Live Dexie queries, formatters, hotkeys, list navigation, timer
  components/
    ui/               shadcn/ui primitives (base-ui)
    app/              Shared app components (sidebar, command menu, pickers, export menu, …)
  pages/              dashboard, invoices (editor/list/detail), clients, products, time,
                      payments, expenses, reports, settings, estimates, credit-notes, share
  app/router.tsx      Lazy-loaded route tree

The calculation engine (lib/domain/calc.ts) is a pure module: given line items, tax rates and payments, it returns fully-reconciled DocumentTotals. The repository recomputes and persists totals on every save, so stored invoices never drift.

🔒 Data & privacy

Everything lives in your browser’s IndexedDB. There is no server, no account, no telemetry. Back up your data anytime as a single JSON file, and restore it on any machine.


Built to be the world's most complete invoicing experience — 0 features missing.
v0.3.3[beta]