diff --git a/brain/app/main.py b/brain/app/main.py
index 529987a..38b3e58 100644
--- a/brain/app/main.py
+++ b/brain/app/main.py
@@ -26,7 +26,7 @@ from app.infrastructure.ollama_model_installer import ensure_ollama_embedding_mo
app = FastAPI(
title="LoreMind Brain",
description="Backend IA pour la génération de contenu narratif.",
- version="0.16.3",
+ version="0.17.0",
)
logger = logging.getLogger(__name__)
diff --git a/core/pom.xml b/core/pom.xml
index 5b9a17c..df90bbe 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -14,7 +14,7 @@
com.loremind
loremind-core
- 0.16.3
+ 0.17.0
LoreMind Core
Backend Core - Architecture Hexagonale
diff --git a/core/src/main/java/com/loremind/infrastructure/desktop/SystemTrayManager.java b/core/src/main/java/com/loremind/infrastructure/desktop/SystemTrayManager.java
index 4dc2f1b..679ec8e 100644
--- a/core/src/main/java/com/loremind/infrastructure/desktop/SystemTrayManager.java
+++ b/core/src/main/java/com/loremind/infrastructure/desktop/SystemTrayManager.java
@@ -20,6 +20,9 @@ import java.awt.RenderingHints;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.InputStream;
+import javax.imageio.ImageIO;
/**
* Icone dans la zone de notification (barre des taches) en mode bureau
@@ -63,7 +66,7 @@ public class SystemTrayManager {
try {
popup = new PopupMenu();
- MenuItem open = new MenuItem("Ouvrir LoreMind");
+ MenuItem open = new MenuItem("Ouvrir DM Loremind");
open.addActionListener(e -> DesktopSingleInstance.openAppInBrowser());
popup.add(open);
@@ -79,17 +82,17 @@ public class SystemTrayManager {
popup.add(editConfig);
// Acces au dossier de donnees (~/.loremind : base, images, config…).
- MenuItem openFolder = new MenuItem("Ouvrir le dossier LoreMind");
+ MenuItem openFolder = new MenuItem("Ouvrir le dossier DM Loremind");
openFolder.addActionListener(e -> DesktopSingleInstance.openFolder(DesktopUserConfig.getHomeDir()));
popup.add(openFolder);
popup.addSeparator();
- MenuItem quit = new MenuItem("Quitter LoreMind");
+ MenuItem quit = new MenuItem("Quitter DM Loremind");
quit.addActionListener(e -> quit());
popup.add(quit);
- trayIcon = new TrayIcon(createIcon(), "LoreMind", popup);
+ trayIcon = new TrayIcon(createIcon(), "DM Loremind", popup);
trayIcon.setImageAutoSize(true);
// Double-clic sur l'icone : ouvre l'application dans le navigateur.
trayIcon.addActionListener(e -> DesktopSingleInstance.openAppInBrowser());
@@ -122,7 +125,7 @@ public class SystemTrayManager {
popup.insertSeparator(1);
trayIcon.displayMessage(
- "LoreMind — mise a jour disponible",
+ "DM Loremind — mise a jour disponible",
"Version " + info.latestVersion() + " disponible (vous avez " + info.currentVersion()
+ "). Menu de l'icone → Telecharger.",
TrayIcon.MessageType.INFO);
@@ -151,19 +154,35 @@ public class SystemTrayManager {
}
/**
- * Genere une petite icone (carre arrondi violet « L ») sans dependre d'un
- * fichier image — robuste quel que soit l'empaquetage.
+ * Icone du systray : charge l'image de marque {@code /tray-icon.png} depuis le
+ * classpath (embarquee dans le jar). Repli sur une icone dessinee si le fichier
+ * est absent ou illisible — l'application reste fonctionnelle dans tous les cas.
*/
private Image createIcon() {
+ try (InputStream in = getClass().getResourceAsStream("/tray-icon.png")) {
+ if (in != null) {
+ BufferedImage loaded = ImageIO.read(in);
+ if (loaded != null) {
+ return loaded;
+ }
+ }
+ } catch (IOException e) {
+ // ignore : on retombe sur l'icone dessinee ci-dessous
+ }
+ return drawFallbackIcon();
+ }
+
+ /** Icone de repli (carre arrondi violet « DM ») si l'image embarquee manque. */
+ private Image drawFallbackIcon() {
int size = 16;
BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = img.createGraphics();
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.setColor(new Color(0x8B, 0x5C, 0xF6)); // violet de marque LoreMind
+ g.setColor(new Color(0x8B, 0x5C, 0xF6)); // violet de marque
g.fillRoundRect(0, 0, size, size, 5, 5);
g.setColor(Color.WHITE);
- g.setFont(new Font("SansSerif", Font.BOLD, 12));
- g.drawString("L", 4, 13);
+ g.setFont(new Font("SansSerif", Font.BOLD, 9));
+ g.drawString("DM", 1, 12);
g.dispose();
return img;
}
diff --git a/core/src/main/resources/tray-icon.png b/core/src/main/resources/tray-icon.png
new file mode 100644
index 0000000..d99f931
Binary files /dev/null and b/core/src/main/resources/tray-icon.png differ
diff --git a/installers/desktop/app-icon.ico b/installers/desktop/app-icon.ico
new file mode 100644
index 0000000..8d0c3ad
Binary files /dev/null and b/installers/desktop/app-icon.ico differ
diff --git a/installers/desktop/build-windows.ps1 b/installers/desktop/build-windows.ps1
index f27daef..8952491 100644
--- a/installers/desktop/build-windows.ps1
+++ b/installers/desktop/build-windows.ps1
@@ -57,6 +57,7 @@ $BrainDir = Join-Path $RepoRoot 'brain'
$CoreDir = Join-Path $RepoRoot 'core'
$StageDir = Join-Path $CoreDir 'target\dist-input' # charge utile jpackage
$OutDir = Join-Path $CoreDir 'target\dist-out' # .msi produit
+$IconFile = Join-Path $PSScriptRoot 'app-icon.ico' # icone de l'app (.msi + raccourcis)
# --- Version (numerique pour MSI) ------------------------------------------
if (-not $Version) {
@@ -213,11 +214,21 @@ $brainCmd = '$APPDIR\brain\python\python.exe,$APPDIR\brain\run_local.py'
#
# Note : pas de --win-console (app de bureau). Les logs Spring/Brain peuvent
# etre rediriges vers un fichier via une option ulterieure si besoin de debug.
+# Icone de l'application (.msi, raccourcis bureau/menu). Doit etre un .ico Windows
+# multi-resolution (16/32/48/256). Absente -> jpackage retomberait sur l'icone Java
+# par defaut : on echoue tot avec un message clair plutot que de livrer ca.
+if (-not (Test-Path $IconFile)) {
+ Write-Err "Icone manquante : $IconFile"
+ Write-Err "Depose l'icone de l'app (image DM, .ico multi-resolution) a cet emplacement."
+ exit 1
+}
+
jpackage `
--type msi `
- --name LoreMind `
+ --name 'DM Loremind' `
--app-version $Version `
--vendor 'IGML Creation' `
+ --icon $IconFile `
--input $StageDir `
--main-jar loremind-core.jar `
--main-class org.springframework.boot.loader.launch.JarLauncher `
@@ -226,7 +237,7 @@ jpackage `
--java-options "-Dbrain.sidecar.command=$brainCmd" `
--win-per-user-install `
--win-upgrade-uuid 'a7c4e1d2-9b3f-4e6a-8d05-1f2c3b4a5e6d' `
- --win-menu --win-menu-group 'LoreMind' `
+ --win-menu --win-menu-group 'DM Loremind' `
--win-shortcut --win-dir-chooser
if ($LASTEXITCODE -ne 0) {
diff --git a/web/package-lock.json b/web/package-lock.json
index e8c463b..84dcf3f 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "loremind-web",
- "version": "0.16.3",
+ "version": "0.17.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "loremind-web",
- "version": "0.16.3",
+ "version": "0.17.0",
"dependencies": {
"@angular/animations": "^21.2.16",
"@angular/common": "^21.2.16",
diff --git a/web/package.json b/web/package.json
index eda8e21..55e01d4 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,6 +1,6 @@
{
"name": "loremind-web",
- "version": "0.16.3",
+ "version": "0.17.0",
"description": "LoreMind Frontend - Angular",
"scripts": {
"ng": "ng",
diff --git a/web/src/app/sidebar/sidebar.component.html b/web/src/app/sidebar/sidebar.component.html
index 45fbeca..88b8424 100644
--- a/web/src/app/sidebar/sidebar.component.html
+++ b/web/src/app/sidebar/sidebar.component.html
@@ -2,8 +2,8 @@
diff --git a/web/src/app/sidebar/sidebar.component.scss b/web/src/app/sidebar/sidebar.component.scss
index 7a0d315..b733d20 100644
--- a/web/src/app/sidebar/sidebar.component.scss
+++ b/web/src/app/sidebar/sidebar.component.scss
@@ -18,6 +18,7 @@
}
.logo-icon { font-size: 1.2rem; color: #6c63ff; }
+.logo-img { width: 1.75rem; height: 1.75rem; border-radius: 6px; object-fit: contain; flex: 0 0 auto; }
.logo-text { font-size: 1.25rem; font-weight: 700; color: white; }
.logo-subtitle {
diff --git a/web/src/assets/logo.png b/web/src/assets/logo.png
new file mode 100644
index 0000000..5949a8c
Binary files /dev/null and b/web/src/assets/logo.png differ
diff --git a/web/src/favicon.ico b/web/src/favicon.ico
new file mode 100644
index 0000000..3c393e0
Binary files /dev/null and b/web/src/favicon.ico differ
diff --git a/web/src/index.html b/web/src/index.html
index fa6f1b0..401e981 100644
--- a/web/src/index.html
+++ b/web/src/index.html
@@ -2,7 +2,7 @@
- LoreMind
+ DM Loremind