diff --git a/.gitignore b/.gitignore index c381d9af..005d81b1 100644 --- a/.gitignore +++ b/.gitignore @@ -56,3 +56,7 @@ desktop.ini docs/temp/ docs/Bin/ docs/_archive/ + +# Conveyor +conveyor.rootkey +output/ diff --git a/conveyor.conf b/conveyor.conf index 97b9232b..f4ae9879 100644 --- a/conveyor.conf +++ b/conveyor.conf @@ -1,42 +1,31 @@ # ============================================================================= # Conveyor Configuration for Meldestelle Desktop App # ============================================================================= -# Dieser Build-Weg ermöglicht das Cross-Packaging für Windows (MSI) auf Linux. -# Dokumentation: https://conveyor.hydraulic.dev/ -# ============================================================================= +include required("/stdlib/jdk/21/openjdk.conf") include required("https://raw.githubusercontent.com/hydraulic-software/conveyor/master/configs/jvm/extract-native-libraries.conf") -# Basis-Import der Gradle-Konfiguration (sofern das Plugin genutzt wird, -# aber wir definieren es hier explizit für maximale Kontrolle im CI/CD). app { - # Anzeige-Name und Vendor display-name = "Meldestelle" rdns-name = "at.mocode.meldestelle" vendor = "mo-code.at" contact-email = "support@mo-code.at" - - # Version aus version.properties (Conveyor kann HOCON-Variablen nutzen) - # Für diesen Task hart codiert oder via CLI-Flag --variable übergeben. version = "1.0.0" - - # Beschreibung description = "ÖTO-konforme Turnier-Meldestelle – Desktop App" - # Ziel-Plattformen - # Wir konzentrieren uns auf Windows, können aber Linux/Mac später ergänzen. - site.base-url = "localhost" # Später echte Update-URL + # Ziel-Plattformen: Windows und Linux (AMD/Intel 64-bit) + machines = [ windows.amd64, linux.amd64.glibc ] - # Icons - icons = "frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png" + site.base-url = "localhost" + + # Wir geben nur den Ordner an, Conveyor findet die icon.png darin automatisch + icons = "frontend/shells/meldestelle-desktop/src/jvmMain/resources" - # Einbetten der JRE (Temurin 21 wie in CI genutzt) jvm { gui { main-class = "at.mocode.frontend.shell.desktop.MainKt" } - # JVM-Argumente (analog build.gradle.kts) jvm-options = [ "-Xms128m", "-Xmx512m", @@ -45,19 +34,14 @@ app { ] } - # Input-Dateien: Hier ziehen wir die Uber-JAR oder die Gradle-Outputs. - # Da wir plattformunabhängig bleiben wollen, nutzen wir das Gradle-Output-Dir. - inputs += "frontend/shells/meldestelle-desktop/build/libs/meldestelle-desktop-jvm-*.jar" + # JARs aus dem Gradle-Build + inputs += "frontend/shells/meldestelle-desktop/build/libs/*.jar" - # Windows-spezifische Einstellungen windows { - # Icon als .ico - icons = "frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.ico" - # GUID für Upgrades (muss stabil bleiben) upgrade-uuid = "a1b2c3d4-e5f6-7890-abcd-ef1234567890" - # Menü-Eintrag menu-group = "Meldestelle" - # Verknüpfung desktop-shortcut = true } } + +conveyor.compatibility-level = 22 diff --git a/docs/02_Guides/Desktop-Packaging-Guide.md b/docs/02_Guides/Desktop-Packaging-Guide.md new file mode 100644 index 00000000..05df4bc9 --- /dev/null +++ b/docs/02_Guides/Desktop-Packaging-Guide.md @@ -0,0 +1,98 @@ +# 📦 Guide: Desktop App Packaging (Linux, Windows, macOS) + +Dieses Dokument beschreibt, wie die Meldestelle Desktop App für verschiedene Betriebssysteme paketiert wird. Wir nutzen einen hybriden Ansatz aus **Gradle (Compose-Desktop)** für lokale Linux-Builds und **Conveyor** für das Cross-Packaging (Windows/macOS) von Linux aus. + +--- + +## 1. Voraussetzungen + +### Linux (Entwicklungsrechner / Fedora) +Um native Pakete bauen zu können, müssen folgende Werkzeuge auf dem System vorhanden sein: + +```bash +# Für RPM-Pakete (Fedora) +sudo dnf install rpm-build + +# Für DEB-Pakete (Ubuntu/Debian) +sudo apt install dpkg-dev fakeroot +``` + +### Conveyor (Cross-Packaging Tool) +Conveyor wird benötigt, um von Linux aus Windows-Installer (.msi) oder macOS-Pakete zu erzeugen. + +**Installation auf Fedora/Linux:** +Da automatisierte Skripte manchmal unzuverlässig sind, hier der direkte Weg über das Binär-Paket: + +1. **Tarball herunterladen:** + Besuchen Sie [https://downloads.hydraulic.dev/conveyor/download.html](https://downloads.hydraulic.dev/conveyor/download.html) und laden Sie die neueste `linux-amd64.tar.gz` Datei herunter. + +2. **Manuelle Installation:** + ```bash + # Entpacken + tar -xvf hydraulic-conveyor-*-linux-amd64.tar.gz + # In den Pfad verschieben + sudo mv conveyor /usr/local/bin/ + ``` + +3. **Verifizieren:** + ```bash + conveyor --version + ``` + +--- + +## 2. Lokale Linux-Builds (Gradle) + +Die schnellste Methode, um während der Entwicklung ein installierbares Paket für das eigene System zu erstellen. + +### RPM-Paket (Fedora) +```bash +./gradlew :frontend:shells:meldestelle-desktop:packageRpm +``` +*Ausgabe: `frontend/shells:meldestelle-desktop/build/compose/binaries/main/rpm/`* + +### DEB-Paket (Ubuntu/Debian) +```bash +./gradlew :frontend:shells:meldestelle-desktop:packageDeb +``` +*Ausgabe: `frontend/shells:meldestelle-desktop/build/compose/binaries/main/deb/`* + +### Portable Version (Ohne Installation) +```bash +./gradlew :frontend:shells:meldestelle-desktop:createDistributable +``` +*Ausgabe: `frontend/shells:meldestelle-desktop/build/compose/binaries/main/app/`* + +--- + +## 3. Cross-Packaging mit Conveyor + +Conveyor nutzt die kompilierte JAR-Datei und schnürt daraus Pakete für alle Zielplattformen. + +### Schritt 1: JAR erstellen +```bash +./gradlew :frontend:shells:meldestelle-desktop:jvmJar +``` + +### Schritt 2: Pakete bauen +```bash +# Erstellt den Windows-Installer und die HTML-Downloadseite +conveyor make site +``` + +### Schritt 3: Ergebnisse +Die fertigen Installer (z.B. `.msi` für Windows) befinden sich im neu erstellten Ordner `output/`. + +--- + +## 4. Problembehandlung & Optimierung + +### Native Access Warnungen +Die App benötigt Zugriff auf native Bibliotheken (Netty/SQLite). Der notwendige Parameter `--enable-native-access=ALL-UNNAMED` ist bereits fest hinterlegt. + +### Firewall-Konfiguration +Für Netzwerk-Tests (Discovery/Chat) müssen die Ports 8090, 8080 und 5353 (UDP) geöffnet sein. +Nutzen Sie dafür das bereitgestellte Skript: +```bash +sudo ./setup-firewall-linux.sh +``` diff --git a/docs/90_Reports/Network-POC-Testplan.md b/docs/90_Reports/Network-POC-Testplan.md new file mode 100644 index 00000000..4dad2248 --- /dev/null +++ b/docs/90_Reports/Network-POC-Testplan.md @@ -0,0 +1,47 @@ +# 🧪 Testplan: Real-World Netzwerk-POC (Chat) + +Ziel dieses Tests ist die Verifizierung der stabilen Kommunikation zwischen verschiedenen Geräten (Master & Client) im lokalen Netzwerk (LAN/WLAN) inklusive automatischer Dienst-Erkennung (mDNS). + +--- + +## Vorbereitung (USB-Stick) + +Folgende Dateien sollten auf dem Test-USB-Stick vorhanden sein: +1. **Installer:** Das .rpm oder .deb Paket der App (oder der distributable Ordner). +2. **Windows-Installer:** Die .msi Datei (via Conveyor). +3. **Setup-Skript:** setup-firewall-linux.sh. + +--- + +## Durchführung + +### 1. Master-Gerät einrichten (Zentrale) +1. App auf dem Haupt-PC installieren und starten. +2. In der **Geräte-Initialisierung**: + * Rolle: **MASTER** wählen. + * Gerätename vergeben (z.B. "Meldestelle-Master"). + * Sicherheitsschlüssel (Sync-Key) festlegen (z.B. "geheim123"). +3. Auf **Finalisieren** klicken. +4. Der Master zeigt nun seine IP-Adresse an und wartet auf Clients. + +### 2. Client-Geräte einrichten (Richter/PC) +1. App auf weiteren Geräten (Linux/Windows) starten. +2. In der **Geräte-Initialisierung**: + * Rolle: **CLIENT** wählen. + * **Shared Key** eingeben (muss exakt wie beim Master sein). +3. Warten, bis der Master in der Liste erscheint (mDNS Discovery). +4. Master auswählen und auf **Jetzt verbinden** klicken. + +### 3. Verbindungs-Check & Chat +1. Sobald der Status auf "Verbunden" steht, den Button **"Verbindung testen (Chat & Self-Test)"** klicken. +2. Im Chat-Modal eine Nachricht schreiben. +3. Prüfen, ob die Nachricht auf allen verbundenen Geräten erscheint. +4. Den automatischen "Ping-Pong" Self-Test beobachten. + +--- + +## Erfolgskriterien +* [ ] Master wird innerhalb von 10 Sekunden automatisch in der Client-Liste gefunden. +* [ ] Nachrichten werden nahezu verzögerungsfrei (< 500ms) übertragen. +* [ ] Der Status wechselt zuverlässig auf "CONNECTED". +* [ ] Keine FocusRelatedWarning mehr in der Konsole/Log. diff --git a/frontend/shells/meldestelle-desktop/build.gradle.kts b/frontend/shells/meldestelle-desktop/build.gradle.kts index f103a495..44e38057 100644 --- a/frontend/shells/meldestelle-desktop/build.gradle.kts +++ b/frontend/shells/meldestelle-desktop/build.gradle.kts @@ -1,21 +1,6 @@ import org.jetbrains.compose.desktop.application.dsl.TargetFormat import java.util.* -/** - * Shell-Modul: Meldestelle Desktop App - * Reines JVM/Compose-Desktop-Modul – Desktop-First gemäß MASTER_ROADMAP. - * Setzt alle Core- und Feature-Module zu einer lauffähigen Desktop-Anwendung zusammen. - * - * Packaging: - * ./gradlew :frontend:shells:meldestelle-desktop:packageDeb → Linux .deb - * ./gradlew :frontend:shells:meldestelle-desktop:packageMsi → Windows .msi - * ./gradlew :frontend:shells:meldestelle-desktop:packageDmg → macOS .dmg - * ./gradlew :frontend:shells:meldestelle-desktop:packageReleaseDistributables → alle Plattformen - * - * Version: Wird automatisch aus version.properties im Root-Projekt gelesen (SemVer). - * Icons: src/jvmMain/resources/icon.png / icon.ico / icon.icns - * → siehe ICONS_PLACEHOLDER.md für Anforderungen - */ plugins { alias(libs.plugins.kotlinMultiplatform) alias(libs.plugins.composeCompiler) @@ -26,16 +11,12 @@ plugins { group = "at.mocode.frontend.shell" version = "1.0.0" -// --------------------------------------------------------------- -// Version aus root version.properties lesen (SemVer) -// --------------------------------------------------------------- val versionProps = Properties().also { props -> rootProject.file("version.properties").inputStream().use { props.load(it) } } val vMajor: String? = versionProps.getProperty("VERSION_MAJOR", "1") val vMinor: String? = versionProps.getProperty("VERSION_MINOR", "0") val vPatch: String? = versionProps.getProperty("VERSION_PATCH", "0") -// nativeDistributions erwartet reines "MAJOR.MINOR.PATCH" (kein Qualifier) val packageVer = "$vMajor.$vMinor.$vPatch" kotlin { @@ -43,7 +24,6 @@ kotlin { sourceSets { jvmMain.dependencies { - // Core-Module implementation(projects.frontend.core.domain) implementation(projects.core.coreDomain) implementation(projects.frontend.core.designSystem) @@ -54,10 +34,8 @@ kotlin { implementation(projects.frontend.core.auth) implementation(projects.core.znsParser) - // Feature-Module implementation(projects.frontend.features.pingFeature) implementation(projects.frontend.features.nennungFeature) - implementation(projects.frontend.features.znsImportFeature) implementation(projects.frontend.features.veranstalterFeature) implementation(projects.frontend.features.veranstaltungFeature) @@ -70,7 +48,6 @@ kotlin { implementation(projects.frontend.features.billingFeature) implementation(projects.frontend.features.deviceInitialization) - // Compose Desktop implementation(compose.desktop.currentOs) implementation(compose.runtime) implementation(compose.foundation) @@ -80,15 +57,10 @@ kotlin { implementation(compose.uiTooling) implementation(libs.composeHotReloadApi) - // DI (Koin) implementation(libs.koin.core) implementation(libs.koin.compose) implementation(libs.koin.compose.viewmodel) - - // Coroutines implementation(libs.kotlinx.coroutines.swing) - - // Bundles implementation(libs.bundles.kmp.common) implementation(libs.bundles.compose.common) implementation(libs.logback.classic) @@ -105,12 +77,8 @@ compose.desktop { mainClass = "at.mocode.frontend.shell.desktop.MainKt" nativeDistributions { - // Ziel-Formate: Linux .deb, Windows .msi, macOS .dmg - targetFormats(TargetFormat.Deb, TargetFormat.Msi, TargetFormat.Dmg) + targetFormats(TargetFormat.Deb, TargetFormat.Rpm, TargetFormat.Msi, TargetFormat.Dmg) - // ------------------------------------------------------- - // Gemeinsame App-Metadaten - // ------------------------------------------------------- packageName = "meldestelle" packageVersion = packageVer description = "ÖTO-konforme Turnier-Meldestelle – Desktop App" @@ -118,53 +86,30 @@ compose.desktop { copyright = "© 2024–2026 mo-code.at. Alle Rechte vorbehalten." licenseFile.set(rootProject.file("LICENSE")) - // ------------------------------------------------------- - // Linux (.deb) - // ------------------------------------------------------- linux { - // PNG 512×512 px — siehe src/jvmMain/resources/ICONS_PLACEHOLDER.md iconFile.set(project.file("src/jvmMain/resources/icon.png")) packageName = "meldestelle" - // Debian-Kategorie appCategory = "misc" - // Menü-Eintrag menuGroup = "Meldestelle" shortcut = true debMaintainer = "support@mo-code.at" } - // ------------------------------------------------------- - // Windows (.msi) - // ------------------------------------------------------- windows { - // ICO Multi-Size — siehe src/jvmMain/resources/ICONS_PLACEHOLDER.md iconFile.set(project.file("src/jvmMain/resources/icon.ico")) - // Eindeutige GUID für Windows Installer Upgrade-Erkennung - // WICHTIG: Diese UUID darf sich NIE ändern! upgradeUuid = "a1b2c3d4-e5f6-7890-abcd-ef1234567890" menuGroup = "Meldestelle" - // Startmenü-Verknüpfung shortcut = true - // Desktop-Verknüpfung dirChooser = true perUserInstall = false } - // ------------------------------------------------------- - // macOS (.dmg) - // ------------------------------------------------------- macOS { - // ICNS 1024×1024 px — siehe src/jvmMain/resources/ICONS_PLACEHOLDER.md iconFile.set(project.file("src/jvmMain/resources/icon.icns")) bundleID = "at.mocode.meldestelle" appCategory = "public.app-category.productivity" - // Für notarisierten Release: signing-Konfiguration hier ergänzen - // signing { sign.set(true); identity.set("Developer ID Application: ...") } } - // ------------------------------------------------------- - // JVM-Laufzeit-Konfiguration (eingebettetes JRE) - // ------------------------------------------------------- modules( "java.base", "java.desktop", @@ -177,7 +122,6 @@ compose.desktop { ) } - // JVM-Argumente für die gepackte Anwendung jvmArgs( "--enable-native-access=ALL-UNNAMED", "-Xms128m", diff --git a/frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png b/frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png index fc232d66..d2a261e5 100644 Binary files a/frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png and b/frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..477d939c --- /dev/null +++ b/index.html @@ -0,0 +1,850 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CHANGELOG.md - Realease notes & Feedback Management Tool + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+
+
+
+
+ + + Effortlessly collect feedback + +
+
+

