Pre-Release 0.11.1 – minifakt befindet sich gerade im Test. Funktionen und Datenformate können sich noch ändern. Bitte Rechnungen und E-Rechnungs-XML vor dem Versand prüfen und regelmäßig sichern.
minifakt Dokumentation minifakt öffnen

minifakt – Rechnungen schreiben, direkt im Browser

minifakt ist ein kleines Rechnungsprogramm für alle, die nur ab und zu eine Rechnung schreiben: ohne Warenwirtschaft, ohne Datenbank, ohne Server und ohne Anmeldung.

Version 0.11.1 (Pre-Release, im Test) · eine HTML-Datei, keine Abhängigkeiten · © Ralf Burger · minifakt.html herunterladen · Kurzlink zum Weitergeben: rbag.eu/minifakt

Schnell

Kunde wählen, Positionen eintippen, festschreiben, drucken. Die Rechnung entsteht live in der A4-Vorschau.

Sauber

Fortlaufende Rechnungsnummern, festgeschriebene Rechnungen sind gesperrt, Korrektur per Stornorechnung.

Mandanten

Mehrere Firmen in einem Programm, jede mit eigenem Briefkopf, Logo, Kunden und Nummernkreisen.

E-Rechnung

Jede Rechnung auch als XML nach EN 16931 – als ZUGFeRD-XML oder XRechnung, geprüft mit den offiziellen Validatoren.

Privat

Läuft offline, lädt nichts nach, setzt keine Cookies. Sicherungen auf Wunsch mit Passwort verschlüsselt.

minifakt am PC: links die Eingabe einer Rechnung mit Kunde, Datum und Positionen, rechts die A4-Vorschau der fertigen Rechnung
Am PC: Eingabe links, Druckvorschau rechts
minifakt auf dem Handy: dieselbe Rechnung in einspaltiger Ansicht
Auf dem Handy

Beim ersten Öffnen startet minifakt mit dem Testmandanten FRIESE („Der Friese – Testmandant“), einem Testkunden und einer fertigen Testrechnung. So lässt sich alles gefahrlos ausprobieren, bevor man den eigenen Mandanten anlegt.

Funktionen

Rechnungen

FunktionWirkung
Neue RechnungLegt einen Entwurf an. Kunde, Rechnungsdatum, Leistungsdatum oder Leistungszeitraum, Zahlungsziel (Standard 14 Tage), optional Skonto (Tage und Prozent), optionale Käuferreferenz, MwSt.-Satz (19, 7 oder 0 %), Positionen und Schlusstext. Entwürfe speichern sich bei jeder Eingabe von selbst.
PositionenAnzahl (auch mit Komma, z. B. 1,5), Einheit (Stunde, Tag, Monat, Stück, pauschal, km), Bezeichnung (mehrzeilig) und Einzelpreis. Gerechnet wird in Cent, gerundet wird je Position und bei der Mehrwertsteuer.
FestschreibenVergibt die nächste Rechnungsnummer und sperrt die Rechnung. Die Anschrift des Kunden wird dabei eingefroren; spätere Änderungen am Kunden wirken nur auf neue Rechnungen. Zum Schutz vor Versehen muss der Knopf zweimal geklickt werden.
Drucken / PDFDruckt nur das A4-Blatt. Als Dateiname schlägt der Browser z. B. FRIESE.rechnung.2026001.pdf vor.
Auf der RechnungUnter den Summen stehen automatisch Leistungsdatum bzw. -zeitraum, bei 0 % der Grund der Steuerbefreiung und das Zahlungsziel mit Datum („Zahlbar ohne Abzug bis zum …“). Ist Skonto eingetragen, folgt z. B. „Bei Zahlung bis zum 11.10.2026 abzüglich 2 % Skonto (2,38 €), Zahlbetrag dann 116,62 €.“ Bei Stornos gibt es kein Skonto.
E-Rechnung (XML), XRechnungErzeugen die E-Rechnung zu einer festgeschriebenen Rechnung, siehe E-Rechnung.
StornierenLegt eine Stornorechnung mit negativen Mengen als Entwurf an. Erst wenn sie festgeschrieben ist, bekommt sie eine eigene Nummer und die ursprüngliche Rechnung den Status „storniert“.
Als VorlageKopiert eine vorhandene Rechnung als neuen Entwurf, praktisch bei wiederkehrenden Leistungen.
ProbedruckDruckt einen Entwurf zur Kontrolle, ohne Nummer.

