diff --git a/.dockerignore b/.dockerignore
deleted file mode 100644
index f6583ff37f4fe49d18819affc38e873e5e031d7f..0000000000000000000000000000000000000000
--- a/.dockerignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-app/Dockerfile
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000000000000000000000000000000000000..6f9185791af15e1cbf15957a9ce09b39fabd5d80
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,141 @@
+# Contributing
+
+## Install
+
+[nodeJS](https://nodejs.org/en/download)
+
+## Launch the app
+
+```
+npm install
+npm run dev
+```
+
+Open chrome base browser and go to http://localhost:5173/.
+
+## Add a new device
+
+1. Get the device code from the stock ROM
+ - We link device and its resources with deviceName.toLowerCase().replace(/ /g, ''); ex: One Plus Nord -> oneplusnord.json
+ - Since the deviceName may not be the same in fastboot (Android), we need at least a first connexion in adb to retrieve the deviceName
+2. Understand how does the flash process works
+3. Configure the flash process
+ - Define the steps in an array of objects describing the process
+ - template:
+ ```json
+ "steps": [
+ {
+ "mode": string?,
+ "command" : string?,
+ "instruction": string?,
+ "needUser": boolean?
+ }
+ ]
+ ```
+ - Options
+
+ | key | exemple | description |
+ |---------------|---------------------------------|-----------------------------------------------------------------------------|
+ | `mode` | `[fastboot\| adb\| bootloader]` | It's a shortcut for a reboot and a reconnect before the command is executed |
+ | `needUser` | `[true\| false]` | The user needs to click on continue before the command is executed |
+ | `instruction` | `Please select unlock` | String displayed to the user at this step. Command is used if not defined |
+ | `command` | `flashing unlock unlocked` | Command as defined in the next chapter |
+ - Available commands
+
+ | command | exemple | description |
+ |----------------------------------------|----------------------------|-----------------|
+ | `[flashing\| oem] unlock [varName?]` | `flashing unlock unlocked` | -------------- |
+ | `[flashing\|oem] lock [varName?]` | `flashing lock` | -------------- |
+ | `flash [partitionName] [fileName.img]` | `flashing unlock unlocked` | -------------- |
+ | `sideload [fileName.zip]` | `sideload romFile.zip` | -------------- |
+ | `erase [partitionName]` | `erase userdata` | -------------- |
+ | `reboot [fastboot\| adb\| bootloader]` | `reboot bootloader` | -------------- |
+ | `connect [adb\| bootloader]` | `connect device` | -------------- |
+
+ > For oem, recovery, rom and key, we parse these command and execute them. The others commands are not analyzed and executed arbitrarily in the device.
+
+ - Define the folder, an array describing the files involved in the flash process
+ - template:
+ ```json
+ "folder": [
+ {
+ "name" : "filename.zip", # fileName used for the command.
+ "path": "https://domain.com/image.zip", # path used to download the file.
+ "unzip": true # optional boolean in case we have a zip we want to uncompress.
+ }
+ ]
+ ```
+
+ > In case of unzip : the file is unzipped, and the retrieved files are stored in the "folder" like the other file
+ - example:
+
+ ```json
+ {
+ "folder": [
+ {
+ "name": "recovery.img"
+ "path" : "assets/sources/coral/recovery-e-latest-s-community-coral.img"
+ },
+ {
+ "name": "rom.zip",
+ "path" : "assets/sources/coral/e-latest-s-community-coral.zip"
+ },
+ {
+ "name": "pkmd_pixel.bin",
+ "path" : "assets/sources/coral/pkmd_pixel.bin"
+ },
+ {
+ "path" : "assets/sources/emerald/IMG-e-latest-s-official-emerald.zip",
+ "name": "Teracube_2e installer",
+ "unzip": true
+ },
+ ]
+ }
+ ```
+4. Adding images
+ - Add the images files within `app/public/assets/images/illustrations/fp5`
+ - declare the image in the html, at `app/index.html`
+ - example:
+ ```html
+
+
+
+
+
+
+
+
+
+
+
+
+ ```
+
+## Other
+
+- Vues
+ - `vue.manager.js`
+ - Need log.manager.js and translation.manager.js
+ - Need a div with id "process"
+ - `log.manager.js`
+ - Need a div with id "log-ctn" to scroll on log added
+ - Need a select with id "log" to add log
+ - `translation.manager.js`
+ - Need a select with id "translation" to listen to.
+ - On select change : download the translation file and render the DOM
+ - Translation are in `static/assets/languages`
+- Controller
+ - `controller.manager.js`
+
+## Doctrine
+
+- my-class are for css class
+- camelCase are for variable
+- $variableName are for DOM Nodes
+- MAJUSCULE are for global constant
+- object.manager.js are for class directing subClass or vue. It's just my arbitrary concept to mark a class as "directive" in the process
+- object.class.js are for class used by object.manager.js where functions should have a single responsibility
+
+Please respect ♥
diff --git a/README.md b/README.md
index 5c55fdaca529e036798e03f2fbe67f0e05d195f1..e64526e3580f9d8574302134825d36bce3210ad4 100644
--- a/README.md
+++ b/README.md
@@ -23,142 +23,13 @@ Install /e/OS from a chromium-based browser
- Linux: `docker run -v "$(pwd)/src:/app/src" -p 127.0.0.1:3000:3000 eos-installer`
3. The app is available at `http://localhost:3000/`
-## Usage
+## Supportted devices
+
+The list of supported devices is available [here](https://gitlab.e.foundation/e/devices/eos-installer/-/tree/main/app/public/resources).
## Contributing
-### Build
-
-```shell
-docker build -t eos-installer app/.
-```
-
-### Add a new device
-
-1. Get the device code from the stock ROM
- - We link device and its resources with deviceName.toLowerCase().replace(/ /g, ''); ex: One Plus Nord -> oneplusnord.json
- - Since the deviceName may not be the same in fastboot (Android), we need at least a first connexion in adb to retrieve the deviceName
-2. Understand how does the flash process works
-3. Configure the flash process
- - Define the steps in an array of objects describing the process
- - template:
- ```json
- "steps": [
- {
- "mode": string?,
- "command" : string?,
- "instruction": string?,
- "needUser": boolean?
- }
- ]
- ```
- - Options
-
- | key | exemple | description |
- |---------------|---------------------------------|-----------------------------------------------------------------------------|
- | `mode` | `[fastboot\| adb\| bootloader]` | It's a shortcut for a reboot and a reconnect before the command is executed |
- | `needUser` | `[true\| false]` | The user needs to click on continue before the command is executed |
- | `instruction` | `Please select unlock` | String displayed to the user at this step. Command is used if not defined |
- | `command` | `flashing unlock unlocked` | Command as defined in the next chapter |
- - Available commands
-
- | command | exemple | description |
- |----------------------------------------|----------------------------|-----------------|
- | `[flashing\| oem] unlock [varName?]` | `flashing unlock unlocked` | -------------- |
- | `[flashing\|oem] lock [varName?]` | `flashing lock` | -------------- |
- | `flash [partitionName] [fileName.img]` | `flashing unlock unlocked` | -------------- |
- | `sideload [fileName.zip]` | `sideload romFile.zip` | -------------- |
- | `erase [partitionName]` | `erase userdata` | -------------- |
- | `reboot [fastboot\| adb\| bootloader]` | `reboot bootloader` | -------------- |
- | `connect [adb\| bootloader]` | `connect device` | -------------- |
-
- > For oem, recovery, rom and key, we parse these command and execute them. The others commands are not analyzed and executed arbitrarily in the device.
-
- - Define the folder, an array describing the files involved in the flash process
- - template:
- ```json
- "folder": [
- {
- name : fileName used for the command ,
- path: path used to download the file,
- unzip: optional boolean in case we have a zip we want to parse
- }
- ]
- ```
-
- > In case of unzip : the file is unzipped, and the retrieved files are stored in the "folder" like the other file
- - example:
-
- ```json
- {
- "folder": [
- {
- "name": "recovery.img"
- "path" : "assets/sources/coral/recovery-e-1.14-s-20230818321663-dev-coral.img"
- },
- {
- "name": "rom.zip",
- "path" : "assets/sources/coral/e-1.14-s-20230818321663-dev-coral.zip"
- },
- {
- "name": "pkmd_pixel.bin",
- "path" : "assets/sources/coral/pkmd_pixel.bin"
- },
- {
- "path" : "assets/sources/emerald/IMG-e-1.14.2-s-20230825321006-stable-emerald.zip",
- "name": "Teracube_2e installer",
- "unzip": true
- },
- ]
- }
- ```
-4. Adding images
- - Add the images files within `app/src/static/assets/images/illustrations/fp5`
- - declare the image in the html, at `app/src/static/index.html`
- - example:
- ```html
-
-
-
-
-
-
-
-
-
-
-
-
- ```
-
-### Other
-
-- Vues
- - `vue.manager.js`
- - Need log.manager.js and translation.manager.js
- - Need a div with id "process"
- - `log.manager.js`
- - Need a div with id "log-ctn" to scroll on log added
- - Need a select with id "log" to add log
- - `translation.manager.js`
- - Need a select with id "translation" to listen to.
- - On select change : download the translation file and render the DOM
- - Translation are in `static/assets/languages`
-- Controller
- - `controller.manager.js`
-
-### Doctrine
-
-- my-class are for css class
-- camelCase are for variable
-- $variableName are for DOM Nodes
-- MAJUSCULE are for global constant
-- object.manager.js are for class directing subClass or vue. It's just my arbitrary concept to mark a class as "directive" in the process
-- object.class.js are for class used by object.manager.js where functions should have a single responsibility
-
-Please respect ♥
+See [CONTRIBUTING.md](CONTRIBUTING.md).
## License
@@ -173,4 +44,3 @@ Using:
Libraries:
- fastboot.js (License: MIT): https://github.com/kdrag0n/fastboot.js/
- ya-webadb (License: MIT): https://github.com/yume-chan/ya-webadb
-- zip-no-worker-inflate.js (License: BSD3): https://github.com/gildas-lormeau/zip.js/blob/master/lib/zip-no-worker-inflate.js
diff --git a/app/Dockerfile b/app/Dockerfile
index b05651a78f0dcfb0ec1dffd6e145cbe0fea1bc50..2a2a3e4eef48ec259406e959143445baffcdee82 100644
--- a/app/Dockerfile
+++ b/app/Dockerfile
@@ -1,8 +1,8 @@
-# syntax=docker/dockerfile:1
-
-FROM node:22-alpine
+FROM node:23-alpine AS builder
WORKDIR /app
COPY . .
-RUN yarn install --production
-CMD ["node", "src/index.js"]
-EXPOSE 3000
+RUN npm install && npm run build
+
+FROM nginx:1.27.3
+
+COPY --from=builder /app/dist /usr/share/nginx/html
diff --git a/app/src/static/index.html b/app/index.html
similarity index 86%
rename from app/src/static/index.html
rename to app/index.html
index 4f2b5179170c83810f6029de35a62c2479427abb..9e59fb30ce005705980f41af8c1db0f39e48791c 100644
--- a/app/src/static/index.html
+++ b/app/index.html
@@ -5,13 +5,12 @@
-
-
+
+
/e/OS Installer
-
-
-
-
+
+
+