diff --git a/.gitignore b/.gitignore
index 8787fe0..016c4b6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@
src/main/resources/TIC2WebSocket.properties
target/
var/
+docs/site/
diff --git a/README.fr.md b/README.fr.md
index 3de3070..91d797d 100644
--- a/README.fr.md
+++ b/README.fr.md
@@ -16,13 +16,11 @@
## Sommaire
-* [Introduction](#introduction)
-* [Installation](#installation)
-* [Exemple d'utilisation](#usage_example)
-* [Documentation](#documentation)
-* [Contribuer](#contrib)
-* [Support](#support)
-* [Contributeurs](#contributors)
+- [TIC2WebSocket](#tic2websocket)
+ - [Sommaire](#sommaire)
+ - [ Introduction](#-introduction)
+ - [ Documentation](#-documentation)
+ - [ Contributeurs](#-contributeurs)
## Introduction
@@ -30,97 +28,9 @@ L'application **TIC2WebSocket** est utilisée comme interface générique pour a
TIC2WebSocket fournit une API basée sur WebSocket pour gérer les données TIC, permettant une communication en temps réel et un échange de données pour les informations de télémétrie client.
-## Installation
-
-### Prérequis
-
-Pour générer/installer l'application, vous avez besoin des prérequis suivants :
-
-- [Java](https://www.java.com/download/)
-- [Maven](https://maven.apache.org/download.cgi)
-
-### Installation
-
-Pour installer l'application **TIC2WebSocket**, suivez ces étapes :
-
-#### Générer les fichiers cible
-Lorsque vous êtes à la racine du projet, tapez simplement la commande suivante :
-
-```bash
-mvn clean package
-```
-
-En conséquence, le répertoire *target* est créé, contenant le fichier .zip de sortie.
-
-#### Extraire le fichier .zip
-Décompressez le fichier .zip dans le dossier de votre choix.
-
-🐧 **Linux**
-
-Extraire le zip
-```bash
-unzip target/TIC2WebSocket-VERSION-bin -d /chemin/vers/votre/dossier
-```
-
-💻 **Windows**
-
-Extrayez `target/TIC2WebSocket-VERSION-bin` dans le dossier de votre choix.
-
-### Démarrage de l'Application
-
-Pour démarrer l'application **TIC2WebSocket**, exécutez le script de lancement :
-
-🐧 **Linux**
-
-Extraire le zip
-```bash
-cd /chemin/vers/votre/dossier
-./TIC2WebSocket.sh
-```
-
-💻 **Windows**
-
-Exécutez `TIC2WebSocket.bat`
-
-### Aide
-
-Ajoutez l'option `--help` pour obtenir des informations de base sur l'utilisation du lanceur.
-```bash
-./TIC2WebSocket.sh --help
-```
-
## Documentation
-### Page HTML de test WebSocket
-
-Une page HTML autonome est disponible pour tester rapidement l’API WebSocket :
-
-- Fichier : [docs/ws-tester.html](docs/ws-tester.html)
-- URL par défaut : `ws://localhost:19584/`
-
-Fonctionnement :
-
-- Ouvrez la page dans un navigateur (optionnel : servez le dossier `docs/` via un serveur HTTP statique).
-- Renseignez l’URL WebSocket (ou host/port), puis cliquez sur `Connect`.
-- Choisissez une requête prédéfinie (`GetModemsInfo`, `GetAvailableTICs`, `ReadTIC`, `SubscribeTIC`, `UnsubscribeTIC`) puis cliquez sur `Send`.
-- Les filtres d’identifiant (SerialNumber / PortId / PortName) permettent de cibler un TIC.
-- Les messages entrants s’affichent dans Logs ; les messages de type `EVENT` sont regroupés par `(nom d’événement + identifiant)`.
-
-## Contribuer ?
-
-
-
-Vous n'avez pas besoin d'être développeur pour contribuer, ni de faire beaucoup, vous pouvez simplement :
-* Améliorer la documentation,
-* Corriger une faute d'orthographe,
-* [Signaler un bug](https://github.com/Enedis-OSS/TIC2WebSocket/issues/new/choose)
-* [Demander une fonctionnalité](https://github.com/Enedis-OSS/TIC2WebSocket/issues/new/choose)
-* [Nous donner des conseils ou des idées](https://github.com/Enedis-OSS/TIC2WebSocket/issues/new/choose),
-* etc.
-
-Pour vous aider à démarrer, nous vous invitons à lire [Contributing](CONTRIBUTING.md), qui vous donne les règles et conventions de code à respecter
-
-Pour contribuer à cette documentation (README, CONTRIBUTING, etc.), nous nous conformons à la [CommonMark Spec](https://spec.commonmark.org/)
+Pour plus d'informations sur le fonctionnement de TIC2WebSocket, consultez la [documentation officielle](https://enedis-oss.github.io/TIC2WebSocket/).
## Contributeurs
diff --git a/README.md b/README.md
index 5a75266..de56b6e 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@
-->
# TIC2WebSocket
-*Tele Information Client (TIC) WebSocket Interface*
+*WebSocket interface for TIC (Tele Information Client) data*
[](https://api.reuse.software/info/git.fsfe.org/reuse/api)
@@ -16,13 +16,11 @@
## Summary
-* [Introduction](#introduction)
-* [Installation](#installation)
-* [Usage Example](#usage_example)
-* [Documentation](#documentation)
-* [Contributing](#contrib)
-* [Support](#support)
-* [Contributors](#contributors)
+- [TIC2WebSocket](#tic2websocket)
+ - [Summary](#summary)
+ - [ Introduction](#-introduction)
+ - [ Documentation](#-documentation)
+ - [ Contributors](#-contributors)
## Introduction
@@ -30,97 +28,9 @@ The **TIC2WebSocket** application is used as a generic interface for accessing t
TIC2WebSocket provides a WebSocket-based API for managing and interfacing with TIC data, enabling real-time communication and data exchange for client telemetry information.
-## Installation
-
-### Prerequisites
-
-To generate/install the application, you need the following prerequisites:
-
-- [Java](https://www.java.com/download/)
-- [Maven](https://maven.apache.org/download.cgi)
-
-### Installation
-
-To install the **TIC2WebSocket** application, follow these steps:
-
-#### Generate target files
-When you are at the project root, simply type the following command:
-
-```bash
-mvn clean package
-```
-
-As a result, the *target* directory is created, containing the output .zip file.
-
-#### Extract .zip file
-Unzip the .zip file into the folder of your choice.
-
-🐧 **Linux**
-
-Extract zip
-```bash
-unzip target/TIC2WebSocket-VERSION-bin -d /path/to/your/folder
-```
-
-💻 **Windows**
-
-Extract `target/TIC2WebSocket-VERSION-bin` in the folder of your choice.
-
-### Starting the Application
-
-To start the **TIC2WebSocket** application, execute the launch script:
-
-🐧 **Linux**
-
-Extract zip
-```bash
-cd /path/to/your/folder
-./TIC2WebSocket.sh
-```
-
-💻 **Windows**
-
-Run `TIC2WebSocket.bat`
-
-### Help
-
-Add `--help` option to get basic information on how to use the launcher.
-```bash
-./TIC2WebSocket.sh --help
-```
-
## Documentation
-### WebSocket tester (HTML)
-
-A small, self-contained HTML page is available to quickly test the WebSocket API:
-
-- File: [docs/ws-tester.html](docs/ws-tester.html)
-- Default URL: `ws://localhost:19584/`
-
-How it works:
-
-- Open the page in a browser (optionally serve the `docs/` folder with any static server).
-- Set the WebSocket URL (or host/port), click `Connect`.
-- Pick a request preset (`GetModemsInfo`, `GetAvailableTICs`, `ReadTIC`, `SubscribeTIC`, `UnsubscribeTIC`) and click `Send`.
-- Optional identifier filters (SerialNumber / PortId / PortName) help target a specific TIC.
-- Incoming messages are displayed in the Logs panel; `EVENT` messages are grouped by `(event name + identifier)` for readability.
-
-## Contributing ?
-
-
-
-You don't need to be a developer to contribute, nor do much, you can simply:
-* Enhance documentation,
-* Correct a spelling,
-* [Report a bug](https://github.com/Enedis-OSS/TIC2WebSocket/issues/new/choose)
-* [Ask a feature](https://github.com/Enedis-OSS/TIC2WebSocket/issues/new/choose)
-* [Give us advices or ideas](https://github.com/Enedis-OSS/TIC2WebSocket/issues/new/choose),
-* etc.
-
-To help you start, we invite you to read [Contributing](CONTRIBUTING.md), which gives you rules and code conventions to respect
-
-To contribute to this documentation (README, CONTRIBUTING, etc.), we conform to the [CommonMark Spec](https://spec.commonmark.org/)
+For more information about TIC2WebSocket, see the [official documentation](https://enedis-oss.github.io/TIC2WebSocket/).
## Contributors
@@ -128,4 +38,4 @@ Core contributors :
* **Jehan BOUSCH** ()
* **Mathieu SABARTHES** ()
-We strive to provide a benevolent environment and support any [contribution](#contrib).
+We strive to provide a benevolent environment and support any contribution.
diff --git a/REUSE.toml b/REUSE.toml
index b5c7366..a2fec55 100644
--- a/REUSE.toml
+++ b/REUSE.toml
@@ -17,4 +17,12 @@ path = [
"**/*.svg"
]
SPDX-FileCopyrightText = "2025 Enedis Smarties team "
+SPDX-License-Identifier = "Apache-2.0"
+
+# Documentation files are covered via REUSE annotations (no per-file header)
+[[annotations]]
+path = [
+ "docs/**"
+]
+SPDX-FileCopyrightText = "2025 Enedis Smarties team "
SPDX-License-Identifier = "Apache-2.0"
\ No newline at end of file
diff --git a/docs/Dockerfile b/docs/Dockerfile
new file mode 100644
index 0000000..3da9510
--- /dev/null
+++ b/docs/Dockerfile
@@ -0,0 +1,8 @@
+FROM squidfunk/mkdocs-material
+
+# Required because this repository is configured with Git LFS hooks.
+# `mkdocs gh-deploy` triggers a `git push` which runs the pre-push hook.
+RUN apk add --no-cache git-lfs
+
+COPY requirements.txt .
+RUN pip install -r requirements.txt
diff --git a/docs/README.en.md b/docs/README.en.md
new file mode 100644
index 0000000..db4200c
--- /dev/null
+++ b/docs/README.en.md
@@ -0,0 +1,10 @@
+[🇫🇷 Français](README.md) | [🇺🇸 English](README.en.md)
+
+# Developer setup
+
+From the project `docs` folder:
+
+- Start (PlantUML server + MkDocs server): `docker-compose up --build`
+- Stop: `docker-compose down`
+
+Then visit: http://localhost:8000/tic2websocket/ (the `/` root redirects to this path)
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 0000000..54178e9
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,26 @@
+[🇫🇷 Français](README.md) | [🇺🇸 English](README.en.md)
+
+# Configuration pour les développeurs
+
+Depuis le dossier `docs` à la racine du projet :
+
+- Démarrer (serveur PlantUML + serveur MkDocs) : `docker-compose up --build` (ou `docker compose up --build`)
+- Arrêter : `docker-compose down`
+
+Puis visiter : http://localhost:8000/tic2websocket/ (la racine `/` redirige vers ce chemin)
+
+## Déployer sur GitHub Pages
+
+La commande `mkdocs gh-deploy` pousse sur la branche `gh-pages` et nécessite une authentification GitHub.
+
+GitHub ne supporte plus l'authentification Git via HTTPS avec le mot de passe du compte : utiliser SSH.
+
+Déploiement en SSH :
+
+- Passer le remote en SSH : `git remote set-url origin git@github.com:Enedis-OSS/TIC2WebSocket.git`
+- Générer une clé SSH (déjà ignorée via `var/`) :
+ - `mkdir -p ../var/ssh && chmod 700 ../var/ssh`
+ - `ssh-keygen -t ed25519 -f ../var/ssh/id_ed25519_tic2websocket -C "tic2websocket-mkdocs-gh-pages" -N ""`
+ - `ssh-keyscan -H github.com > ../var/ssh/known_hosts`
+- Ajouter la clé publique `../var/ssh/id_ed25519_tic2websocket.pub` sur GitHub (Settings → SSH and GPG keys)
+- Déployer : `docker-compose run --rm mkdocs gh-deploy`
diff --git a/docs/docker-compose.yml b/docs/docker-compose.yml
new file mode 100644
index 0000000..d3ab320
--- /dev/null
+++ b/docs/docker-compose.yml
@@ -0,0 +1,29 @@
+services:
+ plantuml:
+ image: plantuml/plantuml-server:tomcat
+ ports:
+ - "8080:8080"
+
+ mkdocs:
+ build: .
+ # Mount the whole repository so `mkdocs gh-deploy` can find the git worktree (.git)
+ working_dir: /repo/docs
+ entrypoint:
+ - /bin/sh
+ - -c
+ - |
+ git config --global --add safe.directory /repo >/dev/null 2>&1 || true
+ exec mkdocs "$$@"
+ - --
+ environment:
+ # SSH-based deployment: mount a key and use it for git pushes
+ - GIT_SSH_COMMAND=ssh -i /root/.ssh/id_ed25519_tic2websocket -o IdentitiesOnly=yes -o BatchMode=yes -o StrictHostKeyChecking=yes -o UserKnownHostsFile=/root/.ssh/known_hosts
+ volumes:
+ - ../:/repo
+ # SSH keys for deployment live in ../var/ssh (already ignored by .gitignore)
+ - ../var/ssh:/root/.ssh:ro
+ ports:
+ - "8000:8000"
+ command: serve --config-file /repo/docs/mkdocs.yml --dev-addr 0.0.0.0:8000
+ depends_on:
+ - plantuml
diff --git a/docs/docs/assets/sceenshots_ws-tester/connect.png b/docs/docs/assets/sceenshots_ws-tester/connect.png
new file mode 100644
index 0000000..6a1d16e
Binary files /dev/null and b/docs/docs/assets/sceenshots_ws-tester/connect.png differ
diff --git a/docs/docs/assets/sceenshots_ws-tester/disconnect.png b/docs/docs/assets/sceenshots_ws-tester/disconnect.png
new file mode 100644
index 0000000..baa76e6
Binary files /dev/null and b/docs/docs/assets/sceenshots_ws-tester/disconnect.png differ
diff --git a/docs/docs/assets/sceenshots_ws-tester/payload.png b/docs/docs/assets/sceenshots_ws-tester/payload.png
new file mode 100644
index 0000000..2e8c609
Binary files /dev/null and b/docs/docs/assets/sceenshots_ws-tester/payload.png differ
diff --git a/docs/docs/assets/sceenshots_ws-tester/preset.png b/docs/docs/assets/sceenshots_ws-tester/preset.png
new file mode 100644
index 0000000..31d576b
Binary files /dev/null and b/docs/docs/assets/sceenshots_ws-tester/preset.png differ
diff --git a/docs/docs/assets/sceenshots_ws-tester/send.png b/docs/docs/assets/sceenshots_ws-tester/send.png
new file mode 100644
index 0000000..19518b9
Binary files /dev/null and b/docs/docs/assets/sceenshots_ws-tester/send.png differ
diff --git a/docs/docs/assets/sceenshots_ws-tester/url_port.png b/docs/docs/assets/sceenshots_ws-tester/url_port.png
new file mode 100644
index 0000000..7fce331
Binary files /dev/null and b/docs/docs/assets/sceenshots_ws-tester/url_port.png differ
diff --git a/docs/docs/en/development/architecture.md b/docs/docs/en/development/architecture.md
new file mode 100644
index 0000000..9a76d35
--- /dev/null
+++ b/docs/docs/en/development/architecture.md
@@ -0,0 +1,144 @@
+# Architecture
+
+This page describes the technical architecture of **TIC2WebSocket**: its components, execution flows, responsibilities, and extension points.
+
+## System goal
+
+`TIC2WebSocket` exposes a JSON WebSocket interface to:
+
+- discover available TICs;
+- read a TIC frame on demand;
+- subscribe to one or more TIC streams;
+- receive real-time events (`OnTICData`, `OnError`).
+
+The service bridges the **hardware/serial port** world (TIC modems) and **WebSocket** application clients.
+
+## Context view
+
+```plantuml
+@startuml
+title TIC2WebSocket - Context view
+skinparam shadowing false
+left to right direction
+skinparam rectangle {
+ RoundCorner 12
+}
+
+actor "Business client\n(WebSocket)" as Client
+actor "Host OS" as OS
+actor "Meter / TIC modem" as Meter
+
+rectangle "TIC2WebSocket" as App {
+ component "JSON WebSocket API" as WS
+ component "TICCore" as Core
+}
+
+Client --> WS : Requests
+WS --> Client : Responses + events
+
+Core --> OS : Port discovery\n(USB, serial)
+Core --> Meter : Read TIC frames
+WS <--> Core
+@enduml
+```
+
+## Main components
+
+The application is organized into several Java packages, each with clear responsibilities.
+
+### Diagnostic package
+
+- **TICCoreApp**: application for global TIC core tests and diagnostics
+- **ModemFinderApp**: modem discovery test application
+- **ModemPlugNotifierApp**: plug/unplug notification test application
+- **SerialPortFinderApp**: serial port discovery test application
+- **UsbPortFinderApp**: USB port discovery test application
+
+### Utility package
+
+- **Codec**: JSON encoding/decoding, TIC frames, etc.
+- **Message**: generic message models (Request, Response, Event)
+- **Task**: asynchronous task management
+- **Time**: date and time utilities
+
+### io package
+
+- **Modem**: TIC modem management (serial port, USB)
+- **ModemFinder**: dynamic discovery of connected modems
+- **PlugNotifier**: plug/unplug event notifications
+
+### frame package
+
+- **TICFrame**: representation of a decoded TIC frame
+- **TICFrameCodec**: TIC frame encoding/decoding
+
+### stream package
+
+- **TICCoreStream**: TIC data stream management (reading, decoding)
+- **TICStreamReader**: reads a TIC stream from a modem
+- **TICStreamModeDetector**: detects the TIC mode (historic, standard)
+
+### core package
+
+- **TICCoreBase**: application core, subscription management, notifications
+
+### service package
+
+- **TIC2WebSocketApplication**: TIC2WebSocket application entry point
+- **TIC2WebSocketServer**: WebSocket server (Netty)
+- **TIC2WebSocketHandler**: main WebSocket request handler
+- **TIC2WebSocketRequestHandlerBase**: base class for business request handlers
+- **TIC2WebSocketClientPool**: connected WebSocket clients management
+
+## Execution flows
+
+### Startup
+
+1. The CLI is parsed (`picocli`) and configuration is loaded.
+2. `TICCoreBase` is instantiated with the TIC mode and optional ports.
+3. The Netty WebSocket server starts.
+4. The core enables modem plug/unplug monitoring.
+
+### Handling a WebSocket request
+
+1. The handler receives a WebSocket text frame.
+2. JSON is decoded into a `Message` then transformed into a `Request`.
+3. `TIC2WebSocketRequestHandlerBase` performs the business operation.
+4. The JSON response is sent back to the client.
+
+### Broadcasting TIC events
+
+1. A stream reads and decodes a new TIC frame.
+2. `TICCoreBase` receives `onData` / `onError`.
+3. Subscribers filtered by `TICIdentifier` are resolved.
+4. Each client receives a WebSocket event.
+
+## Sequence: subscribe then events
+
+```plantuml
+@startuml
+title SubscribeTIC + OnTICData broadcast
+skinparam shadowing false
+
+actor "WS client" as C
+participant "TIC2WebSocketHandler" as H
+participant "RequestHandlerBase" as RH
+participant "TICCoreBase" as Core
+participant "TICCoreStream" as Stream
+participant "TIC2WebSocketClient" as WSC
+
+C -> H : REQUEST SubscribeTIC(identifier)
+H -> RH : handle(request, client)
+RH -> Core : subscribe(identifier, client)
+Core --> RH : ok
+RH --> H : RESPONSE SubscribeTIC(errorCode=0)
+H --> C : RESPONSE SubscribeTIC
+
+loop for each frame
+ Stream -> Core : onData(frame)
+ Core -> WSC : onData(frame)
+ WSC -> H : sendEvent(OnTICData)
+ H --> C : EVENT OnTICData
+end
+@enduml
+```
diff --git a/docs/docs/en/development/contributing.md b/docs/docs/en/development/contributing.md
new file mode 100644
index 0000000..9cfde40
--- /dev/null
+++ b/docs/docs/en/development/contributing.md
@@ -0,0 +1,21 @@
+# Contributing
+
+Thanks for your interest in contributing to the TIC2WebSocket project. Contributions are welcome!
+
+## REUSE compliance
+
+This project is compliant with [REUSE](https://reuse.software/), meaning all source and documentation files include clear information about licensing and copyright. This makes reuse, distribution, and legal compliance easier.
+
+For more information about REUSE compliance and best practices, please visit the official website: [REUSE.software](https://reuse.software/).
+
+## Commit and branch conventions
+
+We use [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) for commit messages. This improves the readability of Git history and helps automate versioning and changelogs. Please follow this convention when contributing.
+
+We also apply [Conventional Branches](https://www.conventionalcommits.org/en/v1.0.0/#conventional-branches) for branch naming. Please refer to the official documentation to name your branches appropriately before submitting a pull request.
+
+## License
+
+This project is licensed under [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0).
+
+You are free to use, modify, and distribute this software under the terms of that license.
diff --git a/docs/docs/en/development/index.md b/docs/docs/en/development/index.md
new file mode 100644
index 0000000..04060a3
--- /dev/null
+++ b/docs/docs/en/development/index.md
@@ -0,0 +1,20 @@
+---
+sidebar_position: 1
+title: Development
+---
+
+# Development
+
+This section documents how to work on **TIC2WebSocket** locally, run checks, and contribute safely.
+
+## Architecture
+
+See the dedicated page for an overview of the architecture and design decisions:
+
+- [Architecture](architecture.md)
+
+## Contributing
+
+See the dedicated page for guidelines on contributing to the project:
+
+- [Contributing](contributing.md)
diff --git a/docs/docs/en/getting-started/index.md b/docs/docs/en/getting-started/index.md
new file mode 100644
index 0000000..6807631
--- /dev/null
+++ b/docs/docs/en/getting-started/index.md
@@ -0,0 +1,10 @@
+# Getting Started
+
+This section explains how to get started quickly with TIC2WebSocket.
+
+## Quick steps
+
+1. Check the [required hardware and software](prerequisites.md)
+2. Install TIC2WebSocket by following the [installation instructions](installation.md)
+3. [Launch](launch.md) the TIC2WebSocket server.
+4. Use the [WebSocket tester](ws-tester.md) to send requests and receive TIC data.
diff --git a/docs/docs/en/getting-started/installation.md b/docs/docs/en/getting-started/installation.md
new file mode 100644
index 0000000..db3ccfd
--- /dev/null
+++ b/docs/docs/en/getting-started/installation.md
@@ -0,0 +1,47 @@
+# Installation
+
+## Build the project
+
+### Clone the repository
+
+```bash
+git clone https://github.com/Enedis-OSS/TIC2WebSocket.git
+```
+
+### Run the Maven build
+
+```bash
+cd TIC2WebSocket
+mvn clean package
+```
+
+### Verify generated artifacts
+
+```bash
+cd target
+ls
+```
+
+You should see the generated deliverables, including `TIC2WebSocket-VERSION-bin.zip` or `TIC2WebSocket-VERSION-bin.tar.gz`.
+
+## Run the documentation locally
+
+### Go to the `docs/` folder
+
+```bash
+cd docs
+```
+
+### Start the documentation Docker services
+
+```bash
+docker-compose up --build
+```
+
+### Open the documentation
+
+```text
+http://localhost:8000
+```
+
+You should see the TIC2WebSocket documentation in your browser.
diff --git a/docs/docs/en/getting-started/launch.md b/docs/docs/en/getting-started/launch.md
new file mode 100644
index 0000000..c1f9f9a
--- /dev/null
+++ b/docs/docs/en/getting-started/launch.md
@@ -0,0 +1,95 @@
+# Launch
+
+## Start the TIC2WebSocket server
+
+### Linux/macOS
+
+Once the TIC2WebSocket archive has been generated, extract it into a directory of your choice.
+
+Set the `APPLICATION_HOME` and `VERSION` environment variables to indicate the installation folder path and the TIC2WebSocket version.
+
+```bash
+export APPLICATION_HOME=/path/to/folder
+export VERSION=1.0.0
+```
+
+```bash
+tar -xzf TIC2WebSocket-$VERSION-bin.tar.gz -C $APPLICATION_HOME --strip-components=1
+cd $APPLICATION_HOME
+```
+
+Show the TIC2WebSocket launcher help with:
+
+```bash
+./TIC2WebSocket.sh --help
+```
+
+You should see the help options, confirming the server is ready to be started.
+
+Stop the server with Ctrl+C.
+
+To start the TIC2WebSocket server, use:
+
+```bash
+./TIC2WebSocket.sh --verbose=INFO --configFile=var/config/TIC2WebSocketConfiguration.json
+```
+
+You should see the server logs in the console, indicating it is running and ready to accept WebSocket connections.
+
+```text
+Loading configuration file var/config/TIC2WebSocketConfiguration.json
+TIC2WebSocket initialized
+TIC2WebSocket starting
+Starting TICCore
+Starting TIC2WebSocket Netty server on localhost:19584
+TIC2WebSocket Netty server started successfully on localhost:19584
+TIC2WebSocket started
+```
+
+### Windows
+
+Once the TIC2WebSocket archive has been generated, extract it into a directory of your choice.
+
+Set the `APPLICATION_HOME` and `VERSION` environment variables to indicate the installation folder path and the TIC2WebSocket version.
+
+```powershell
+$env:APPLICATION_HOME = "C:\path\to\folder"
+$env:VERSION = "1.0.0"
+```
+
+```powershell
+Unzip-File -Path TIC2WebSocket-$env:VERSION-bin.zip -DestinationPath $env:APPLICATION_HOME
+cd $env:APPLICATION_HOME
+```
+
+Show the TIC2WebSocket launcher help with:
+
+```powershell
+.\TIC2WebSocket.bat --help
+```
+
+You should see the help options, confirming the server is ready to be started.
+
+Stop the server with Ctrl+C.
+
+To start the TIC2WebSocket server, use:
+
+```powershell
+.\TIC2WebSocket.bat --verbose=INFO --configFile=var/config/TIC2WebSocketConfiguration.json
+```
+
+You should see the server logs in the console, indicating it is running and ready to accept WebSocket connections.
+
+```text
+Loading configuration file var/config/TIC2WebSocketConfiguration.json
+TIC2WebSocket initialized
+TIC2WebSocket starting
+Starting TICCore
+Starting TIC2WebSocket Netty server on localhost:19584
+TIC2WebSocket Netty server started successfully on localhost:19584
+TIC2WebSocket started
+```
+
+## Test the WebSocket connection
+
+Once the TIC2WebSocket server is started, you can test the WebSocket connection using the WebSocket client embedded in the documentation. Follow the instructions in [WebSocket Tester](ws-tester.md) to connect to the TIC2WebSocket server and receive TIC data in real time.
diff --git a/docs/docs/en/getting-started/prerequisites.md b/docs/docs/en/getting-started/prerequisites.md
new file mode 100644
index 0000000..5f3c47d
--- /dev/null
+++ b/docs/docs/en/getting-started/prerequisites.md
@@ -0,0 +1,12 @@
+# Prerequisites
+
+## Environment
+
+- Java 8 or higher
+- Maven
+- Docker / Docker Compose (optional, for local documentation)
+
+## Sources
+
+- Project GitHub repository
+- Access to configuration files
diff --git a/docs/docs/en/getting-started/ws-tester.md b/docs/docs/en/getting-started/ws-tester.md
new file mode 100644
index 0000000..682b8ff
--- /dev/null
+++ b/docs/docs/en/getting-started/ws-tester.md
@@ -0,0 +1,94 @@
+# WebSocket Tester
+
+The project includes a ready-to-use WebSocket client interface: `ws-tester.html`.
+
+This tester helps you quickly validate a TIC2WebSocket instance without having to develop a dedicated client.
+
+## Role in the project
+
+Use the tester to:
+
+- verify that the WebSocket server is reachable,
+- discover available TIC streams,
+- generate valid JSON requests for the main API commands,
+- inspect incoming responses/events in real time,
+- reproduce integration issues while troubleshooting.
+
+## Open the tester
+
+Open `ws-tester.html` in your browser.
+
+By default, it targets `ws://localhost:19584/`.
+
+You can prefill the connection using query parameters:
+
+- full URL: `?url=ws://localhost:19584/` (aliases: `wsUrl`, `ws`)
+- host/port: `?host=localhost&port=19584` (host aliases: `address`, `addr`)
+
+## Main usage flow
+
+1. Check the default target URL or adjust the host/port if needed.
+
+ 
+
+2. Click **Connect** to open the WebSocket session.
+
+ 
+
+3. Choose a request preset from the dropdown list.
+
+ 
+
+4. Check the generated JSON payload before sending it.
+
+ 
+
+5. Click **Send** and watch the logs panel to inspect the request/response flow.
+
+ 
+
+6. Click **Disconnect** when the test session is finished.
+
+ 
+
+## Request presets and identifiers
+
+Available presets:
+
+- `GetModemsInfo`
+- `GetAvailableTICs`
+- `ReadTIC`
+- `SubscribeTIC`
+- `UnsubscribeTIC`
+
+Identifier fields are optional except for `ReadTIC`, which requires an identifier.
+
+Priority rule applied by the tester:
+
+1. `serialNumber`
+2. `portId`
+3. `portName`
+
+When a higher-priority identifier is active, lower-priority fields are automatically disabled.
+
+For `SubscribeTIC` / `UnsubscribeTIC`:
+
+- no identifier selected -> the request applies to all streams,
+- one identifier selected -> the request targets that stream.
+
+When receiving a `GetAvailableTICs` response, the tester automatically fills identifier fields using the first returned entry.
+
+## Logs and diagnostics
+
+- **OUT** lines: JSON sent by the client.
+- **IN** lines: messages received from the server.
+- **ERR** lines: client-side validation errors or socket errors.
+
+`EVENT` messages are grouped by event name + identifier to keep logs readable in stream mode.
+
+## Best practices
+
+- Start with `GetAvailableTICs` before `ReadTIC`/`SubscribeTIC`.
+- Keep JSON indentation at `2` for easier debugging.
+- Use **Clear logs** before reproducing an issue.
+- Keep useful request/response pairs when reporting a problem.
diff --git a/docs/docs/en/index.md b/docs/docs/en/index.md
new file mode 100644
index 0000000..184b541
--- /dev/null
+++ b/docs/docs/en/index.md
@@ -0,0 +1,23 @@
+# TIC2WebSocket
+
+Welcome to the documentation for the **TIC2WebSocket** project.
+
+## Introduction
+
+TIC2WebSocket is a Java application that exposes TIC ("Téléinformation Client") data through a WebSocket interface. It allows developers to access TIC data in real time, making integrations with other systems and applications easier.
+
+## Documentation structure
+
+The documentation is organized into several sections to guide you through using TIC2WebSocket:
+
+- [Getting Started](getting-started/index.md): Quick-start guide for TIC2WebSocket.
+ - [Prerequisites](getting-started/prerequisites.md): Required hardware and software.
+ - [Installation](getting-started/installation.md): Detailed installation instructions.
+ - [Launch](getting-started/launch.md): How to start the TIC2WebSocket server.
+ - [WebSocket Tester](getting-started/ws-tester.md): How to use the built-in WebSocket tester.
+- [Usage](usage/index.md): Common usage patterns and client-side guidance.
+ - [API Reference](usage/api.md): WebSocket API documentation exposed by TIC2WebSocket.
+ - [Configuration](usage/configuration.md): Advanced configuration details.
+- [Development](development/index.md): How to contribute to TIC2WebSocket.
+ - [Architecture](development/architecture.md): Project architecture overview.
+ - [Contributing](development/contributing.md): How to contribute code, report bugs, and propose improvements.
diff --git a/docs/docs/en/usage/api.md b/docs/docs/en/usage/api.md
new file mode 100644
index 0000000..44a2a9d
--- /dev/null
+++ b/docs/docs/en/usage/api.md
@@ -0,0 +1,331 @@
+# API Reference
+
+Communication with TIC2WebSocket is based on JSON messages exchanged over WebSocket.
+
+## GetAvailableTICs
+
+This request returns the list of available TIC streams.
+
+### Request
+
+```json
+{
+ "type": "REQUEST",
+ "name": "GetAvailableTICs"
+}
+```
+
+### Response
+
+The response contains a list of TIC information objects:
+
+- Linky meter serial number;
+- serial port name;
+- physical USB port identifier.
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "GetAvailableTICs",
+ "dateTime": "10/06/2021 14:01:00",
+ "errorCode": 0,
+ "data": [
+ {
+ "serialNumber": "021762010203",
+ "portName": "/dev/ttyUSB0",
+ "portId": "1-1"
+ },
+ {
+ "serialNumber": "041775010507",
+ "portName": "/dev/ttyUSB2",
+ "portId": "1-2"
+ }
+ ]
+}
+```
+
+## GetModemsInfo
+
+This request returns modem information for connected TIC modems.
+
+Modem recognition is based on the USB pair `vendorId` + `productId`.
+
+Supported modem types:
+
+| Modem type | Vendor ID (hex) | Product ID (hex) | Vendor ID (dec) | Product ID (dec) |
+| --- | --- | --- | --- | --- |
+| `MICHAUD` | `0x0403` | `0x6001` | `1027` | `24577` |
+| `TELEINFO` | `0x0403` | `0x6015` | `1027` | `24597` |
+
+### Request
+
+```json
+{
+ "type": "REQUEST",
+ "name": "GetModemsInfo"
+}
+```
+
+### Response
+
+The response contains a list of modem information objects:
+
+- serial port name;
+- modem type, if available (only the USB modems described above);
+- product identifier (USB PID), if available;
+- vendor identifier (USB VID), if available;
+- product name, if available;
+- manufacturer name, if available;
+- modem serial number, if available;
+- physical serial port identifier, if available.
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "GetModemsInfo",
+ "dateTime": "16/06/2021 15:53:32",
+ "errorCode": 0,
+ "data": [
+ {
+ "portName": "COM3",
+ "modemType": "MICHAUD",
+ "productId": 24597,
+ "vendorId": 1027,
+ "productName": null,
+ "manufacturerName": "FTDI",
+ "serialNumber": "DA2VYTKGA",
+ "portId": null
+ }
+ ]
+}
+```
+
+## ReadTIC
+
+This request reads one TIC frame.
+
+### Request
+
+```json
+{
+ "type": "REQUEST",
+ "name": "ReadTIC",
+ "data": {
+ "serialNumber": "010203040506"
+ }
+}
+```
+
+The `data` field must contain a TIC identifier defined in [TIC identifier format](#tic-identifier-format).
+
+### Response
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "ReadTIC",
+ "dateTime": "10/06/2021 14:01:00",
+ "errorCode": 0,
+ "data": {
+ "mode": "STANDARD",
+ "captureDateTime": "10/06/2021 14:01:00",
+ "ticIdentifier": {
+ "serialNumber": "021762010203",
+ "portName": "/dev/ttyUSB0",
+ "portId": "1-1"
+ },
+ "content": {
+ "ADSC": "010203040506",
+ "URMS1": "230"
+ }
+ }
+}
+```
+
+## SubscribeTIC
+
+This request subscribes to one or more TIC streams. Once subscribed, the client receives events for each new TIC frame or stream-related error.
+
+### Request
+
+Several request formats are available.
+
+Subscribe to one TIC stream:
+
+```json
+{
+ "type": "REQUEST",
+ "name": "SubscribeTIC",
+ "data": {
+ "serialNumber": "010203040506"
+ }
+}
+```
+
+Subscribe to multiple TIC streams:
+
+```json
+{
+ "type": "REQUEST",
+ "name": "SubscribeTIC",
+ "data": [
+ {
+ "serialNumber": "010203040506"
+ },
+ {
+ "portId": "1-1"
+ }
+ ]
+}
+```
+
+Subscribe to all TIC streams:
+
+```json
+{
+ "type": "REQUEST",
+ "name": "SubscribeTIC"
+}
+```
+
+The `data` field must contain one TIC identifier (or a list of TIC identifiers) defined in [TIC identifier format](#tic-identifier-format).
+
+### Response
+
+Success response:
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "SubscribeTIC",
+ "dateTime": "10/06/2021 14:01:00",
+ "errorCode": 0
+}
+```
+
+If the requested TIC stream does not exist:
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "SubscribeTIC",
+ "dateTime": "10/06/2021 14:01:00",
+ "errorCode": -7,
+ "errorMessage": "The given TIC identifier doesn't match with current TIC stream"
+}
+```
+
+## `OnTICData` event
+
+This event is generated for each new TIC frame and sent to all clients subscribed to that TIC.
+
+```json
+{
+ "type": "EVENT",
+ "dateTime": "10/06/2021 14:01:00",
+ "name": "OnTICData",
+ "data": {
+ "mode": "STANDARD",
+ "captureDateTime": "10/06/2021 14:01:00",
+ "ticIdentifier": {
+ "serialNumber": "021762010203",
+ "portName": "/dev/ttyUSB0",
+ "portId": "1-1"
+ },
+ "content": {
+ "ADSC": "010203040506",
+ "URMS1": "230"
+ }
+ }
+}
+```
+
+## `OnError` event
+
+This event is generated when an error occurs on the TIC stream and sent to all clients subscribed to that TIC.
+
+```json
+{
+ "type": "EVENT",
+ "dateTime": "10/06/2021 14:01:00",
+ "name": "OnError",
+ "data": {
+ "errorCode": -5,
+ "errorMessage": "TIC frame reading timeout",
+ "ticIdentifier": {
+ "serialNumber": "021762010203",
+ "portName": "/dev/ttyUSB0",
+ "portId": "1-1"
+ }
+ }
+}
+```
+
+## UnsubscribeTIC
+
+This request unsubscribes from one or more TIC streams.
+
+### Request
+
+Several request formats are available.
+
+Unsubscribe from one TIC stream:
+
+```json
+{
+ "type": "REQUEST",
+ "name": "UnsubscribeTIC",
+ "data": {
+ "serialNumber": "010203040506"
+ }
+}
+```
+
+Unsubscribe from multiple TIC streams:
+
+```json
+{
+ "type": "REQUEST",
+ "name": "UnsubscribeTIC",
+ "data": [
+ {
+ "serialNumber": "010203040506"
+ },
+ {
+ "portId": "1-1"
+ }
+ ]
+}
+```
+
+Unsubscribe from all TIC streams:
+
+```json
+{
+ "type": "REQUEST",
+ "name": "UnsubscribeTIC"
+}
+```
+
+For targeted unsubscription, the `data` field must contain one TIC identifier (or a list of TIC identifiers) defined in [TIC identifier format](#tic-identifier-format).
+
+## TIC identifier format
+
+A TIC identifier is an object containing one of the following fields:
+
+- `serialNumber` : Linky meter serial number;
+- `portId` : physical serial port identifier where the modem is connected;
+- `portName` : serial port name where the modem is connected;
+
+Depending on the request, you can provide a single identifier or a list of identifiers.
+
+### Response
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "UnsubscribeTIC",
+ "dateTime": "16/06/2021 15:53:32",
+ "errorCode": 0
+}
+```
diff --git a/docs/docs/en/usage/configuration.md b/docs/docs/en/usage/configuration.md
new file mode 100644
index 0000000..ab7e9a8
--- /dev/null
+++ b/docs/docs/en/usage/configuration.md
@@ -0,0 +1,56 @@
+# Configuration
+
+## Location
+
+The `TIC2WebSocketConfiguration.json` configuration file is located in the `var/config` subdirectory of the TIC2WebSocket installation directory.
+
+## Structure
+
+The configuration file uses JSON and allows you to change:
+
+- the listening port of the WebSocket server,
+- the TIC mode (optional),
+- the list of native serial ports (optional).
+
+> ℹ️ The USB port list is not configurable, because TIC2WebSocket detects them automatically.
+
+Example configuration file:
+
+```json
+{
+ "serverPort": 19584,
+ "ticMode": "AUTO",
+ "ticPortNames": ["/dev/ttyAMA0"]
+}
+```
+
+## `serverPort` parameter
+
+`serverPort` configures the TCP listening port of the TIC2WebSocket WebSocket server, between `1` and `65535`.
+
+The default value is `19584`.
+
+## `ticMode` parameter
+
+`ticMode` configures the TIC stream mode:
+
+- `"AUTO"`: automatic detection (default),
+- `"STANDARD"`: Standard TIC mode at 9600 baud,
+- `"HISTORIC"`: Historic TIC mode at 1200 baud.
+
+## `ticPortNames` parameter
+
+`ticPortNames` configures the list of native serial ports used to read TIC.
+
+When set, the list must:
+
+- contain at least one element,
+- contain unique elements,
+- contain no null element,
+- contain only strings with at least one character.
+
+Example:
+
+```json
+"ticPortNames": ["/dev/ttyAMA0"]
+```
diff --git a/docs/docs/en/usage/index.md b/docs/docs/en/usage/index.md
new file mode 100644
index 0000000..f2eeda4
--- /dev/null
+++ b/docs/docs/en/usage/index.md
@@ -0,0 +1,23 @@
+# Usage
+
+This section explains how to use TIC2WebSocket from the client side.
+
+## Recommended approach
+
+1. Open a WebSocket connection to the TIC2WebSocket server.
+2. Send a `GetAvailableTICs` request to discover available streams.
+3. Subscribe to the desired stream(s) using `SubscribeTIC`.
+4. Handle `OnTICData` and `OnError` events.
+5. Unsubscribe using `UnsubscribeTIC` before closing the client.
+
+## API reference
+
+See the dedicated page for the full list of requests and events:
+
+- [API Reference](api.md)
+
+## WebSocket tester
+
+To quickly test requests/events using the built-in client UI:
+
+- [WS Tester](../getting-started/ws-tester.md)
diff --git a/docs/docs/fr/development/architecture.md b/docs/docs/fr/development/architecture.md
new file mode 100644
index 0000000..11c2f05
--- /dev/null
+++ b/docs/docs/fr/development/architecture.md
@@ -0,0 +1,139 @@
+# Architecture
+
+Cette page décrit l’architecture technique de **TIC2WebSocket** : ses composants, ses flux d’exécution, ses responsabilités et ses points d’extension.
+
+## Objectif du système
+
+`TIC2WebSocket` expose une interface WebSocket JSON pour :
+
+- découvrir les TIC disponibles ;
+- lire une trame TIC à la demande ;
+- s’abonner à un ou plusieurs flux TIC ;
+- recevoir des événements temps réel (`OnTICData`, `OnError`).
+
+Le service fait le pont entre le monde **matériel/port série** (modems TIC) et des clients applicatifs **WebSocket**.
+
+## Vue contexte
+
+```plantuml
+@startuml
+title TIC2WebSocket - Vue contexte
+skinparam shadowing false
+left to right direction
+skinparam rectangle {
+ RoundCorner 12
+}
+
+actor "Client métier\n(WebSocket)" as Client
+actor "OS hôte" as OS
+actor "Compteur / modem TIC" as Meter
+
+rectangle "TIC2WebSocket" as App {
+ component "API WebSocket JSON" as WS
+ component "TICCore" as Core
+}
+
+Client --> WS : Requêtes
+WS --> Client : Réponses + événements
+
+Core --> OS : Détection ports\n(USB, série)
+Core --> Meter : Lecture trames TIC
+WS <--> Core
+@enduml
+```
+
+## Composants principaux
+
+L'application est organisée en plusieurs packages Java, chacun avec des responsabilités claires.
+
+### Package diagnostic
+
+- **TICCoreApp** : application pour tests et diagnostics globaux du core TIC
+- **ModemFinderApp** : application de test de détection de modems
+- **ModemPlugNotifierApp** : application de test de notification de plug/unplug
+- **SerialPortFinderApp** : application de test de détection de ports série
+- **UsbPortFinderApp** : application de test de détection de ports USB
+
+### Package utilitaire
+
+- **Codec** : encodage/décodage JSON, trames TIC, etc
+- **Message** : modèles de messages génériques (Request, Response, Event)
+- **Task** : gestion de tâches asynchrones
+- **Time** : utilitaires de temps et de date
+
+### Package io
+- **Modem** : gestion d’un modem TIC (port série, USB)
+- **ModemFinder** : détection dynamique des modems connectés
+- **PlugNotifier** : notification des événements de plug/unplug
+
+### Package frame
+- **TICFrame** : représentation d’une trame TIC décodée
+- **TICFrameCodec** : encodage/décodage de trames TIC
+
+### Package stream
+- **TICCoreStream** : gestion d’un flux de données TIC (lecture, décodage)
+- **TICStreamReader** : lecture d’un flux TIC à partir d’un modem
+- **TICStreamModeDetector** : détection du mode TIC (historique, standard)
+
+### Package core
+- **TICCoreBase** : cœur de l’application, gestion des abonnements, notifications
+
+### Package service
+- **TIC2WebSocketApplication** : point d’entrée de l’application TIC2WebSocket
+- **TIC2WebSocketServer** : serveur WebSocket (Netty)
+- **TIC2WebSocketHandler** : handler principal des requêtes WebSocket
+- **TIC2WebSocketRequestHandlerBase** : base pour les handlers de requêtes métier
+- **TIC2WebSocketClientPool** : gestion des clients WebSocket connectés
+
+## Flux d’exécution
+
+### Démarrage
+
+1. La CLI est parsée (`picocli`) et la configuration est chargée.
+2. `TICCoreBase` est instancié avec le mode TIC et les ports éventuels.
+3. Le serveur Netty WebSocket démarre.
+4. Le core active la surveillance de plug/unplug modem.
+
+### Traitement d’une requête WebSocket
+
+1. Le handler reçoit une trame texte WebSocket.
+2. Le JSON est décodé en `Message` puis transformé en `Request`.
+3. `TIC2WebSocketRequestHandlerBase` exécute l’opération métier.
+4. La réponse JSON est renvoyée au client.
+
+### Diffusion d’événements TIC
+
+1. Un stream lit et décode une nouvelle trame TIC.
+2. `TICCoreBase` reçoit `onData` / `onError`.
+3. Les abonnés filtrés par `TICIdentifier` sont résolus.
+4. Chaque client reçoit un événement WebSocket.
+
+## Séquence : abonnement puis événements
+
+```plantuml
+@startuml
+title SubscribeTIC + diffusion OnTICData
+skinparam shadowing false
+
+actor "Client WS" as C
+participant "TIC2WebSocketHandler" as H
+participant "RequestHandlerBase" as RH
+participant "TICCoreBase" as Core
+participant "TICCoreStream" as Stream
+participant "TIC2WebSocketClient" as WSC
+
+C -> H : REQUEST SubscribeTIC(identifier)
+H -> RH : handle(request, client)
+RH -> Core : subscribe(identifier, client)
+Core --> RH : ok
+RH --> H : RESPONSE SubscribeTIC(errorCode=0)
+H --> C : RESPONSE SubscribeTIC
+
+loop à chaque trame
+ Stream -> Core : onData(frame)
+ Core -> WSC : onData(frame)
+ WSC -> H : sendEvent(OnTICData)
+ H --> C : EVENT OnTICData
+end
+@enduml
+```
diff --git a/docs/docs/fr/development/contributing.md b/docs/docs/fr/development/contributing.md
new file mode 100644
index 0000000..747525e
--- /dev/null
+++ b/docs/docs/fr/development/contributing.md
@@ -0,0 +1,18 @@
+# Contribuer
+
+Merci de votre intérêt pour contribuer au projet TIC2WebSocket. Vos contributions sont les bienvenues !
+
+## Conformité REUSE
+
+Ce projet est conforme à [REUSE](https://reuse.software/), ce qui signifie que tous les fichiers source et de documentation incluent des informations claires sur la licence et les droits d'auteur. Cela garantit une réutilisation, une distribution et une conformité légale plus faciles du code. Pour plus d'informations sur la conformité REUSE et les meilleures pratiques, veuillez visiter le site officiel [REUSE.software](https://reuse.software/).
+
+## Convention de commits et de branches
+
+Nous utilisons la convention [Conventional Commits](https://www.conventionalcommits.org/fr/v1.0.0/) pour la rédaction des messages de commit. Cela permet d'assurer une meilleure lisibilité de l'historique git et facilite l'automatisation des versions et des changelogs. Merci de suivre cette convention lors de vos contributions.
+
+De plus, nous appliquons la convention [Conventional Branches](https://www.conventionalcommits.org/fr/v1.0.0/#conventional-branches) pour le nommage des branches. Veuillez consulter la documentation officielle pour nommer vos branches de façon appropriée avant de soumettre une pull request.
+
+## Licence
+
+Ce projet est sous licence [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0).
+Vous êtes libre d'utiliser, de modifier et de distribuer ce logiciel conformément aux termes de cette licence.
diff --git a/docs/docs/fr/development/index.md b/docs/docs/fr/development/index.md
new file mode 100644
index 0000000..06900ca
--- /dev/null
+++ b/docs/docs/fr/development/index.md
@@ -0,0 +1,20 @@
+---
+sidebar_position: 1
+title: Développement
+---
+
+# Développement
+
+Cette section explique comment travailler sur **TIC2WebSocket** en local, exécuter les vérifications et contribuer au projet dans de bonnes conditions.
+
+## Architecture
+
+Consultez la page dédiée pour une vue d’ensemble de l’architecture et des choix de conception :
+
+- [Architecture](architecture.md)
+
+## Contribuer
+
+Consultez la page dédiée pour les bonnes pratiques de contribution au projet :
+
+- [Contribuer](contributing.md)
\ No newline at end of file
diff --git a/docs/docs/fr/getting-started/index.md b/docs/docs/fr/getting-started/index.md
new file mode 100644
index 0000000..d182b1e
--- /dev/null
+++ b/docs/docs/fr/getting-started/index.md
@@ -0,0 +1,9 @@
+# Démarrage
+
+Cette section explique comment démarrer rapidement avec TIC2WebSocket.
+
+## Étapes rapides
+1. Vérifiez les [prérequis matériels et logiciels](prerequisites.md)
+2. Installez TIC2WebSocket en suivant les [instructions d'installation](installation.md)
+3. [Lancez](launch.md) le serveur TIC2WebSocket.
+4. Utilisez le [testeur WebSocket](ws-tester.md) pour envoyer des requêtes et recevoir des données TIC.
diff --git a/docs/docs/fr/getting-started/installation.md b/docs/docs/fr/getting-started/installation.md
new file mode 100644
index 0000000..f7285e3
--- /dev/null
+++ b/docs/docs/fr/getting-started/installation.md
@@ -0,0 +1,45 @@
+# Installation
+
+## Build du projet
+
+### Cloner le dépôt
+
+```
+git clone https://github.com/Enedis-OSS/TIC2WebSocket.git
+```
+
+### Lancer le build Maven
+
+```
+cd TIC2WebSocket
+mvn clean package
+```
+
+### Vérifier la génération des artefacts
+
+```
+cd target
+ls
+```
+Vous devriez voir les livrables générés, notamment `TIC2WebSocket-VERSION-bin.zip` ou `TIC2WebSocket-VERSION-bin.tar.gz`.
+
+## Lancement de la documentation
+
+### Aller dans le dossier `docs/`
+
+```
+cd docs
+```
+
+### Démarrer les services Docker de documentation
+
+```
+docker-compose up --build
+```
+
+### Accéder à la documentation
+
+```
+http://localhost:8000
+```
+Vous devriez voir la documentation TIC2WebSocket s'afficher dans votre navigateur.
diff --git a/docs/docs/fr/getting-started/launch.md b/docs/docs/fr/getting-started/launch.md
new file mode 100644
index 0000000..7abfb37
--- /dev/null
+++ b/docs/docs/fr/getting-started/launch.md
@@ -0,0 +1,95 @@
+# Lancement
+
+## Lancer le serveur TIC2WebSocket
+
+### Linux/MacOS
+
+Une fois le dossier compressé de TIC2WebSocket généré, extraire le contenu du dossier dans un répertoire de votre choix.
+
+Définir les variables d'environnement `APPLICATION_HOME` et `VERSION` pour indiquer le chemin vers le dossier d'installation et la version de TIC2WebSocket.
+
+```bash
+export APPLICATION_HOME=/chemin/vers/dossier
+export VERSION=1.0.0
+```
+
+```bash
+tar -xzf TIC2WebSocket-$VERSION-bin.tar.gz -C $APPLICATION_HOME --strip-components=1
+cd $APPLICATION_HOME
+```
+
+Afficher l'aide de TIC2WebSocket via le lanceur avec la commande suivante :
+
+```bash
+./TIC2WebSocket.sh --help
+```
+
+Vous devriez voir les options d'aide du lanceur TIC2WebSocket s'afficher, confirmant que le serveur est prêt à être lancé.
+
+Le serveur s'arrête avec Ctrl+C.
+
+Pour démarrer le serveur TIC2WebSocket, utilisez la commande suivante :
+
+```bash
+./TIC2WebSocket.sh --verbose=INFO --configFile=var/config/TIC2WebSocketConfiguration.json
+```
+
+Vous devriez voir les logs du serveur TIC2WebSocket s'afficher dans la console, indiquant que le serveur est en cours d'exécution et prêt à accepter les connexions WebSocket.
+
+```
+Loading configuration file var/config/TIC2WebSocketConfiguration.json
+TIC2WebSocket initialized
+TIC2WebSocket starting
+Starting TICCore
+Starting TIC2WebSocket Netty server on localhost:19584
+TIC2WebSocket Netty server started successfully on localhost:19584
+TIC2WebSocket started
+```
+
+### Windows
+
+Une fois le dossier compressé de TIC2WebSocket généré, extraire le contenu du dossier dans un répertoire de votre choix.
+
+Définir les variables d'environnement `APPLICATION_HOME` et `VERSION` pour indiquer le chemin vers le dossier d'installation et la version de TIC2WebSocket.
+
+```powershell
+$env:APPLICATION_HOME = "C:\chemin\vers\dossier"
+$env:VERSION = "1.0.0"
+```
+
+```powershell
+Unzip-File -Path TIC2WebSocket-$env:VERSION-bin.zip -DestinationPath $env:APPLICATION_HOME
+cd $env:APPLICATION_HOME
+```
+
+Afficher l'aide de TIC2WebSocket via le lanceur avec la commande suivante :
+
+```powershell
+.\TIC2WebSocket.bat --help
+```
+
+Vous devriez voir les options d'aide du lanceur TIC2WebSocket s'afficher, confirmant que le serveur est prêt à être lancé.
+
+Le serveur s'arrête avec Ctrl+C.
+
+Pour démarrer le serveur TIC2WebSocket, utilisez la commande suivante :
+
+```powershell
+.\TIC2WebSocket.bat --verbose=INFO --configFile=var/config/TIC2WebSocketConfiguration.json
+```
+
+Vous devriez voir les logs du serveur TIC2WebSocket s'afficher dans la console, indiquant que le serveur est en cours d'exécution et prêt à accepter les connexions WebSocket.
+
+```
+Loading configuration file var/config/TIC2WebSocketConfiguration.json
+TIC2WebSocket initialized
+TIC2WebSocket starting
+Starting TICCore
+Starting TIC2WebSocket Netty server on localhost:19584
+TIC2WebSocket Netty server started successfully on localhost:19584
+TIC2WebSocket started
+```
+
+## Tester la connexion WebSocket
+
+Une fois le serveur TIC2WebSocket démarré, vous pouvez tester la connexion WebSocket en utilisant le client WebSocket intégré à la documentation. Suivez les instructions du guide [Testeur WebSocket](ws-tester.md) pour vous connecter au serveur TIC2WebSocket et recevoir les données TIC en temps réel.
\ No newline at end of file
diff --git a/docs/docs/fr/getting-started/prerequisites.md b/docs/docs/fr/getting-started/prerequisites.md
new file mode 100644
index 0000000..7f0a781
--- /dev/null
+++ b/docs/docs/fr/getting-started/prerequisites.md
@@ -0,0 +1,12 @@
+# Prérequis
+
+## Environnement
+
+- Java 8 ou supérieur
+- Maven
+- Docker / Docker Compose (optionnel pour la doc locale)
+
+## Sources
+
+- Dépôt GitHub du projet
+- Accès aux fichiers de configuration
diff --git a/docs/docs/fr/getting-started/ws-tester.md b/docs/docs/fr/getting-started/ws-tester.md
new file mode 100644
index 0000000..4ef5505
--- /dev/null
+++ b/docs/docs/fr/getting-started/ws-tester.md
@@ -0,0 +1,94 @@
+# WebSocket Tester
+
+Le projet inclut une interface cliente WebSocket prête à l'emploi : `ws-tester.html`.
+
+Ce testeur permet de valider rapidement une instance TIC2WebSocket, sans développer de client spécifique.
+
+## Rôle dans le projet
+
+Utilisez le testeur pour :
+
+- vérifier que le serveur WebSocket est joignable,
+- découvrir les flux TIC disponibles,
+- générer des requêtes JSON valides pour les principales commandes API,
+- inspecter les réponses/évènements entrants en temps réel,
+- reproduire des problèmes d'intégration lors du dépannage.
+
+## Ouvrir le testeur
+
+Ouvrez `ws-tester.html` dans votre navigateur.
+
+Par défaut, il cible `ws://localhost:19584/`.
+
+Vous pouvez préremplir la connexion avec des paramètres de requête :
+
+- URL complète : `?url=ws://localhost:19584/` (alias : `wsUrl`, `ws`)
+- Hôte/port : `?host=localhost&port=19584` (alias hôte : `address`, `addr`)
+
+## Flux d'utilisation principal
+
+1. Vérifiez l'URL cible par défaut ou ajustez l'hôte et le port si nécessaire.
+
+ 
+
+2. Cliquez sur **Connect** pour ouvrir la session WebSocket.
+
+ 
+
+3. Choisissez un preset de requête dans la liste déroulante.
+
+ 
+
+4. Vérifiez le payload JSON généré avant l'envoi.
+
+ 
+
+5. Cliquez sur **Send** et surveillez le panneau de logs pour suivre les échanges.
+
+ 
+
+6. Cliquez sur **Disconnect** lorsque la session de test est terminée.
+
+ 
+
+## Presets de requêtes et identifiants
+
+Presets disponibles :
+
+- `GetModemsInfo`
+- `GetAvailableTICs`
+- `ReadTIC`
+- `SubscribeTIC`
+- `UnsubscribeTIC`
+
+Les champs d'identifiant sont optionnels sauf pour `ReadTIC`, qui exige un identifiant.
+
+Règle de priorité appliquée par le testeur :
+
+1. `serialNumber`
+2. `portId`
+3. `portName`
+
+Lorsqu'un identifiant de priorité supérieure est actif, les champs de priorité inférieure sont désactivés automatiquement.
+
+Pour `SubscribeTIC` / `UnsubscribeTIC` :
+
+- aucun identifiant sélectionné -> la requête s'applique à tous les flux,
+- un identifiant sélectionné -> la requête cible ce flux.
+
+Lors de la réception d'une réponse `GetAvailableTICs`, le testeur remplit automatiquement les champs d'identifiants avec la première entrée retournée.
+
+## Logs et diagnostic
+
+- Lignes **OUT** : JSON envoyé par le client.
+- Lignes **IN** : messages reçus du serveur.
+- Lignes **ERR** : erreurs de validation client ou erreurs socket.
+
+Les messages `EVENT` sont regroupés par nom d'évènement + identifiant pour garder des logs lisibles en mode flux.
+
+## Bonnes pratiques
+
+- Commencez par `GetAvailableTICs` avant `ReadTIC`/`SubscribeTIC`.
+- Conservez une indentation JSON à `2` pour faciliter le debug.
+- Utilisez **Clear logs** avant de reproduire un incident.
+- Conservez les couples requête/réponse utiles lors d'un signalement.
\ No newline at end of file
diff --git a/docs/docs/fr/index.md b/docs/docs/fr/index.md
new file mode 100644
index 0000000..042c4fd
--- /dev/null
+++ b/docs/docs/fr/index.md
@@ -0,0 +1,21 @@
+# TIC2WebSocket
+
+Bienvenue dans la documentation du projet TIC2WebSocket.
+
+## Introduction
+TIC2WebSocket est une application Java qui expose les données TIC (Téléinformation Client) via une interface WebSocket. Elle permet aux développeurs d'accéder facilement aux données TIC en temps réel, facilitant ainsi l'intégration avec d'autres systèmes et applications.
+
+## Structure de la documentation
+La documentation est organisée en plusieurs sections pour vous guider à travers les différentes étapes de l'utilisation de TIC2WebSocket :
+
+- [Démarrage](getting-started/index.md) : Guide pour démarrer rapidement avec TIC2WebSocket.
+ - [Prérequis](getting-started/prerequisites.md) : Liste des prérequis matériels et logiciels nécessaires.
+ - [Installation](getting-started/installation.md) : Instructions détaillées pour installer TIC2WebSocket.
+ - [Lancement](getting-started/launch.md) : Comment lancer le serveur TIC2WebSocket.
+ - [Testeur WebSocket](getting-started/ws-tester.md) : Guide pour utiliser le testeur WebSocket intégré.
+- [Utilisation](usage/index.md) : Exemples d'utilisation et cas d'usage courants.
+ - [Référence API](usage/api.md) : Documentation de l'API WebSocket exposée par TIC2WebSocket.
+ - [Configuration](usage/configuration.md) : Détails sur la configuration avancée de TIC2WebSocket.
+- [Développement](development/index.md) : Guide pour contribuer au projet TIC2WebSocket.
+ - [Architecture](development/architecture.md) : Description de l'architecture du projet TIC2WebSocket.
+ - [Contribuer](development/contributing.md) : Comment contribuer au code, signaler des bugs, et proposer des améliorations.
\ No newline at end of file
diff --git a/docs/docs/fr/usage/api.md b/docs/docs/fr/usage/api.md
new file mode 100644
index 0000000..2260b1a
--- /dev/null
+++ b/docs/docs/fr/usage/api.md
@@ -0,0 +1,331 @@
+# Référence API
+
+La communication avec TIC2WebSocket repose sur des messages JSON échangés via WebSocket.
+
+## GetAvailableTICs
+
+Cette requête permet de récupérer la liste des flux TIC disponibles.
+
+### Requête
+
+```json
+{
+ "type": "REQUEST",
+ "name": "GetAvailableTICs"
+}
+```
+
+### Réponse
+
+La réponse contient une liste de structures avec les informations TIC :
+
+- numéro de série du compteur Linky ;
+- nom du port série ;
+- identifiant du port USB physique.
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "GetAvailableTICs",
+ "dateTime": "10/06/2021 14:01:00",
+ "errorCode": 0,
+ "data": [
+ {
+ "serialNumber": "021762010203",
+ "portName": "/dev/ttyUSB0",
+ "portId": "1-1"
+ },
+ {
+ "serialNumber": "041775010507",
+ "portName": "/dev/ttyUSB2",
+ "portId": "1-2"
+ }
+ ]
+}
+```
+
+## GetModemsInfo
+
+Cette requête permet de récupérer la liste des informations des modems TIC connectés.
+
+La reconnaissance des modems se fait à partir de la paire USB `vendorId` + `productId`.
+
+Types de modems pris en charge :
+
+| Type de modem | Vendor ID (hex) | Product ID (hex) | Vendor ID (dec) | Product ID (dec) |
+| --- | --- | --- | --- | --- |
+| `MICHAUD` | `0x0403` | `0x6001` | `1027` | `24577` |
+| `TELEINFO` | `0x0403` | `0x6015` | `1027` | `24597` |
+
+### Requête
+
+```json
+{
+ "type": "REQUEST",
+ "name": "GetModemsInfo"
+}
+```
+
+### Réponse
+
+La réponse contient une liste de structures avec les informations des modems :
+
+- nom du port série ;
+- type de modem, si disponible (uniquement les modem USB décrit ci-dessus);
+- identifiant produit (USB PID), si disponible ;
+- identifiant vendeur (USB VID), si disponible ;
+- nom du produit, si disponible ;
+- nom du fabricant, si disponible ;
+- numéro de série du modem, si disponible ;
+- identifiant physique du port série, si disponible.
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "GetModemsInfo",
+ "dateTime": "16/06/2021 15:53:32",
+ "errorCode": 0,
+ "data": [
+ {
+ "portName": "COM3",
+ "modemType": "MICHAUD",
+ "productId": 24597,
+ "vendorId": 1027,
+ "productName": null,
+ "manufacturerName": "FTDI",
+ "serialNumber": "DA2VYTKGA",
+ "portId": null
+ }
+ ]
+}
+```
+
+## ReadTIC
+
+Cette requête permet de lire une trame TIC.
+
+### Requête
+
+```json
+{
+ "type": "REQUEST",
+ "name": "ReadTIC",
+ "data": {
+ "serialNumber": "010203040506"
+ }
+}
+```
+
+Le champ `data` doit contenir un identifiant TIC défini dans le [format d'identifiant TIC](#format-didentifiant-tic).
+
+### Réponse
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "ReadTIC",
+ "dateTime": "10/06/2021 14:01:00",
+ "errorCode": 0,
+ "data": {
+ "mode": "STANDARD",
+ "captureDateTime": "10/06/2021 14:01:00",
+ "ticIdentifier": {
+ "serialNumber": "021762010203",
+ "portName": "/dev/ttyUSB0",
+ "portId": "1-1"
+ },
+ "content": {
+ "ADSC": "010203040506",
+ "URMS1": "230"
+ }
+ }
+}
+```
+
+## SubscribeTIC
+
+Cette requête permet de s'abonner à un flux TIC. Une fois abonné, le client reçoit des évènements à chaque nouvelle trame TIC ou erreur liée au flux TIC.
+
+### Requête
+
+Plusieurs formats sont possibles.
+
+Abonnement à un flux TIC :
+
+```json
+{
+ "type": "REQUEST",
+ "name": "SubscribeTIC",
+ "data": {
+ "serialNumber": "010203040506"
+ }
+}
+```
+
+Abonnement à plusieurs flux TIC :
+
+```json
+{
+ "type": "REQUEST",
+ "name": "SubscribeTIC",
+ "data": [
+ {
+ "serialNumber": "010203040506"
+ },
+ {
+ "portId": "1-1"
+ }
+ ]
+}
+```
+
+Abonnement à tous les flux TIC :
+
+```json
+{
+ "type": "REQUEST",
+ "name": "SubscribeTIC"
+}
+```
+
+Le champ `data` doit contenir un identifiant TIC (ou une liste d'identifiants TIC) défini dans le [format d'identifiant TIC](#format-didentifiant-tic).
+
+### Réponse
+
+Réponse en cas de succès :
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "SubscribeTIC",
+ "dateTime": "10/06/2021 14:01:00",
+ "errorCode": 0
+}
+```
+
+Si le flux TIC demandé n'existe pas :
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "SubscribeTIC",
+ "dateTime": "10/06/2021 14:01:00",
+ "errorCode": -7,
+ "errorMessage": "The given TIC identifier doesn't match with current TIC stream"
+}
+```
+
+## Évènement `OnTICData`
+
+Cet évènement est généré à chaque nouvelle trame TIC et envoyé à tous les clients abonnés à cette TIC.
+
+```json
+{
+ "type": "EVENT",
+ "dateTime": "10/06/2021 14:01:00",
+ "name": "OnTICData",
+ "data": {
+ "mode": "STANDARD",
+ "captureDateTime": "10/06/2021 14:01:00",
+ "ticIdentifier": {
+ "serialNumber": "021762010203",
+ "portName": "/dev/ttyUSB0",
+ "portId": "1-1"
+ },
+ "content": {
+ "ADSC": "010203040506",
+ "URMS1": "230"
+ }
+ }
+}
+```
+
+## Évènement `OnError`
+
+Cet évènement est généré lorsqu'une erreur survient sur le flux TIC et envoyé à tous les clients abonnés à cette TIC.
+
+```json
+{
+ "type": "EVENT",
+ "dateTime": "10/06/2021 14:01:00",
+ "name": "OnError",
+ "data": {
+ "errorCode": -5,
+ "errorMessage": "TIC frame reading timeout",
+ "ticIdentifier": {
+ "serialNumber": "021762010203",
+ "portName": "/dev/ttyUSB0",
+ "portId": "1-1"
+ }
+ }
+}
+```
+
+## UnsubscribeTIC
+
+Cette requête permet de se désabonner d'un flux TIC.
+
+### Requête
+
+Plusieurs formats sont possibles.
+
+Désabonnement d'un flux TIC :
+
+```json
+{
+ "type": "REQUEST",
+ "name": "UnsubscribeTIC",
+ "data": {
+ "serialNumber": "010203040506"
+ }
+}
+```
+
+Désabonnement de plusieurs flux TIC :
+
+```json
+{
+ "type": "REQUEST",
+ "name": "UnsubscribeTIC",
+ "data": [
+ {
+ "serialNumber": "010203040506"
+ },
+ {
+ "portId": "1-1"
+ }
+ ]
+}
+```
+
+Désabonnement de tous les flux TIC :
+
+```json
+{
+ "type": "REQUEST",
+ "name": "UnsubscribeTIC"
+}
+```
+
+Dans le cas d'un désabonnement ciblé, le champ `data` doit contenir un identifiant TIC (ou une liste d'identifiants TIC) défini dans le [format d'identifiant TIC](#format-didentifiant-tic).
+
+## Format d'identifiant TIC
+
+Un identifiant TIC est un objet contenant un des champs suivants :
+
+- `serialNumber` : numéro de série du compteur Linky ;
+- `portId` : identifiant physique du port série sur lequel le modem est connecté ;
+- `portName` : nom du port série sur lequel le modem est connecté ;
+
+Selon la requête, vous pouvez fournir un identifiant unique ou une liste d'identifiants.
+
+### Réponse
+
+```json
+{
+ "type": "RESPONSE",
+ "name": "UnsubscribeTIC",
+ "dateTime": "16/06/2021 15:53:32",
+ "errorCode": 0
+}
+```
\ No newline at end of file
diff --git a/docs/docs/fr/usage/configuration.md b/docs/docs/fr/usage/configuration.md
new file mode 100644
index 0000000..a94a60b
--- /dev/null
+++ b/docs/docs/fr/usage/configuration.md
@@ -0,0 +1,56 @@
+# Configuration
+
+## Emplacement
+
+Le fichier de configuration `TIC2WebSocketConfiguration.json` se trouve dans le sous-répertoire `var/config` du répertoire d'installation de TIC2WebSocket.
+
+## Structure
+
+Le fichier de configuration utilise le format JSON et vous permet de modifier les paramètres suivants :
+
+- le port d'écoute du serveur WebSocket ;
+- le mode TIC (optionnel) ;
+- la liste des ports série natifs (optionnel).
+
+> ℹ️ La liste des ports USB n'est pas configurable, car TIC2WebSocket les détecte automatiquement.
+
+Exemple de fichier de configuration :
+
+```json
+{
+ "serverPort": 19584,
+ "ticMode": "AUTO",
+ "ticPortNames": ["/dev/ttyAMA0"]
+}
+```
+
+## Paramètre `serverPort`
+
+Le paramètre `serverPort` permet de configurer le port TCP d'écoute du serveur WebSocket TIC2WebSocket, entre `1` et `65535`.
+
+La valeur par défaut est `19584`.
+
+## Paramètre `ticMode`
+
+Le paramètre `ticMode` permet de configurer le mode de flux TIC :
+
+- `"AUTO"` : détection automatique (valeur par défaut) ;
+- `"STANDARD"` : mode TIC Standard à 9600 bauds ;
+- `"HISTORIC"` : mode TIC Historique à 1200 bauds.
+
+## Paramètre `ticPortNames`
+
+Le paramètre `ticPortNames` permet de configurer la liste des ports série natifs utilisés pour lire la TIC.
+
+Lorsque ce paramètre est défini, la liste doit :
+
+- contenir au moins un élément ;
+- contenir des éléments uniques ;
+- ne contenir aucun élément nul ;
+- contenir uniquement des chaînes d'au moins un caractère.
+
+Exemple :
+
+```json
+"ticPortNames": ["/dev/ttyAMA0"]
+```
diff --git a/docs/docs/fr/usage/index.md b/docs/docs/fr/usage/index.md
new file mode 100644
index 0000000..249f5b0
--- /dev/null
+++ b/docs/docs/fr/usage/index.md
@@ -0,0 +1,23 @@
+# Utilisation
+
+Cette section présente l'utilisation de TIC2WebSocket côté client.
+
+## Démarche recommandée
+
+1. Ouvrir une connexion WebSocket vers le serveur TIC2WebSocket.
+2. Envoyer une requête `GetAvailableTICs` pour découvrir les flux disponibles.
+3. S'abonner au(x) flux voulu(s) avec `SubscribeTIC`.
+4. Traiter les évènements `OnTICData` et `OnError`.
+5. Se désabonner avec `UnsubscribeTIC` avant fermeture du client.
+
+## Référence API
+
+Consultez la page dédiée à la référence complète des requêtes et évènements :
+
+- [Référence API](api.md)
+
+## Testeur WebSocket
+
+Pour tester rapidement les requêtes/évènements avec l'interface cliente intégrée :
+
+- [WS Tester](../getting-started/ws-tester.md)
diff --git a/docs/docs/stylesheets/puml-fix.css b/docs/docs/stylesheets/puml-fix.css
new file mode 100644
index 0000000..1abfaca
--- /dev/null
+++ b/docs/docs/stylesheets/puml-fix.css
@@ -0,0 +1,25 @@
+/*
+ * PlantUML (mkdocs-puml / plantuml plugin) renders both light and dark SVGs.
+ * The upstream puml.css only hides variants when Material palette attributes
+ * (data-md-color-scheme) exist or when prefers-color-scheme is dark.
+ *
+ * When neither applies (common on fresh load or when no palette is configured),
+ * both variants become visible. This file enforces a sane default.
+ */
+
+/* Default: show light, hide dark */
+body .puml.light { display: block; }
+body .puml.dark { display: none; }
+
+/* OS/browser dark mode */
+@media (prefers-color-scheme: dark) {
+ body .puml.light { display: none; }
+ body .puml.dark { display: block; }
+}
+
+/* MkDocs Material explicit palette (if enabled) */
+body[data-md-color-scheme="default"] .puml.light { display: block; }
+body[data-md-color-scheme="default"] .puml.dark { display: none; }
+
+body[data-md-color-scheme="slate"] .puml.light { display: none; }
+body[data-md-color-scheme="slate"] .puml.dark { display: block; }
diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml
new file mode 100644
index 0000000..312d532
--- /dev/null
+++ b/docs/mkdocs.yml
@@ -0,0 +1,103 @@
+# SPDX-FileCopyrightText: 2025 Enedis Smarties team
+# SPDX-FileContributor: Jehan BOUSCH
+# SPDX-FileContributor: Mathieu SABARTHES
+#
+# SPDX-License-Identifier: Apache-2.0
+
+site_name: TIC2WebSocket
+site_url: "https://enedis-oss.github.io/tic2websocket/"
+site_description: Documentation TIC2WebSocket
+site_author: Enedis OSS
+
+repo_name: Enedis-OSS/tic2websocket
+repo_url: https://github.com/Enedis-OSS/TIC2WebSocket
+
+# Site navigation
+nav:
+ - Overview: index.md
+ - Getting Started:
+ - Overview: getting-started/index.md
+ - Prerequisites: getting-started/prerequisites.md
+ - Installation: getting-started/installation.md
+ - Launch: getting-started/launch.md
+ - WS Tester: getting-started/ws-tester.md
+ - Usage:
+ - Overview: usage/index.md
+ - API Reference: usage/api.md
+ - Configuration: usage/configuration.md
+ - Development:
+ - Overview: development/index.md
+ - Architecture: development/architecture.md
+ - Contributing: development/contributing.md
+
+markdown_extensions:
+ - admonition
+ - pymdownx.details
+ - pymdownx.superfences
+ # - plantuml_markdown:
+ # server: "http://plantuml:8080/plantuml"
+ # format: svg
+
+plugins:
+ - plantuml:
+ puml_url: http://plantuml:8080
+ puml_keyword: plantuml
+ theme:
+ enabled: true
+ light: default/light
+ dark: default/dark
+ - search
+ - i18n:
+ docs_structure: folder
+ fallback_to_default: true
+ reconfigure_material: true
+ reconfigure_search: true
+ languages:
+ - locale: fr
+ default: true
+ name: Français
+ build: true
+ nav_translations:
+ Overview: Vue d'ensemble
+ Getting Started: Démarrage
+ Prerequisites: Prérequis
+ Installation: Installation
+ Configuration: Configuration
+ Usage: Utilisation
+ API Reference: Référence API
+ WS Tester: WS Tester
+ Architecture: Architecture
+ Contributing: Contribuer
+ Launch: Lancement
+ Development: Développement
+
+ - locale: en
+ name: English
+ build: true
+ nav_translations:
+ Overview: Overview
+ Getting Started: Getting Started
+ Prerequisites: Prerequisites
+ Installation: Installation
+ Configuration: Configuration
+ Usage: Usage
+ API Reference: API Reference
+ WS Tester: WS Tester
+ Architecture: Architecture
+ Contributing: Contributing
+ Launch: Launch
+ Development: Development
+
+theme:
+ name: material
+ language: fr
+ font:
+ text: Ubuntu
+ features:
+ - navigation.sections
+ - navigation.expand
+ - navigation.indexes
+ - toc.integrate
+
+extra_css:
+ - stylesheets/puml-fix.css
diff --git a/docs/requirements.txt b/docs/requirements.txt
new file mode 100644
index 0000000..f2876d9
--- /dev/null
+++ b/docs/requirements.txt
@@ -0,0 +1,4 @@
+# Extra MkDocs extensions beyond squidfunk/mkdocs-material
+plantuml-markdown
+mkdocs-puml
+mkdocs-static-i18n