Kunden

Name bzw. Firma, Zusatz (z. B. „z. Hd.“), Straße, Länderkennung (D oder DE), PLZ, Ort, E-Mail (für XRechnung Pflicht), optional die USt.-ID des Kunden und eine interne Notiz. Kundennummern werden automatisch vergeben. Löschen lässt sich ein Kunde nur, solange es keine Rechnung an ihn gibt.

Mandanten

Jeder Mandant hat eigene Einstellungen (Briefkopf, Infoblock mit Bankverbindung und Steuernummern, Logo, Standard-MwSt., Schlusstext, Präfix für den PDF-Namen), eigene Kunden, eigene Rechnungen und eigene Nummernkreise. Gewechselt wird über die Auswahl oben links. Angelegt werden Mandanten unter Einstellungen → Mandanten.

Einstellungen

Pro Mandant: Briefkopf, Absenderzeile über der Anschrift, Anschrift und Kontaktperson für die E-Rechnung, Infoblock (Telefon, E-Mail, Bank, IBAN, USt.-ID, Steuernummer), Vorgaben (Skonto Standard: Tage und Prozent, 0 Tage = kein Skonto; MwSt.-Satz, Schlusstext, Zahlungsziel, Grund bei 0 % MwSt., PDF-Präfix), Logo und die nächsten Rechnungs- und Kundennummern. minifakt verhindert, dass die nächste Rechnungsnummer auf eine schon vergebene zurückgesetzt wird.

Erste Schritte

  1. minifakt öffnen und mit dem Testmandanten FRIESE ein wenig herumprobieren.
  2. Unter Einstellungen → Mandanten ein Kürzel eintragen (z. B. MEINEFIRMA) und „Neuer Mandant“ klicken.
  3. Briefkopf, Bankverbindung, Steuernummern und die Nummernkreise eintragen, optional ein Logo wählen, speichern.
  4. Unter Kunden den ersten Kunden anlegen.
  5. Rechnungen → Neue Rechnung, Positionen eintippen, festschreiben, drucken bzw. als PDF speichern.
  6. Sicherung speichern – und die Datei an einem sicheren Ort aufbewahren.

Den Testmandanten kann man löschen, sobald er keine Kunden und Rechnungen mehr hat, oder einfach behalten.

E-Rechnung

Zu jeder festgeschriebenen Rechnung erzeugt minifakt auf Knopfdruck eine E-Rechnung: eine XML-Datei nach der europäischen Norm EN 16931 in der Syntax UN/CEFACT CII. Sie ist die rechtlich maßgebliche Rechnung; das PDF dient als lesbare Ansicht.

KnopfErgebnisWofür
E-Rechnung (XML)…_zugferd-en16931.xml, Profil EN 16931 von ZUGFeRD/Factur-XRechnungen an Unternehmen
XRechnung…_xrechnung.xml, XRechnung 3.0Rechnungen an Behörden und Kunden, die ausdrücklich XRechnung verlangen

Was dafür eingetragen sein muss

  • Mandant: Firmenname, Anschrift (mindestens PLZ, Ort, Ländercode), USt.-ID oder Steuernummer, eine gültige IBAN (minifakt prüft die Prüfziffer)
  • Kunde: Name, PLZ, Ort, Länderkennung
  • zusätzlich für XRechnung: Kontaktperson, Telefon und E-Mail des Absenders sowie die E-Mail des Kunden. Ohne Käuferreferenz trägt minifakt die Kundennummer ein; Behörden verlangen hier ihre Leitweg-ID.

Fehlt etwas, sagt minifakt genau, was, statt eine unvollständige Datei zu erzeugen.