Create better products driven by customer feedback

+

Simplify feedback collection, lighten support tasks, and share product updates—all in one powerful tool.

+
+ +
+
+
+
+
+
+
+
+
+ +
+ +
+
+ +
+ +
+
+
+
+
+ + + + +
+
+
+
+
+
+
+
+ clients-logo-1.svg +
+
+
+
+ clients-logo-2.svg +
+
+
+
+ clients-logo-3.svg +
+
+
+
+ clients-logo-4.svg +
+
+
+
+ clients-logo-5.svg +
+
+
+ +
+ +
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+ + + Features + +
+
+

All-in-One Platform for Customer Feedback

+

Centralize your feedback, prioritize your next steps, and keep everyone informed.

+
+
+
+
+
+ +
+
+ +
+
+ + +
+ +
+
+ +
+
+
+ Powerful SaaS solutions. +
+

Feedback Management

+

Don’t let valuable ideas fall through the cracks. Use a single tool to collect, analyze, and organize feedback and feature requests efficiently.

+
    +
  • - Capture customer input seamlessly from conversations with Autopilot.
  • +
  • - Detect and merge duplicate requests to better quantify user needs.
  • +
+ + +
+ + +
+
+ feature-img +
+
+
+
+ + +
+
+ +
+
+
+ Define Your Product Vision. +
+

