Initial commit: Rapport Website (Hugo + Hextra)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 11:52:03 +02:00
commit e007bdd4e7
480 changed files with 41697 additions and 0 deletions
+107
View File
@@ -0,0 +1,107 @@
---
title: RAPPORT
layout: hextra-home
toc: false
---
{{< hextra/hero-badge >}}
<div class="hx:w-2 hx:h-2 hx:rounded-full" style="background: #b07848; box-shadow: 0 0 8px rgba(176,120,72,0.55);"></div>
<span>Pre-Release 0.8.3 · Aktiv in Entwicklung</span>
{{< /hextra/hero-badge >}}
<div class="hx:mt-8 hx:mb-6">
<div class="rapport-logo-card">
<div class="rapport-logo-text">RAPPORT</div>
<div class="rapport-logo-sub">Studio Administration</div>
</div>
</div>
<div class="hx:mb-12">
{{< hextra/hero-subtitle >}}
Die Studio Management Software für Architekturbüros mit offenem Quellcode — Zeiterfassung, Rechnungen, Offerten, Projekte, Mitarbeiter und QR-Einzahlungsscheine in einer App.
{{< /hextra/hero-subtitle >}}
</div>
<div class="rapport-hero-actions">
<a href="https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.3/RAPPORT%20PRE-RELEASE_0.8.3_aarch64.dmg" target="_blank" rel="noreferrer" class="rapport-btn rapport-btn-primary">Download · 0.8.3 (macOS)</a>
<a href="https://git.kgva.ch/karim/RAPPORT" class="rapport-btn rapport-btn-secondary">Quellcode ↗</a>
</div>
<div class="rapport-meta hx:mb-12">
<span class="rapport-meta-item">AGPL-3.0</span>
<span class="rapport-meta-item">Tauri + React</span>
<span class="rapport-meta-item">macOS (später Linux &amp; Windows)</span>
<span class="rapport-meta-item">Lokal / Selfhosting</span>
</div>
<div class="hx:mt-12 hx:mb-8 hx:text-center">
<p style="font-size: 10px; letter-spacing: 0.2em; text-transform: uppercase; color: var(--rapport-accent); margin-bottom: 12px;">ZIEL</p>
<h2 style="font-family: 'Playfair Display', serif; font-size: clamp(26px, 3.5vw, 40px); font-weight: 700; line-height: 1.2; margin: 0 auto 16px; max-width: 580px;">Freie Studio Managementsoftware</h2>
<p style="font-size: 13px; line-height: 1.8; color: var(--rapport-text-3); max-width: 620px; margin: 0 auto;">Rapport wurde für eigene Zwecke konzipiert — aus dem Drang heraus, möglichst viel Open-Source-Software in einem Architekturbüro zu verwenden. Die Strukturen folgen der SIA 102 (Phasen, Honorar), die Daten bleiben lokal.</p>
</div>
{{< hextra/feature-grid >}}
{{< hextra/feature-card
title="Zeiterfassung"
subtitle="Tages- und Wochenraster mit Drag &amp; Drop. Auswertungen pro Mitarbeiter und Projekt. Ferienverwaltung mit Prorata und Jahresabschluss."
style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.10),hsla(0,0%,100%,0));"
>}}
{{< hextra/feature-card
title="Rechnungen & Offerten"
subtitle="QR-Einzahlungsscheine, SIA-Phasen, Akonto-, Teil- und Schlussrechnungen. Offerten sind in Projekte und Rechnungen konvertierbar. PDF-Export."
style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.08),hsla(0,0%,100%,0));"
>}}
{{< hextra/feature-card
title="Projekt- & Kundenverwaltung"
subtitle="Projekte nach SIA 102 mit Budget, Phasen und Beteiligten. Erstellung aus einer Offerte mit Verknüpfung zu Zeiterfassung und Rechnungen."
style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.12),hsla(0,0%,100%,0));"
>}}
{{< hextra/feature-card
title="Mitarbeiter"
subtitle="Ferienverwaltung, interne Stunden / Absenzen und Lohnabrechnung. Jahresabschluss mit Überstundenausgleich."
>}}
{{< hextra/feature-card
title="Spesen & Bürobudget"
subtitle="Spesenerfassung mit Belegupload. Jahresbudget mit Einnahmen und Ausgaben. Internes Rechnungswesen."
>}}
{{< hextra/feature-card
title="Protokolle & Lieferscheine"
subtitle="Einfache Erstellung von Sitzungsprotokollen mit Beschlüssen und Aufgaben. Briefe und Lieferscheine im gleichen Erscheinungsbild."
>}}
{{< hextra/feature-card
title="Auto-Updater"
subtitle="Rapport prüft beim Start automatisch auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden."
>}}
{{< hextra/feature-card
title="System-Tray"
subtitle="Schnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter, Cmd+Q beendet die App vollständig."
>}}
{{< hextra/feature-card
title="Rapport Server"
subtitle="Selfhost-Stack für Studios mit mehreren Personen — Postgres, Auth, Realtime-Sync, Storage. Alles in einem Docker-Compose. Eigene Daten, eigene Domain, eigene Kontrolle."
icon="sparkles"
link="/server/"
style="background: radial-gradient(ellipse at 50% 80%,rgba(176,120,72,0.10),hsla(0,0%,100%,0));"
>}}
{{< /hextra/feature-grid >}}
<div class="rapport-stack-bar">
<span class="rapport-stack-label">Aufgebaut auf</span>
<div class="rapport-stack-items">
<span class="rapport-stack-item">Tauri 2</span>
<span class="rapport-stack-item">React 19</span>
<span class="rapport-stack-item">Vite</span>
<span class="rapport-stack-item">SIA 102</span>
<span class="rapport-stack-item">AGPL-3.0</span>
</div>
</div>
+35
View File
@@ -0,0 +1,35 @@
---
title: Dokumentation
linkTitle: Dokumentation
weight: 1
---
Vollständige Anleitung zu RAPPORT — von der Installation über den täglichen Arbeitsablauf bis zur Cloud-Variante und Eigen-Builds.
## Erste Schritte
{{< cards >}}
{{< card link="erste-schritte" title="Quick-Start" subtitle="In sechs Schritten von Null zur ersten Rechnung." >}}
{{< card link="installation" title="Installation" subtitle="macOS, Gatekeeper, Signatur, geplante Plattformen." >}}
{{< card link="einrichtung" title="Einrichtung" subtitle="Bürodaten, Mitarbeiter, Kunden, Projekte initial anlegen." >}}
{{< /cards >}}
## Im Alltag
{{< cards >}}
{{< card link="arbeitsablauf" title="Typischer Arbeitsablauf" subtitle="Kunde → Offerte → Projekt → Zeit → Rechnung." >}}
{{< card link="datenhaltung" title="Datenhaltung & Backup" subtitle="Wo die Daten liegen, wie du sie sicherst und wiederherstellst." >}}
{{< card link="troubleshooting" title="Troubleshooting" subtitle="App startet nicht, Daten weg, Update hängt." >}}
{{< /cards >}}
## Für Fortgeschrittene
{{< cards >}}
{{< card link="web-modus" title="Web-Modus (Multi-User)" subtitle="Rapport im Browser via Supabase — für Studios mit mehreren Nutzern." >}}
{{< card link="entwicklung" title="Entwicklung & Build" subtitle="Aus dem Quellcode kompilieren, beitragen, eigenes Release." >}}
{{< card link="changelog" title="Changelog" subtitle="Versionsgeschichte und Breaking Changes." >}}
{{< /cards >}}
## Hilfe & Support
Bei Bugs oder weiteren Fragen → [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues). Siehe auch die [FAQ](../faq) für häufige Fragen.
+129
View File
@@ -0,0 +1,129 @@
---
title: Typischer Arbeitsablauf
linkTitle: Arbeitsablauf
weight: 4
toc: true
---
Vom Erstkontakt mit dem Kunden bis zur Schlussrechnung — der typische Weg eines Projekts durch Rapport.
## Übersicht
```text
Kunde → Offerte → Projekt → Zeit → Akonto → Schluss
anlegen erstellen (aus Offerte) erfassen -Rechnung -Rechnung
QR-Schein
```
## 1 · Kunde anlegen
**Kunden → Neu** — siehe [Einrichtung § 3](../einrichtung#3--kunden).
Falls der Kunde später bestellt, lassen sich alle gesammelten Daten (Adresse, Honorartyp) direkt übernehmen.
## 2 · Offerte erstellen
**Offerten → Neu**
| Feld | Inhalt |
|---|---|
| **Kunde** | aus Kundendatenbank wählen |
| **Bezeichnung** | Projekttitel (z. B. "Einfamilienhaus Müller, Bern") |
| **Honorartyp** | Stundensatz / SIA 102 / Pauschal |
| **Bauschätzwert** | bei SIA — Bruttowert in CHF |
| **Phasen** | bei SIA — anzuklickende Phasen |
| **Positionen** | bei Stundensatz/Pauschal — Position, Beschreibung, Betrag |
Mit *PDF exportieren* — fertige Offerte für den Kunden.
### Offerten-Status
| Status | Bedeutung |
|---|---|
| **Entwurf** | noch nicht versandt |
| **Versandt** | beim Kunden, wartet auf Antwort |
| **Angenommen** | Kunde hat zugesagt — bereit zur Konvertierung |
| **Abgelehnt** | Kunde hat abgelehnt — Archiv |
## 3 · Offerte → Projekt
Bei Status **"Angenommen"**: Knopf **"In Projekt konvertieren"**.
Das erzeugt:
- Ein neues Projekt mit den Daten der Offerte (Kunde, Bezeichnung, Honorar, Phasen)
- Eine Verknüpfung zwischen Offerte und Projekt
- Die Offerte selbst bleibt im Archiv erhalten
Siehe auch [Projekt-Feature](../../features/projekte).
## 4 · Zeit erfassen
**Zeit → Mitarbeiter wählen → Woche navigieren**
- **Klick** auf einen Halbstunden-Slot → Eintrag erstellen
- **Drag** über mehrere Slots → längerer Eintrag
- **Projekt zuweisen** (Pflichtfeld) — aus aktiven Projekten
- **SIA-Phase** zuweisen (optional, für detaillierte Auswertung)
### Spezialfälle
- **Ferien** — eigener "Projekt"-Typ "Ferien", in der Auswertung separat
- **Krankheit/Absenz** — eigener "Projekt"-Typ, ebenfalls separat
- **Interne Stunden** — z. B. Verwaltung, Marketing, IT — eigene interne Projekte
## 5 · Akonto-Rechnung
Während der Projektlaufzeit — typisch nach jeder abgeschlossenen SIA-Phase oder monatlich.
**Rechnungen → Neu → Akonto**
| Feld | Inhalt |
|---|---|
| **Projekt** | aus aktiven Projekten |
| **Bezug** | "Akonto für Phase 31 — Vorprojekt" |
| **Betrag** | Stundensatz × Stunden, oder Phasenanteil × Bausumme |
| **Fälligkeit** | i. d. R. 30 Tage |
Rapport zieht automatisch die geleisteten Stunden aus der Zeiterfassung — die kannst du als Basis nehmen oder überschreiben.
PDF inkl. **QR-Einzahlungsschein** — siehe [Rechnungen-Feature](../../features/rechnungen).
## 6 · Schlussrechnung
Nach Projektabschluss — Differenz aus Gesamthonorar minus aller Akonto-Beträge.
**Rechnungen → Neu → Schlussrechnung**
Rapport rechnet die bisherigen Akonto-Rechnungen automatisch ab:
```text
Gesamthonorar (SIA / Pauschal / Stundensatz)
Akonto-Rechnung 1
Akonto-Rechnung 2
Akonto-Rechnung 3
= Schlussrechnung
```
## 7 · Projektabschluss
Im Projekt → Status auf **"Abgeschlossen"**.
Das Projekt bleibt für historische Auswertungen sichtbar, taucht aber nicht mehr in der Zeiterfassungs-Auswahl auf.
## Auswertungen
Wöchentlich / monatlich / am Jahresende:
- **Zeit → Auswertungen** — Stunden pro Mitarbeiter, pro Projekt, pro Phase
- **Rechnungen → Übersicht** — offene Beträge, bezahlt, Mahnungen
- **Buchhaltung → Erfolgsrechnung** — Einnahmen vs. Ausgaben
- **Mitarbeiter → Lohnabrechnung** — monatlich
## Tipps aus dem Alltag
- **Zeit jeden Tag erfassen** statt rückwirkend — sonst gehen Details verloren
- **Akonto regelmässig** statt einmal am Schluss — Liquidität
- **Backups** vor Jahresabschluss — siehe [Datenhaltung](../datenhaltung)
- **Briefbogen-Logo** in hoher Auflösung — sieht im PDF besser aus
+114
View File
@@ -0,0 +1,114 @@
---
title: Changelog
linkTitle: Changelog
weight: 9
toc: true
---
Versionsgeschichte von RAPPORT. Aktuelle Releases: [Gitea](https://git.kgva.ch/karim/RAPPORT/releases).
## 0.8.3 — Aktuelle Version <span class="rapport-status new">Aktuell</span>
Veröffentlicht am 2026-05-24.
**Neu / Verbessert**
- Diverse Verbesserungen und Bugfixes (Details werden im [Release auf Gitea](https://git.kgva.ch/karim/RAPPORT/releases/tag/0.8.3) gepflegt)
**Bekannte Einschränkungen**
- Builds sind Tauri-signiert, aber noch nicht Apple-notarisiert — siehe [Installation § Gatekeeper](../installation#3--erster-start-macos-gatekeeper)
- Linux- und Windows-Builds noch nicht verfügbar
## 0.8.00.8.2 — Patch-Releases
Patch-Reihe mit kleineren Verbesserungen und Bugfixes. Details siehe [Releases auf Gitea](https://git.kgva.ch/karim/RAPPORT/releases).
## 0.7.0 — Auto-Updater & System-Tray
**Neu**
- **Auto-Updater** — Rapport prüft beim Start auf neue Versionen und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden. ([Doku](../../features/auto-updater))
- **System-Tray** — Schnellzugriff über die Menüleiste mit Hide-on-Close. Beim Schliessen läuft Rapport im Hintergrund weiter, Cmd+Q beendet die App vollständig. ([Doku](../../features/system-tray))
- **Quick-Open** der letzten 5 Projekte direkt aus dem Tray-Menü
**Verbessert**
- Schnellerer App-Start durch lazy-geladene Views
- Klarere Statusbadges in der Projekt-Übersicht
## 0.6.x — Spesen & Buchhaltung
**Neu**
- Spesenerfassung mit Beleg-Upload (Base64 in localStorage)
- Jahresbudget mit Einnahmen-/Ausgaben-Übersicht
- Vereinfachte Erfolgsrechnung pro Geschäftsjahr
**Verbessert**
- Lohnabrechnung integriert Spesen-Erstattungen
- CSV-Export aus der Zeiterfassung
## 0.5.x — Mitarbeiter & Lohn
**Neu**
- Mitarbeiterverwaltung mit Pensum, Stundensatz, Ferienanspruch
- Lohnabrechnung mit AHV/IV/EO, ALV, BVG, NBU
- Jahresabschluss mit Überstundenausgleich
- Ferien-Prorata bei Eintritt unter Jahr
## 0.4.x — Projekte & SIA 102
**Neu**
- Projektverwaltung nach SIA 102
- Vorgeschlagene Phasen-Anteile am Gesamthonorar
- Bauschätzwert-basiertes Honorar
**Verbessert**
- Zeit-Auswertung pro SIA-Phase
- Akonto- und Schlussrechnungen mit automatischer Differenzberechnung
## 0.3.x — Rechnungen & QR
**Neu**
- Rechnungsmodul mit QR-Einzahlungsschein (via `swissqrbill`)
- Akonto-, Teil- und Schlussrechnungen
- PDF-Export mit Bürobriefbogen
- Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung
## 0.2.x — Zeiterfassung
**Neu**
- Wochenraster mit Halbstunden-Slots
- Drag & Drop zur Slot-Erfassung
- Projekt-Zuweisung pro Eintrag
- Auswertungen pro Mitarbeiter und Projekt
## 0.1.x — Initial
**Neu**
- Erste Setup-Routine (Bürodaten, Mitarbeiter, Kunden)
- Briefe und Lieferscheine
- Tauri-2-Bundle für macOS
---
## Roadmap
Geplant — keine konkreten Termine:
- **Linux-Build** (Tauri 2 unterstützt es, Bedarf nötig)
- **Windows-Build** (analog)
- **Cloud-Modus** Stable (Supabase) — derzeit in [Web-Modus](../web-modus) verfügbar, aber experimentell
- **Französische / Italienische Übersetzung**
- **PostgreSQL-Migration** aus localStorage (Knopf in der App)
- **Mobile App** (iOS Companion zur Zeiterfassung) — offen
Wünsche oder Prioritäten → [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues).
+148
View File
@@ -0,0 +1,148 @@
---
title: Datenhaltung & Backup
linkTitle: Datenhaltung
weight: 5
toc: true
---
Wo Rapport seine Daten speichert, wie du sie sicherst und wiederherstellst.
> **Diese Seite beschreibt die Desktop-App (Single-User).** Wer im Team arbeitet und Rapport gegen einen [Rapport Server](../../server/) betreibt, sichert stattdessen die Postgres-Datenbank — siehe [Rapport Server § Backup](../../server/#backup).
## Speicherort (Desktop-App)
Die Desktop-App speichert **alles lokal** — keine Cloud, kein Server.
### macOS
```text
~/Library/Application Support/com.rapport.app/
```
Dort liegt eine einzelne **`localStorage`**-Datenbank des WebView, in der **alle** Rapport-Daten als JSON unter dem Key `studio_data_v1` gespeichert sind:
- Bürodaten, Logo, IBAN
- Mitarbeiter, Kunden, Projekte, Offerten
- Zeit-Einträge, Rechnungen
- Spesen, Lohnabrechnungen, Protokolle
- App-Einstellungen
> **Konsequenz:** Wer den Application-Support-Ordner kopiert, hat ein vollständiges Backup. Wer ihn löscht, verliert alle Daten.
### Warum localStorage?
In der Desktop-App ist Rapport eine **Single-User-Anwendung**. localStorage ist dafür:
- **Schnell** — keine Datenbank-Roundtrips
- **Einfach** — keine Migration nötig, JSON-Schema im Code
- **Portabel** — eine Datei → ein Backup
Für **Multi-User-Betrieb** existiert [Rapport Server](../../server/) — Postgres + Auth + Realtime in einem Docker-Compose. Wechsel zwischen Desktop- und Server-Modus erfolgt im Login-Bildschirm der App.
## Backup-Strategien
### A · Einfach (manuell)
Den ganzen Ordner kopieren:
```bash
cp -R "~/Library/Application Support/com.rapport.app" \
"~/Documents/Rapport-Backup-$(date +%Y%m%d)"
```
→ Auf USB-Stick, externen Datenträger oder in die Cloud.
### B · Time Machine
Wenn Time Machine läuft, ist der Ordner automatisch dabei. Versionierung inbegriffen.
> **Einschränkung:** Time Machine sichert nur lokal/USB. Für off-site-Backup separat sorgen.
### C · Cron-Job (täglich automatisch)
```bash
# In ~/Library/LaunchAgents/com.rapport.backup.plist hinterlegen
# oder als crontab-Eintrag:
0 22 * * * rsync -a "$HOME/Library/Application Support/com.rapport.app/" \
"$HOME/Backups/rapport/$(date +\%Y\%m\%d)/"
```
### D · iCloud Drive (off-site)
Application-Support liegt **nicht** automatisch in iCloud. Wer das will:
```bash
# Symlink anlegen
mkdir -p "~/iCloud Drive/Rapport"
ln -s "~/Library/Application Support/com.rapport.app" "~/iCloud Drive/Rapport/data"
```
> **Achtung:** iCloud-Sync mit aktiver App kann zu **Race-Conditions** führen. Besser den Sync zeitversetzt (z. B. nachts via Cron).
## Wiederherstellung
### Vollständig (Rapport komplett tot)
1. Rapport beenden (Cmd+Q, nicht nur Fenster zu)
2. Aktuellen Ordner umbenennen (falls noch da):
```bash
mv "~/Library/Application Support/com.rapport.app" \
"~/Library/Application Support/com.rapport.app.bak"
```
3. Backup-Ordner zurück kopieren:
```bash
cp -R "~/Documents/Rapport-Backup-20260523" \
"~/Library/Application Support/com.rapport.app"
```
4. Rapport starten
### Selektiv (nur einzelne Daten)
Da alle Daten in **einem JSON unter `studio_data_v1`** liegen, ist selektive Wiederherstellung **manuell**:
1. Backup-`localStorage`-Datei öffnen (WebKit-Format → mit Tool wie [WebKit Storage Inspector] lesen, oder via Rapport DevTools)
2. Gewünschte Felder in die aktuelle Instanz übertragen
In der Praxis: meistens lohnt sich die **vollständige** Wiederherstellung mehr.
## Export-Funktionen (in der App)
Aus Rapport selbst:
| Was | Wo | Format |
|---|---|---|
| **Zeit-Auswertung** | Zeit → Export | CSV |
| **Rechnung** | Rechnung → PDF | PDF (inkl. QR) |
| **Offerte** | Offerte → PDF | PDF |
| **Lohnabrechnung** | Mitarbeiter → PDF | PDF |
| **Jahres-Buchhaltung** | Buchhaltung → Export | CSV |
Die Exports sind für externe Verwendung (Buchhalter, Treuhänder, Archiv) gedacht — kein Full-Backup.
## Schema-Migrationen
Bei Updates kann sich das Datenformat ändern. Rapport hat einen **Migrations-Mechanismus**: beim Start prüft die App, ob das gespeicherte Format dem aktuellen entspricht, und migriert es automatisch.
Code: [src/storage/migrations.js](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js).
> **Empfehlung:** Vor jedem grösseren Update ein Backup machen — Migrationen sind getestet, aber 100%-Sicherheit gibt es nicht.
## Was wird **nicht** gespeichert?
- **WebView-Cache** — `~/Library/Caches/com.rapport.app/` und `~/Library/WebKit/com.rapport.app/` sind sicher zu löschen (UI-Caches, regenerieren sich)
- **App-Updates** — werden bei Bedarf erneut runtergeladen
- **Logs** — `~/Library/Logs/com.rapport.app/` (geplant, derzeit nicht geschrieben)
## Datenmenge
Typische Grössen pro Bürojahr:
| Inhalt | Grösse |
|---|---|
| Logo (PNG/SVG) | 50 KB 1 MB |
| 1 Jahr Zeiterfassung (1 MA) | ~ 80 KB |
| 1 Jahr Zeiterfassung (5 MA) | ~ 400 KB |
| 50 Projekte mit je 5 Rechnungen | ~ 800 KB |
| **Total typisches Solo-Büro / Jahr** | **~ 12 MB** |
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 → [Rapport Server](../../server/).
+111
View File
@@ -0,0 +1,111 @@
---
title: Einrichtung
linkTitle: Einrichtung
weight: 3
toc: true
---
Nach der [Installation](../installation): Bürodaten, Mitarbeiter, Kunden und Projekte initial anlegen.
## Reihenfolge
Die Reihenfolge ist wichtig — jede Stufe baut auf der vorherigen auf:
```text
1. Bürodaten → 2. Mitarbeiter → 3. Kunden → 4. Projekte
▼ ▼ ▼ ▼
Briefbogen, Zeiterfassung, Adressen, Zeiterfassung,
QR-Schein, Lohn Rechnungen Rechnungen
Login
```
## 1 · Bürodaten
**Einstellungen → Bürodaten**
| Feld | Beschreibung | Verwendung |
|---|---|---|
| **Name** | Bürobezeichnung | Briefbogen, Login-Screen |
| **Adresse** | Strasse, PLZ, Ort | Briefbogen, QR-Rechnung (Empfänger) |
| **Telefon, E-Mail** | Kontaktdaten | Briefbogen, Rechnung-Footer |
| **IBAN** | CH-IBAN (Format `CH XX XXXX …`) | **QR-Einzahlungsschein** — Pflicht |
| **Logo** | PNG/SVG-Upload | Briefbogen, Rechnung, Brief |
| **MwSt.-Nr.** | optional | Rechnung-Footer |
> **Tipp:** Das Logo wird hochauflösend gespeichert (Base64 im localStorage). Bei sehr grossen Dateien (>1 MB) vorher in Vorschau verkleinern.
## 2 · Mitarbeiter
**Einstellungen → Mitarbeiter → Neu**
| Feld | Beschreibung |
|---|---|
| **Name, Vorname** | wird in Zeiterfassung & Lohn verwendet |
| **Initialen** | Kürzel für Auswertungen (z. B. "KGE") |
| **Eintrittsdatum** | für **Prorata** der Ferien |
| **Pensum (%)** | 100 = Vollzeit |
| **Stundensatz (CHF)** | für Stundensatz-Rechnungen |
| **Ferienanspruch (Tage/Jahr)** | i. d. R. 2530 |
| **Lohn (brutto, monatlich)** | optional, für Lohnabrechnung |
Mindestens **ein Mitarbeiter** (z. B. der Inhaber selbst) muss angelegt sein, sonst lässt sich keine Zeit erfassen.
### Sozialabzüge (optional)
In Einstellungen → Lohn:
| Abzug | Standardwert (CH) |
|---|---|
| AHV / IV / EO | 5,3 % |
| ALV | 1,1 % |
| BVG (Pensionskasse) | variabel — je Mitarbeiter |
| NBU | je nach Versicherung |
Die Standardsätze sind hinterlegt, können aber überschrieben werden.
## 3 · Kunden
**Kunden → Neu**
| Feld | Beschreibung |
|---|---|
| **Typ** | Privatperson / Firma |
| **Anrede, Name** | für Brief / Rechnung |
| **Adresse** | Strasse, PLZ, Ort, Land |
| **Ansprechperson** | bei Firmen |
| **Telefon, E-Mail** | Kontakt |
| **Honorartyp Default** | Stundensatz / SIA / Pauschal |
| **Stundensatz** | falls vom Bürostandard abweichend |
| **MwSt.-pflichtig** | ja/nein |
## 4 · Projekte
**Projekte → Neu**
| Feld | Beschreibung |
|---|---|
| **Projekt-Nr.** | freie Form, oder generiert (`2026-001`) |
| **Bezeichnung** | Kurztitel |
| **Standort** | Adresse |
| **Kunde** | aus Kundendatenbank |
| **Bauschätzwert** | für SIA-Phasen-Honorar |
| **SIA-Phasen** | Vorprojekt / Bauprojekt / … — alle anwählbar |
| **Honorartyp** | Stundensatz / SIA 102 / Pauschal |
| **Status** | aktiv / pausiert / abgeschlossen |
### SIA-102-Phasen
Wenn als Honorartyp **SIA 102** gewählt ist, werden die Phasen-Anteile am Gesamthonorar vorgeschlagen — siehe [Projekt-Feature](../../features/projekte#sia-102).
## Checkliste
Nach diesen vier Schritten ist Rapport einsatzbereit:
- [ ] Bürodaten inkl. IBAN erfasst
- [ ] Mindestens ein Mitarbeiter angelegt
- [ ] Erster Kunde angelegt
- [ ] Erstes Projekt angelegt
- [ ] Eine Test-Zeitbuchung erfasst — wird das Projekt korrekt zugewiesen?
- [ ] Eine Test-Rechnung erstellt — kommt der QR-Schein sauber raus?
Wenn alles funktioniert: [Typischer Arbeitsablauf](../arbeitsablauf).
+146
View File
@@ -0,0 +1,146 @@
---
title: Entwicklung & Build
linkTitle: Entwicklung
weight: 7
toc: true
---
Aus dem Quellcode kompilieren, beitragen, eigenes Release erzeugen.
## Voraussetzungen
| Tool | Version |
|---|---|
| **Node.js** | ≥ 20 (für Vite 8) |
| **npm** | ≥ 10 |
| **Rust toolchain** | ≥ 1.77.2 (via `rustup`) |
| **Plattform-Tools** | siehe [Tauri Prerequisites](https://v2.tauri.app/start/prerequisites/) |
Plattform-spezifisch:
- **macOS:** Xcode Command Line Tools (`xcode-select --install`)
- **Windows:** Microsoft C++ Build Tools + WebView2
- **Linux:** `webkit2gtk-4.1`, `librsvg2-dev`, `libayatana-appindicator3-dev`, `build-essential`
## Setup
```bash
git clone https://git.kgva.ch/karim/RAPPORT.git
cd RAPPORT/APP
npm install
```
## Entwicklung
### Web-Modus (HMR, schnellster Loop)
```bash
npm run dev # http://localhost:3000
```
- Hot-Module-Replacement
- Schnellster Iteration-Loop für UI-Arbeit
- Datenpersistierung: Browser-localStorage
### Native Window (Tauri-Fenster mit Desktop-Integration)
```bash
npx tauri dev
```
- Echtes Tauri-Fenster
- System-Tray, Updater, native APIs verfügbar
- Erster Start dauert lange (Rust-Compile)
## Architektur in einem Absatz
> RAPPORT ist eine monolithische SPA: ein React-Root in [App.jsx](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/App.jsx) hält den **gesamten** App-State in einem `useState({...})`, persistiert ihn synchron in `localStorage` unter `studio_data_v1`, und übergibt ihn als Props an lazy-geladene Views. **Kein Routing-Framework**, **kein State-Library**, **kein TypeScript**, **kein CSS-Framework**. Der **Rust-Teil** ist 109 Zeilen und macht nur drei Dinge: System-Tray, Window-Hide-on-Close, Plugin-Registrierung (Updater, Process, Log). **Keine** `#[tauri::command]` — Frontend ↔ Backend kommuniziert nur über das Event `rapport:navigate` (Tray → Frontend).
Detaillierte Karte: [ARCHITECTURE.md](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/ARCHITECTURE.md).
## Verzeichnis-Karte
```text
APP/
├── src/ React 19 (kein TS, nur .jsx)
│ ├── App.jsx Root: State, Navigation, Sidebar, Modals
│ ├── constants.js STORAGE_KEY, NAV_ITEMS, defaultData, SIA-Phasen
│ ├── utils.js Business-Logik: Kalkulation, QR-Bill, CSV, Lohn
│ ├── storage/adapter.js LocalStorageAdapter (Phase 1), SupabaseAdapter (Phase 2)
│ ├── storage/migrations.js Schema-Migrationen
│ ├── views/ 20 Top-Level-Screens, lazy-geladen
│ ├── components/UI.jsx StatusBadge, Modal, FormField, …
│ ├── components/Update* Auto-Update-UI
│ ├── print/ PrintComponents.jsx — alle Druckansichten
│ └── utils/updater.js @tauri-apps/plugin-updater Wrapper
├── supabase/migrations/ Postgres-Schema für Cloud-Variante
├── src-tauri/ Rust-Backend (Tauri 2.10.3)
│ ├── src/lib.rs ~103 Z. — Tray, Window-Events, Plugins
│ ├── tauri.conf.json Updater-URL, Public-Key, CSP, Bundle-Targets
│ └── capabilities/ Tauri Permissions
├── scripts/release.sh Build + Sign + latest.json erzeugen
├── latest.json Updater-Manifest
└── deploy/ Docker-Compose für Web-Modus
```
## Konventionen
- **JavaScript** statt TypeScript — bewusste Entscheidung für Solo-Dev-Velocity
- **Inline-Styles** statt CSS-Framework
- **kein Routing-Framework** — `view`-State in App.jsx triggert Komponente
- **JSON-Schema implizit** — definiert durch `defaultData` in `constants.js`
- **Migrationen** als reine Funktionen in [storage/migrations.js](https://git.kgva.ch/karim/RAPPORT/src/branch/main/APP/src/storage/migrations.js)
## Build
### Desktop (Tauri DMG)
```bash
npm run build # erst Vite-Build (dist/)
npx tauri build # dann Tauri-Bundle (DMG)
```
Output: `src-tauri/target/release/bundle/dmg/Rapport_<version>_aarch64.dmg`
### Web (statisches Bundle)
```bash
npm run build # Output: dist/ (~500 KB)
```
Für Hosting auf einem Static-Server (z. B. Nginx, Caddy, GitHub Pages). Siehe [Web-Modus](../web-modus).
## Release-Workflow
```bash
# 1 · Version bumpen in package.json + Cargo.toml + tauri.conf.json
./scripts/release.sh 0.7.1
# 2 · Build mit Signatur
TAURI_SIGNING_PRIVATE_KEY=$(cat ~/.tauri/rapport-key) \
TAURI_SIGNING_PRIVATE_KEY_PASSWORD=\
npx tauri build
# 3 · latest.json aktualisieren mit neuer Signatur
# 4 · DMG + latest.json auf Gitea Releases hochladen
```
## Beitragen
[Issues & Pull Requests](https://git.kgva.ch/karim/RAPPORT) sind willkommen. Wertvoll sind:
- **Bug-Reports** mit Reproduktionsschritten
- **Workflow-Verbesserungen** aus dem realen Büroalltag
- **Vorlagen** (Briefe, Protokolle, Lieferscheine) für andere Büros
- **Übersetzungen / Internationalisierung** (FR, IT)
- **Linux-/Windows-Builds** und plattformspezifische Fixes
Vor grösseren Änderungen → Issue zum Diskutieren.
## Lizenz
**GNU AGPL-3.0-or-later** — eigene Builds erlaubt, Modifikationen müssen unter derselben Lizenz veröffentlicht werden, wenn die Software als Service angeboten wird.
+62
View File
@@ -0,0 +1,62 @@
---
title: Erste Schritte
linkTitle: Erste Schritte
weight: 1
toc: true
---
Von der Installation bis zur ersten Rechnung — in sechs Schritten.
## 01 · Installation
DMG von [Gitea Releases](https://git.kgva.ch/karim/RAPPORT/releases) herunterladen. Rapport in den **Programme-Ordner** ziehen. Beim ersten Start: *Systemeinstellungen → Datenschutz & Sicherheit* öffnen und Rapport zulassen.
Die Pre-Release-Builds sind **signiert über Tauri**, aber (noch) nicht über die Apple-Notarisierung gegangen — daher der manuelle Freigabe-Schritt.
## 02 · Einrichtung
In den **Einstellungen** hinterlegen:
- **Bürodaten** — Name, Adresse, IBAN, Logo
- **Mitarbeiter** — Namen, Pensum, Stundensatz, Ferienanspruch
- **Kunden** — Adresse, Ansprechperson, Honorartyp
- **Projekte** — SIA-102-Phasen, Budget, Beteiligte
Danach ist die Zeiterfassung bereit.
## 03 · Zeiterfassung
Im Modul **Zeit**:
1. Mitarbeiter wählen
2. Woche navigieren
3. Stunden per **Klick** oder **Drag** erfassen
4. Jedem Eintrag ein Projekt zuweisen
Auswertungen pro Mitarbeiter und pro Projekt sind unter *Zeit → Auswertungen* abrufbar. Halbe Tage und Mehrfacheinträge pro Slot werden unterstützt.
## 04 · Rechnungen
Aus einer **Offerte** oder **direkt** erstellen:
- SIA-Phasen, Stundensatz oder Pauschal wählen
- Akonto-, Teil- oder Schlussrechnung
- Mit *PDF exportieren* wird die fertige Rechnung inkl. **QR-Einzahlungsschein** generiert
Offerten lassen sich nahtlos in Projekte und Rechnungen konvertieren.
## 05 · Backup
In der Desktop-App liegen alle Daten als **JSON** im Applikationsordner:
```text
~/Library/Application Support/com.rapport.app/
```
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 [Rapport Server § Backup](../../server/#backup).
## 06 · Probleme melden
Ein [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues) erstellen — mit kurzer Beschreibung, was passiert ist. **Screenshots helfen.** Bitte die Rapport-Version (links unten in der App) angeben.
> **Tipp:** Wenn die App nicht mehr startet, hilft oft, den Cache-Ordner zu sichern und neu zu starten. Die JSON-Daten selbst bleiben unverändert.
+94
View File
@@ -0,0 +1,94 @@
---
title: Installation
linkTitle: Installation
weight: 2
toc: true
---
Schritt-für-Schritt-Anleitung für die Installation der Desktop-App.
## Voraussetzungen
| Plattform | Status | Versionen |
|---|---|---|
| **macOS** Apple Silicon (M1 M4) | ✅ Unterstützt | macOS 12+ |
| **macOS** Intel | ⚠ Build auf Anfrage | macOS 12+ |
| **Linux** | 🕐 Geplant | — |
| **Windows** | 🕐 Geplant | — |
Eine Portierung auf Linux und Windows ist mit Tauri 2 möglich. [Issue erstellen](https://git.kgva.ch/karim/RAPPORT/issues/new), wenn du eine Plattform brauchst.
## 1 · Download
Aktueller Build: [Downloads-Seite](../../downloads) oder direkt [Releases auf Gitea](https://git.kgva.ch/karim/RAPPORT/releases).
| Datei | Plattform |
|---|---|
| `RAPPORT_<version>_aarch64.dmg` | macOS Apple Silicon |
| `RAPPORT_<version>_x86_64.dmg` | macOS Intel (auf Anfrage) |
## 2 · DMG öffnen & installieren
1. DMG doppelklicken
2. Rapport.app in den **Applications**-Ordner ziehen
3. DMG auswerfen
## 3 · Erster Start (macOS Gatekeeper)
Beim ersten Start verweigert macOS den Start, weil die Pre-Release-Builds **Tauri-signiert**, aber (noch) **nicht Apple-notarisiert** sind.
### Lösung
1. **Systemeinstellungen → Datenschutz & Sicherheit** öffnen
2. Bis ganz nach unten scrollen — es erscheint:
> "Rapport" wurde blockiert, da es nicht von einem identifizierten Entwickler stammt.
3. Auf **"Trotzdem öffnen"** klicken
4. Bestätigen
Ab dem zweiten Start läuft Rapport ohne Rückfragen.
### Alternative (Terminal)
Falls der GUI-Weg nicht funktioniert:
```bash
xattr -d com.apple.quarantine /Applications/Rapport.app
```
Das entfernt das Quarantäne-Flag und macOS akzeptiert den Start.
## 4 · Erstes Setup
Beim ersten Start zeigt Rapport den **Setup-Bildschirm**. Hier werden die Stammdaten erfasst — siehe [Einrichtung](../einrichtung).
## 5 · Update-Strategie
Ab Version 0.7.0 prüft Rapport beim Start automatisch auf neue Versionen (siehe [Auto-Updater](../../features/auto-updater)). Updates können in den Einstellungen deaktiviert werden.
Manuelle Updates: einfach das neuere DMG installieren — die Daten bleiben erhalten, da sie unabhängig von der App liegen (siehe [Datenhaltung](../datenhaltung)).
## Deinstallation
```bash
# App entfernen
rm -rf /Applications/Rapport.app
# Daten entfernen (optional!)
rm -rf "~/Library/Application Support/com.rapport.app"
# Caches
rm -rf "~/Library/Caches/com.rapport.app"
rm -rf "~/Library/WebKit/com.rapport.app"
```
> **Achtung:** Schritt 2 löscht **alle Rapport-Daten unwiederbringlich**. Vorher Backup machen — siehe [Datenhaltung](../datenhaltung).
## Bekannte Probleme
| Problem | Lösung |
|---|---|
| App lässt sich nicht öffnen trotz Freigabe | Terminal-Variante mit `xattr` |
| "Rapport is damaged" | DMG erneut von Gitea ziehen (Browser-Cache hat evtl. Müll) |
| Schwarzer Bildschirm beim Start | `~/Library/WebKit/com.rapport.app` löschen, neu starten |
Mehr unter [Troubleshooting](../troubleshooting).
+203
View File
@@ -0,0 +1,203 @@
---
title: Troubleshooting
linkTitle: Troubleshooting
weight: 8
toc: true
---
Typische Probleme und Lösungen. Wenn dein Problem nicht dabei ist → [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues).
## App startet nicht
### "Rapport ist beschädigt" beim ersten Start
**Ursache:** macOS Gatekeeper blockt unsignierte/nicht-notarisierte Apps.
**Lösung:** siehe [Installation § 3](../installation#3--erster-start-macos-gatekeeper). Kurz:
```bash
xattr -d com.apple.quarantine /Applications/Rapport.app
```
### App startet, zeigt aber schwarzen Bildschirm
**Ursache:** WebView-Cache korrupt.
**Lösung:**
```bash
rm -rf "~/Library/Caches/com.rapport.app"
rm -rf "~/Library/WebKit/com.rapport.app"
```
App neu starten. Daten gehen dabei **nicht** verloren (liegen in `Application Support`, nicht im Cache).
### App stürzt sofort beim Start ab
**Ursache:** wahrscheinlich beschädigte JSON-Daten in `studio_data_v1`.
**Diagnose:**
```bash
# Daten ansehen (DevTools-Output)
open "~/Library/Application Support/com.rapport.app"
```
**Lösung:**
1. Backup wiederherstellen (siehe [Datenhaltung](../datenhaltung#wiederherstellung))
2. **Oder** als letzter Ausweg: Daten zurücksetzen
```bash
mv "~/Library/Application Support/com.rapport.app" \
"~/Library/Application Support/com.rapport.app.bad"
```
App neu starten → erstellt frische Daten. Anschliessend Setup-Screen.
## Daten weg
### Nach einem App-Update fehlen Einträge
**Ursache:** mögliche fehlgeschlagene Migration.
**Sofortmassnahme:**
1. Rapport **beenden** (Cmd+Q, nicht nur Fenster zu)
2. **Aktuelles Datenverzeichnis sichern**:
```bash
cp -R "~/Library/Application Support/com.rapport.app" \
"~/Documents/Rapport-Notfall-$(date +%Y%m%d-%H%M)"
```
3. [Issue erstellen](https://git.kgva.ch/karim/RAPPORT/issues/new) mit:
- Version vor dem Update (falls bekannt)
- Version nach dem Update
- Was fehlt
- Optional: gesicherter Datenordner (via Pastebin oder verschlüsselt zugesandt)
### localStorage voll
**Symptom:** Rapport schreibt Fehler-Toast "Speicher voll" beim Sichern.
**Ursache:** macOS WebView limitiert localStorage auf ~10 MB pro Origin.
**Lösung:**
- Sehr grosse Logos durch kleinere ersetzen (Bürodaten → Logo)
- Belege (Spesen) selektiv löschen oder als externe Datei archivieren
- Auf [Web-Modus](../web-modus) wechseln (Postgres ohne praktisches Limit)
## Updates
### Auto-Update findet nichts
**Diagnose:**
```bash
curl -s https://git.kgva.ch/karim/RAPPORT/raw/branch/main/APP/latest.json
```
→ sollte JSON liefern. Wenn nicht: Server-/Netzwerkproblem.
### Update lädt, lässt sich aber nicht installieren
**Ursache:** Signaturprüfung scheitert (Public-Key in App ≠ Signatur in `latest.json`).
**Lösung:** Manuelles Update — DMG direkt von [Releases](https://git.kgva.ch/karim/RAPPORT/releases) laden und installieren. Daten bleiben erhalten.
### "Diese Version überspringen" rückgängig machen
In **Einstellungen → Updates** → *Übersprungene Versionen zurücksetzen*. Beim nächsten Start wird die Version wieder angeboten.
## PDF / QR-Schein
### QR-Schein hat falsche Daten
**Diagnose-Checkliste:**
- [ ] IBAN korrekt? (CH, 21 Zeichen, keine Leerzeichen)
- [ ] Empfänger-Adresse vollständig? (PLZ und Ort beide gefüllt)
- [ ] Schuldner-Adresse vollständig?
- [ ] Betrag > 0?
- [ ] Referenz nicht zu lang? (max 27 Zeichen)
QR-Bibliothek: [`swissqrbill`](https://github.com/schoero/SwissQRBill) — bei merkwürdigen Fehlern dort nachschauen.
### PDF-Export ist leer / weisses Blatt
**Ursache:** Print-View hat keine Daten (möglicherweise Race-Condition beim Laden).
**Lösung:** Rechnung schliessen, erneut öffnen, dann PDF.
### PDF-Schrift sieht falsch aus
**Ursache:** Web-Schrift nicht geladen, Fallback greift.
**Lösung:** Vor dem Drucken warten, bis das Vorschau-Bild komplett geladen ist (35 Sek).
## System-Tray
### Tray-Icon erscheint nicht
**Plattform-Hinweis:** Tray-Icons unter macOS sind bei extrem voller Menüleiste oder unter "Bartender"/"Hidden Bar" eventuell unsichtbar.
**Diagnose:**
```bash
ps aux | grep -i rapport
```
→ wenn Prozess läuft, aber kein Icon: in den Tray-Manager-Apps prüfen.
**Konfiguration:** Einstellungen → System-Tray → *Tray-Icon ausblenden* (aus → Icon erzwingen).
### Tray-Menü reagiert nicht / hängt
**Lösung:** App via *Activity Monitor* hart beenden und neu starten. Daten gehen nicht verloren (alle Schreibungen sind synchron in localStorage).
## Web-Modus
### Login-Screen zeigt keine Server-URL
**Ursache:** `.env.production` enthielt nicht den richtigen `VITE_SUPABASE_URL` zur Build-Zeit.
**Lösung:** `.env.production` prüfen, dann `npm run build` neu, Container restart.
### Realtime-Updates kommen nicht an
**Ursache:** Websocket-Support fehlt im Reverse Proxy.
**Lösung:** In Nginx Proxy Manager für `api.*` Websocket Support aktivieren.
Siehe [Web-Modus § Troubleshooting](../web-modus#troubleshooting).
## Debug-Informationen sammeln
Bei einem Issue helfen folgende Infos:
```bash
# Rapport-Version
defaults read /Applications/Rapport.app/Contents/Info.plist CFBundleShortVersionString
# macOS-Version
sw_vers
# Architektur
uname -m
# Datenverzeichnis-Grösse
du -sh "~/Library/Application Support/com.rapport.app"
# Cache-Verzeichnis-Grösse
du -sh "~/Library/Caches/com.rapport.app"
```
→ Bei Issue mit anhängen.
## Wenn nichts hilft
[Neues Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues/new) mit:
- Was du gemacht hast
- Was passiert ist
- Was du erwartet hättest
- Screenshots (auch von DevTools-Konsole falls möglich)
- Rapport-Version und macOS-Version
+53
View File
@@ -0,0 +1,53 @@
---
title: Web-Modus (Multi-User)
linkTitle: Web-Modus
weight: 6
toc: true
---
> **Hinweis:** Der frühere Supabase-basierte Web-Modus wurde durch **[Rapport Server](../../server/)** abgelöst — den vollständigen Selfhost-Stack mit eigenem Postgres, Auth, Realtime und Storage. Keine externe Cloud-Abhängigkeit mehr.
>
> Diese Seite bleibt als Referenz erhalten, der **empfohlene Weg** für Multi-User-Setups ist **[Rapport Server](../../server/)**.
## Wann brauchst du das?
| Anwendungsfall | Empfehlung |
|---|---|
| **Solo-Büro, ein Mac** | Desktop-App — siehe [Installation](../installation) |
| **25 Personen, gleicher Standort** | [Rapport Server](../../server/) auf einem Mac Mini im LAN |
| **Verteiltes Team / Home-Office** | [Rapport Server](../../server/) mit SSL + Reverse Proxy |
| **Hosted Backend (eigener VPS)** | [Rapport Server](../../server/) auf Linux-VPS |
## Architektur (Kurzfassung)
```text
┌────────────┐ HTTPS ┌──────────────┐ SQL ┌────────────┐
│ Browser │ ──────────────│ nginx │ ─────────────│ Postgres │
│ / Desktop │ │ (Frontend) │ │ + GoTrue │
└────────────┘ └──────────────┘ │ + REST │
│ + Realtime │
│ + Storage │
└────────────┘
```
- **Frontend:** dieselbe React-App, aber Vite-Build statt Tauri (`npm run build`)
- **Backend:** Postgres-Stack ([Rapport Server](../../server/))
- **Auth:** E-Mail / Passwort über GoTrue
- **Storage:** Belege, Logos in Object-Storage
## Setup
Alle Setup-Schritte (Repo klonen, `.env` erstellen, Migrations syncen, Docker-Compose starten, Reverse-Proxy konfigurieren) sind in **[Rapport Server](../../server/)** dokumentiert.
## Migration Desktop → Cloud
Wer mit der Desktop-App startet und später auf den Web-Modus wechseln möchte:
- **Aktuell:** manueller Export aus Rapport (CSV/PDF) und manuelles Wiederanlegen im neuen Setup
- **Geplant:** *"localStorage → Postgres"*-Import-Knopf direkt in der App
Status: [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues).
## Troubleshooting
Siehe [Rapport Server § Troubleshooting](../../server/) oder [allgemeine Troubleshooting-Seite](../troubleshooting).
+99
View File
@@ -0,0 +1,99 @@
---
title: Downloads
linkTitle: Downloads
weight: 3
toc: true
---
Aktuelle Builds von Rapport. Quellcode und ältere Versionen auf [Gitea](https://git.kgva.ch/karim/RAPPORT/releases).
Rapport besteht aus zwei Komponenten:
| Komponente | Für wen | Aktuelle Version |
|---|---|---|
| **Desktop-App** | Solo-Büro, lokale Datenhaltung | 0.8.3 |
| **Rapport Server** | Team / Multi-User / Selfhost | 0.1.0 |
---
## Desktop-App — Pre-Release 0.8.3
<span class="rapport-status new">Aktuelle Version</span>
**Neuerungen** — siehe [Changelog](../docs/changelog#083) für Details.
### macOS
| Architektur | Download |
|---|---|
| **Apple Silicon (M1M4)** | [RAPPORT_0.8.3_aarch64.dmg](https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.3/RAPPORT%20PRE-RELEASE_0.8.3_aarch64.dmg) |
| **Intel (x86_64)** | [auf Anfrage](https://git.kgva.ch/karim/RAPPORT/issues/new) |
> **Erstinstallation:** *Systemeinstellungen → Datenschutz & Sicherheit* öffnen und Rapport zulassen. Die Builds sind über Tauri signiert, aber (noch) nicht Apple-notarisiert.
### Linux & Windows
**Geplant.** Rapport basiert auf Tauri 2 — eine Portierung ist möglich, sobald der Bedarf besteht. [Issue erstellen](https://git.kgva.ch/karim/RAPPORT/issues/new), wenn du eine Plattform brauchst.
---
## Rapport Server — 0.1.0
<span class="rapport-status new">Erstes Release</span>
Selfhost-Backend für Multi-User-Setups — Postgres, Auth, Realtime-Sync, Storage. Details und Setup-Anleitung auf der [Server-Seite](../server).
### Server-App (macOS)
GUI zum Starten, Stoppen und Verwalten der Server-Instanz auf einem Mac (Mac Mini, Studio-Rechner). Bündelt den Docker-Compose-Stack.
| Architektur | Download |
|---|---|
| **Apple Silicon (M1M4)** | [RAPPORT_SERVER_0.1.0_aarch64.dmg](https://git.kgva.ch/karim/rapport-server/releases/download/0.1.0/RAPPORT%20SERVER_0.1.0_aarch64.dmg) |
| **Intel (x86_64)** | [auf Anfrage](https://git.kgva.ch/karim/rapport-server/issues/new) |
> **Voraussetzung:** [Colima](https://github.com/abiosoft/colima) oder Docker Desktop muss installiert sein. Die App verwaltet den Container-Stack darüber.
### Docker (Linux / VPS / Headless)
Für Linux-Server, NAS oder VPS — der reine Docker-Compose-Stack ohne GUI.
```bash
git clone https://git.kgva.ch/karim/rapport-server.git
cd rapport-server
git checkout 0.1.0
cp .env.example .env
# .env editieren (POSTGRES_PASSWORD, JWT_SECRET, SITE_URL)
docker compose up -d
```
Vollständige Anleitung mit `.env`-Variablen, Reverse-Proxy und Backup → [Server-Seite](../server).
Container-Images werden von Docker Hub / Gitea-Registry gezogen — `docker compose pull` aktualisiert auf die neuesten Tags.
---
## Quellcode
**Desktop-App** — Tauri / React:
```bash
git clone https://git.kgva.ch/karim/RAPPORT.git
cd RAPPORT/APP
npm install
npm run tauri dev
```
Voraussetzungen: Node 20+, Rust (stable), Xcode-CLI (macOS).
**Rapport Server**:
```bash
git clone https://git.kgva.ch/karim/rapport-server.git
```
Beide Repos auf [Gitea](https://git.kgva.ch/karim) — Issues und PRs willkommen.
## Auto-Update
Seit 0.7.0 prüft die Desktop-App beim Start automatisch auf neue Versionen — siehe [Auto-Updater](../features/auto-updater). Für Rapport Server: `git pull && docker compose pull && docker compose up -d`.
+65
View File
@@ -0,0 +1,65 @@
---
title: FAQ
linkTitle: FAQ
weight: 4
toc: true
---
Häufige Fragen zu RAPPORT. Bei Bugs oder weiteren Fragen → [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues).
## Für wen ist Rapport gedacht?
Für **kleine Architekturbüros in der Schweiz**. Die Strukturen folgen der SIA 102 (Phasen, Honorar). Rapport wurde für den internen Gebrauch entwickelt und wird mit diesem Projekt öffentlich geteilt.
## Ist Rapport kostenlos?
**Ja, vollständig.** Quellcode unter GNU AGPL-3.0-or-later. Keine versteckten Kosten, keine Telemetrie. Die Daten bleiben lokal auf deinem Computer bzw. in deiner Instanz. Du hast die komplette Kontrolle über deine Daten.
## Welche Systeme werden unterstützt?
Aktuell nur **macOS** (Intel & Apple Silicon). Rapport basiert auf Tauri — eine Portierung auf **Linux** und **Windows** ist möglich, sobald der Bedarf seitens Community besteht.
## Wo werden die Daten gespeichert?
Rapport unterstützt **zwei Modi**, beide selbst-gehostet:
- **Desktop-App (Single-User)** — alle Daten liegen lokal auf deinem Mac (`localStorage` im Applikationsordner). Kein Server nötig, kein Cloud-Account, keine Telemetrie.
- **Server-Modus (Multi-User)** — Daten in einer eigenen PostgreSQL-Datenbank über [Rapport Server](../server). Mehrere Personen, Realtime-Sync, eigene Domain. Wechsel direkt im Login-Bildschirm der App.
In beiden Fällen bleibt die Kontrolle über die Daten bei dir.
## Ist die Software stabil genug für den Betrieb?
**Noch nicht.** Aktuell befindet sich Rapport in aktiver Entwicklung (Pre-Release **0.8.3**). Funktionen können sich ändern, Bugs sind möglich. Regelmässige Backups sind empfohlen. Testen und Feedback geben ist erwünscht.
## Was ist mit dem QR-Einzahlungsschein?
Rapport erzeugt **Schweizer QR-Rechnungen** nach Norm — direkt eingebettet in das PDF der Rechnung. IBAN, Bürodaten und Empfänger werden aus den Einstellungen bzw. den Kundendaten gezogen. Akonto-, Teil- und Schlussrechnungen werden unterstützt.
## Wie funktioniert die Zeiterfassung?
Tages- und Wochenraster mit **Drag & Drop**. Jeder Eintrag wird einem Projekt zugewiesen. Auswertungen pro Mitarbeiter und Projekt sind unter *Zeit* abrufbar. Ferienverwaltung mit Prorata und Jahresabschluss mit Überstundenausgleich.
## Kann ich zum Projekt beitragen?
**Ja.** Issues und Pull Requests sind willkommen auf [Gitea](https://git.kgva.ch/karim/RAPPORT). Rapport ist kein Framework — konkrete Verbesserungen für den **Büroalltag** sind am wertvollsten:
- Bug-Reports mit Reproduktionsschritten
- Workflow-Verbesserungen aus dem realen Büroalltag
- Vorlagen (Briefe, Protokolle, Lieferscheine) für andere Büros
- Übersetzungen / Internationalisierung
## Wie erhalte ich Hilfe bei einem Problem?
Ein [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues) ist der beste Weg. Bitte beschreibe, was du gemacht hast und was passiert ist. Screenshots helfen. Die Rapport-Version (links unten in der App) bitte angeben.
| Kanal | Verwendung |
|--------------------|-------------------------------------------|
| **Gitea Issues** | Bugs, Feature-Wünsche, allgemeine Fragen |
| **gabrielevarano.ch** | Entwickler-Kontakt |
## Warum Open Source?
Bürowissen sollte nicht in proprietären Tools eingesperrt sein. Studio-Management-Workflows sind in der Branche gut etabliert — ein Tool, das die Schweizer Konventionen (SIA 102, QR-Rechnung) sauber umsetzt, gehört allen.
**AGPL-3.0** stellt sicher, dass Verbesserungen wieder ins Projekt fliessen.
+20
View File
@@ -0,0 +1,20 @@
---
title: Features
linkTitle: Features
weight: 2
---
Die Bausteine von RAPPORT — Studio-Management für Schweizer Architekturbüros.
## Module
{{< cards >}}
{{< card link="zeiterfassung" title="Zeiterfassung" subtitle="Tages- & Wochenraster mit Drag & Drop." >}}
{{< card link="rechnungen" title="Rechnungen & Offerten" subtitle="QR-Einzahlungsscheine, SIA-Phasen, Akonto." >}}
{{< card link="projekte" title="Projekt- & Kundenverwaltung" subtitle="SIA 102, Budget, Phasen, Beteiligte." >}}
{{< card link="mitarbeiter" title="Mitarbeiter" subtitle="Ferien, Absenzen, Lohnabrechnung." >}}
{{< card link="spesen" title="Spesen & Bürobudget" subtitle="Belegupload, Jahresbudget, Internes." >}}
{{< card link="protokolle" title="Protokolle & Lieferscheine" subtitle="Sitzungsprotokolle, Briefe, Lieferscheine." >}}
{{< card link="auto-updater" title="Auto-Updater" subtitle="Signierte Updates via Tauri." >}}
{{< card link="system-tray" title="System-Tray" subtitle="Hide-on-Close, Quick-Open." >}}
{{< /cards >}}
+49
View File
@@ -0,0 +1,49 @@
---
title: Auto-Updater
linkTitle: Auto-Updater
weight: 7
toc: true
---
<span class="rapport-status new">Neu in 0.7.0</span>
**Rapport prüft beim Start automatisch auf neue Versionen** und installiert Updates signiert über Tauri. Einzelne Versionen können übersprungen werden.
## Funktionsweise
Beim App-Start:
1. Abfrage gegen `https://git.kgva.ch/karim/RAPPORT/releases/latest.json`
2. Versionsvergleich mit lokaler `version` im Tauri-Bundle
3. Bei neuer Version → Update-Dialog
4. Bei Bestätigung → Download + Signaturprüfung + Installation + Neustart
## Sicherheit
- Updates werden mit dem **Tauri-Updater-Schlüssel** signiert
- Manipulierte Downloads werden abgelehnt
- Quellcode und Build sind reproduzierbar (Gitea CI, geplant)
## Optionen
- **Update installieren** — Download & Neustart
- **Diese Version überspringen** — überspringt nur diese eine Version
- **Später erinnern** — beim nächsten Start erneut fragen
Updates können in den Einstellungen komplett deaktiviert werden.
## Latest-Endpoint
```json
{
"version": "0.8.3",
"notes": "Rapport 0.8.3",
"pub_date": "2026-05-24T00:00:00Z",
"platforms": {
"darwin-aarch64": {
"signature": "…",
"url": "https://git.kgva.ch/karim/RAPPORT/releases/download/0.8.3/RAPPORT%20PRE-RELEASE.app.tar.gz"
}
}
}
```
+52
View File
@@ -0,0 +1,52 @@
---
title: Mitarbeiter
linkTitle: Mitarbeiter
weight: 4
toc: true
---
<span class="rapport-status active">In Arbeit</span>
**Ferienverwaltung, interne Stunden / Absenzen und Lohnabrechnung.** Jahresabschluss mit Überstundenausgleich.
## Stammdaten
Pro Mitarbeiter:
- Name, Eintrittsdatum, Pensum (%)
- Stundensatz (intern, für Rechnungen)
- Ferienanspruch (Tage / Jahr)
- Lohn (monatlich, brutto)
## Ferienverwaltung
- **Prorata-Berechnung** bei Eintritt unter Jahr
- **Ferien-Saldo** in Tagen (live)
- **Halbtage** unterstützt
- **Übertrag** ins Folgejahr oder Auszahlung
## Absenzen
Krankheit, Militär, Mutterschaft, unbezahlter Urlaub — getrennt erfasst, mit Auswertung pro Mitarbeiter.
## Lohnabrechnung
Monatliche Abrechnung mit:
- Grundlohn (basierend auf Pensum)
- Überstunden-Vergütung
- Spesen-Erstattung
- Sozialabzüge (AHV, ALV, Pensionskasse)
PDF-Export pro Mitarbeiter.
## Jahresabschluss
- Ferien-Restguthaben übertragen oder auszahlen
- Überstunden ausgleichen oder vergüten
- Lohnausweis vorbereiten (Export)
## Verwandte Module
- [Zeiterfassung](../zeiterfassung) — Pensum-Soll vs. Stunden-Ist
- [Spesen](../spesen) — Spesen-Erstattung in der Lohnabrechnung
+53
View File
@@ -0,0 +1,53 @@
---
title: Projekt- & Kundenverwaltung
linkTitle: Projekte
weight: 3
toc: true
---
<span class="rapport-status active">In Arbeit</span>
**Projekte nach SIA 102** mit Budget, Phasen und Beteiligten. Erstellung aus einer Offerte mit Verknüpfung zu Zeiterfassung und Rechnungen.
## Projektstruktur
Jedes Projekt besitzt:
- **Stammdaten** — Nummer, Bezeichnung, Standort, Bauschätzwert
- **Kunde** — verknüpft mit Kundendatenbank
- **Beteiligte** — Bauleitung, Fachplaner, Behörden
- **Phasen** — SIA 102 (Vorprojekt, Bauprojekt, Ausschreibung, …)
- **Budget** — Gesamthonorar, pro Phase aufgeteilt
## SIA 102
Standard-Phasenverteilung wird vorgeschlagen, kann pro Projekt überschrieben werden.
| Phase | Anteil (Standard) |
|---|---|
| 31 — Vorprojekt | 9 % |
| 32 — Bauprojekt | 21 % |
| 33 — Bewilligung | 3 % |
| 41 — Ausschreibung | 18 % |
| 51 — Ausführung | 38 % |
| 52 — Inbetriebnahme | 6 % |
| 53 — Abschluss | 5 % |
## Kundendatenbank
- Adresse, Ansprechperson, Telefon, E-Mail
- Honorartyp (Stundensatz / SIA / Pauschal)
- Verknüpfung zu allen Projekten und Rechnungen des Kunden
## Auswertung
Pro Projekt:
- Geleistete Stunden vs. Budget
- Honorar-Saldo (verrechnet / Akonto / offen)
- Phasen-Fortschritt
## Verwandte Module
- [Rechnungen](../rechnungen) — Offerte → Projekt
- [Zeiterfassung](../zeiterfassung) — Stunden-Auswertung pro Phase
+44
View File
@@ -0,0 +1,44 @@
---
title: Protokolle & Lieferscheine
linkTitle: Protokolle
weight: 6
toc: true
---
<span class="rapport-status active">In Arbeit</span>
**Einfache Erstellung von Sitzungsprotokollen** mit Beschlüssen und Aufgaben. Briefe und Lieferscheine im gleichen Erscheinungsbild.
## Sitzungsprotokolle
Pro Sitzung:
- Datum, Ort, Teilnehmer (aus Beteiligten-Liste)
- **Traktanden** als nummerierte Liste
- Pro Traktandum: Beschluss, Aufgabe, Verantwortlich, Frist
- Anhänge
PDF-Export mit Bürobriefbogen.
## Briefe
Brief-Editor mit:
- Empfänger aus Kundendatenbank
- Bezugszeile, Anrede, Text, Grussformel
- Briefbogen-Vorlage mit Logo
- PDF-Export
## Lieferscheine
Pro Lieferung:
- Empfänger, Datum, Bezug
- Positionen (Plan-Nummer, Bezeichnung, Anzahl, Massstab)
- Unterschriftenfeld
Konsistentes Erscheinungsbild über alle Dokumenttypen — eine Briefbogen-Vorlage, mehrere Verwendungen.
## Verwandte Module
- [Projekte](../projekte) — Beteiligte als Empfänger
+44
View File
@@ -0,0 +1,44 @@
---
title: Rechnungen & Offerten
linkTitle: Rechnungen
weight: 2
toc: true
---
<span class="rapport-status active">In Arbeit</span>
**QR-Einzahlungsscheine, SIA-Phasen, Akonto-, Teil- und Schlussrechnungen.** Offerten sind in Projekte und Rechnungen konvertierbar. PDF-Export.
## Workflow
1. **Offerte** erstellen — auf Basis SIA 102 oder pauschal
2. Kunde nimmt an → **konvertieren in Projekt + Rechnung**
3. **Akonto-Rechnungen** während der Projektlaufzeit
4. **Schlussrechnung** mit Differenz zum bisher Akonto-bezahlten
## QR-Einzahlungsschein
Schweizer **QR-Rechnung** nach Norm — direkt eingebettet in die PDF.
Ausgelesen aus:
- **Bürodaten** — IBAN, Empfänger-Adresse
- **Kundendaten** — Schuldner-Adresse
- **Rechnungs-Daten** — Betrag, Referenz, Zusatzinformation
## Honorarmodelle
| Modell | Berechnung | Verwendung |
|---|---|---|
| **Stundensatz** | Aus Zeiterfassung × Mitarbeiter-Stundensatz | Kleinaufträge, Beratung |
| **SIA-Phasen** | Bauschätzwert × Honorarsatz × Phasenanteil | Reguläre Architektur-Aufträge |
| **Pauschal** | Fester Betrag | Auf Wunsch des Kunden |
## PDF-Export
Druckfertige Rechnung inkl. QR-Schein. Layout aus dem Büro-Briefbogen (mit Logo). Mehrsprachig DE/FR/IT (geplant).
## Verwandte Module
- [Projekte](../projekte) — Honorarstruktur stammt aus dem Projekt
- [Zeiterfassung](../zeiterfassung) — Stundensatz-Rechnungen
+40
View File
@@ -0,0 +1,40 @@
---
title: Spesen & Bürobudget
linkTitle: Spesen
weight: 5
toc: true
---
<span class="rapport-status active">In Arbeit</span>
**Spesenerfassung mit Belegupload.** Jahresbudget mit Einnahmen und Ausgaben. Internes Rechnungswesen.
## Spesenerfassung
Pro Mitarbeiter:
- Datum, Betrag, Kategorie
- **Beleg-Upload** (PDF, JPG, PNG)
- Projekt-Zuordnung (optional)
- Status (offen / erstattet)
Kategorien: Reise, Verpflegung, Material, Telefon, Sonstiges.
## Jahresbudget
Übersicht über:
- **Einnahmen** — Rechnungsbeträge, sortiert nach Eingang
- **Ausgaben** — Spesen, Bürokosten, Löhne, Sozialabzüge
- **Saldo** pro Monat / Quartal / Jahr
## Auswertung
- Einnahmen pro Kunde / Projekt
- Ausgaben pro Kategorie / Mitarbeiter
- Erfolgsrechnung pro Geschäftsjahr (vereinfacht)
## Verwandte Module
- [Mitarbeiter](../mitarbeiter) — Spesen-Erstattung in der Lohnabrechnung
- [Rechnungen](../rechnungen) — Einnahmen-Quelle
+40
View File
@@ -0,0 +1,40 @@
---
title: System-Tray
linkTitle: System-Tray
weight: 8
toc: true
---
<span class="rapport-status new">Neu in 0.7.0</span>
**Schnellzugriff über die Menüleiste mit Hide-on-Close.** Beim Schliessen läuft Rapport im Hintergrund weiter — Cmd+Q beendet die App vollständig.
## Verhalten
| Aktion | Verhalten |
|---|---|
| **Fenster schliessen** (⌘W oder rotes X) | App läuft im Tray weiter |
| **Cmd+Q** | App wird vollständig beendet |
| **Klick auf Tray-Icon** | Fenster nach vorne, oder zeigen |
| **Rechtsklick auf Tray-Icon** | Menü mit Schnellzugriffen |
## Tray-Menü
- **Rapport zeigen** — Fenster nach vorne
- **Neue Zeiterfassung** — direkt im Zeit-Modul
- **Neue Rechnung** — direkt im Rechnungs-Modul
- **Letzte Projekte** — Quick-Open der letzten 5 Projekte
- **Einstellungen**
- **Rapport beenden**
## Konfiguration
In den Einstellungen:
- **Beim Systemstart starten** (Login-Item) — Standard: aus
- **Beim Schliessen beenden** statt ins Tray — Standard: aus
- **Tray-Icon ausblenden** — App läuft, aber kein Menüleisten-Icon
## Verwandte Module
- [Auto-Updater](../auto-updater) — prüft Updates im Hintergrund
+45
View File
@@ -0,0 +1,45 @@
---
title: Zeiterfassung
linkTitle: Zeiterfassung
weight: 1
toc: true
---
<span class="rapport-status active">In Arbeit</span>
**Tages- und Wochenraster** mit Drag & Drop. Auswertungen pro Mitarbeiter und Projekt. Ferienverwaltung mit Prorata und Jahresabschluss.
## Konzept
Die Zeiterfassung ist das **Kernmodul** von RAPPORT — alle anderen Module (Rechnungen, Auswertungen, Lohnabrechnung) greifen auf die hier erfassten Stunden zu.
## Eingabe
- **Wochenraster** mit den 5 (oder 7) Arbeitstagen
- **Halbstunden-Slots** von 06:00 bis 22:00
- **Klick** oder **Drag** über mehrere Slots
- Jeder Eintrag wird einem **Projekt** zugewiesen (Pflichtfeld)
- Mehrfacheinträge pro Slot möglich (z. B. parallele Telefonate)
## Auswertungen
Pro Mitarbeiter und pro Projekt:
- Geleistete Stunden vs. Soll-Pensum
- Ferienanspruch / -saldo (mit Prorata bei Eintritt unter Jahr)
- Überstunden-Saldo
- Stundenaufschlüsselung nach SIA-Phase pro Projekt
## Jahresabschluss
Am Jahresende:
- Ferien-Restguthaben übertragen oder auszahlen
- Überstunden ausgleichen oder vergüten
- Neues Jahr automatisch initialisieren
## Verwandte Module
- [Rechnungen](../rechnungen) — Stundensatz-Rechnungen ziehen direkt aus der Zeiterfassung
- [Projekte](../projekte) — Stunden-Auswertung pro SIA-Phase
- [Mitarbeiter](../mitarbeiter) — Pensum, Ferienanspruch
+104
View File
@@ -0,0 +1,104 @@
---
title: Lizenz & Mitwirkende
linkTitle: Lizenz
weight: 99
toc: true
---
Lizenz von RAPPORT, Zugehörigkeit zu OpenBureau und Attribution der verwendeten Open-Source-Software.
## RAPPORT
**RAPPORT** — Studio Management Software für Architekturbüros.
Quellcode: [git.kgva.ch/karim/RAPPORT](https://git.kgva.ch/karim/RAPPORT)
Autor: [Karim Gabriele Varano](https://gabrielevarano.ch)
### Lizenz
Lizenziert unter **GNU Affero General Public License v3.0 oder höher** ([AGPL-3.0-or-later](https://www.gnu.org/licenses/agpl-3.0.html)).
> Dies bedeutet im Kern:
>
> - **Freie Nutzung** für jeden Zweck (privat, kommerziell, behördlich)
> - **Freier Zugang** zum Quellcode
> - **Freie Modifikation** und Weitergabe — unter derselben Lizenz
> - **Netzwerk-Nutzung gilt als Weitergabe** — wer eine modifizierte Version als Service anbietet, muss den Quellcode offenlegen
Eigene Builds, eigene Forks, eigene Anpassungen — alles erlaubt, solange Modifikationen wieder unter AGPL-3.0 veröffentlicht werden.
## OpenBureau
RAPPORT ist Teil der **OpenBureau**-Initiative — einer Sammlung freier Software-Werkzeuge für den Architektur-Büro-Alltag.
Die Idee: Bürowissen — Workflows, Konventionen, Vorlagen — sollte nicht in proprietären Tools eingesperrt sein. OpenBureau-Tools setzen die in der Branche etablierten Konventionen (SIA-Normen, QR-Rechnung, Plan-Verwaltung) sauber um und stehen unter freien Lizenzen zur Verfügung.
| Tool | Zweck | Status |
|---|---|---|
| **RAPPORT** | Studio-Management Desktop-App (Zeit, Rechnungen, Projekte) | Pre-Release |
| **Rapport Server** | Selfhost-Stack (Postgres + Auth + Realtime + Storage) | Pre-Release |
| **DOSSIER** | Rhino-8-Plugin für Plan- und Dokumentationsausgabe | Pre-Release |
Mehr unter [gabrielevarano.ch](https://gabrielevarano.ch).
## Verwendete Open-Source-Software
RAPPORT baut auf freier Software auf. Diese Liste nennt die wichtigsten Komponenten und ihre jeweiligen Lizenzen.
### Frontend
| Software | Verwendung | Lizenz |
|---|---|---|
| [React 19](https://react.dev/) | UI-Bibliothek | MIT |
| [Vite](https://vite.dev/) | Build-Tool, Dev-Server | MIT |
| [swissqrbill](https://github.com/schoero/SwissQRBill) | QR-Einzahlungsscheine | MIT |
### Desktop-Wrapper
| Software | Verwendung | Lizenz |
|---|---|---|
| [Tauri 2](https://v2.tauri.app/) | Cross-Platform Desktop-Wrapper | MIT / Apache-2.0 |
| [WebKit](https://webkit.org/) | WebView-Engine (macOS) | LGPL-2.1 / BSD |
### Rapport Server (Selfhost-Stack)
| Software | Verwendung | Lizenz |
|---|---|---|
| [PostgreSQL](https://www.postgresql.org/) | Datenbank | PostgreSQL-Lizenz |
| [GoTrue](https://github.com/supabase/gotrue) | Authentication-Service | MIT |
| [PostgREST](https://postgrest.org/) | REST-API über Postgres-Schema | MIT |
| [Realtime](https://github.com/supabase/realtime) | WebSocket-Sync | Apache-2.0 |
| [Storage](https://github.com/supabase/storage-api) | Object-Storage für Belege & Logos | Apache-2.0 |
| [Kong](https://konghq.com/) | API-Gateway | Apache-2.0 |
| [nginx](https://nginx.org/) | Frontend-Webserver | BSD-2-Clause |
| [Docker Compose](https://docs.docker.com/compose/) | Orchestrierung | Apache-2.0 |
### Diese Website
| Software | Verwendung | Lizenz |
|---|---|---|
| [Hugo](https://gohugo.io/) | Static-Site-Generator | Apache-2.0 |
| [Hextra](https://imfing.github.io/hextra/) | Hugo-Theme (von Xin) | MIT |
| [Inter](https://rsms.me/inter/) | UI-Schrift (Rasmus Andersson) | SIL OFL 1.1 |
| [Playfair Display](https://fonts.google.com/specimen/Playfair+Display) | Headings | SIL OFL 1.1 |
Alle Logos und Marken-Namen gehören ihren jeweiligen Eigentümern.
## Lizenz-Volltexte
Die vollständigen Lizenztexte:
- [AGPL-3.0](https://www.gnu.org/licenses/agpl-3.0.html) — RAPPORT
- [MIT](https://opensource.org/licenses/MIT) — React, Vite, Tauri, Hextra, swissqrbill
- [Apache-2.0](https://opensource.org/licenses/Apache-2.0) — Tauri, Hugo, Supabase
- [SIL OFL 1.1](https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL) — Inter, Playfair Display
## Mitwirkende
RAPPORT wird derzeit als Ein-Personen-Projekt von [Karim Gabriele Varano](https://gabrielevarano.ch) entwickelt. Beiträge — Code, Issues, Übersetzungen, Vorlagen — sind willkommen.
Wer beitragen möchte → [Gitea Issues](https://git.kgva.ch/karim/RAPPORT/issues).
## Kontakt
Fragen zur Lizenz, kommerzieller Einsatz, Spezialfälle: [Issue auf Gitea](https://git.kgva.ch/karim/RAPPORT/issues) oder via [gabrielevarano.ch](https://gabrielevarano.ch).
+227
View File
@@ -0,0 +1,227 @@
---
title: Rapport Server
linkTitle: Server
weight: 4
toc: true
---
<span class="rapport-status new">Self-Hosting</span>
**Rapport Server** — der vollständige Selfhost-Stack für Rapport. Eigene Daten, eigene Domain, eigener Server. Komplett Open-Source, Docker-Compose, AGPL-3.0.
## Wann brauchst du Rapport Server?
| Szenario | Lösung |
|---|---|
| **Ein Mensch, ein Mac** | Desktop-App reicht — [Installation](../docs/installation) |
| **Mehrere Personen im Studio** | Rapport Server auf einem Mac Mini oder Linux-Server |
| **Verteiltes Team, Home-Office, Mobile-Zugriff** | Rapport Server mit Reverse-Proxy + SSL |
| **Cloud-Hosting bei einem Anbieter** | Rapport Server auf VPS/Hetzner/etc. |
> Die Desktop-App speichert lokal als JSON. Rapport Server bringt **Postgres + Multi-User + Realtime-Sync** — für alle, die zu zweit oder im Team arbeiten.
## Architektur
Rapport Server bündelt sechs Open-Source-Komponenten zu einem stimmigen Stack:
```text
┌──────────────────────────────────────────────────────┐
│ Browser / Desktop-App │
└──────────────┬───────────────────────┬───────────────┘
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ nginx │ │ Kong │ ← API-Gateway
│ (app) │ │ │
└──────────┘ └──────────┘
┌───────────────────┼─────────────────────┐
▼ ▼ ▼
┌────────┐ ┌──────────┐ ┌─────────┐
│ GoTrue │ │PostgREST │ │ Realtime│
│ (Auth) │ │ (API) │ │ (WS) │
└────────┘ └──────────┘ └─────────┘
│ │ │
└───────────────────┼─────────────────────┘
┌─────────────────┐
│ PostgreSQL │
└─────────────────┘
┌─────────────────┐
│ Storage │ ← Belege, Logos
└─────────────────┘
```
| Komponente | Funktion |
|---|---|
| **PostgreSQL** | Datenbank — alle Rapport-Daten |
| **GoTrue** | Authentication — Email/Passwort, JWT-Tokens |
| **PostgREST** | REST-API direkt aus dem Postgres-Schema |
| **Realtime** | WebSocket-Sync für Live-Updates |
| **Storage** | Object-Storage für Belege & Logos |
| **Kong** | API-Gateway, routet alle Calls |
| **app** (nginx) | Liefert das Rapport-Frontend (React-Build) |
Alles in **einem Docker-Compose**. Keine Cloud-Abhängigkeit, keine Telemetrie.
## Voraussetzungen
| OS | Container-Runtime |
|---|---|
| **Linux** (Ubuntu 22.04+, Debian 12+, …) | Docker Engine + Compose v2 |
| **macOS** (Mac Mini etc.) | [Colima](https://github.com/abiosoft/colima) + Docker CLI — voll OSS |
> Auf macOS funktionieren auch OrbStack oder Docker Desktop, beide sind aber proprietär. **Colima** ist die OSS-Alternative und für Selfhost vollkommen ausreichend.
**Plus:** ein DNS-Name für TLS (z. B. `rapport.studio.ch`), und optional ein Reverse-Proxy wie [Nginx Proxy Manager](https://nginxproxymanager.com/) oder [Caddy](https://caddyserver.com/).
## Setup in 5 Schritten
### 1 · Repo klonen
```bash
git clone https://git.kgva.ch/karim/rapport-server.git
cd rapport-server
```
### 2 · `.env` erstellen
```bash
cp .env.example .env
```
In `.env` müssen mindestens diese Werte ersetzt werden:
| Variable | Was |
|---|---|
| `POSTGRES_PASSWORD` | DB-Passwort (≥ 32 Zeichen, zufällig) |
| `JWT_SECRET` | JWT-Signatur (≥ 32 Zeichen, zufällig) |
| `ANON_KEY` / `SERVICE_ROLE_KEY` | aus JWT-Secret abgeleitet |
| `SITE_URL` | Public-URL der Instanz (z. B. `https://app.rapport.studio.ch`) |
Zufallswerte generieren:
```bash
openssl rand -hex 32 # für POSTGRES_PASSWORD und JWT_SECRET
node scripts/generate-keys.mjs # ANON_KEY + SERVICE_ROLE_KEY aus JWT_SECRET
```
### 3 · Migrations holen
Die SQL-Migrations stammen aus dem App-Repo. Einmal initial holen:
```bash
./scripts/sync-migrations.sh
```
Bei späteren Rapport-Updates erneut ausführen, dann `docker compose down && docker compose up -d`.
### 4 · Stack starten
```bash
docker compose up -d
```
Erststart dauert ~1 Minute (Postgres initialisiert sich, Migrations laufen, Container starten).
### 5 · Health-Check
```bash
docker compose ps
```
Alle Container sollten `healthy` zeigen. Frontend ist dann erreichbar unter `http://localhost:8080`.
## Reverse-Proxy + HTTPS
Für Production-Setups mit eigener Domain — **Caddy** ist die einfachste Variante (config-as-code, Let's-Encrypt automatisch):
```caddy
app.rapport.studio.ch {
reverse_proxy localhost:8080
}
api.rapport.studio.ch {
reverse_proxy localhost:8000
}
```
In `.env` dann:
```env
SITE_URL=https://app.rapport.studio.ch
API_EXTERNAL_URL=https://api.rapport.studio.ch
```
Alternativ über **Nginx Proxy Manager** mit Web-UI — siehe [Troubleshooting](../docs/troubleshooting).
## Updates
```bash
git pull
./scripts/sync-migrations.sh # falls neue SQL-Migrationen
docker compose pull # neueste Container-Versionen
docker compose up -d # neu starten
```
Daten bleiben erhalten — das Volume `postgres-data` wird nicht angetastet.
## Backup
### Postgres-Dump
```bash
docker compose exec -T db pg_dumpall -U postgres > backup-$(date +%Y%m%d).sql
```
Empfohlen: per `cron` täglich + auf externe Disk / S3 / Backblaze sichern.
### Storage (Belege, Logos)
```bash
docker compose exec storage tar -czf - /var/lib/storage > storage-$(date +%Y%m%d).tar.gz
```
### Restore
```bash
docker compose down
docker volume rm rapport-server_postgres-data
docker compose up -d db
sleep 10
cat backup-YYYYMMDD.sql | docker compose exec -T db psql -U postgres
docker compose up -d
```
## Bezug Rapport ↔ Rapport Server
| Komponente | Wo | Lizenz |
|---|---|---|
| **Rapport Desktop-App** | [git.kgva.ch/karim/RAPPORT](https://git.kgva.ch/karim/RAPPORT) | AGPL-3.0 |
| **Rapport Server** | [git.kgva.ch/karim/rapport-server](https://git.kgva.ch/karim/rapport-server) | AGPL-3.0 |
Die Desktop-App kann **wahlweise** im Lokal-Modus (JSON, kein Server nötig) oder im Cloud-Modus (gegen Rapport Server) betrieben werden. Wechsel erfolgt im Login-Bildschirm der App.
## Häufige Fragen
### Brauche ich Supabase Cloud?
**Nein.** Rapport Server ist die Selfhost-Variante derselben Komponenten (Postgres + GoTrue + PostgREST + Realtime + Storage), aber komplett auf eigener Infrastruktur. Kein Supabase-Account, keine externe Abhängigkeit.
### Kann ich von der Desktop-App auf Rapport Server migrieren?
Im Login der Desktop-App auf **Cloud** wechseln, Server-URL eingeben, Account erstellen, Daten manuell wieder anlegen (Bürodaten, Mitarbeiter, Kunden). Ein direkter localStorage → Postgres-Import ist [geplant](https://git.kgva.ch/karim/RAPPORT/issues).
### Was kostet das?
Nichts — Rapport Server ist Open-Source (AGPL-3.0). Du brauchst nur einen Server (Mac Mini, NAS, VPS) und ggf. eine Domain.
### Wieviel Server-Resourcen?
Ein Mac Mini M1 (8 GB RAM) reicht problemlos für ein 5-Personen-Studio. Linux-VPS mit 2 GB RAM + 2 CPU reicht auch.
## Quellcode
[git.kgva.ch/karim/rapport-server](https://git.kgva.ch/karim/rapport-server) — Issues, Pull Requests und Forks willkommen.