Was in der XML steht

  • Rechnungsnummer, Datum, Typ (380 Rechnung, 384 Korrekturrechnung mit Verweis auf die stornierte Rechnung)
  • Verkäufer mit Anschrift, Kontakt, USt.-ID (VA) und Steuernummer (FC); Käufer mit Anschrift, E-Mail und ggf. USt.-ID
  • Positionen mit Menge und Einheit nach UN/ECE Rec. 20 (HUR, DAY, MON, C62, LS, KMT), Nettopreis und Steuersatz
  • Leistungsdatum bzw. Leistungszeitraum, Zahlungsart SEPA-Überweisung mit IBAN, Fälligkeitsdatum
  • Skonto (falls eingetragen) in den Zahlungsbedingungen als maschinenlesbare Zeile nach XRechnung-Konvention, z. B. #SKONTO#TAGE=7#PROZENT=2.00#
  • Steuerkategorie S (19 % bzw. 7 %) oder E (steuerbefreit, mit dem eingestellten Grund, z. B. Kleinunternehmer)

Geprüft

Die erzeugten Dateien – normale Rechnung, Rechnung mit Leistungszeitraum, Stornorechnung und Kleinunternehmer-Rechnung – wurden mit dem offiziellen KoSIT-Validator (XRechnung 3.0.2) und mit dem Mustang-Validator (ZUGFeRD 2.x, Profil EN 16931) geprüft: gültig, ohne Fehler und ohne Warnungen.

Die XML-Datei verschickt man zusammen mit dem PDF. Ein einzelnes PDF mit eingebetteter XML („ZUGFeRD-PDF“) erzeugt minifakt noch nicht; das ist für eine spätere Version angedacht. Rechtlich genügt die XML-Datei als E-Rechnung. Aufbewahrt werden muss die XML.

Daten und Sicherung

minifakt hat keinen Server. Alle Daten liegen im Speicher des Browsers (localStorage), und zwar nur in dem Browser und auf dem Gerät, mit dem man arbeitet.

  • Ein anderer Browser oder ein anderes Gerät sieht diese Daten nicht.
  • Wer die Browserdaten („Cookies und Website-Daten“) löscht, löscht auch die Rechnungen.
  • Wird minifakt.html lokal geöffnet, hängt der Speicher am Pfad der Datei: Eine verschobene Kopie beginnt leer.

Die eigentlichen Daten sind deshalb die Sicherungsdateien. Oben rechts zeigt minifakt „Ungesicherte Änderungen“, bis wieder gesichert wurde. Beim Festschreiben einer Rechnung lädt minifakt automatisch eine Sicherung herunter.

Sicherungsdateien

DateinameEntsteht
minifakt_2026-10-04_09-15.jsonüber „Sicherung speichern“
minifakt_2026-10-04_09-15_FRIESE-Rechnung-2026002.jsonautomatisch beim Festschreiben
…_verschluesselt.jsonwenn mit Passwort gesichert wurde

Eine Sicherung enthält immer alle Mandanten. Die meisten Browser legen sie ohne Rückfrage im Download-Ordner ab (Firefox: Strg+Shift+Y zeigt die Downloads).

Sicherung laden

„Sicherung laden …“ zeigt vor dem Übernehmen eine Gegenüberstellung von Datei und aktuellem Stand und bietet zwei Wege:

  • Mandanten hinzufügen: Die Mandanten aus der Datei kommen zusätzlich dazu. Mandanten mit einem Kürzel, das es schon gibt, werden übersprungen. So lässt sich z. B. ein einzeln gesicherter Mandant neben dem Testmandanten einspielen.
  • Alles ersetzen: Der aktuelle Stand im Browser wird vollständig durch die Datei ersetzt, etwa beim Umzug auf einen anderen Rechner.

Nur an einer Stelle arbeiten

minifakt führt Datenstände nicht zusammen. Wer an zwei Geräten parallel Rechnungen schreibt, bekommt doppelte Nummern. Also: ein Hauptgerät, Umzug nur per Sicherung. Mehrere Tabs im selben Browser gleicht minifakt dagegen automatisch ab und weist darauf hin.

Verschlüsselung der Sicherung

„Sicherung speichern“ fragt nach einem Passwort. Bleibt das Feld leer, wird im Klartext gesichert – lesbares JSON. Mit Passwort ist die Datei ohne dieses Passwort nicht lesbar.

  • Verfahren: Schlüssel aus dem Passwort per PBKDF2-SHA256 mit 600.000 Durchläufen und zufälligem Salt, Verschlüsselung mit AES-256-GCM. Das erledigt die eingebaute Kryptografie des Browsers (Web Crypto API), ohne Zusatzbibliothek.
  • „Passwort merken“ hält das Passwort nur im Arbeitsspeicher, bis die Seite geschlossen wird. Dann verschlüsselt minifakt auch die automatische Sicherung beim Festschreiben. Gespeichert wird das Passwort nie.
  • War die letzte Sicherung verschlüsselt und ist kein Passwort gemerkt, fragt minifakt beim Festschreiben nach, statt still im Klartext zu sichern.
  • Beim Laden erkennt minifakt verschlüsselte Dateien selbst und fragt nach dem Passwort.

