---
title: Dossier-Launcher
linkTitle: Launcher
weight: 3
toc: true
---

Der **Dossier-Launcher** ist eine separate **Tauri 2** Standalone-App. Sie verwaltet Projekte, hält Settings, liefert Auto-Updates und lebt im System-Tray. Aktuell produktiv im Einsatz für Projekt-Switching, Window-Layout-Push und Plugin-Settings.

## Was er macht

{{< cards >}}
  {{< card title="Projekt-Verwaltung" icon="collection" subtitle="Liste aller DOSSIER-Projekte mit Pfad, letztem Zugriff und Phase." >}}
  {{< card title="Settings-Sync" icon="cog" subtitle="Schreibt Plugin-Settings in dossier_settings.json — Rhino liest live." >}}
  {{< card title="Auto-Updates" icon="cloud-download" subtitle="Über tauri-plugin-updater, signiert mit Code-Signing-Key." >}}
  {{< card title="System-Tray" icon="desktop-computer" subtitle="Quick-Open der letzten 5 Projekte, ohne Hauptfenster zu öffnen." >}}
  {{< card title="Window-Layouts" icon="template" subtitle="Live-Push von Window-Layouts an laufende Rhino-Session." >}}
  {{< card title="Recent-Cache" icon="clock" subtitle="recent.json — letzte 50 geöffnete Projekte für Quick-Access." >}}
{{< /cards >}}

## Technologie

| Komponente   | Stack                              |
|--------------|------------------------------------|
| Frontend     | React + Vite (`launcher/src/`)     |
| Backend      | Rust + Tauri 2 (`launcher/src-tauri/`) |
| Update-Plugin| `tauri-plugin-updater`             |
| Tray-Plugin  | `tauri-plugin-tray`                |
| IPC zu Rhino | Dateibasiert (kein Socket)         |

## Settings-Files

Pfad-Hierarchie:

1. **Primär** (Launcher schreibt):
   `~/Library/Application Support/ch.gabrielevarano.Dossier/dossier_settings.json`
2. **Legacy-Fallback** (read-only):
   `~/Library/Application Support/RhinoPanel/dossier_settings.json`

Recent-Cache:
`~/Library/Application Support/ch.gabrielevarano.Dossier/recent.json`

## Bekannte Settings-Keys

| Key                  | Beschreibung                                          |
|----------------------|-------------------------------------------------------|
| `windowLayout`       | Aktives Window-Layout (XML-Display-Name)              |
| `autoApplyLayout`    | Bool — Layout beim Projekt-Wechsel anwenden?          |
| `pendingApplyLayout` | Pending Layout-Name — wird von `oberleiste.tick_idle()` gepollt und gelöscht |
| `rhinoApp`           | Pfad zum Rhino-App-Bundle                             |
| `templatePath`       | Default-Template für neue Projekte                    |

## Window-Layouts auf Mac

Mac Rhino 8 speichert Window-Layouts als **XML** unter:

```text
~/Library/Application Support/McNeel/Rhinoceros/8.0/settings/Scheme__Default/workspaces/<GUID>.xml
```

Display-Name aus dem `<RhinoUI name="…">` Attribut. Der Launcher liest diese Datei direkt — kein `.rwl` wie auf Windows.

**Apply** via Reflection über `Rhino.UI.WindowLayout.*`, Fallback `_-SetActiveLayout "Name" _Enter`.

## Live-Push Workflow

```text
Launcher ─writes─▶ pendingApplyLayout key ──▶ dossier_settings.json
                                                     │
                                                     ▼
Rhino-Plugin: oberleiste.tick_idle() ─polls─▶ liest + clearet
                                                     │
                                                     ▼
                                              Window-Layout aktiv
```

Polling-Intervall: 500 ms im Rhino-Idle-Handler. Latenz spürbar < 1 s.

## Setup

```bash
cd launcher
npm install
npm run tauri dev      # Development-Mode
```

Release-Build mit Code-Signing:

```bash
cd launcher
./scripts/release.sh   # → schreibt latest.json für Updater
```

Voraussetzungen siehe [Tauri Prerequisites](https://v2.tauri.app/start/prerequisites/).

## Standalone

**Rhino läuft ohne Launcher** — Settings haben sinnvolle Defaults, Plugin funktioniert direkt aus dem PackageManager-Install.

**Launcher läuft ohne Rhino** — Projekt-Verwaltung, Settings-Editor und Updates funktionieren auch ohne installiertes Rhino. IPC ist bewusst dateibasiert.
