Skip to content

jonax1337/Zettel

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

133 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Zettel

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.

Release Build License: MIT Stars

Tauri Svelte TypeScript Tailwind Python Java SQLite

Download · Diskutieren · Changelog · Mitmachen · Security


Screenshots

Dashboard mit KPIs, Steuer-Rücklage und Period-Switcher
Dashboard
Rechnungs-Editor mit Multi-Currency und Leistungszeitraum
Rechnung erstellen
Eingangsrechnungen-Drop-Zone mit ZUGFeRD-Auto-Parse
Eingangsrechnungen
PDF/A-3 mit eingebettetem Factur-X-XML
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.

Warum Zettel?

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

Features

Rechnungen, die EN 16931 wirklich erfüllen

  • PDF/A-3 mit eingebettetem Factur-X-XML in den Profilen BASIC, EN 16931 und EXTENDED
  • Kleinunternehmer-Modus mit korrektem CategoryCode E und BR-CO-26-konformem BT-29-Fallback ohne USt-IdNr.
  • Reverse-Charge intra-EU (CategoryCode K) und Drittland (CategoryCode G) inkl. Pflicht-Hinweistexte
  • Stornorechnungen als first-class Credit-Notes mit korrektem CII-Schema
  • Eingebauter KoSIT-Validator — erzeugte und eingehende Rechnungen direkt in der App gegen die offiziellen XRechnung-Scenarios prüfen, mit Fundstellen-genauem Report (gebundelte JRE, kein System-Java nötig)
  • Mehrere USt-Sätze pro Rechnung (0 %, 7 %, 19 %), Multi-Currency mit eingefrorenem EUR-Wert
  • Drei PDF-Themes (classic / modern / minimal) per CSS-Variablen
  • PDF auf Deutsch oder Englisch pro Rechnung wählbar (XML bleibt sprach-neutral nach Norm)
  • Leistungszeiträume (BG-14 / BG-26) auf Header- und Positions-Ebene, lange Positions-Beschreibungen (BT-154)
  • Artikel-/Leistungs-Katalog für wiederverwendbare Positionen (DE + EN-Beschreibungen)
  • Skonto (Frühzahler-Rabatt) strukturiert als ApplicableTradePaymentDiscountTerms im XML
  • EPC-QR-Code (Girocode) automatisch auf EUR-Rechnungen mit IBAN — Empfänger scannt mit Banking-App
  • Angebote als eigener Dokumententyp mit One-Click-Konvertierung zur Rechnung

Buchhaltungs-Light

  • Eingangsrechnungen mit Drop-Zone für ZUGFeRD-PDFs (automatisches Parsing) und OCR-Light-Fallback (Text-Layer-Extraktion, kein Tesseract)
  • Lieferanten-Verwaltung mit USt-IdNr.-Matching beim Drop
  • Kuratierte Ausgaben-Kategorien mit SKR03- und SKR04-Konten-Mapping (Software, Hardware, Reise, …)
  • Teilzahlungen mit eigener Tabelle und automatischem partial-Status für teil-bezahlte Rechnungen
  • Bank-Import für CAMT.053 (XML) und MT940 (Text) mit Auto-Match auf Rechnungsnummer / Betrag / Kunde
  • DATEV-Export (Format 700, SKR03/SKR04) — Erlöse, Aufwände und Stornos in einem Buchungsstapel
  • UStVA-Vorbereitung (Kennzahlen 81/86/41/21/66 pro Quartal, zum Abtippen)
  • Mahnungen als eigene Dokumentenklasse mit Nummernkreis MA-…, Eskalations-Strip pro Rechnung
  • Bulk-Aktionen in Rechnungen-, Angebote- und Eingangsrechnungen-Listen

Steuer-Rücklage

  • § 32a EStG-Tarif für VZ 2024, 2025 und 2026 hartcodiert aus amtlicher BMF-Bekanntmachung, 38 Testfälle
  • Splittingtarif für Verheiratete, Soli mit Milderungszone, KiSt 8/9 %, GewSt mit § 35-Anrechnung
  • Pauschal-Modus (% × Umsatz) als zusätzliche Sanity-Check-Anzeige
  • YTD-Modus vs. Hochrechnung; Quartals-Vorauszahlungen werden gegengerechnet
  • Nebenberuf: marginale ESt-Berechnung wenn other_income_annual_cent gesetzt ist