Ohne Passwort gibt es keinen Weg zurück. Es gibt keine Hintertür und keine Wiederherstellung. Das Passwort gehört in einen Passwortmanager.

Handy und Tablet

minifakt passt sich an schmale Bildschirme an: Positionen werden zu Karten, Tabellen zeigen nur das Wichtigste, Eingabefelder sind groß genug für Finger. Auf dem Handy öffnet man minifakt über die Webadresse, die Daten bleiben trotzdem nur auf dem Gerät.

  • Jedes Gerät hat eigene Daten. Handy und PC teilen nichts; Umzug nur per Sicherungsdatei.
  • iPhone und iPad: Safari löscht die gespeicherten Daten einer Webseite, wenn sie sieben Tage lang nicht geöffnet wurde. Das gilt nicht, wenn minifakt über Teilen → Zum Home-Bildschirm als App abgelegt ist. minifakt bittet den Browser zwar, die Daten dauerhaft zu behalten, Safari beachtet das aber nur eingeschränkt.
  • Drucken und „Als PDF sichern“ laufen über das Teilen- bzw. Druckmenü des Telefons.

Empfehlung: Rechnungen am PC schreiben und das Handy höchstens zum Nachschauen nutzen. Und immer sichern.

Datenschutz

minifakt läuft vollständig im Browser:

  • keine Verbindungen ins Netz, keine nachgeladenen Skripte, Schriften oder Bilder
  • keine Cookies, kein Tracking, keine Statistik
  • Daten nur im lokalen Browserspeicher und in den Sicherungsdateien, die man selbst speichert
  • die Zwischenablage nur, wenn man ausdrücklich „Daten in die Zwischenablage kopieren“ wählt

Wird minifakt von einem Webserver geöffnet, sieht dieser – wie bei jeder Webseite – nur den Abruf der Datei, nicht die Rechnungsdaten. Wer ganz ohne Server arbeiten will, lädt minifakt.html herunter und öffnet die Datei lokal.

Kundendaten sind personenbezogene Daten. Weil minifakt sie nirgendwohin überträgt, gibt es keinen Auftragsverarbeiter. Unverschlüsselte Sicherungen sollte man nicht ungeschützt in eine Cloud legen.

Rechtliches und Grenzen

  • Keine Steuerberatung, keine Gewähr. minifakt hilft beim Schreiben ordentlicher Rechnungen. Ob eine Rechnung alle Pflichtangaben enthält, liegt in der Verantwortung dessen, der sie ausstellt.
  • Aufbewahrung: Rechnungen müssen acht Jahre aufbewahrt werden. Am besten die PDFs und die Sicherungen dauerhaft ablegen. Der Browserspeicher allein ist kein Archiv.
  • Unveränderbarkeit: minifakt sperrt festgeschriebene Rechnungen in der Oberfläche. Es ist aber kein geprüftes Archivsystem; technisch versierte Nutzer könnten den Browserspeicher verändern.
  • Kleinunternehmer: MwSt.-Satz 0 % wählen. Der unter Einstellungen → Vorgaben eingetragene Grund („Kleinunternehmer gemäß § 19 UStG“) erscheint auf der Rechnung und in der E-Rechnung.
  • E-Rechnung: Rechnungen an Unternehmen müssen in Deutschland ab 2027 (bei mehr als 800.000 € Vorjahresumsatz) bzw. ab 2028 (für alle) als E-Rechnung ausgestellt werden. minifakt erzeugt dafür die XML-Datei (siehe E-Rechnung). Rechnungen an Privatpersonen und Kleinbetragsrechnungen bis 250 € sind ausgenommen.

Aufbau und Formate

Die gesamte Anwendung steckt in minifakt.html (rund 1.050 Zeilen, etwa 90 KB inklusive Testlogo). Es gibt keinen Build-Schritt und keine Abhängigkeiten; Änderungen werden direkt in dieser Datei gemacht.

BereichInhalt
<style>Oberfläche, Handy-Ansicht (max-width: 640px), das Rechnungsblatt in Millimetern (.sheet) und die Druckregeln (@page, @media print)
Datenmodelldefaults() (Startzustand mit Testmandant), normalize() (bringt geladene und ältere Daten in die aktuelle Form), M() (aktueller Mandant), persist()
RechnenparseDe() für deutsche Zahleneingaben, calc() in Cent
RechnungsblattsheetHtml() erzeugt das A4-Blatt für Vorschau und Druck, printRechnung()
E-RechnungeRechnungLuecken() prüft die Pflichtangaben, eRechnungXml() erzeugt das CII-XML (ZUGFeRD-Profil EN 16931 oder XRechnung 3.0), ibanOk(), isoLand()
Sicherungbackup(), download(), encryptText()/decryptText(), Dialoge openBackupDialog() und openDecryptDialog()
Ansichtenrender() verteilt auf renderListe, renderRechnung, renderKunden, renderKunde, renderEinstellungen, renderRestore

Datenformat

Browserspeicher (Schlüssel minifakt.v2) und unverschlüsselte Sicherung haben dasselbe Format:

{
  "app": "minifakt",
  "version": 2,
  "aktiv": "<id des aktuellen Mandanten>",
  "mandanten": [
    {
      "id": "…", "kuerzel": "FRIESE",
      "settings": { "firma": "…", "strasse": "…", "plz": "…", "ort": "…", "land": "DE",
                    "iban": "…", "zahlungszielTage": 14, "naechsteRechnungsNr": 2026002, … },
      "kunden": [ { "nr": 10001, "name": "Erika Mustermann", "email": "…", … } ],
      "rechnungen": [
        { "id": "…", "nr": 2026001, "status": "fest", "datum": "2026-10-01",
          "leistungVon": "2026-09-01", "leistungBis": "2026-09-30", "zahlungsziel": 14, "kaeuferRef": "",
          "kunde": { … Anschrift zum Zeitpunkt des Festschreibens … },
          "mwst": 19, "positionen": [ { "anz": "2", "einheit": "HUR", "text": "…", "preis": "85,00" } ],
          "stornoVon": null, "festAm": "2026-10-01T10:00:00.000Z" }
      ]
    }
  ],
  "meta": { "letzteSicherung": "…", "geaendert": "…", "verschluesselt": false }
}

status ist entwurf, fest oder storniert; Entwürfe haben "nr": null.

Verschlüsselte Sicherung

{
  "app": "minifakt", "verschluesselt": true, "format": 1,
  "kdf": "PBKDF2-SHA256", "iter": 600000, "cipher": "AES-256-GCM",
  "salt": "<Base64, 16 Byte>", "iv": "<Base64, 12 Byte>",
  "daten": "<Base64: verschlüsseltes JSON wie oben, mit GCM-Prüfsumme>"
}

Das Format ist offen. Mit dem Passwort lässt sich eine Sicherung auch ohne minifakt entschlüsseln, zum Beispiel in Python mit der Bibliothek cryptography:

import json, base64
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

j = json.load(open("minifakt_…_verschluesselt.json")); b = base64.b64decode
key = PBKDF2HMAC(hashes.SHA256(), 32, b(j["salt"]), j["iter"]).derive(b"passwort")
daten = json.loads(AESGCM(key).decrypt(b(j["iv"]), b(j["daten"]), None))

Entwicklung

  • Zum Testen minifakt.html im Browser öffnen; ein Webserver ist nicht nötig.
  • Bei jeder Änderung APP_VERSION im Skript anheben; die Anzeige neben dem Namen liest sie aus.
  • Neue Felder im Datenmodell immer in blankSettings() bzw. normalize() mit Standardwert versehen, damit ältere Sicherungen weiter laden.
  • Das Rechnungsblatt ist in Millimetern gesetzt. Änderungen am Layout am besten mit einer gedruckten PDF gegen eine Vorlage prüfen.
  • Lizenz: GNU General Public License, Version 3 oder neuer (GPL-3.0-or-later). Der Quelltext steht unter rbag.eu/quellen zum Herunterladen.

minifakt und diese Dokumentation sind mit Unterstützung eines KI-Assistenten entstanden und vom Autor geprüft.