Offline-first Rechnungen für deutsche Freelancer und Kleinunternehmer. ZUGFeRD- / Factur-X-konforme PDF/A-3 mit eingebettetem EN-16931-XML — lokal, ohne Cloud, ohne Abo.
Download · Diskutieren · Changelog · Mitmachen · Security
![]() Dashboard |
![]() Rechnung erstellen |
![]() Eingangsrechnungen |
![]() PDF/A-3 + ZUGFeRD |
Die Bilder im Repo sind noch Platzhalter — wer ein paar saubere Sandbox-Screenshots erzeugen mag: PR willkommen. Konventionen in
docs/screenshots/README.md.
Ich bin Solo-Selbstständig und hatte keine Lust auf weitere 20–30 € pro Monat für SaaS-Buchhaltung, nur um ein paar Rechnungen pro Quartal zu schreiben. Erst recht nicht, wenn meine Buchhaltungs-Daten dann irgendwo in einem AWS-Bucket eines deutschen GmbH-mit-niederländischer-Holding-Konstrukts liegen.
Zettel ist das, was dabei rausgekommen ist: ein kleines Desktop-Tool, das lokal läuft, die deutsche E-Rechnungs-Norm EN 16931 korrekt umsetzt, den Kleinunternehmer-Modus (§ 19 UStG) als First-Class-Feature behandelt — und keine Telemetrie sendet, weil es keinen Server gibt, an den es senden könnte.
| SaaS-Tools | Zettel | |
|---|---|---|
| Hosting | Cloud (DSGVO-AVV nötig) | Dein Rechner |
| Kosten | 15–40 €/Monat | Einmalig 0 € |
| Daten-Eigentum | Vendor-Lockin | SQLite-File auf deiner Disk |
| ZUGFeRD-XML | Häufig nur ab Premium | Standard, alle Profile |
| Funktioniert offline | Selten | Immer |
| Internet weg → kein Backup? | Problem | Egal |
CategoryCode E und BR-CO-26-konformem BT-29-Fallback ohne USt-IdNr.ApplicableTradePaymentDiscountTerms im XMLpartial-Status für teil-bezahlte RechnungenMA-…, Eskalations-Strip pro Rechnungother_income_annual_cent gesetzt istCmd/Ctrl+K) über alle Entities inkl. Item-Beschreibungenfollow_up_dateVorgebaute Installer für Windows, macOS und Linux: latest release.
| Plattform | Format | Hinweis |
|---|---|---|
| Windows 10/11 | .msi, .exe (NSIS) |
Beim ersten Start: SmartScreen → Weitere Informationen → Trotzdem ausführen |
| macOS 14+ (Apple Silicon) | .dmg |
Nicht notarisiert — Rechtsklick → Öffnen. Intel-Build pausiert (CI-Capacity) |
| Linux (Ubuntu 22.04+) | .deb |
System-Pango/Cairo nötig (siehe unten) |
Linux / macOS Systempakete (WeasyPrint lädt Pango und Cairo dynamisch):
# Ubuntu / Debian
sudo apt install libpango1.0-0 libcairo2 libgdk-pixbuf2.0-0
# macOS
brew install pango cairo gdk-pixbuf
Auto-Update ist ab v0.4.3 aktiv. Ältere Installationen einmal manuell auf die aktuelle Version ziehen.
Beim ersten Start führt der Onboarding-Wizard durch Firma, Steuer, Bank — kann mit „Später erinnern" übersprungen werden. Wer manuell loslegen will:
/customers/new)~/Documents/Zettel/Rechnungen/RE-2026-0001.pdfFür eingehende Rechnungen: /expenses öffnen, PDF in die Drop-Zone ziehen — ZUGFeRD-XML wird automatisch geparsed, Vendor via USt-IdNr. gematcht.
Bewusst ausgeschlossen — diese Dinge sind im Scope anderer Tools besser aufgehoben:
┌─────────────────────────────────────────────────────────┐
│ Frontend Svelte 5 (runes) · Tailwind v4 · Bits UI │
│ svelte-spa-router (hash) │
└────────────────────────┬────────────────────────────────┘
│ Tauri Commands
┌────────────────────────┴────────────────────────────────┐
│ Rust Tauri 2 · plugin-sql · Updater · ureq │
│ AES-256-GCM Backup · Sandbox · ECB-Kurs │
└──────────┬──────────────────────────┬───────────────────┘
│ spawn(stdio JSON) │ SQLite
▼ ▼
┌───────────────────┐ ┌──────────────┐
│ Python Sidecar │ │ zettel.db │
│ WeasyPrint │ │ (SQLite) │
│ factur-x · lxml │ └──────────────┘
│ pypdf │
└───────────────────┘
src/) — Svelte 5 mit Runes, hash-Routing via svelte-spa-router, UI als shadcn-Style-Wrapper über Bits UI in src/lib/ui/src/lib/db/) — SQLite direkt via @tauri-apps/plugin-sql. Schema-Typen aus Drizzle (nur compile-time), Queries als raw parameterized SQL. Migrations werden compile-time via include_str! in den Rust-Layer eingebettetsrc-tauri/src/) — Tauri-Commands, Backup, Crypto, Sandbox, ECB-Wechselkurs, Sidecar-Bridgesidecar/) — JSON-RPC über stdin/stdout. PDF-Rendering via WeasyPrint + Jinja2, ZUGFeRD-XML via factur-x, eingehende PDFs via factur-x.extract oder pypdf-Heuristik. PyInstaller-gebundelt im Release-BuildImplementierungs-Details und Konventionen: CLAUDE.md. DATEV-Mapping: docs/datev-export.md.
git clone https://github.com/jonax1337/zettel
cd zettel
pnpm install
# Sidecar-Venv für dev
cd sidecar
python -m venv .venv
# Windows:
.\.venv\Scripts\Activate.ps1
# macOS / Linux:
source .venv/bin/activate
pip install -r requirements.txt
cd ..
pnpm tauri:dev
Release-Build (mit gebundeltem Sidecar):
cd sidecar && python build.py && cd ..
pnpm tauri:build
Vollständige Plattform-Voraussetzungen (GTK3-Runtime auf Windows, Tauri-System-Deps, Python 3.12) und Konventionen: CONTRIBUTING.md.
Geplant — siehe Issues und Discussions. Größere Themen, die in Diskussion sind:
Was bereits drin ist: CHANGELOG.md.
Issues, Patches und Vorschläge sind willkommen. Setup, Konventionen und PR-Workflow in CONTRIBUTING.md. Code of Conduct in CODE_OF_CONDUCT.md.
Gute Einstiegspunkte: Issues mit Label good first issue und help wanted.
SECURITY.md — bitte keine öffentlichen Issues für Security-BugsPRIVACY.md — keine Telemetrie, alle Daten lokalCOMPLIANCE.mdZettel ist keine Rechts- oder Steuerberatung. Die erzeugten Rechnungen sind nach bestem Wissen EN-16931-konform, aber ohne Garantie. Die ersten Rechnungen vor dem Versand vom Steuerberater prüfen lassen. Die Steuer-Rücklage-Berechnung ist eine Vorhersage, kein Steuerbescheid — Quartals-Vorauszahlungen, individuelle Sonderausgaben und außergewöhnliche Belastungen werden nicht berücksichtigt. Details zu den Grenzen (insbesondere GoBD, Audit-Log, Aufbewahrungsfristen): COMPLIANCE.md.
MIT — © Jonas Laux & Contributors
Lizenzen der verwendeten Open-Source-Komponenten: THIRD_PARTY_LICENSES.md.
Dieses Projekt würde ohne diese tollen Open-Source-Tools nicht existieren: Tauri, Svelte, WeasyPrint, factur-x, Bits UI, Lucide. Validierung über erechnungs-validator.de und den KoSIT-Validator.