Build your roadmap

+

Keep users and stakeholders informed about current projects and upcoming plans.

+
+ + +
+
+ feature-img +
+
+
+
+ + +
+
+ +
+
+
+ Management & prioritization +
+

Prioritize feature requests

+

Create a prioritization formula to score feedback and feature requests, ensuring you focus on the most impactful features.

+
    +
  • - Adjust impact and effort factors to fit your needs.
  • +
  • - Include business-specific post fields for greater flexibility.
  • +
  • - Prioritize features based on user demand.
  • +
+
+ + +
+
+ feature-img +
+
+
+
+ + +
+
+ +
+
+
+ CHANGELOG.md +
+

Share updates

+

Create a changelog that keeps everyone informed and engaged.

+
    +
  • - Publish Detailed Release Notes.
  • +
  • - Notify users who voted on specific feature requests.
  • +
  • - Drive customer retention, engagement and feature adoption.
  • +
+
+ + +
+
+ feature-img +
+
+
+
+
+
+
+ + + + +
+
+
+
+
+ + + Capture feedback + +
+
+

Easy to set up and use

+

Simplify feedback collection, lighten support workloads, and announce product updates—all with a single tool.

+
+
+
+
+
+
+
+
+

Feedback Board

+

Gather, analyze, and organize feedback in a centralized location

