diff --git a/.planning/HANDOFF.json b/.planning/HANDOFF.json
deleted file mode 100644
index dba6f63..0000000
--- a/.planning/HANDOFF.json
+++ /dev/null
@@ -1,29 +0,0 @@
-{
- "version": "1.0",
- "timestamp": "2026-06-25T10:36:54.489Z",
- "phase": "06",
- "phase_name": "desktop-client-ci-cd",
- "phase_dir": ".planning/phases/06-desktop-client-ci-cd",
- "plan": 3,
- "task": 4,
- "total_plans": 3,
- "completed_plans": ["06-01"],
- "in_progress_plans": ["06-03"],
- "remaining_plans": ["06-02"],
- "status": "in_progress",
- "stopped_at": "Plan 06-03 Task 4 — CI pipeline verification pending (Run #87)",
- "resume_command": "/gsd-execute-phase 6",
- "blockers": [],
- "human_actions_pending": [
- "Check CI pipeline Run #87 result at https://git.vicolab.de/schalli/tessera-ctl/actions",
- "If pipeline still fails, check type-check step — prisma generate postinstall was added"
- ],
- "decisions": [
- "Gitea user: schalli, repo: schalli/tessera-ctl (private)",
- "Gitea URL: https://git.vicolab.de",
- "Git remote uses embedded token credentials in URL",
- "act_runner already existed as Docker container, reused instead of creating new",
- "Replaced pnpm/action-setup@v4 with corepack for Gitea Actions compatibility",
- "Added prisma generate postinstall to apps/api for CI type-check"
- ]
-}
diff --git a/.planning/STATE.md b/.planning/STATE.md
index 95f312b..ac316e1 100644
--- a/.planning/STATE.md
+++ b/.planning/STATE.md
@@ -2,16 +2,16 @@
gsd_state_version: 1.0
milestone: v1.0
milestone_name: milestone
-status: executing
-stopped_at: context exhaustion at 76% (2026-06-25)
-last_updated: "2026-06-25T09:55:59.913Z"
-last_activity: 2026-06-25 -- Phase 06 execution started
+status: complete
+stopped_at: all phases complete
+last_updated: "2026-06-25T12:00:00.000Z"
+last_activity: 2026-06-25 -- Phase 06 all plans complete
progress:
total_phases: 6
- completed_phases: 4
+ completed_phases: 6
total_plans: 24
- completed_plans: 22
- percent: 67
+ completed_plans: 24
+ percent: 100
---
# Project State
@@ -25,12 +25,12 @@ See: .planning/PROJECT.md (updated 2026-06-18)
## Current Position
-Phase: 06 (desktop-client-ci-cd) — EXECUTING
+Phase: 06 (desktop-client-ci-cd) — COMPLETE
Plan: 3 of 3
-Status: Ready to execute
-Last activity: 2026-06-25 -- Phase 06 execution started
+Status: All plans complete
+Last activity: 2026-06-25 -- Phase 06 complete (CI green, AppImage built)
-Progress: [████████░░] 86%
+Progress: [██████████] 100%
## Performance Metrics
@@ -115,6 +115,6 @@ Items acknowledged and carried forward from previous milestone close:
## Session Continuity
-Last session: 2026-06-25T09:55:59.905Z
-Stopped at: context exhaustion at 76% (2026-06-25)
+Last session: 2026-06-25T12:00:00Z
+Stopped at: All 6 phases complete — v1.0 milestone done
Resume file: None
diff --git a/.planning/phases/05-dashboard-calendar/.continue-here.md b/.planning/phases/05-dashboard-calendar/.continue-here.md
deleted file mode 100644
index c9bbd51..0000000
--- a/.planning/phases/05-dashboard-calendar/.continue-here.md
+++ /dev/null
@@ -1,50 +0,0 @@
----
-context: phase
-phase: 05-dashboard-calendar
-task: null
-total_tasks: null
-status: complete
-last_updated: 2026-06-24T20:40:58.014Z
----
-
-
-Phase 05 Dashboard & Calendar is COMPLETE. All 5 plans executed, verified, and approved by human.
-ROADMAP status updated to Complete. No remaining work in this phase.
-
-
-
-
-Session Work (2026-06-24):
-- Plan-phase finalized: checker verification, wave fix (05-04 wave 3→4, 05-05 wave 4→5), ROADMAP corrected (was showing 4 plans, Phase 6 had stale 05-xx refs), all gates passed (10/10 reqs, 22/22 decisions, 32/32 gap analysis)
-- 05-01 executed: Dashboard foundation — Prisma models, CRUD API, react-grid-layout grid, ClockWidget, widget-registry, Zustand store, settings shell, header link, i18n (5 commits)
-- 05-02 executed: Search + Notes widgets, SearchProvider backend, widget settings panel (5 commits, session limit interrupted — continued with fresh agent)
-- 05-03 executed: Calendar backend — CalendarSource model, AES-256-GCM CryptoService, CalDAV/ICS/Exchange providers, event aggregation with cache (5 commits)
-- 05-04 executed: Calendar frontend — calendar widget, settings UI, API client (5 commits)
-- 05-05 verified: Pre-flight (46 tests green, tsc clean), human checkpoint approved after 2 fixes
-- Fix: CALENDAR_ENCRYPTION_KEY dev default added to docker-compose.yml
-- Fix: i18n flat dot-keys converted to nested structure for next-intl compatibility
-
-
-
-No remaining work for Phase 05. Next milestone work:
-- Phase 06: Desktop Client & CI/CD (not yet planned — run /gsd-plan-phase 06)
-
-
-
-- Worktree isolation degraded to sequential (origin/HEAD unresolvable) — all plans ran sequentially on main tree
-- CALENDAR_ENCRYPTION_KEY: generated dev default hardcoded in docker-compose.yml fallback (production should use .env)
-- i18n structure: converted flat dot-keys to nested objects (next-intl requires nested for useTranslations namespace scoping)
-
-
-
-None.
-
-
-## Infrastructure State
-- Docker stack running (api healthy, db healthy, web up)
-- CALENDAR_ENCRYPTION_KEY set via docker-compose.yml dev default
-- 46 web tests passing, API tsc clean
-
-
-Run `/gsd-plan-phase 06` to plan Phase 6: Desktop Client & CI/CD (Tauri wrapper + Gitea integration).
-
diff --git a/.planning/phases/06-desktop-client-ci-cd/.continue-here.md b/.planning/phases/06-desktop-client-ci-cd/.continue-here.md
deleted file mode 100644
index eb71348..0000000
--- a/.planning/phases/06-desktop-client-ci-cd/.continue-here.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Continue Here — Phase 06: Desktop Client & CI/CD
-
-**Paused:** 2026-06-25T10:36Z
-**Resume:** `/gsd-execute-phase 6`
-
-## Current State
-
-### Plan 06-01: Tauri Desktop Wrapper ✅ COMPLETE
-- Toolchain installed (rustc 1.96.0, WebKitGTK 2.52.3)
-- apps/desktop scaffolded as @tessera/desktop, cargo check passes
-- First-run setup.html with server URL persistence
-- Commits: 48e3a69, d944aaa, f41e673
-
-### Plan 06-03: Gitea CI/CD ⏳ IN PROGRESS (Task 4/4)
-- Gitea user `schalli` created, repo `schalli/tessera-ctl` (private)
-- Remote: `origin` → `https://git.vicolab.de/schalli/tessera-ctl.git` (token in URL)
-- act_runner: existing Docker container reused (gitea-docker-runner-1, v0.6.1)
-- docker-compose.ci.yml + docs/ci-cd-setup.md created (c0e3293)
-- .gitea/workflows/ci.yml created (756925b)
-- **CI fixes pushed:** corepack statt pnpm/action-setup (e5d45e1), prisma generate postinstall (faff50b)
-- **Pending:** Run #87 Ergebnis pruefen — type-check sollte jetzt passen
-
-### Plan 06-02: Native Desktop Features ❌ NOT STARTED (Wave 2)
-- Depends on 06-01 (complete)
-- Tray, close-to-tray, window-state, autostart, notifications, version check, icons, bundles
-
-## Human Actions Before Resume
-
-1. Check Pipeline Run #87: https://git.vicolab.de/schalli/tessera-ctl/actions
-2. If still failing, paste the error — likely needs another CI fix
-
-## Key Infrastructure
-
-- **Gitea:** https://git.vicolab.de — User: schalli, Token in git remote URL
-- **Runner Token:** SK5NCGjVMTxg6NYleLeOlc3qAuLrDxbvlENGIixJ
-- **MCP Token:** cdfaa3668ec21439bc6acd2243abd6df701177e8 (updated in .claude.json, needs restart to take effect)
-
-## Uncommitted Files
-
-- .planning/STATE.md (modified)
-- apps/desktop/src-tauri/Cargo.lock (untracked, should be committed)
-- apps/desktop/src-tauri/gen/ (untracked, Tauri generated)
-
-## Critical Anti-Patterns
-
-| Anti-Pattern | Severity | Detail |
-|-------------|----------|--------|
-| pnpm/action-setup incompatible with Gitea Actions | advisory | Use corepack instead — already fixed |
-| Prisma types missing in CI | advisory | postinstall added — verify Run #87 |
diff --git a/.planning/phases/06-desktop-client-ci-cd/06-02-SUMMARY.md b/.planning/phases/06-desktop-client-ci-cd/06-02-SUMMARY.md
new file mode 100644
index 0000000..5f8cf50
--- /dev/null
+++ b/.planning/phases/06-desktop-client-ci-cd/06-02-SUMMARY.md
@@ -0,0 +1,87 @@
+---
+phase: 06-desktop-client-ci-cd
+plan: 02
+subsystem: desktop
+tags: [tauri, tray, autostart, window-state, notification, version-check, appimage]
+
+requires:
+ - phase: 06-desktop-client-ci-cd
+ plan: 01
+ provides: Tauri scaffold with server URL persistence
+provides:
+ - System tray with close-to-tray behavior
+ - Window state persistence (size/position)
+ - Autostart plugin registration
+ - Startup version check with native notification
+ - GET /health/version API endpoint
+ - AppImage production bundle
+affects: [desktop user experience, API health module]
+
+tech-stack:
+ added: [tauri-plugin-notification, tauri-plugin-autostart, tauri-plugin-window-state, reqwest]
+ patterns: [close-to-tray, prevent-exit, async-version-check]
+
+key-files:
+ modified:
+ - apps/desktop/src-tauri/src/lib.rs
+ - apps/desktop/src-tauri/Cargo.toml
+ - apps/desktop/src-tauri/capabilities/default.json
+ - apps/api/src/health/health.controller.ts
+ created:
+ - apps/desktop/src-tauri/icons/icon.png
+ - apps/desktop/src-tauri/icons/icon.ico
+ - apps/desktop/src-tauri/icons/128x128.png
+
+key-decisions:
+ - "Both prevent_close (CloseRequested) AND prevent_exit (ExitRequested) per Pitfall 2"
+ - "Async version check via reqwest — non-blocking, fire-and-forget"
+ - "German tray labels: Oeffnen / Beenden"
+ - "ImageMagick for icon generation (tauri icon not available headless)"
+ - "NSIS target configured but only AppImage built (no Windows cross-compile toolchain)"
+
+patterns-established:
+ - "Close-to-tray: on_window_event hide + prevent_close, RunEvent::ExitRequested prevent_exit, tray quit -> app.exit(0)"
+ - "Version check: spawn async task in setup, GET {server_url}/health/version, compare CARGO_PKG_VERSION"
+
+requirements-completed: [DESK-01, DESK-02]
+
+duration: 8min
+completed: 2026-06-25
+---
+
+# Phase 06 Plan 02: Native Desktop Features Summary
+
+**Tray, close-to-tray, window-state, autostart, version check, branded icons, AppImage bundle**
+
+## Performance
+
+- **Duration:** 8 min
+- **Commit:** c65ada0
+- **Tasks:** 4 completed (3 auto + 1 build verification)
+- **Files modified:** 4, icons generated: 3
+
+## Accomplishments
+
+- API GET /health/version endpoint (public, no auth)
+- Tray icon with context menu (Oeffnen/Beenden) and left-click show
+- Close-to-tray with both prevent_close and prevent_exit guards
+- Window state persistence via tauri-plugin-window-state
+- Autostart plugin registered with capability permissions
+- Async startup version check with native notification on mismatch
+- Tessera-branded icon (yellow T on dark bg, OKLCH palette)
+- AppImage built: Tessera_0.0.1_amd64.AppImage
+
+## Deviations from Plan
+
+- Icons generated with ImageMagick instead of `tauri icon` (headless environment)
+- NSIS bundle configured but not built (no Windows cross-compile toolchain on Linux host)
+
+## Self-Check: PASSED
+
+- cargo check passes with all 4 plugins
+- API type-check passes
+- AppImage produced at target/release/bundle/appimage/
+
+---
+*Phase: 06-desktop-client-ci-cd*
+*Completed: 2026-06-25*