Dashboard & Workflow

  • Zeitraum-Switcher (Jahr / Quartal / Monat / Custom) mit YoY-Kontext
  • Globale Suche (Cmd/Ctrl+K) über alle Entities inkl. Item-Beschreibungen
  • Liquiditäts-Vorschau über die nächsten 30 Tage (offene Posten + überfällige + wiederkehrend)
  • Wiedervorlage-Liste pro Kunde/Rechnung mit follow_up_date
  • Onboarding-Wizard beim ersten Start, sortierbare Tabellen in allen Listen
  • Interne Notizen (nicht auf der PDF)
  • Wiederkehrende Rechnungen (monatlich / quartalsweise / jährlich) — explizit per Klick erzeugen, kein stilles Background-Cron

Daten gehören dir

  • Backup als verschlüsseltes ZIP (AES-256-GCM + Argon2id) oder unverschlüsselt
  • Auto-Backup mit konfigurierbarem Intervall (rotierender Wochen-Snapshot)
  • Granularer Restore (Kunden / Rechnungen+PDFs / Settings unabhängig)
  • Sandbox-Modus mit separater DB zum Ausprobieren
  • Auto-Update Ed25519-signiert via GitHub Releases
  • Danger Zone mit Auto-Backup vor jeder destruktiven Aktion

Install

Vorgebaute 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.

Quickstart

Beim ersten Start führt der Onboarding-Wizard durch Firma, Steuer, Bank — kann mit „Später erinnern" übersprungen werden. Wer manuell loslegen will:

  1. Einstellungen → Unternehmen öffnen, Firmendaten + Steuernummer (bzw. USt-IdNr.) eintragen
  2. Einstellungen → Steuerprofil ausfüllen, damit das Dashboard die Steuer-Rücklage berechnen kann
  3. Kunde anlegen (/customers/new)
  4. Neue Rechnung → Kunde wählen → Positionen → speichern
  5. PDF erzeugen~/Documents/Zettel/Rechnungen/RE-2026-0001.pdf

Für eingehende Rechnungen: /expenses öffnen, PDF in die Drop-Zone ziehen — ZUGFeRD-XML wird automatisch geparsed, Vendor via USt-IdNr. gematcht.

Was Zettel nicht ist

Bewusst ausgeschlossen — diese Dinge sind im Scope anderer Tools besser aufgehoben:

  • Keine vollständige Buchhaltung (kein doppelter Eintrag, kein Konten-Plan, kein Jahresabschluss)
  • Keine Online-Banking-Anbindung — der Bank-Import liest CAMT.053-/MT940-Dateien lokal ein, keine Live-Verbindung zur Bank
  • Kein ELSTER-Upload und kein UStVA-Versand — Zettel bereitet vor, du tippst ab oder gibst es dem Steuerberater
  • Keine Cloud, kein Sync, keine Mobile-App — bewusst nicht in Scope
  • Kein SMTP-Versand — Rechnungen landen als PDF, du schickst sie wie du willst
  • Kein Tesseract-OCR — gescannte Belege funktionieren nicht und sollen es auch nicht
  • Keine Telemetrie — es gibt buchstäblich keinen Server, der was empfangen könnte

Architektur

Vier Laufzeiten, sternförmig orchestriert über Rust — Frontend, Python und Java reden nie direkt miteinander:

┌─────────────────────────────────────────────────────────────┐
│  Frontend  Svelte 5 (runes) · Tailwind v4 · Bits UI         │
│            svelte-spa-router (hash)                         │
└──────────────────────────┬──────────────────────────────────┘
                           │ Tauri Commands (invoke, IPC)