+
+
+
+ +
+
+
+
+
+
+
+

Product Roadmap

+

Create public/private roadmaps to keep everyone updated on your progress

+
+
+
+ +
+
+
+
+
+
+
+

Changelog

+

Increase transparency with detailed change logs

+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+ +
+
+

Feature Request

+

Organize feature requests to identify the most in-demand improvements.

+
+
+
+
+
+
+
+
+
+
+ +
+
+

Customer Satisfaction

+

Collect ongoing feedback to track and improve customer satisfaction over time.

+
+
+
+
+
+
+
+
+
+
+ +
+
+

Analyze feedback

+

+ Uncover valuable customer insights to make better product decisions. +

+
+
+
+
+
+
+
+
+
+
+ +
+
+

Bug Reporting

+

Receive instant notifications when users report bugs, keeping you ahead of critical issues.

+
+
+
+
+
+
+
+
+
+
+ +
+
+

Uptime monitoring service

+

Create beautiful status pages & incident management reports and keep your visitors updated.(Soon)

+
+
+
+
+
+
+
+ + + + + +
+
+
+
+
+
+ Join Our Newsletter +

Subscribe Now

+
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+
+ + + Help Center + +
+
+

Frequently Asked Questions

+
+
+
+
+
+
+
+
+
+
+

