diff --git a/docker/demo/docker-compose.yml b/docker/demo/docker-compose.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8cb4ed158f32ecc7d296f1bede3ae5d3f27c7f00
--- /dev/null
+++ b/docker/demo/docker-compose.yml
@@ -0,0 +1,106 @@
+version: "3.9"
+
+services:
+  ## INITIALIZE GENESIS AND SECRETS
+  init:
+    build:
+      context: ../../
+      dockerfile: docker/demo/init/Dockerfile
+    volumes:
+      - ecomobicoin-data:/data
+
+  simulation-data:
+    image: registry.gitlab.limos.fr/ecomobicoin/data/movement-data
+    volumes:
+      - simulation-data:/data
+
+  ## RUN NODES
+  node-1:
+    image: registry.gitlab.limos.fr/ecomobicoin/truite
+    platform: linux/amd64/r
+    command: sh -c "truite --datadir /data/data-1 --chain-spec-file /data/local-1.ron --max-block 0 --exit-after-sync && truite --datadir /data/data-1 --chain-spec-file /data/local-1.ron --rpc-listen-address 0.0.0.0:8545 --no-dns-discovery"
+    depends_on:
+      init:
+        condition: service_completed_successfully
+    ports:
+      - "41000:7545"
+      - "41002:8545"
+      - "41303:30303/tcp"
+      - "41303:30303/udp"
+    volumes:
+      - ecomobicoin-data:/data
+    restart: on-failure
+
+  node-2:
+    image: registry.gitlab.limos.fr/ecomobicoin/truite
+    platform: linux/amd64/r
+    command: [
+        "truite",
+        "--datadir",
+        "/data/data-2",
+        "--chain-spec-file",
+        "/data/local-2.ron",
+        # "--no-discovery",
+        "--no-dns-discovery",
+        "--rpc-listen-address",
+        "0.0.0.0:8545",
+      ]
+    depends_on:
+      init:
+        condition: service_completed_successfully
+    ports:
+      - "42000:7545"
+      - "42002:8545"
+      - "42303:30303/tcp"
+      - "42303:30303/udp"
+    volumes:
+      - ecomobicoin-data:/data
+    restart: on-failure
+
+  explorer:
+    image: registry.gitlab.limos.fr/ecomobicoin/block-explorer
+    environment:
+      - ERIGON_URL=http://localhost:42002
+    depends_on:
+      - node-2
+    ports:
+      - "40100:80"
+    restart: on-failure
+
+  tickets-api:
+    image: registry.gitlab.limos.fr/ecomobicoin/tickets_api
+    environment:
+      - SIGNING_KEY=
+    ports:
+      - "3001:3001"
+      # - "43001:3001"
+    restart: on-failure
+
+  front:
+    image: registry.gitlab.limos.fr/ecomobicoin/example-app
+    ports:
+      - "43000:3000"
+    restart: on-failure
+    # front env vars are set in docker build.
+
+  testnet-injector:
+    image: registry.gitlab.limos.fr/ecomobicoin/testnet-injector:modify-docker-image
+    container_name: testnet-injector
+    platform: linux/amd64/r
+    depends_on:
+      - simulation-data
+      - node-1
+      - node-2
+    environment:
+      - RPC_URL=http://node-1:8545
+      - RPC_URL_MINER_1=http://node-1:8545
+      - RPC_URL_MINER_2=http://node-2:8545
+      - BLOCK_TIME=12
+      - TOTAL_SIMULATION_TIME=1800
+    volumes:
+      - simulation-data:/data
+    command: ./scripts/run_simulation_2_nodes.sh
+
+volumes:
+  ecomobicoin-data:
+  simulation-data:
diff --git a/docker/demo/init.sh b/docker/demo/init.sh
new file mode 100755
index 0000000000000000000000000000000000000000..344b8f9fe738a104b6cb9b4bbaa66dfafcb80874
--- /dev/null
+++ b/docker/demo/init.sh
@@ -0,0 +1,40 @@
+#!/bin/sh
+
+set -e
+
+if [ -f "$GENESIS_PATH" ]; then
+    echo "Secrets have already been generated."
+else
+    echo "Generating secrets..."
+    # secrets=$("$POLYGON_EDGE_BIN" secrets init --insecure --num 4 --data-dir /data/data- --json)
+    # echo "Secrets have been successfully generated"
+    # mkdir -p /data/data-1 /data/data-2
+    echo -n "6cc26b8e1321d771f5bf3af188aca546941b7c35941ba426d4bfc38ec54bbe46" > /data/data-1/nodekey
+    echo -n"433d2cd42ec425403903ecffefd7cbcdc582e34575e2b5b8d2d7bb7958045162" > /data/data-1/jwt.hex
+
+    echo -n "a0e7c71661af160e5b71be81672629d4960b9736e2d5568e153650253f2cfbd8" > /data/data-2/nodekey
+    echo -n "fa927d7eb2051cf226df5c21d44cb27c035ea4227dea435a8dd8ca983e6335e1" > /data/data-2/jwt.hex
+
+    chown truite:truite /data/data-{1,2}/nodekey
+    chown truite:truite /data/data-{1,2}/jwt.hex
+    
+    echo "Added keys for node-1, node-2"
+
+    # Need root user to create file
+    cp ./local.ron /data/local.ron
+    cp ./local.ron /data/local-1.ron
+    cp ./local.ron /data/local-2.ron
+
+    sed -i 's/\/\/"enode:\/\/NODE1/"enode:\/\/0bcddc979717e692c7e05e281db4febb96fa566fbe43ae6b3f7860bec62af336393c3443d9a9dc746d66b7712f5b6742cd90d22afdc8ad2c08d1cd9b958964cd/g' /data/local.ron
+    sed -i 's/\/\/"enode:\/\/NODE2/"enode:\/\/e4ac9a8b6b779d482e74ee2f7b35b58269757dbd2d53364fe683a90935b7866d0262cf6cb947e06bf28b0563964edef15be15ff472c2c232ec7d1bb20764394a/g' /data/local.ron
+
+    sed -i 's/\/\/"enode:\/\/NODE2/"enode:\/\/e4ac9a8b6b779d482e74ee2f7b35b58269757dbd2d53364fe683a90935b7866d0262cf6cb947e06bf28b0563964edef15be15ff472c2c232ec7d1bb20764394a/g' /data/local-1.ron
+
+    sed -i 's/\/\/"enode:\/\/NODE1/"enode:\/\/0bcddc979717e692c7e05e281db4febb96fa566fbe43ae6b3f7860bec62af336393c3443d9a9dc746d66b7712f5b6742cd90d22afdc8ad2c08d1cd9b958964cd/g' /data/local-2.ron
+
+    echo "Updated local.ron"
+
+    # cd /data && /polygon-edge/polygon-edge genesis $CHAIN_CUSTOM_OPTIONS \
+    # --bootnode "/dns4/node-1/tcp/1478/p2p/$(echo "$secrets" | jq -r '.[0] | .node_id')" \
+    # --bootnode "/dns4/node-2/tcp/1478/p2p/$(echo "$secrets" | jq -r '.[1] | .node_id')"
+fi
\ No newline at end of file
diff --git a/docker/demo/init/Dockerfile b/docker/demo/init/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..a04af5e456745999f988c623a26be8711aa92bdf
--- /dev/null
+++ b/docker/demo/init/Dockerfile
@@ -0,0 +1,18 @@
+FROM fedora:36 as builder
+
+ARG UID=1000
+ARG GID=1000
+
+RUN groupadd -g $GID truite
+RUN adduser --uid $UID --gid $GID truite
+
+RUN mkdir -p /data/data-1 /data/data-2
+RUN chown truite:truite /data/data-1 /data/data-2
+
+USER truite
+COPY src/res/chainspec/local-demo-docker.ron ./local.ron
+
+USER root
+COPY docker/demo/init.sh .
+RUN chmod +x ./init.sh
+CMD ./init.sh
\ No newline at end of file
diff --git a/src/res/chainspec/local-demo-docker.ron b/src/res/chainspec/local-demo-docker.ron
new file mode 100644
index 0000000000000000000000000000000000000000..169c36a5350c5fb5b161fbf28314ef8826dfe74b
--- /dev/null
+++ b/src/res/chainspec/local-demo-docker.ron
@@ -0,0 +1,69 @@
+(
+    name: "Local Demo",
+    consensus: (
+        seal_verification: Pob(
+            int_size_bits: 1024,
+            // 0 < k′′ < k′ < k.
+            miner_behavior_reward_per_quantity: {
+                0: "0xBB8", // k 3000
+            },
+            behavior_reward_per_quantity: {
+                0: "0x7D0", // k' 2000
+            },
+            miner_included_behavior_reward_per_quantity: {
+                0: "0x3E8", // k'' 1000
+            },
+        ),
+        eip1559_block: 12965000,
+    ),
+    upgrades: (
+        homestead: 1150000,
+        tangerine: 2463000,
+        spurious: 2675000,
+        byzantium: 4370000,
+        constantinople: 7280000,
+        petersburg: 7280000,
+        istanbul: 9069000,
+        berlin: 12244000,
+        london: 12965000,
+        paris: 15537394,
+    ),
+    params: (
+        chain_id: 636363,
+        network_id: 636363,
+        additional_forks: [9200000, 13773000, 15050000],
+        expiration_time_limit: 86400,                                   // EXP
+        desired_average_mining_time_in_ms: 10000,                       // ∆t
+        desired_demurrage_percent_per_day: 1000,                        // 10%
+        difficulty_adjustment_period: 10,                               // P
+        min_update_network_difficulty_percent: 25,
+        max_update_network_difficulty_percent: 4,
+        transaction_fees_percentage: 1000,                              // fr
+        miner_fixed_reward_per_transaction: "0x5208",                   // tr
+    ),
+    genesis: (
+        number: 0,
+        author: "0x0000000000000000000000000000000000000000",
+        timestamp: 0,
+        gas_limit: 5000,
+        seal: Pob(
+            vanity: "0x5365706f6c69612c20417468656e732c204174746963612c2047726565636521",
+            difficulty: "0x20000",
+            nonce: "0x0000000000000000",
+            output: "0x0000000000000000000000000000000000000000000000000000000000000000",
+        ),
+    ),
+    balances: {
+        0: {
+            "0x2c7536e3605d9c16a7a3d7b1898e529396a65c23":"0x7a120",
+        },
+    },
+    p2p: (
+        // Bootnodes needs IPv4 no alias
+        bootnodes: [
+            // REPLACE 172.17.0.1 (docker's IP on linux) with your IP address
+            //"enode://NODE1@172.17.0.1:41303",
+            //"enode://NODE2@172.17.0.1:42303",
+        ],
+    ),
+)