diff --git a/javafx-client/pom.xml b/javafx-client/pom.xml
new file mode 100644
index 0000000..6b7b70a
--- /dev/null
+++ b/javafx-client/pom.xml
@@ -0,0 +1,145 @@
+
+
+ 4.0.0
+
+ com.teterialosjuanjos.tfg
+ javafx-client
+ 0.0.1-SNAPSHOT
+ javafx-client
+ TFG — JavaFX Desktop Client para Sync Service
+
+
+ UTF-8
+ 21
+ 21
+ 21.0.2
+ 0.0.8
+
+
+
+
+
+ org.openjfx
+ javafx-controls
+ ${javafx.version}
+
+
+ org.openjfx
+ javafx-fxml
+ ${javafx.version}
+
+
+ org.openjfx
+ javafx-graphics
+ ${javafx.version}
+
+
+ org.openjfx
+ javafx-base
+ ${javafx.version}
+
+
+ org.openjfx
+ javafx-swing
+ ${javafx.version}
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.18.0
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ 2.18.0
+
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.30
+ provided
+
+
+
+
+ org.slf4j
+ slf4j-api
+ 2.0.13
+
+
+ ch.qos.logback
+ logback-classic
+ 1.5.6
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.10.2
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+ 21
+ 21
+
+
+ org.projectlombok
+ lombok
+ 1.18.30
+
+
+
+
+
+
+
+ org.openjfx
+ javafx-maven-plugin
+ ${javafx.maven.plugin.version}
+
+ com.teterialosjuanjos.tfg.javafxclient.JavaFxClientApplication
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+ 3.5.0
+
+
+ package
+
+ shade
+
+
+ true
+ fat
+
+
+ com.teterialosjuanjos.tfg.javafxclient.JavaFxClientApplication
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/javafx-client/src/main/java/com/teterialosjuanjos/tfg/javafxclient/JavaFxClientApplication.java b/javafx-client/src/main/java/com/teterialosjuanjos/tfg/javafxclient/JavaFxClientApplication.java
new file mode 100644
index 0000000..660ef85
--- /dev/null
+++ b/javafx-client/src/main/java/com/teterialosjuanjos/tfg/javafxclient/JavaFxClientApplication.java
@@ -0,0 +1,33 @@
+package com.teterialosjuanjos.tfg.javafxclient;
+
+import com.teterialosjuanjos.tfg.javafxclient.model.SessionManager;
+import com.teterialosjuanjos.tfg.javafxclient.ui.stages.LoginStage;
+import javafx.application.Application;
+import javafx.stage.Stage;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * JavaFX Desktop Client para TFG Integración Dolibarr-PrestaShop.
+ *
+ *
Punto de entrada de la aplicación. Inicia sesión y luego accede al
+ * {@code sync-service} en Railway para ver/crear productos, pedidos, logs.
+ */
+@Slf4j
+public class JavaFxClientApplication extends Application {
+
+ @Override
+ public void start(Stage primaryStage) {
+ log.info("Starting JavaFX Client Application");
+
+ // Inicializa SessionManager (almacena credenciales + cliente HTTP)
+ SessionManager sessionManager = new SessionManager();
+
+ // Muestra LoginStage
+ LoginStage loginStage = new LoginStage(sessionManager, primaryStage);
+ loginStage.show();
+ }
+
+ public static void main(String[] args) {
+ launch(args);
+ }
+}
\ No newline at end of file
diff --git a/javafx-client/src/main/java/com/teterialosjuanjos/tfg/javafxclient/api/SyncServiceClient.java b/javafx-client/src/main/java/com/teterialosjuanjos/tfg/javafxclient/api/SyncServiceClient.java
new file mode 100644
index 0000000..b5c78ae
--- /dev/null
+++ b/javafx-client/src/main/java/com/teterialosjuanjos/tfg/javafxclient/api/SyncServiceClient.java
@@ -0,0 +1,179 @@
+package com.teterialosjuanjos.tfg.javafxclient.api;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+/**
+ * Cliente HTTP tipado para el sync-service en Railway.
+ *
+ * Maneja autenticación Basic Auth para todos los endpoints.
+ */
+@Slf4j
+public class SyncServiceClient {
+
+ private final HttpClient httpClient;
+ private final String baseUrl;
+ private final String authHeader;
+ private final ObjectMapper objectMapper;
+
+ public SyncServiceClient(String baseUrl, String username, String password) {
+ this.baseUrl = baseUrl.replaceAll("/$", ""); // Remove trailing slash
+ this.httpClient = HttpClient.newHttpClient();
+ this.authHeader = buildBasicAuthHeader(username, password);
+ this.objectMapper = new ObjectMapper();
+ this.objectMapper.registerModule(new JavaTimeModule());
+ }
+
+ // ── Health Check ────────────────────────────────────────────────────────
+
+ public Map checkHealth() throws IOException, InterruptedException {
+ String url = baseUrl + "/actuator/health";
+ return getJson(url, Map.class);
+ }
+
+ // ── Logs ─────────────────────────────────────────────────────────────────
+
+ /**
+ * Obtiene todos los logs de sincronización.
+ *
+ * @param type opcional, filtra por tipo (PRODUCT_PUSH, STOCK_PUSH, ORDER_PULL)
+ */
+ public List