+ +

+
+

CHANGELOG.md is a SaaS platform designed to help you collect, analyze, and act on customer feedback to uncover valuable insights and make informed product decisions.

+
+
+
+

+ +

+
+

Absolutely! With our prioritization tools, you can score feedback and feature requests based on factors like impact and effort, helping you focus on what matters most.

+
+
+
+

+ +

+
+

CHANGELOG.md allows you to build a clear and actionable roadmap by organizing feedback and aligning it with your product vision.

+
+
+
+

+ +

+
+

Yes! CHANGELOG.md includes a changelog feature where you can publish detailed release notes, link them to specific feature requests, and notify users who requested those features automatically.

+
+
+
+

+ +

+
+

Yes, CHANGELOG.md integrates with popular customer support and project management tools, allowing your team to seamlessly capture and manage feedback within their existing workflows.

+
+
+
+

+ +

+
+

Product managers, customer success teams, and anyone involved in building and improving products can benefit from CHANGELOG.md. It’s perfect for startups, SaaS companies, and organizations looking to make data-driven product decisions.

+
+
+
+

+ +

+
+

Getting started is simple! Sign up for a free trial, set up your feedback portal, and start collecting insights to drive your product decisions.

+
+
+
+
+
+
+
+
+ + + + + +
+
+
+
+
+ + + More features. More power. + +
+
+