┌──────────────────────────┴──────────────────────────────────┐
│  Rust       Tauri 2 · plugin-sql · Updater · ureq           │
│             AES-256-GCM Backup · Sandbox · ECB-Kurs         │
└────┬─────────────────┬─────────────────────────┬────────────┘
     │ SQLite          │ spawn(stdio JSON)        │ spawn(CLI)
     ▼                 ▼                          ▼
┌──────────┐  ┌───────────────────┐  ┌───────────────────────┐
│ zettel.db│  │  Python Sidecar   │  │  Java (gebundelte JRE) │
│ (SQLite) │  │  WeasyPrint       │  │  KoSIT-Validator       │
└──────────┘  │  factur-x · lxml  │  │  XRechnung-Scenarios   │
              │  pypdf            │  └───────────────────────┘
              └───────────────────┘
  • Frontend (src/) — Svelte 5 mit Runes, hash-Routing via svelte-spa-router, UI als shadcn-Style-Wrapper über Bits UI in src/lib/ui/. Ruft Rust über Tauri-invoke() auf
  • Persistenz (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 eingebettet
  • Rust (src-tauri/src/) — der zentrale Orchestrator: Tauri-Commands, Backup, Crypto, Sandbox, ECB-Wechselkurs, Sidecar-Bridge (sidecar.rs) und Validator-Bridge (validator.rs)
  • Python-Sidecar (sidecar/) — JSON-RPC über stdin/stdout. Rust spawnt pro Aufruf einen frischen Prozess. PDF-Rendering via WeasyPrint + Jinja2, ZUGFeRD-XML via factur-x, eingehende PDFs via factur-x.extract oder pypdf-Heuristik. PyInstaller-gebundelt im Release-Build
  • Java-Validator (tools/kosit-validator, tools/jre) — der offizielle KoSIT-Validator (validator.jar) prüft erzeugte und eingehende E-Rechnungen gegen die XRechnung-Scenarios. Rust extrahiert dazu erst die XML über den Sidecar und startet dann Java als CLI-Subprozess (java -jar validator.jar …). Eine per jlink minimierte JRE (~35 MB) wird mitgebundelt — kein System-Java nötig. Nur im Release-Build aktiv (bzw. in dev mit lokalem tools/jre + tools/kosit-validator)

Implementierungs-Details und Konventionen: CLAUDE.md. DATEV-Mapping: docs/datev-export.md.

Build from source

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, KoSIT-Validator und JRE):

cd sidecar && python build.py && cd ..
tools/download-validator.sh   # KoSIT validator.jar + XRechnung-Scenarios
tools/build-jre.sh            # per jlink minimierte JRE nach tools/jre/
pnpm tauri:build

Vollständige Plattform-Voraussetzungen (GTK3-Runtime auf Windows, Tauri-System-Deps, Python 3.12) und Konventionen: CONTRIBUTING.md.

Roadmap

Geplant — siehe Issues und Discussions. Größere Themen, die in Diskussion sind:

  • Englische UI (PDF auf Englisch existiert seit v0.16, die App-UI ist noch nur Deutsch)
  • AfA / Anlageverzeichnis
  • EÜR-Export
  • Mandanten-Profile (mehrere Firmen in einer Installation)
  • Custom Ausgaben-Kategorien-Verwaltung in den Settings (Schema steht, UI fehlt)

Was bereits drin ist: CHANGELOG.md.

Mitmachen

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.

Sicherheit, Datenschutz, Compliance

  • Schwachstelle melden: SECURITY.md — bitte keine öffentlichen Issues für Security-Bugs
  • Was wird gespeichert, was geht raus: PRIVACY.md — keine Telemetrie, alle Daten lokal
  • GoBD, § 14 UStG, Aufbewahrung, Verfahrensdokumentation: COMPLIANCE.md

Disclaimer

Zettel 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.

Lizenz

MIT — © Jonas Laux & Contributors

Lizenzen der verwendeten Open-Source-Komponenten: THIRD_PARTY_LICENSES.md.

Acknowledgments

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.

About

Offline-first ZUGFeRD/Factur-X invoice generator for German freelancers and Kleinunternehmer.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors