Files
RAPPORT-WEBSITE/public/docs/index.xml
T
2026-05-26 11:52:03 +02:00

1465 lines
129 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RAPPORT Dokumentation</title><link>https://rapport.gabrielevarano.ch/docs/</link><description>Recent content in Dokumentation on RAPPORT</description><generator>Hugo -- gohugo.io</generator><language>de</language><atom:link href="https://rapport.gabrielevarano.ch/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>Erste Schritte</title><link>https://rapport.gabrielevarano.ch/docs/erste-schritte/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/erste-schritte/</guid><description>
&lt;p&gt;Von der Installation bis zur ersten Rechnung — in sechs Schritten.&lt;/p&gt;
&lt;h2&gt;01 · Installation&lt;span class="hx:absolute hx:-mt-20" id="01--installation"&gt;&lt;/span&gt;
&lt;a href="#01--installation" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;DMG von &lt;a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener"&gt;Gitea Releases&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; herunterladen. Rapport in den &lt;strong&gt;Programme-Ordner&lt;/strong&gt; ziehen. Beim ersten Start: &lt;em&gt;Systemeinstellungen → Datenschutz &amp;amp; Sicherheit&lt;/em&gt; öffnen und Rapport zulassen.&lt;/p&gt;
&lt;p&gt;Die Pre-Release-Builds sind &lt;strong&gt;signiert über Tauri&lt;/strong&gt;, aber (noch) nicht über die Apple-Notarisierung gegangen — daher der manuelle Freigabe-Schritt.&lt;/p&gt;
&lt;h2&gt;02 · Einrichtung&lt;span class="hx:absolute hx:-mt-20" id="02--einrichtung"&gt;&lt;/span&gt;
&lt;a href="#02--einrichtung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In den &lt;strong&gt;Einstellungen&lt;/strong&gt; hinterlegen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bürodaten&lt;/strong&gt; — Name, Adresse, IBAN, Logo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mitarbeiter&lt;/strong&gt; — Namen, Pensum, Stundensatz, Ferienanspruch&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kunden&lt;/strong&gt; — Adresse, Ansprechperson, Honorartyp&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projekte&lt;/strong&gt; — SIA-102-Phasen, Budget, Beteiligte&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Danach ist die Zeiterfassung bereit.&lt;/p&gt;
&lt;h2&gt;03 · Zeiterfassung&lt;span class="hx:absolute hx:-mt-20" id="03--zeiterfassung"&gt;&lt;/span&gt;
&lt;a href="#03--zeiterfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Im Modul &lt;strong&gt;Zeit&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Mitarbeiter wählen&lt;/li&gt;
&lt;li&gt;Woche navigieren&lt;/li&gt;
&lt;li&gt;Stunden per &lt;strong&gt;Klick&lt;/strong&gt; oder &lt;strong&gt;Drag&lt;/strong&gt; erfassen&lt;/li&gt;
&lt;li&gt;Jedem Eintrag ein Projekt zuweisen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Auswertungen pro Mitarbeiter und pro Projekt sind unter &lt;em&gt;Zeit → Auswertungen&lt;/em&gt; abrufbar. Halbe Tage und Mehrfacheinträge pro Slot werden unterstützt.&lt;/p&gt;
&lt;h2&gt;04 · Rechnungen&lt;span class="hx:absolute hx:-mt-20" id="04--rechnungen"&gt;&lt;/span&gt;
&lt;a href="#04--rechnungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Aus einer &lt;strong&gt;Offerte&lt;/strong&gt; oder &lt;strong&gt;direkt&lt;/strong&gt; erstellen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SIA-Phasen, Stundensatz oder Pauschal wählen&lt;/li&gt;
&lt;li&gt;Akonto-, Teil- oder Schlussrechnung&lt;/li&gt;
&lt;li&gt;Mit &lt;em&gt;PDF exportieren&lt;/em&gt; wird die fertige Rechnung inkl. &lt;strong&gt;QR-Einzahlungsschein&lt;/strong&gt; generiert&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Offerten lassen sich nahtlos in Projekte und Rechnungen konvertieren.&lt;/p&gt;
&lt;h2&gt;05 · Backup&lt;span class="hx:absolute hx:-mt-20" id="05--backup"&gt;&lt;/span&gt;
&lt;a href="#05--backup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;In der Desktop-App liegen alle Daten als &lt;strong&gt;JSON&lt;/strong&gt; im Applikationsordner:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/Library/Application Support/com.rapport.app/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Für ein Backup reicht es, diesen Ordner zu kopieren — z. B. auf einen externen Datenträger oder in die Cloud. Empfohlen: regelmässig (wöchentlich oder via Time Machine). Im Server-Modus läuft das Backup über Postgres-Dumps — siehe &lt;a href="../../server/#backup"&gt;Rapport Server § Backup&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;06 · Probleme melden&lt;span class="hx:absolute hx:-mt-20" id="06--probleme-melden"&gt;&lt;/span&gt;
&lt;a href="#06--probleme-melden" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Ein &lt;a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener"&gt;Issue auf Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; erstellen — mit kurzer Beschreibung, was passiert ist. &lt;strong&gt;Screenshots helfen.&lt;/strong&gt; Bitte die Rapport-Version (links unten in der App) angeben.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tipp:&lt;/strong&gt; Wenn die App nicht mehr startet, hilft oft, den Cache-Ordner zu sichern und neu zu starten. Die JSON-Daten selbst bleiben unverändert.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Installation</title><link>https://rapport.gabrielevarano.ch/docs/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/installation/</guid><description>
&lt;p&gt;Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.&lt;/p&gt;
&lt;h2&gt;Voraussetzungen&lt;span class="hx:absolute hx:-mt-20" id="voraussetzungen"&gt;&lt;/span&gt;
&lt;a href="#voraussetzungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plattform&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Versionen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;macOS&lt;/strong&gt; Apple Silicon (M1 M4)&lt;/td&gt;
&lt;td&gt;✅ Unterstützt&lt;/td&gt;
&lt;td&gt;macOS 12+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;macOS&lt;/strong&gt; Intel&lt;/td&gt;
&lt;td&gt;⚠ Build auf Anfrage&lt;/td&gt;
&lt;td&gt;macOS 12+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🕐 Geplant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🕐 Geplant&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Eine Portierung auf Linux und Windows ist mit Tauri 2 möglich. &lt;a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener"&gt;Issue erstellen&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;, wenn du eine Plattform brauchst.&lt;/p&gt;
&lt;h2&gt;1 · Download&lt;span class="hx:absolute hx:-mt-20" id="1--download"&gt;&lt;/span&gt;
&lt;a href="#1--download" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Aktueller Build: &lt;a href="../../downloads"&gt;Downloads-Seite&lt;/a&gt; oder direkt &lt;a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener"&gt;Releases auf Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Datei&lt;/th&gt;
&lt;th&gt;Plattform&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RAPPORT_&amp;lt;version&amp;gt;_aarch64.dmg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;macOS Apple Silicon&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;RAPPORT_&amp;lt;version&amp;gt;_x86_64.dmg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;macOS Intel (auf Anfrage)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;2 · DMG öffnen &amp;amp; installieren&lt;span class="hx:absolute hx:-mt-20" id="2--dmg-öffnen--installieren"&gt;&lt;/span&gt;
&lt;a href="#2--dmg-%c3%b6ffnen--installieren" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;DMG doppelklicken&lt;/li&gt;
&lt;li&gt;Rapport.app in den &lt;strong&gt;Applications&lt;/strong&gt;-Ordner ziehen&lt;/li&gt;
&lt;li&gt;DMG auswerfen&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;3 · Erster Start (macOS Gatekeeper)&lt;span class="hx:absolute hx:-mt-20" id="3--erster-start-macos-gatekeeper"&gt;&lt;/span&gt;
&lt;a href="#3--erster-start-macos-gatekeeper" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Beim ersten Start verweigert macOS den Start, weil die Pre-Release-Builds &lt;strong&gt;Tauri-signiert&lt;/strong&gt;, aber (noch) &lt;strong&gt;nicht Apple-notarisiert&lt;/strong&gt; sind.&lt;/p&gt;
&lt;h3&gt;Lösung&lt;span class="hx:absolute hx:-mt-20" id="lösung"&gt;&lt;/span&gt;
&lt;a href="#l%c3%b6sung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Systemeinstellungen → Datenschutz &amp;amp; Sicherheit&lt;/strong&gt; öffnen&lt;/li&gt;
&lt;li&gt;Bis ganz nach unten scrollen — es erscheint:
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Rapport&amp;rdquo; wurde blockiert, da es nicht von einem identifizierten Entwickler stammt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;Auf &lt;strong&gt;&amp;ldquo;Trotzdem öffnen&amp;rdquo;&lt;/strong&gt; klicken&lt;/li&gt;
&lt;li&gt;Bestätigen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ab dem zweiten Start läuft Rapport ohne Rückfragen.&lt;/p&gt;
&lt;h3&gt;Alternative (Terminal)&lt;span class="hx:absolute hx:-mt-20" id="alternative-terminal"&gt;&lt;/span&gt;
&lt;a href="#alternative-terminal" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Falls der GUI-Weg nicht funktioniert:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xattr -d com.apple.quarantine /Applications/Rapport.app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Das entfernt das Quarantäne-Flag und macOS akzeptiert den Start.&lt;/p&gt;
&lt;h2&gt;4 · Erstes Setup&lt;span class="hx:absolute hx:-mt-20" id="4--erstes-setup"&gt;&lt;/span&gt;
&lt;a href="#4--erstes-setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Beim ersten Start zeigt Rapport den &lt;strong&gt;Setup-Bildschirm&lt;/strong&gt;. Hier werden die Stammdaten erfasst — siehe &lt;a href="../einrichtung"&gt;Einrichtung&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;5 · Update-Strategie&lt;span class="hx:absolute hx:-mt-20" id="5--update-strategie"&gt;&lt;/span&gt;
&lt;a href="#5--update-strategie" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe &lt;a href="../../features/auto-updater"&gt;Auto-Updater&lt;/a&gt;). Updates können in den Einstellungen deaktiviert werden.&lt;/p&gt;
&lt;p&gt;Manuelle Updates: einfach das neuere DMG installieren — die Daten bleiben erhalten, da sie unabhängig von der App liegen (siehe &lt;a href="../datenhaltung"&gt;Datenhaltung&lt;/a&gt;).&lt;/p&gt;
&lt;h2&gt;Deinstallation&lt;span class="hx:absolute hx:-mt-20" id="deinstallation"&gt;&lt;/span&gt;
&lt;a href="#deinstallation" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# App entfernen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf /Applications/Rapport.app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Daten entfernen (optional!)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Caches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="s2"&gt;&amp;#34;~/Library/Caches/com.rapport.app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="s2"&gt;&amp;#34;~/Library/WebKit/com.rapport.app&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; Schritt 2 löscht &lt;strong&gt;alle Rapport-Daten unwiederbringlich&lt;/strong&gt;. Vorher Backup machen — siehe &lt;a href="../datenhaltung"&gt;Datenhaltung&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Bekannte Probleme&lt;span class="hx:absolute hx:-mt-20" id="bekannte-probleme"&gt;&lt;/span&gt;
&lt;a href="#bekannte-probleme" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Lösung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;App lässt sich nicht öffnen trotz Freigabe&lt;/td&gt;
&lt;td&gt;Terminal-Variante mit &lt;code&gt;xattr&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;ldquo;Rapport is damaged&amp;rdquo;&lt;/td&gt;
&lt;td&gt;DMG erneut von Gitea ziehen (Browser-Cache hat evtl. Müll)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Schwarzer Bildschirm beim Start&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/Library/WebKit/com.rapport.app&lt;/code&gt; löschen, neu starten&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Mehr unter &lt;a href="../troubleshooting"&gt;Troubleshooting&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Einrichtung</title><link>https://rapport.gabrielevarano.ch/docs/einrichtung/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/einrichtung/</guid><description>
&lt;p&gt;Nach der &lt;a href="../installation"&gt;Installation&lt;/a&gt;: Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.&lt;/p&gt;
&lt;h2&gt;Reihenfolge&lt;span class="hx:absolute hx:-mt-20" id="reihenfolge"&gt;&lt;/span&gt;
&lt;a href="#reihenfolge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. Bürodaten → 2. Mitarbeiter → 3. Kunden → 4. Projekte
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ▼ ▼ ▼ ▼
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Briefbogen, Zeiterfassung, Adressen, Zeiterfassung,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; QR-Schein, Lohn Rechnungen Rechnungen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Login&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;1 · Bürodaten&lt;span class="hx:absolute hx:-mt-20" id="1--bürodaten"&gt;&lt;/span&gt;
&lt;a href="#1--b%c3%bcrodaten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Einstellungen → Bürodaten&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feld&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;th&gt;Verwendung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bürobezeichnung&lt;/td&gt;
&lt;td&gt;Briefbogen, Login-Screen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Adresse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strasse, PLZ, Ort&lt;/td&gt;
&lt;td&gt;Briefbogen, QR-Rechnung (Empfänger)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Telefon, E-Mail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kontaktdaten&lt;/td&gt;
&lt;td&gt;Briefbogen, Rechnung-Footer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;IBAN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CH-IBAN (Format &lt;code&gt;CH XX XXXX …&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;QR-Einzahlungsschein&lt;/strong&gt; — Pflicht&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Logo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PNG/SVG-Upload&lt;/td&gt;
&lt;td&gt;Briefbogen, Rechnung, Brief&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MwSt.-Nr.&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;optional&lt;/td&gt;
&lt;td&gt;Rechnung-Footer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tipp:&lt;/strong&gt; Das Logo wird hochauflösend gespeichert (Base64 im localStorage). Bei sehr grossen Dateien (&amp;gt;1 MB) vorher in Vorschau verkleinern.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;2 · Mitarbeiter&lt;span class="hx:absolute hx:-mt-20" id="2--mitarbeiter"&gt;&lt;/span&gt;
&lt;a href="#2--mitarbeiter" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Einstellungen → Mitarbeiter → Neu&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feld&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Name, Vorname&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;wird in Zeiterfassung &amp;amp; Lohn verwendet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Initialen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kürzel für Auswertungen (z. B. &amp;ldquo;KGE&amp;rdquo;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eintrittsdatum&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;für &lt;strong&gt;Prorata&lt;/strong&gt; der Ferien&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pensum (%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 = Vollzeit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stundensatz (CHF)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;für Stundensatz-Rechnungen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ferienanspruch (Tage/Jahr)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;i. d. R. 2530&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lohn (brutto, monatlich)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;optional, für Lohnabrechnung&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Mindestens &lt;strong&gt;ein Mitarbeiter&lt;/strong&gt; (z. B. der Inhaber selbst) muss angelegt sein, sonst lässt sich keine Zeit erfassen.&lt;/p&gt;
&lt;h3&gt;Sozialabzüge (optional)&lt;span class="hx:absolute hx:-mt-20" id="sozialabzüge-optional"&gt;&lt;/span&gt;
&lt;a href="#sozialabz%c3%bcge-optional" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In Einstellungen → Lohn:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abzug&lt;/th&gt;
&lt;th&gt;Standardwert (CH)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AHV / IV / EO&lt;/td&gt;
&lt;td&gt;5,3 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ALV&lt;/td&gt;
&lt;td&gt;1,1 %&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BVG (Pensionskasse)&lt;/td&gt;
&lt;td&gt;variabel — je Mitarbeiter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NBU&lt;/td&gt;
&lt;td&gt;je nach Versicherung&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die Standardsätze sind hinterlegt, können aber überschrieben werden.&lt;/p&gt;
&lt;h2&gt;3 · Kunden&lt;span class="hx:absolute hx:-mt-20" id="3--kunden"&gt;&lt;/span&gt;
&lt;a href="#3--kunden" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Kunden → Neu&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feld&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typ&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Privatperson / Firma&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Anrede, Name&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;für Brief / Rechnung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Adresse&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strasse, PLZ, Ort, Land&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ansprechperson&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;bei Firmen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Telefon, E-Mail&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kontakt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Honorartyp Default&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stundensatz / SIA / Pauschal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Stundensatz&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;falls vom Bürostandard abweichend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MwSt.-pflichtig&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ja/nein&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;4 · Projekte&lt;span class="hx:absolute hx:-mt-20" id="4--projekte"&gt;&lt;/span&gt;
&lt;a href="#4--projekte" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Projekte → Neu&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feld&lt;/th&gt;
&lt;th&gt;Beschreibung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Projekt-Nr.&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;freie Form, oder generiert (&lt;code&gt;2026-001&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bezeichnung&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kurztitel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Standort&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Adresse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kunde&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;aus Kundendatenbank&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bauschätzwert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;für SIA-Phasen-Honorar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SIA-Phasen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vorprojekt / Bauprojekt / … — alle anwählbar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Honorartyp&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stundensatz / SIA 102 / Pauschal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Status&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;aktiv / pausiert / abgeschlossen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;SIA-102-Phasen&lt;span class="hx:absolute hx:-mt-20" id="sia-102-phasen"&gt;&lt;/span&gt;
&lt;a href="#sia-102-phasen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Wenn als Honorartyp &lt;strong&gt;SIA 102&lt;/strong&gt; gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe &lt;a href="../../features/projekte#sia-102"&gt;Projekt-Feature&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Checkliste&lt;span class="hx:absolute hx:-mt-20" id="checkliste"&gt;&lt;/span&gt;
&lt;a href="#checkliste" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Nach diesen vier Schritten ist Rapport einsatzbereit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Bürodaten inkl. IBAN erfasst&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Mindestens ein Mitarbeiter angelegt&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Erster Kunde angelegt&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Erstes Projekt angelegt&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Eine Test-Zeitbuchung erfasst — wird das Projekt korrekt zugewiesen?&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Eine Test-Rechnung erstellt — kommt der QR-Schein sauber raus?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wenn alles funktioniert: &lt;a href="../arbeitsablauf"&gt;Typischer Arbeitsablauf&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Typischer Arbeitsablauf</title><link>https://rapport.gabrielevarano.ch/docs/arbeitsablauf/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/arbeitsablauf/</guid><description>
&lt;p&gt;Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.&lt;/p&gt;
&lt;h2&gt;Übersicht&lt;span class="hx:absolute hx:-mt-20" id="übersicht"&gt;&lt;/span&gt;
&lt;a href="#%c3%bcbersicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Kunde → Offerte → Projekt → Zeit → Akonto → Schluss
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; anlegen erstellen (aus Offerte) erfassen -Rechnung -Rechnung
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; QR-Schein&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;1 · Kunde anlegen&lt;span class="hx:absolute hx:-mt-20" id="1--kunde-anlegen"&gt;&lt;/span&gt;
&lt;a href="#1--kunde-anlegen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Kunden → Neu&lt;/strong&gt; — siehe &lt;a href="../einrichtung#3--kunden"&gt;Einrichtung § 3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Falls der Kunde später bestellt, lassen sich alle gesammelten Daten (Adresse, Honorartyp) direkt übernehmen.&lt;/p&gt;
&lt;h2&gt;2 · Offerte erstellen&lt;span class="hx:absolute hx:-mt-20" id="2--offerte-erstellen"&gt;&lt;/span&gt;
&lt;a href="#2--offerte-erstellen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Offerten → Neu&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feld&lt;/th&gt;
&lt;th&gt;Inhalt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Kunde&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;aus Kundendatenbank wählen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bezeichnung&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Projekttitel (z. B. &amp;ldquo;Einfamilienhaus Müller, Bern&amp;rdquo;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Honorartyp&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stundensatz / SIA 102 / Pauschal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bauschätzwert&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;bei SIA — Bruttowert in CHF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Phasen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;bei SIA — anzuklickende Phasen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Positionen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;bei Stundensatz/Pauschal — Position, Beschreibung, Betrag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Mit &lt;em&gt;PDF exportieren&lt;/em&gt; — fertige Offerte für den Kunden.&lt;/p&gt;
&lt;h3&gt;Offerten-Status&lt;span class="hx:absolute hx:-mt-20" id="offerten-status"&gt;&lt;/span&gt;
&lt;a href="#offerten-status" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Bedeutung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entwurf&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;noch nicht versandt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Versandt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;beim Kunden, wartet auf Antwort&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Angenommen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kunde hat zugesagt — bereit zur Konvertierung&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Abgelehnt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kunde hat abgelehnt — Archiv&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;3 · Offerte → Projekt&lt;span class="hx:absolute hx:-mt-20" id="3--offerte--projekt"&gt;&lt;/span&gt;
&lt;a href="#3--offerte--projekt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Bei Status &lt;strong&gt;&amp;ldquo;Angenommen&amp;rdquo;&lt;/strong&gt;: Knopf &lt;strong&gt;&amp;ldquo;In Projekt konvertieren&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Das erzeugt:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ein neues Projekt mit den Daten der Offerte (Kunde, Bezeichnung, Honorar, Phasen)&lt;/li&gt;
&lt;li&gt;Eine Verknüpfung zwischen Offerte und Projekt&lt;/li&gt;
&lt;li&gt;Die Offerte selbst bleibt im Archiv erhalten&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Siehe auch &lt;a href="../../features/projekte"&gt;Projekt-Feature&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;4 · Zeit erfassen&lt;span class="hx:absolute hx:-mt-20" id="4--zeit-erfassen"&gt;&lt;/span&gt;
&lt;a href="#4--zeit-erfassen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Zeit → Mitarbeiter wählen → Woche navigieren&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Klick&lt;/strong&gt; auf einen Halbstunden-Slot → Eintrag erstellen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drag&lt;/strong&gt; über mehrere Slots → längerer Eintrag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projekt zuweisen&lt;/strong&gt; (Pflichtfeld) — aus aktiven Projekten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SIA-Phase&lt;/strong&gt; zuweisen (optional, für detaillierte Auswertung)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Spezialfälle&lt;span class="hx:absolute hx:-mt-20" id="spezialfälle"&gt;&lt;/span&gt;
&lt;a href="#spezialf%c3%a4lle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ferien&lt;/strong&gt; — eigener &amp;ldquo;Projekt&amp;rdquo;-Typ &amp;ldquo;Ferien&amp;rdquo;, in der Auswertung separat&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Krankheit/Absenz&lt;/strong&gt; — eigener &amp;ldquo;Projekt&amp;rdquo;-Typ, ebenfalls separat&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interne Stunden&lt;/strong&gt; — z. B. Verwaltung, Marketing, IT — eigene interne Projekte&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;5 · Akonto-Rechnung&lt;span class="hx:absolute hx:-mt-20" id="5--akonto-rechnung"&gt;&lt;/span&gt;
&lt;a href="#5--akonto-rechnung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Während der Projektlaufzeit — typisch nach jeder abgeschlossenen SIA-Phase oder monatlich.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rechnungen → Neu → Akonto&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feld&lt;/th&gt;
&lt;th&gt;Inhalt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Projekt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;aus aktiven Projekten&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bezug&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&amp;ldquo;Akonto für Phase 31 — Vorprojekt&amp;rdquo;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Betrag&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stundensatz × Stunden, oder Phasenanteil × Bausumme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fälligkeit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;i. d. R. 30 Tage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Rapport zieht automatisch die geleisteten Stunden aus der Zeiterfassung — die kannst du als Basis nehmen oder überschreiben.&lt;/p&gt;
&lt;p&gt;PDF inkl. &lt;strong&gt;QR-Einzahlungsschein&lt;/strong&gt; — siehe &lt;a href="../../features/rechnungen"&gt;Rechnungen-Feature&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;6 · Schlussrechnung&lt;span class="hx:absolute hx:-mt-20" id="6--schlussrechnung"&gt;&lt;/span&gt;
&lt;a href="#6--schlussrechnung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rechnungen → Neu → Schlussrechnung&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Rapport rechnet die bisherigen Akonto-Rechnungen automatisch ab:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Gesamthonorar (SIA / Pauschal / Stundensatz)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Akonto-Rechnung 1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Akonto-Rechnung 2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Akonto-Rechnung 3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; = Schlussrechnung&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;7 · Projektabschluss&lt;span class="hx:absolute hx:-mt-20" id="7--projektabschluss"&gt;&lt;/span&gt;
&lt;a href="#7--projektabschluss" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Im Projekt → Status auf &lt;strong&gt;&amp;ldquo;Abgeschlossen&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Das Projekt bleibt für historische Auswertungen sichtbar, taucht aber nicht mehr in der Zeiterfassungs-Auswahl auf.&lt;/p&gt;
&lt;h2&gt;Auswertungen&lt;span class="hx:absolute hx:-mt-20" id="auswertungen"&gt;&lt;/span&gt;
&lt;a href="#auswertungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Wöchentlich / monatlich / am Jahresende:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zeit → Auswertungen&lt;/strong&gt; — Stunden pro Mitarbeiter, pro Projekt, pro Phase&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rechnungen → Übersicht&lt;/strong&gt; — offene Beträge, bezahlt, Mahnungen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buchhaltung → Erfolgsrechnung&lt;/strong&gt; — Einnahmen vs. Ausgaben&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mitarbeiter → Lohnabrechnung&lt;/strong&gt; — monatlich&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Tipps aus dem Alltag&lt;span class="hx:absolute hx:-mt-20" id="tipps-aus-dem-alltag"&gt;&lt;/span&gt;
&lt;a href="#tipps-aus-dem-alltag" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Zeit jeden Tag erfassen&lt;/strong&gt; statt rückwirkend — sonst gehen Details verloren&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Akonto regelmässig&lt;/strong&gt; statt einmal am Schluss — Liquidität&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backups&lt;/strong&gt; vor Jahresabschluss — siehe &lt;a href="../datenhaltung"&gt;Datenhaltung&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Briefbogen-Logo&lt;/strong&gt; in hoher Auflösung — sieht im PDF besser aus&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Datenhaltung &amp; Backup</title><link>https://rapport.gabrielevarano.ch/docs/datenhaltung/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/datenhaltung/</guid><description>
&lt;p&gt;Wo Rapport seine Daten speichert, wie du sie sicherst und wiederherstellst.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diese Seite beschreibt die Desktop-App (Single-User).&lt;/strong&gt; Wer im Team arbeitet und Rapport gegen einen &lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt; betreibt, sichert stattdessen die Postgres-Datenbank — siehe &lt;a href="../../server/#backup"&gt;Rapport Server § Backup&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Speicherort (Desktop-App)&lt;span class="hx:absolute hx:-mt-20" id="speicherort-desktop-app"&gt;&lt;/span&gt;
&lt;a href="#speicherort-desktop-app" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Die Desktop-App speichert &lt;strong&gt;alles lokal&lt;/strong&gt; — keine Cloud, kein Server.&lt;/p&gt;
&lt;h3&gt;macOS&lt;span class="hx:absolute hx:-mt-20" id="macos"&gt;&lt;/span&gt;
&lt;a href="#macos" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~/Library/Application Support/com.rapport.app/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dort liegt eine einzelne &lt;strong&gt;&lt;code&gt;localStorage&lt;/code&gt;&lt;/strong&gt;-Datenbank des WebView, in der &lt;strong&gt;alle&lt;/strong&gt; Rapport-Daten als JSON unter dem Key &lt;code&gt;studio_data_v1&lt;/code&gt; gespeichert sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bürodaten, Logo, IBAN&lt;/li&gt;
&lt;li&gt;Mitarbeiter, Kunden, Projekte, Offerten&lt;/li&gt;
&lt;li&gt;Zeit-Einträge, Rechnungen&lt;/li&gt;
&lt;li&gt;Spesen, Lohnabrechnungen, Protokolle&lt;/li&gt;
&lt;li&gt;App-Einstellungen&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Konsequenz:&lt;/strong&gt; Wer den Application-Support-Ordner kopiert, hat ein vollständiges Backup. Wer ihn löscht, verliert alle Daten.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Warum localStorage?&lt;span class="hx:absolute hx:-mt-20" id="warum-localstorage"&gt;&lt;/span&gt;
&lt;a href="#warum-localstorage" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In der Desktop-App ist Rapport eine &lt;strong&gt;Single-User-Anwendung&lt;/strong&gt;. localStorage ist dafür:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Schnell&lt;/strong&gt; — keine Datenbank-Roundtrips&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Einfach&lt;/strong&gt; — keine Migration nötig, JSON-Schema im Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portabel&lt;/strong&gt; — eine Datei → ein Backup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Für &lt;strong&gt;Multi-User-Betrieb&lt;/strong&gt; existiert &lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt; — Postgres + Auth + Realtime in einem Docker-Compose. Wechsel zwischen Desktop- und Server-Modus erfolgt im Login-Bildschirm der App.&lt;/p&gt;
&lt;h2&gt;Backup-Strategien&lt;span class="hx:absolute hx:-mt-20" id="backup-strategien"&gt;&lt;/span&gt;
&lt;a href="#backup-strategien" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;A · Einfach (manuell)&lt;span class="hx:absolute hx:-mt-20" id="a--einfach-manuell"&gt;&lt;/span&gt;
&lt;a href="#a--einfach-manuell" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Den ganzen Ordner kopieren:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -R &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;~/Documents/Rapport-Backup-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;→ Auf USB-Stick, externen Datenträger oder in die Cloud.&lt;/p&gt;
&lt;h3&gt;B · Time Machine&lt;span class="hx:absolute hx:-mt-20" id="b--time-machine"&gt;&lt;/span&gt;
&lt;a href="#b--time-machine" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Wenn Time Machine läuft, ist der Ordner automatisch dabei. Versionierung inbegriffen.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Einschränkung:&lt;/strong&gt; Time Machine sichert nur lokal/USB. Für off-site-Backup separat sorgen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;C · Cron-Job (täglich automatisch)&lt;span class="hx:absolute hx:-mt-20" id="c--cron-job-täglich-automatisch"&gt;&lt;/span&gt;
&lt;a href="#c--cron-job-t%c3%a4glich-automatisch" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# In ~/Library/LaunchAgents/com.rapport.backup.plist hinterlegen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# oder als crontab-Eintrag:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt; * * * rsync -a &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/Library/Application Support/com.rapport.app/&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/Backups/rapport/&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +&lt;span class="se"&gt;\%&lt;/span&gt;Y&lt;span class="se"&gt;\%&lt;/span&gt;m&lt;span class="se"&gt;\%&lt;/span&gt;d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;D · iCloud Drive (off-site)&lt;span class="hx:absolute hx:-mt-20" id="d--icloud-drive-off-site"&gt;&lt;/span&gt;
&lt;a href="#d--icloud-drive-off-site" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Application-Support liegt &lt;strong&gt;nicht&lt;/strong&gt; automatisch in iCloud. Wer das will:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Symlink anlegen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p &lt;span class="s2"&gt;&amp;#34;~/iCloud Drive/Rapport&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -s &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;~/iCloud Drive/Rapport/data&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Achtung:&lt;/strong&gt; iCloud-Sync mit aktiver App kann zu &lt;strong&gt;Race-Conditions&lt;/strong&gt; führen. Besser den Sync zeitversetzt (z. B. nachts via Cron).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Wiederherstellung&lt;span class="hx:absolute hx:-mt-20" id="wiederherstellung"&gt;&lt;/span&gt;
&lt;a href="#wiederherstellung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Vollständig (Rapport komplett tot)&lt;span class="hx:absolute hx:-mt-20" id="vollständig-rapport-komplett-tot"&gt;&lt;/span&gt;
&lt;a href="#vollst%c3%a4ndig-rapport-komplett-tot" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;Rapport beenden (Cmd+Q, nicht nur Fenster zu)&lt;/li&gt;
&lt;li&gt;Aktuellen Ordner umbenennen (falls noch da):
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app.bak&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Backup-Ordner zurück kopieren:
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -R &lt;span class="s2"&gt;&amp;#34;~/Documents/Rapport-Backup-20260523&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Rapport starten&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Selektiv (nur einzelne Daten)&lt;span class="hx:absolute hx:-mt-20" id="selektiv-nur-einzelne-daten"&gt;&lt;/span&gt;
&lt;a href="#selektiv-nur-einzelne-daten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Da alle Daten in &lt;strong&gt;einem JSON unter &lt;code&gt;studio_data_v1&lt;/code&gt;&lt;/strong&gt; liegen, ist selektive Wiederherstellung &lt;strong&gt;manuell&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Backup-&lt;code&gt;localStorage&lt;/code&gt;-Datei öffnen (WebKit-Format → mit Tool wie [WebKit Storage Inspector] lesen, oder via Rapport DevTools)&lt;/li&gt;
&lt;li&gt;Gewünschte Felder in die aktuelle Instanz übertragen&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In der Praxis: meistens lohnt sich die &lt;strong&gt;vollständige&lt;/strong&gt; Wiederherstellung mehr.&lt;/p&gt;
&lt;h2&gt;Export-Funktionen (in der App)&lt;span class="hx:absolute hx:-mt-20" id="export-funktionen-in-der-app"&gt;&lt;/span&gt;
&lt;a href="#export-funktionen-in-der-app" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Aus Rapport selbst:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Was&lt;/th&gt;
&lt;th&gt;Wo&lt;/th&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zeit-Auswertung&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zeit → Export&lt;/td&gt;
&lt;td&gt;CSV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rechnung&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rechnung → PDF&lt;/td&gt;
&lt;td&gt;PDF (inkl. QR)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Offerte&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Offerte → PDF&lt;/td&gt;
&lt;td&gt;PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lohnabrechnung&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mitarbeiter → PDF&lt;/td&gt;
&lt;td&gt;PDF&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jahres-Buchhaltung&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Buchhaltung → Export&lt;/td&gt;
&lt;td&gt;CSV&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Die Exports sind für externe Verwendung (Buchhalter, Treuhänder, Archiv) gedacht — kein Full-Backup.&lt;/p&gt;
&lt;h2&gt;Schema-Migrationen&lt;span class="hx:absolute hx:-mt-20" id="schema-migrationen"&gt;&lt;/span&gt;
&lt;a href="#schema-migrationen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Bei Updates kann sich das Datenformat ändern. Rapport hat einen &lt;strong&gt;Migrations-Mechanismus&lt;/strong&gt;: beim Start prüft die App, ob das gespeicherte Format dem aktuellen entspricht, und migriert es automatisch.&lt;/p&gt;
&lt;p&gt;Code: &lt;a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js"target="_blank" rel="noopener"&gt;src/storage/migrations.js&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Empfehlung:&lt;/strong&gt; Vor jedem grösseren Update ein Backup machen — Migrationen sind getestet, aber 100%-Sicherheit gibt es nicht.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Was wird &lt;strong&gt;nicht&lt;/strong&gt; gespeichert?&lt;span class="hx:absolute hx:-mt-20" id="was-wird-nicht-gespeichert"&gt;&lt;/span&gt;
&lt;a href="#was-wird-nicht-gespeichert" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WebView-Cache&lt;/strong&gt;&lt;code&gt;~/Library/Caches/com.rapport.app/&lt;/code&gt; und &lt;code&gt;~/Library/WebKit/com.rapport.app/&lt;/code&gt; sind sicher zu löschen (UI-Caches, regenerieren sich)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;App-Updates&lt;/strong&gt; — werden bei Bedarf erneut runtergeladen&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Logs&lt;/strong&gt;&lt;code&gt;~/Library/Logs/com.rapport.app/&lt;/code&gt; (geplant, derzeit nicht geschrieben)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Datenmenge&lt;span class="hx:absolute hx:-mt-20" id="datenmenge"&gt;&lt;/span&gt;
&lt;a href="#datenmenge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Typische Grössen pro Bürojahr:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Inhalt&lt;/th&gt;
&lt;th&gt;Grösse&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Logo (PNG/SVG)&lt;/td&gt;
&lt;td&gt;50 KB 1 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 Jahr Zeiterfassung (1 MA)&lt;/td&gt;
&lt;td&gt;~ 80 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1 Jahr Zeiterfassung (5 MA)&lt;/td&gt;
&lt;td&gt;~ 400 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50 Projekte mit je 5 Rechnungen&lt;/td&gt;
&lt;td&gt;~ 800 KB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total typisches Solo-Büro / Jahr&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~ 12 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;localStorage hat Limits (i. d. R. ~10 MB pro Origin). Für Solo-Büros reicht das problemlos für viele Jahre. Wer das Limit erreicht oder im Team arbeitet → &lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Web-Modus (Multi-User)</title><link>https://rapport.gabrielevarano.ch/docs/web-modus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/web-modus/</guid><description>
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Hinweis:&lt;/strong&gt; Der frühere Supabase-basierte Web-Modus wurde durch &lt;strong&gt;&lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt;&lt;/strong&gt; abgelöst — den vollständigen Selfhost-Stack mit eigenem Postgres, Auth, Realtime und Storage. Keine externe Cloud-Abhängigkeit mehr.&lt;/p&gt;
&lt;p&gt;Diese Seite bleibt als Referenz erhalten, der &lt;strong&gt;empfohlene Weg&lt;/strong&gt; für Multi-User-Setups ist &lt;strong&gt;&lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Wann brauchst du das?&lt;span class="hx:absolute hx:-mt-20" id="wann-brauchst-du-das"&gt;&lt;/span&gt;
&lt;a href="#wann-brauchst-du-das" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Anwendungsfall&lt;/th&gt;
&lt;th&gt;Empfehlung&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Solo-Büro, ein Mac&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Desktop-App — siehe &lt;a href="../installation"&gt;Installation&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;25 Personen, gleicher Standort&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt; auf einem Mac Mini im LAN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verteiltes Team / Home-Office&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt; mit SSL + Reverse Proxy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hosted Backend (eigener VPS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt; auf Linux-VPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Architektur (Kurzfassung)&lt;span class="hx:absolute hx:-mt-20" id="architektur-kurzfassung"&gt;&lt;/span&gt;
&lt;a href="#architektur-kurzfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌────────────┐ HTTPS ┌──────────────┐ SQL ┌────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ Browser │ ──────────────│ nginx │ ─────────────│ Postgres │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ / Desktop │ │ (Frontend) │ │ + GoTrue │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└────────────┘ └──────────────┘ │ + REST │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ + Realtime │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ + Storage │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Frontend:&lt;/strong&gt; dieselbe React-App, aber Vite-Build statt Tauri (&lt;code&gt;npm run build&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Backend:&lt;/strong&gt; Postgres-Stack (&lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auth:&lt;/strong&gt; E-Mail / Passwort über GoTrue&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Storage:&lt;/strong&gt; Belege, Logos in Object-Storage&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Setup&lt;span class="hx:absolute hx:-mt-20" id="setup"&gt;&lt;/span&gt;
&lt;a href="#setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Alle Setup-Schritte (Repo klonen, &lt;code&gt;.env&lt;/code&gt; erstellen, Migrations syncen, Docker-Compose starten, Reverse-Proxy konfigurieren) sind in &lt;strong&gt;&lt;a href="../../server/"&gt;Rapport Server&lt;/a&gt;&lt;/strong&gt; dokumentiert.&lt;/p&gt;
&lt;h2&gt;Migration Desktop → Cloud&lt;span class="hx:absolute hx:-mt-20" id="migration-desktop--cloud"&gt;&lt;/span&gt;
&lt;a href="#migration-desktop--cloud" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Wer mit der Desktop-App startet und später auf den Web-Modus wechseln möchte:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Aktuell:&lt;/strong&gt; manueller Export aus Rapport (CSV/PDF) und manuelles Wiederanlegen im neuen Setup&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geplant:&lt;/strong&gt; &lt;em&gt;&amp;ldquo;localStorage → Postgres&amp;rdquo;&lt;/em&gt;-Import-Knopf direkt in der App&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Status: &lt;a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener"&gt;Issue auf Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Troubleshooting&lt;span class="hx:absolute hx:-mt-20" id="troubleshooting"&gt;&lt;/span&gt;
&lt;a href="#troubleshooting" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Siehe &lt;a href="../../server/"&gt;Rapport Server § Troubleshooting&lt;/a&gt; oder &lt;a href="../troubleshooting"&gt;allgemeine Troubleshooting-Seite&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Entwicklung &amp; Build</title><link>https://rapport.gabrielevarano.ch/docs/entwicklung/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/entwicklung/</guid><description>
&lt;p&gt;Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.&lt;/p&gt;
&lt;h2&gt;Voraussetzungen&lt;span class="hx:absolute hx:-mt-20" id="voraussetzungen"&gt;&lt;/span&gt;
&lt;a href="#voraussetzungen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≥ 20 (für Vite 8)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;npm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≥ 10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rust toolchain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;≥ 1.77.2 (via &lt;code&gt;rustup&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plattform-Tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;siehe &lt;a href="https://v2.tauri.app/start/prerequisites/"target="_blank" rel="noopener"&gt;Tauri Prerequisites&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Plattform-spezifisch:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;macOS:&lt;/strong&gt; Xcode Command Line Tools (&lt;code&gt;xcode-select --install&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows:&lt;/strong&gt; Microsoft C++ Build Tools + WebView2&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux:&lt;/strong&gt; &lt;code&gt;webkit2gtk-4.1&lt;/code&gt;, &lt;code&gt;librsvg2-dev&lt;/code&gt;, &lt;code&gt;libayatana-appindicator3-dev&lt;/code&gt;, &lt;code&gt;build-essential&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Setup&lt;span class="hx:absolute hx:-mt-20" id="setup"&gt;&lt;/span&gt;
&lt;a href="#setup" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://git.kgva.ch/karim/RAPPORT.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; RAPPORT/APP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Entwicklung&lt;span class="hx:absolute hx:-mt-20" id="entwicklung"&gt;&lt;/span&gt;
&lt;a href="#entwicklung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Web-Modus (HMR, schnellster Loop)&lt;span class="hx:absolute hx:-mt-20" id="web-modus-hmr-schnellster-loop"&gt;&lt;/span&gt;
&lt;a href="#web-modus-hmr-schnellster-loop" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run dev &lt;span class="c1"&gt;# http://localhost:3000&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Hot-Module-Replacement&lt;/li&gt;
&lt;li&gt;Schnellster Iteration-Loop für UI-Arbeit&lt;/li&gt;
&lt;li&gt;Datenpersistierung: Browser-localStorage&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Native Window (Tauri-Fenster mit Desktop-Integration)&lt;span class="hx:absolute hx:-mt-20" id="native-window-tauri-fenster-mit-desktop-integration"&gt;&lt;/span&gt;
&lt;a href="#native-window-tauri-fenster-mit-desktop-integration" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx tauri dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Echtes Tauri-Fenster&lt;/li&gt;
&lt;li&gt;System-Tray, Updater, native APIs verfügbar&lt;/li&gt;
&lt;li&gt;Erster Start dauert lange (Rust-Compile)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Architektur in einem Absatz&lt;span class="hx:absolute hx:-mt-20" id="architektur-in-einem-absatz"&gt;&lt;/span&gt;
&lt;a href="#architektur-in-einem-absatz" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;RAPPORT ist eine monolithische SPA: ein React-Root in &lt;a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/App.jsx"target="_blank" rel="noopener"&gt;App.jsx&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; hält den &lt;strong&gt;gesamten&lt;/strong&gt; App-State in einem &lt;code&gt;useState({...})&lt;/code&gt;, persistiert ihn synchron in &lt;code&gt;localStorage&lt;/code&gt; unter &lt;code&gt;studio_data_v1&lt;/code&gt;, und übergibt ihn als Props an lazy-geladene Views. &lt;strong&gt;Kein Routing-Framework&lt;/strong&gt;, &lt;strong&gt;kein State-Library&lt;/strong&gt;, &lt;strong&gt;kein TypeScript&lt;/strong&gt;, &lt;strong&gt;kein CSS-Framework&lt;/strong&gt;. Der &lt;strong&gt;Rust-Teil&lt;/strong&gt; ist 109 Zeilen und macht nur drei Dinge: System-Tray, Window-Hide-on-Close, Plugin-Registrierung (Updater, Process, Log). &lt;strong&gt;Keine&lt;/strong&gt; &lt;code&gt;#[tauri::command]&lt;/code&gt; — Frontend ↔ Backend kommuniziert nur über das Event &lt;code&gt;rapport:navigate&lt;/code&gt; (Tray → Frontend).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Detaillierte Karte: &lt;a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/ARCHITECTURE.md"target="_blank" rel="noopener"&gt;ARCHITECTURE.md&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Verzeichnis-Karte&lt;span class="hx:absolute hx:-mt-20" id="verzeichnis-karte"&gt;&lt;/span&gt;
&lt;a href="#verzeichnis-karte" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;APP/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── src/ React 19 (kein TS, nur .jsx)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── App.jsx Root: State, Navigation, Sidebar, Modals
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── constants.js STORAGE_KEY, NAV_ITEMS, defaultData, SIA-Phasen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── utils.js Business-Logik: Kalkulation, QR-Bill, CSV, Lohn
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── storage/adapter.js LocalStorageAdapter (Phase 1), SupabaseAdapter (Phase 2)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── storage/migrations.js Schema-Migrationen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── views/ 20 Top-Level-Screens, lazy-geladen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── components/UI.jsx StatusBadge, Modal, FormField, …
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── components/Update* Auto-Update-UI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── print/ PrintComponents.jsx — alle Druckansichten
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── utils/updater.js @tauri-apps/plugin-updater Wrapper
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── supabase/migrations/ Postgres-Schema für Cloud-Variante
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── src-tauri/ Rust-Backend (Tauri 2.10.3)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── src/lib.rs ~103 Z. — Tray, Window-Events, Plugins
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ ├── tauri.conf.json Updater-URL, Public-Key, CSP, Bundle-Targets
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ └── capabilities/ Tauri Permissions
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── scripts/release.sh Build + Sign + latest.json erzeugen
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── latest.json Updater-Manifest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── deploy/ Docker-Compose für Web-Modus&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Konventionen&lt;span class="hx:absolute hx:-mt-20" id="konventionen"&gt;&lt;/span&gt;
&lt;a href="#konventionen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;/strong&gt; statt TypeScript — bewusste Entscheidung für Solo-Dev-Velocity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inline-Styles&lt;/strong&gt; statt CSS-Framework&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kein Routing-Framework&lt;/strong&gt;&lt;code&gt;view&lt;/code&gt;-State in App.jsx triggert Komponente&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSON-Schema implizit&lt;/strong&gt; — definiert durch &lt;code&gt;defaultData&lt;/code&gt; in &lt;code&gt;constants.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Migrationen&lt;/strong&gt; als reine Funktionen in &lt;a href="https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js"target="_blank" rel="noopener"&gt;storage/migrations.js&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Build&lt;span class="hx:absolute hx:-mt-20" id="build"&gt;&lt;/span&gt;
&lt;a href="#build" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Desktop (Tauri DMG)&lt;span class="hx:absolute hx:-mt-20" id="desktop-tauri-dmg"&gt;&lt;/span&gt;
&lt;a href="#desktop-tauri-dmg" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run build &lt;span class="c1"&gt;# erst Vite-Build (dist/)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx tauri build &lt;span class="c1"&gt;# dann Tauri-Bundle (DMG)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Output: &lt;code&gt;src-tauri/target/release/bundle/dmg/Rapport_&amp;lt;version&amp;gt;_aarch64.dmg&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Web (statisches Bundle)&lt;span class="hx:absolute hx:-mt-20" id="web-statisches-bundle"&gt;&lt;/span&gt;
&lt;a href="#web-statisches-bundle" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm run build &lt;span class="c1"&gt;# Output: dist/ (~500 KB)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe &lt;a href="../web-modus"&gt;Web-Modus&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Release-Workflow&lt;span class="hx:absolute hx:-mt-20" id="release-workflow"&gt;&lt;/span&gt;
&lt;a href="#release-workflow" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1 · Version bumpen in package.json + Cargo.toml + tauri.conf.json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./scripts/release.sh 0.7.1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2 · Build mit Signatur&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TAURI_SIGNING_PRIVATE_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat ~/.tauri/rapport-key&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TAURI_SIGNING_PRIVATE_KEY_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx tauri build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3 · latest.json aktualisieren mit neuer Signatur&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4 · DMG + latest.json auf Gitea Releases hochladen&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Beitragen&lt;span class="hx:absolute hx:-mt-20" id="beitragen"&gt;&lt;/span&gt;
&lt;a href="#beitragen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://git.kgva.ch/karim/RAPPORT"target="_blank" rel="noopener"&gt;Issues &amp;amp; Pull Requests&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; sind willkommen. Wertvoll sind:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bug-Reports&lt;/strong&gt; mit Reproduktionsschritten&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow-Verbesserungen&lt;/strong&gt; aus dem realen Büroalltag&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vorlagen&lt;/strong&gt; (Briefe, Protokolle, Lieferscheine) für andere Büros&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Übersetzungen / Internationalisierung&lt;/strong&gt; (FR, IT)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux-/Windows-Builds&lt;/strong&gt; und plattformspezifische Fixes&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vor grösseren Änderungen → Issue zum Diskutieren.&lt;/p&gt;
&lt;h2&gt;Lizenz&lt;span class="hx:absolute hx:-mt-20" id="lizenz"&gt;&lt;/span&gt;
&lt;a href="#lizenz" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;GNU AGPL-3.0-or-later&lt;/strong&gt; — eigene Builds erlaubt, Modifikationen müssen unter derselben Lizenz veröffentlicht werden, wenn die Software als Service angeboten wird.&lt;/p&gt;</description></item><item><title>Troubleshooting</title><link>https://rapport.gabrielevarano.ch/docs/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/troubleshooting/</guid><description>
&lt;p&gt;Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → &lt;a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener"&gt;Issue auf Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;App startet nicht&lt;span class="hx:absolute hx:-mt-20" id="app-startet-nicht"&gt;&lt;/span&gt;
&lt;a href="#app-startet-nicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;&amp;ldquo;Rapport ist beschädigt&amp;rdquo; beim ersten Start&lt;span class="hx:absolute hx:-mt-20" id="rapport-ist-beschädigt-beim-ersten-start"&gt;&lt;/span&gt;
&lt;a href="#rapport-ist-besch%c3%a4digt-beim-ersten-start" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt; siehe &lt;a href="../installation#3--erster-start-macos-gatekeeper"&gt;Installation § 3&lt;/a&gt;. Kurz:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xattr -d com.apple.quarantine /Applications/Rapport.app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3&gt;App startet, zeigt aber schwarzen Bildschirm&lt;span class="hx:absolute hx:-mt-20" id="app-startet-zeigt-aber-schwarzen-bildschirm"&gt;&lt;/span&gt;
&lt;a href="#app-startet-zeigt-aber-schwarzen-bildschirm" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; WebView-Cache korrupt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="s2"&gt;&amp;#34;~/Library/Caches/com.rapport.app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm -rf &lt;span class="s2"&gt;&amp;#34;~/Library/WebKit/com.rapport.app&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;App neu starten. Daten gehen dabei &lt;strong&gt;nicht&lt;/strong&gt; verloren (liegen in &lt;code&gt;Application Support&lt;/code&gt;, nicht im Cache).&lt;/p&gt;
&lt;h3&gt;App stürzt sofort beim Start ab&lt;span class="hx:absolute hx:-mt-20" id="app-stürzt-sofort-beim-start-ab"&gt;&lt;/span&gt;
&lt;a href="#app-st%c3%bcrzt-sofort-beim-start-ab" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; wahrscheinlich beschädigte JSON-Daten in &lt;code&gt;studio_data_v1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagnose:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Daten ansehen (DevTools-Output)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;open &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Backup wiederherstellen (siehe &lt;a href="../datenhaltung#wiederherstellung"&gt;Datenhaltung&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Oder&lt;/strong&gt; als letzter Ausweg: Daten zurücksetzen
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app.bad&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
App neu starten → erstellt frische Daten. Anschliessend Setup-Screen.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Daten weg&lt;span class="hx:absolute hx:-mt-20" id="daten-weg"&gt;&lt;/span&gt;
&lt;a href="#daten-weg" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Nach einem App-Update fehlen Einträge&lt;span class="hx:absolute hx:-mt-20" id="nach-einem-app-update-fehlen-einträge"&gt;&lt;/span&gt;
&lt;a href="#nach-einem-app-update-fehlen-eintr%c3%a4ge" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; mögliche fehlgeschlagene Migration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sofortmassnahme:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rapport &lt;strong&gt;beenden&lt;/strong&gt; (Cmd+Q, nicht nur Fenster zu)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aktuelles Datenverzeichnis sichern&lt;/strong&gt;:
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -R &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;~/Documents/Rapport-Notfall-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d-%H%M&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener"&gt;Issue erstellen&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; mit:
&lt;ul&gt;
&lt;li&gt;Version vor dem Update (falls bekannt)&lt;/li&gt;
&lt;li&gt;Version nach dem Update&lt;/li&gt;
&lt;li&gt;Was fehlt&lt;/li&gt;
&lt;li&gt;Optional: gesicherter Datenordner (via Pastebin oder verschlüsselt zugesandt)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;localStorage voll&lt;span class="hx:absolute hx:-mt-20" id="localstorage-voll"&gt;&lt;/span&gt;
&lt;a href="#localstorage-voll" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Symptom:&lt;/strong&gt; Rapport schreibt Fehler-Toast &amp;ldquo;Speicher voll&amp;rdquo; beim Sichern.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; macOS WebView limitiert localStorage auf ~10 MB pro Origin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sehr grosse Logos durch kleinere ersetzen (Bürodaten → Logo)&lt;/li&gt;
&lt;li&gt;Belege (Spesen) selektiv löschen oder als externe Datei archivieren&lt;/li&gt;
&lt;li&gt;Auf &lt;a href="../web-modus"&gt;Web-Modus&lt;/a&gt; wechseln (Postgres ohne praktisches Limit)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Updates&lt;span class="hx:absolute hx:-mt-20" id="updates"&gt;&lt;/span&gt;
&lt;a href="#updates" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Auto-Update findet nichts&lt;span class="hx:absolute hx:-mt-20" id="auto-update-findet-nichts"&gt;&lt;/span&gt;
&lt;a href="#auto-update-findet-nichts" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Diagnose:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s https://git.kgva.ch/karim/RAPPORT/raw/branch/main/APP/latest.json&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;→ sollte JSON liefern. Wenn nicht: Server-/Netzwerkproblem.&lt;/p&gt;
&lt;h3&gt;Update lädt, lässt sich aber nicht installieren&lt;span class="hx:absolute hx:-mt-20" id="update-lädt-lässt-sich-aber-nicht-installieren"&gt;&lt;/span&gt;
&lt;a href="#update-l%c3%a4dt-l%c3%a4sst-sich-aber-nicht-installieren" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; Signaturprüfung scheitert (Public-Key in App ≠ Signatur in &lt;code&gt;latest.json&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt; Manuelles Update — DMG direkt von &lt;a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener"&gt;Releases&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; laden und installieren. Daten bleiben erhalten.&lt;/p&gt;
&lt;h3&gt;&amp;ldquo;Diese Version überspringen&amp;rdquo; rückgängig machen&lt;span class="hx:absolute hx:-mt-20" id="diese-version-überspringen-rückgängig-machen"&gt;&lt;/span&gt;
&lt;a href="#diese-version-%c3%bcberspringen-r%c3%bcckg%c3%a4ngig-machen" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;In &lt;strong&gt;Einstellungen → Updates&lt;/strong&gt;&lt;em&gt;Übersprungene Versionen zurücksetzen&lt;/em&gt;. Beim nächsten Start wird die Version wieder angeboten.&lt;/p&gt;
&lt;h2&gt;PDF / QR-Schein&lt;span class="hx:absolute hx:-mt-20" id="pdf--qr-schein"&gt;&lt;/span&gt;
&lt;a href="#pdf--qr-schein" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;QR-Schein hat falsche Daten&lt;span class="hx:absolute hx:-mt-20" id="qr-schein-hat-falsche-daten"&gt;&lt;/span&gt;
&lt;a href="#qr-schein-hat-falsche-daten" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Diagnose-Checkliste:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; IBAN korrekt? (CH, 21 Zeichen, keine Leerzeichen)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Empfänger-Adresse vollständig? (PLZ und Ort beide gefüllt)&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Schuldner-Adresse vollständig?&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Betrag &amp;gt; 0?&lt;/li&gt;
&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Referenz nicht zu lang? (max 27 Zeichen)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;QR-Bibliothek: &lt;a href="https://github.com/schoero/SwissQRBill"target="_blank" rel="noopener"&gt;&lt;code&gt;swissqrbill&lt;/code&gt;&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; — bei merkwürdigen Fehlern dort nachschauen.&lt;/p&gt;
&lt;h3&gt;PDF-Export ist leer / weisses Blatt&lt;span class="hx:absolute hx:-mt-20" id="pdf-export-ist-leer--weisses-blatt"&gt;&lt;/span&gt;
&lt;a href="#pdf-export-ist-leer--weisses-blatt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; Print-View hat keine Daten (möglicherweise Race-Condition beim Laden).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt; Rechnung schliessen, erneut öffnen, dann PDF.&lt;/p&gt;
&lt;h3&gt;PDF-Schrift sieht falsch aus&lt;span class="hx:absolute hx:-mt-20" id="pdf-schrift-sieht-falsch-aus"&gt;&lt;/span&gt;
&lt;a href="#pdf-schrift-sieht-falsch-aus" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; Web-Schrift nicht geladen, Fallback greift.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt; Vor dem Drucken warten, bis das Vorschau-Bild komplett geladen ist (35 Sek).&lt;/p&gt;
&lt;h2&gt;System-Tray&lt;span class="hx:absolute hx:-mt-20" id="system-tray"&gt;&lt;/span&gt;
&lt;a href="#system-tray" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Tray-Icon erscheint nicht&lt;span class="hx:absolute hx:-mt-20" id="tray-icon-erscheint-nicht"&gt;&lt;/span&gt;
&lt;a href="#tray-icon-erscheint-nicht" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Plattform-Hinweis:&lt;/strong&gt; Tray-Icons unter macOS sind bei extrem voller Menüleiste oder unter &amp;ldquo;Bartender&amp;rdquo;/&amp;ldquo;Hidden Bar&amp;rdquo; eventuell unsichtbar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Diagnose:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep -i rapport&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;→ wenn Prozess läuft, aber kein Icon: in den Tray-Manager-Apps prüfen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Konfiguration:&lt;/strong&gt; Einstellungen → System-Tray → &lt;em&gt;Tray-Icon ausblenden&lt;/em&gt; (aus → Icon erzwingen).&lt;/p&gt;
&lt;h3&gt;Tray-Menü reagiert nicht / hängt&lt;span class="hx:absolute hx:-mt-20" id="tray-menü-reagiert-nicht--hängt"&gt;&lt;/span&gt;
&lt;a href="#tray-men%c3%bc-reagiert-nicht--h%c3%a4ngt" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt; App via &lt;em&gt;Activity Monitor&lt;/em&gt; hart beenden und neu starten. Daten gehen nicht verloren (alle Schreibungen sind synchron in localStorage).&lt;/p&gt;
&lt;h2&gt;Web-Modus&lt;span class="hx:absolute hx:-mt-20" id="web-modus"&gt;&lt;/span&gt;
&lt;a href="#web-modus" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;h3&gt;Login-Screen zeigt keine Server-URL&lt;span class="hx:absolute hx:-mt-20" id="login-screen-zeigt-keine-server-url"&gt;&lt;/span&gt;
&lt;a href="#login-screen-zeigt-keine-server-url" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; &lt;code&gt;.env.production&lt;/code&gt; enthielt nicht den richtigen &lt;code&gt;VITE_SUPABASE_URL&lt;/code&gt; zur Build-Zeit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt; &lt;code&gt;.env.production&lt;/code&gt; prüfen, dann &lt;code&gt;npm run build&lt;/code&gt; neu, Container restart.&lt;/p&gt;
&lt;h3&gt;Realtime-Updates kommen nicht an&lt;span class="hx:absolute hx:-mt-20" id="realtime-updates-kommen-nicht-an"&gt;&lt;/span&gt;
&lt;a href="#realtime-updates-kommen-nicht-an" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Ursache:&lt;/strong&gt; Websocket-Support fehlt im Reverse Proxy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lösung:&lt;/strong&gt; In Nginx Proxy Manager für &lt;code&gt;api.*&lt;/code&gt; Websocket Support aktivieren.&lt;/p&gt;
&lt;p&gt;Siehe &lt;a href="../web-modus#troubleshooting"&gt;Web-Modus § Troubleshooting&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Debug-Informationen sammeln&lt;span class="hx:absolute hx:-mt-20" id="debug-informationen-sammeln"&gt;&lt;/span&gt;
&lt;a href="#debug-informationen-sammeln" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Bei einem Issue helfen folgende Infos:&lt;/p&gt;
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code"&gt;
&lt;div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Rapport-Version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;defaults &lt;span class="nb"&gt;read&lt;/span&gt; /Applications/Rapport.app/Contents/Info.plist CFBundleShortVersionString
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# macOS-Version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sw_vers
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Architektur&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uname -m
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Datenverzeichnis-Grösse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;du -sh &lt;span class="s2"&gt;&amp;#34;~/Library/Application Support/com.rapport.app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Cache-Verzeichnis-Grösse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;du -sh &lt;span class="s2"&gt;&amp;#34;~/Library/Caches/com.rapport.app&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0"&gt;
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Code kopieren"
aria-label="Code kopieren"
data-copied-label="Kopiert!"
&gt;
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4"&gt;&lt;/div&gt;
&lt;/button&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;→ Bei Issue mit anhängen.&lt;/p&gt;
&lt;h2&gt;Wenn nichts hilft&lt;span class="hx:absolute hx:-mt-20" id="wenn-nichts-hilft"&gt;&lt;/span&gt;
&lt;a href="#wenn-nichts-hilft" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href="https://git.kgva.ch/karim/RAPPORT/issues/new"target="_blank" rel="noopener"&gt;Neues Issue auf Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; mit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Was du gemacht hast&lt;/li&gt;
&lt;li&gt;Was passiert ist&lt;/li&gt;
&lt;li&gt;Was du erwartet hättest&lt;/li&gt;
&lt;li&gt;Screenshots (auch von DevTools-Konsole falls möglich)&lt;/li&gt;
&lt;li&gt;Rapport-Version und macOS-Version&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Changelog</title><link>https://rapport.gabrielevarano.ch/docs/changelog/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://rapport.gabrielevarano.ch/docs/changelog/</guid><description>
&lt;p&gt;Versionsgeschichte von RAPPORT. Aktuelle Releases: &lt;a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener"&gt;Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;0.8.3 — Aktuelle Version &lt;span class="rapport-status new"&gt;Aktuell&lt;/span&gt;&lt;span class="hx:absolute hx:-mt-20" id="083--aktuelle-version-aktuell"&gt;&lt;/span&gt;
&lt;a href="#083--aktuelle-version-aktuell" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Veröffentlicht am 2026-05-24.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neu / Verbessert&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Diverse Verbesserungen und Bugfixes (Details werden im &lt;a href="https://git.kgva.ch/karim/RAPPORT/releases/tag/0.8.3"target="_blank" rel="noopener"&gt;Release auf Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt; gepflegt)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bekannte Einschränkungen&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Builds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe &lt;a href="../installation#3--erster-start-macos-gatekeeper"&gt;Installation § Gatekeeper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Linux- und Windows-Builds noch nicht verfügbar&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;0.8.00.8.2 — Patch-Releases&lt;span class="hx:absolute hx:-mt-20" id="080082--patch-releases"&gt;&lt;/span&gt;
&lt;a href="#080082--patch-releases" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe &lt;a href="https://git.kgva.ch/karim/RAPPORT/releases"target="_blank" rel="noopener"&gt;Releases auf Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;0.7.0 — Auto-Updater &amp;amp; System-Tray&lt;span class="hx:absolute hx:-mt-20" id="070--auto-updater--system-tray"&gt;&lt;/span&gt;
&lt;a href="#070--auto-updater--system-tray" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Neu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Auto-Updater&lt;/strong&gt; — Rapport prüft beim Start auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden. (&lt;a href="../../features/auto-updater"&gt;Doku&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System-Tray&lt;/strong&gt; — Schnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter, Cmd+Q beendet die App vollständig. (&lt;a href="../../features/system-tray"&gt;Doku&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quick-Open&lt;/strong&gt; der letzten 5 Projekte direkt aus dem Tray-Menü&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verbessert&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Schnellerer App-Start durch lazy-geladene Views&lt;/li&gt;
&lt;li&gt;Klarere Statusbadges in der Projekt-Übersicht&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;0.6.x — Spesen &amp;amp; Buchhaltung&lt;span class="hx:absolute hx:-mt-20" id="06x--spesen--buchhaltung"&gt;&lt;/span&gt;
&lt;a href="#06x--spesen--buchhaltung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Neu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Spesenerfassung mit Beleg-Upload (Base64 in localStorage)&lt;/li&gt;
&lt;li&gt;Jahresbudget mit Einnahmen-/Ausgaben-Übersicht&lt;/li&gt;
&lt;li&gt;Vereinfachte Erfolgsrechnung pro Geschäftsjahr&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verbessert&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lohnabrechnung integriert Spesen-Erstattungen&lt;/li&gt;
&lt;li&gt;CSV-Export aus der Zeiterfassung&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;0.5.x — Mitarbeiter &amp;amp; Lohn&lt;span class="hx:absolute hx:-mt-20" id="05x--mitarbeiter--lohn"&gt;&lt;/span&gt;
&lt;a href="#05x--mitarbeiter--lohn" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Neu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mitarbeiterverwaltung mit Pensum, Stundensatz, Ferienanspruch&lt;/li&gt;
&lt;li&gt;Lohnabrechnung mit AHV/IV/EO, ALV, BVG, NBU&lt;/li&gt;
&lt;li&gt;Jahresabschluss mit Überstundenausgleich&lt;/li&gt;
&lt;li&gt;Ferien-Prorata bei Eintritt unter Jahr&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;0.4.x — Projekte &amp;amp; SIA 102&lt;span class="hx:absolute hx:-mt-20" id="04x--projekte--sia-102"&gt;&lt;/span&gt;
&lt;a href="#04x--projekte--sia-102" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Neu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Projektverwaltung nach SIA 102&lt;/li&gt;
&lt;li&gt;Vorgeschlagene Phasen-Anteile am Gesamthonorar&lt;/li&gt;
&lt;li&gt;Bauschätzwert-basiertes Honorar&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Verbessert&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zeit-Auswertung pro SIA-Phase&lt;/li&gt;
&lt;li&gt;Akonto- und Schlussrechnungen mit automatischer Differenzberechnung&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;0.3.x — Rechnungen &amp;amp; QR&lt;span class="hx:absolute hx:-mt-20" id="03x--rechnungen--qr"&gt;&lt;/span&gt;
&lt;a href="#03x--rechnungen--qr" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Neu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rechnungsmodul mit QR-Einzahlungsschein (via &lt;code&gt;swissqrbill&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Akonto-, Teil- und Schlussrechnungen&lt;/li&gt;
&lt;li&gt;PDF-Export mit Bürobriefbogen&lt;/li&gt;
&lt;li&gt;Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;0.2.x — Zeiterfassung&lt;span class="hx:absolute hx:-mt-20" id="02x--zeiterfassung"&gt;&lt;/span&gt;
&lt;a href="#02x--zeiterfassung" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Neu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wochenraster mit Halbstunden-Slots&lt;/li&gt;
&lt;li&gt;Drag &amp;amp; Drop zur Slot-Erfassung&lt;/li&gt;
&lt;li&gt;Projekt-Zuweisung pro Eintrag&lt;/li&gt;
&lt;li&gt;Auswertungen pro Mitarbeiter und Projekt&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;0.1.x — Initial&lt;span class="hx:absolute hx:-mt-20" id="01x--initial"&gt;&lt;/span&gt;
&lt;a href="#01x--initial" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Neu&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Erste Setup-Routine (Bürodaten, Mitarbeiter, Kunden)&lt;/li&gt;
&lt;li&gt;Briefe und Lieferscheine&lt;/li&gt;
&lt;li&gt;Tauri-2-Bundle für macOS&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2&gt;Roadmap&lt;span class="hx:absolute hx:-mt-20" id="roadmap"&gt;&lt;/span&gt;
&lt;a href="#roadmap" class="subheading-anchor" aria-label="Permalink für diesen Abschnitt"&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;Geplant — keine konkreten Termine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linux-Build&lt;/strong&gt; (Tauri 2 unterstützt es, Bedarf nötig)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows-Build&lt;/strong&gt; (analog)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloud-Modus&lt;/strong&gt; Stable (Supabase) — derzeit in &lt;a href="../web-modus"&gt;Web-Modus&lt;/a&gt; verfügbar, aber experimentell&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Französische / Italienische Übersetzung&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL-Migration&lt;/strong&gt; aus localStorage (Knopf in der App)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mobile App&lt;/strong&gt; (iOS Companion zur Zeiterfassung) — offen&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Wünsche oder Prioritäten → &lt;a href="https://git.kgva.ch/karim/RAPPORT/issues"target="_blank" rel="noopener"&gt;Issue auf Gitea&lt;svg class="hx:inline hx:rtl:rotate-270 hx:align-baseline" height="1em" aria-hidden="true" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"&gt;
&lt;path d="m9.1716 7.7574h7.0711m0 0v7.0711m0-7.0711-8.4853 8.4853" stroke-linecap="round" stroke-linejoin="round"/&gt;
&lt;/svg&gt;&lt;/a&gt;.&lt;/p&gt;</description></item></channel></rss>