We bring companies and customers even closer

+

Ready to start building the right things?

+
+
+ +
+
+
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/setup-firewall-linux.sh b/setup-firewall-linux.sh new file mode 100755 index 00000000..8026f155 --- /dev/null +++ b/setup-firewall-linux.sh @@ -0,0 +1,29 @@ +#!/bin/bash +echo "===========================================" +echo "Meldestelle - Netzwerk-Setup für POC" +echo "===========================================" + +if [ "$EUID" -ne 0 ]; then + echo "Bitte mit sudo ausführen: sudo ./setup-firewall-linux.sh" + exit +fi + +# Erkennung der Firewall (firewalld für Fedora/KDE, ufw für Ubuntu) +if command -v firewall-cmd &> /dev/null; then + echo "[Fedora/firewalld] Öffne Ports 8090 (TCP), 8080 (TCP) und 5353 (UDP)..." + firewall-cmd --permanent --add-port=8090/tcp + firewall-cmd --permanent --add-port=8080/tcp + firewall-cmd --permanent --add-service=mdns + firewall-cmd --reload + echo "Fertig!" +elif command -v ufw &> /dev/null; then + echo "[Ubuntu/ufw] Öffne Ports 8090 (TCP), 8080 (TCP) und 5353 (UDP)..." + ufw allow 8090/tcp + ufw allow 8080/tcp + ufw allow 5353/udp + echo "Fertig!" +else + echo "Keine bekannte Firewall (ufw/firewalld) gefunden. Bitte Ports manuell prüfen." +fi + +echo "Das System ist nun bereit für den Meldestelle-POC."