diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index facf101c0fc8b3eaad26a124503e4bbd3185f8ca..f4310d78d856dfe59dd799cc552b75f685069c50 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,17 +1,51 @@
+# ---------------------------------------------------------------
+# Global
+# ---------------------------------------------------------------
+
+# default image
+image: node:12
+
+# stages (main steps of pipeline)
 stages:
-  #- build
-  #- alt_build
-  #- publish
+  - build
+  - alt_build
+  - deploy
 
-fast-build:
-  stage: build
-  image: $CI_REGISTRY_IMAGE
+# ---------------------------------------------------------------
+# Global variables
+# ---------------------------------------------------------------
+
+variables:
+    CI_BUILD_IMAGE: $CI_REGISTRY_IMAGE/build:develop
+
+# ---------------------------------------------------------------
+# Jobs templates
+# ---------------------------------------------------------------
+
+
+.docker:
+  image: docker:latest
+  tags: [redshift]
+  services:
+    - docker:dind
   before_script:
-    - mv /customCache/node_modules ./
-    - cp -rf /customCache/www ./
-    - cp -rf /customCache/hooks ./
+    - docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
+    #- docker login -u "duniterteam" -p "$DUNITERTEAM_PASSWD"
+  after_script:
+    - docker logout ${CI_REGISTRY}
+    #- docker logout
+  allow_failure: false
+
+# ---------------------------------------------------------------
+# Build jobs
+# ---------------------------------------------------------------
+
+.build:
+  stage: build
+  tags: [redshift]
   script:
-    - node ./node_modules/gulp/bin/gulp webBuild
+    - yarn install
+    - yarn run build:web
   after_script:
     - ls -la dist/web/
     - du -csh dist/web/
@@ -20,51 +54,63 @@ fast-build:
     paths:
       - dist/web
     expire_in: 60 minutes
+
+build:
+  extends: .build
+  image: ${CI_BUILD_IMAGE}
+  before_script:
+    - mv /tmp/.build-cache/node_modules ./
   only:
-    - master
-    - tags
+    - develop
+
 failsafe-build:
+  extends: .build
   stage: alt_build
   when: on_failure
-  image: node:10
-  script:
-    - yarn
-    - node ./node_modules/gulp/bin/gulp config --env default
-    - node ./node_modules/gulp/bin/gulp webBuild
-  artifacts:
-    untracked: true
-    paths:
-      - dist/web
-    expire_in: 60 minutes
+  before_script:
+    - yarn global add gulp
   only:
-    - master
-    - tags
-docker-for-fast-build:
+    - develop
+
+docker:ci:
+  extends: .docker
   stage: alt_build
   when: on_failure
   allow_failure: true
-  tags:
-    - doppler-docker
-  image: docker:latest
-  services:
-    - docker:dind
   script:
-    - echo 'FROM node:10' > Dockerfile
-    - echo 'WORKDIR /customCache' >> Dockerfile
+    # Create the target directory
+    - mkdir -p dist/ci
+    - cd dist/ci
+    # Create the Dockerfile
+    - echo 'FROM node:12' > Dockerfile
+    - echo 'WORKDIR /tmp/.build-cache' >> Dockerfile
     - echo 'COPY ./ ./' >> Dockerfile
-    - echo 'RUN du -s `find . -maxdepth 1 | egrep -v "^\.$"`>/before.txt' >> Dockerfile
-    - echo 'RUN yarn' >> Dockerfile
-    - echo 'RUN du -s `find . -maxdepth 1 | egrep -v "^\.$"`>/after.txt' >> Dockerfile
+    # Store disk usage (before install)
+    - echo 'RUN du -s `find . -maxdepth 1 | egrep -v "^\.$"` > /tmp/before.txt' >> Dockerfile
+    - echo 'RUN du -s `find /tmp/.cache/yarn -maxdepth 1 | egrep -v "^\.$"` >> /tmp/before.txt' >> Dockerfile
+    # Install dependencies
+    - echo 'RUN yarn global add gulp web-ext @ionic/cli' >> Dockerfile
+    - echo 'RUN yarn install' >> Dockerfile
+    # Store disk usage (after install)
+    - echo 'RUN du -s `find . -maxdepth 1 | egrep -v "^\.$"` > /tmp/after.txt' >> Dockerfile
+    - echo 'RUN du -s `find /tmp/.cache/yarn -maxdepth 1 | egrep -v "^\.$"` >> /tmp/after.txt' >> Dockerfile
+    # Force docker to detect any changes
+    - echo "RUN diff /tmp/before.txt /tmp/after.txt || true" >> Dockerfile
     - echo 'WORKDIR /build' >> Dockerfile
-    - echo "RUN diff /before.txt /after.txt || true" >> Dockerfile
-    - docker login -u "gitlab-ci-token" -p "$CI_BUILD_TOKEN" $CI_REGISTRY
-    - docker build --pull -t "$CI_REGISTRY_IMAGE" .
-    - docker push "$CI_REGISTRY_IMAGE"
+    # Build and push the CI image
+    - docker build --no-cache -t ${CI_BUILD_IMAGE} .
+    - docker push ${CI_BUILD_IMAGE}
+  artifacts:
+    paths:
+      - dist/ci/Dockerfile
+    expire_in: 60 minutes
 
+# ---------------------------------------------------------------
+# Deploy jobs
+# ---------------------------------------------------------------
 
 pages:
-  stage: publish
-  image: node:10
+  stage: deploy
   variables:
     GIT_STRATEGY: none
   script:
@@ -76,8 +122,9 @@ pages:
       - public
   only:
     - master
+
 mirror:
-  stage: publish
+  stage: deploy
   image: liaohuqiu/rsync
   before_script:
     - eval $(ssh-agent -s)
@@ -94,10 +141,8 @@ mirror:
   only:
     - master
 
-
-release-web:
-  stage: publish
-  image: node:10
+release:
+  stage: deploy
   variables:
     GIT_STRATEGY: none
   script:
diff --git a/Dockerfile b/Dockerfile
index f6dba3efd9f826c75603298d1712945637019a0b..e681ac5cebc73764f2e45e34ca2594cb62a52d26 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,18 +1,18 @@
-FROM  node:10-alpine
+FROM  node:12
 LABEL maintainer="benoit [dot] lavenier [at] e-is [dot] pro"
-LABEL version="1.6.3"
+LABEL version="1.6.12"
 LABEL description="Cesium Wallet for Äž1 libre currency"
 
-ARG CESIUM_VER="1.6.3"
+ARG CESIUM_VER="1.6.12"
 
 ENV DEBIAN_FRONTEND=noninteractive \
-    NODE_VERSION=10.20.0 \
-    NPM_VERSION=6.14.4 \
-    YARN_VERSION=1.22.4 \
-    IONIC_CLI_VERSION=6.6.0 \
-    CORDOVA_VERSION=8.1.2 \
-    GRADLE_VERSION=4.10.3 \
-    GULP_VERSION=3.9.1
+    NODE_VERSION=12.21.0 \
+    NPM_VERSION=7.14.0 \
+    YARN_VERSION=1.22.10 \
+    IONIC_CLI_VERSION=6.16.3 \
+    CORDOVA_VERSION=10.0.0 \
+    GRADLE_VERSION=6.5.1 \
+    GULP_VERSION=4.0.2
 
 # Install basics
 RUN apk update && \
@@ -31,6 +31,8 @@ RUN yarn global add gulp@"$GULP_VERSION" @ionic/cli@"$IONIC_CLI_VERSION"
 # copy source tree
 COPY ./ ./
 
+RUN test -f package.json || git clone https://github.com/duniter/cesium.git && cd cesium
+
 # Install project dependencies
 # Workaround need for node-sass (- )see https://github.com/yarnpkg/yarn/issues/4867)
 RUN yarn install --ignore-engines && \
diff --git a/config.xml b/config.xml
index 8f1cacd27732fbadc794fdd0be7fd5af1235ba64..cd18fca75f88e787bd8935cf91b906c1e3375779 100644
--- a/config.xml
+++ b/config.xml
@@ -1,5 +1,5 @@
 <?xml version='1.0' encoding='utf-8'?>
-<widget android-versionCode="106120" id="fr.duniter.cesium" ios-CFBundleIdentifier="org.duniter.cesium" version="1.6.12" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
+<widget android-versionCode="106130" id="fr.duniter.cesium" ios-CFBundleIdentifier="org.duniter.cesium" version="1.6.13" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
     <name>Cesium</name>
     <description>
     An simple App for Duniter wallet
diff --git a/install.sh b/install.sh
index 960563ee9bcd9d72037a0d594d0810cf14e296c0..04aaa067f4298e0645ed73fa4b1cbe51b8d712c4 100755
--- a/install.sh
+++ b/install.sh
@@ -15,7 +15,7 @@ if [ "_$CESIUM_DIR" = "_" ]; then
 fi
 
 latest_version() {
-  echo "v1.6.12" #lastest
+  echo "v1.6.13" #lastest
 }
 
 api_release_url() {
diff --git a/package.json b/package.json
index 7cb527ff0f8d3c6e13a864b19a750c50175cf740..e70381d294a3be422ac5e8fe4e4984bd32a4f986 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "cesium",
-  "version": "1.6.12",
+  "version": "1.6.13",
   "description": "Cesium Wallet for G1 libre currency",
   "author": "Benoit Lavenier <benoit.lavenier@e-is.pro>",
   "license": "AGPL-3.0",
@@ -10,8 +10,9 @@
     "url": "git@git.duniter.org:clients/cesium/cesium.git"
   },
   "scripts": {
-    "clean": "clean webClean webExtClean && trash dist/desktop/**/*.deb platforms/android/**/*.apk",
+    "clean": "gulp clean webClean webExtClean && rm -rf dist/web dist/android && rm -f desktop/**/cesium-*.deb desktop/**/cesium-*.exe platforms/android/**/*.apk",
     "postinstall": "node scripts/node/postinstall.js",
+    "gulp": "gulp",
     "lint": "gulp lint",
     "install-platforms": "ionic cordova prepare",
     "start": "ionic serve",
@@ -221,4 +222,4 @@
     "node": ">= 12.18.3",
     "yarn": ">= 1.22.0"
   }
-}
\ No newline at end of file
+}
diff --git a/resources/web-ext/manifest.json b/resources/web-ext/manifest.json
index f08c71c28278e834b9c12f3fa41d5487240c6fdb..f561d1d79571d093b6084289696c7f303ca2e553 100644
--- a/resources/web-ext/manifest.json
+++ b/resources/web-ext/manifest.json
@@ -1,7 +1,7 @@
 {
   "name": "Cesium",
   "short_name": "Cesium",
-  "version": "1.6.12",
+  "version": "1.6.13",
   "description": "Manage your Duniter Wallet on a libre currency, like Äž1",
   "background": {
     "scripts": ["background.js"]
diff --git a/scss/ionic.app.scss b/scss/ionic.app.scss
index f031163381ac33b7e26a159959b536c8016571aa..c26db8b3bfe2597c80dac320fbfb701c6e6ecf82 100644
--- a/scss/ionic.app.scss
+++ b/scss/ionic.app.scss
@@ -2419,6 +2419,10 @@ body.demo {
   height: 204px;
 }
 
+.popover.popover-login-methods.auth.scan {
+  height: 252px;
+}
+
 @media (max-width: $screen-xs-max) {
   .popover.popover-login-methods {
     height: 256px;
diff --git a/www/js/config.js b/www/js/config.js
index 47f6eb71dda8eec252d41f26426775af37cd8865..d05f6cabcfb09f345167fc29c8b3b4112f0a3a68 100644
--- a/www/js/config.js
+++ b/www/js/config.js
@@ -70,14 +70,6 @@ angular.module("cesium.config", [])
 			"host": "g1.presles.fr",
 			"port": 443
 		},
-		{
-			"host": "g1.le-sou.org",
-			"port": 443
-		},
-		{
-			"host": "duniter.normandie-libre.fr",
-			"port": 443
-		},
 		{
 			"host": "g1.duniter.org",
 			"port": 443
@@ -101,10 +93,6 @@ angular.module("cesium.config", [])
 					"host": "g1.data.presles.fr",
 					"port": 443
 				},
-				{
-					"host": "g1.data.le-sou.org",
-					"port": 443
-				},
 				{
 					"host": "g1.data.mithril.re",
 					"port": 443
@@ -119,8 +107,8 @@ angular.module("cesium.config", [])
 			"defaultCountry": "France"
 		}
 	},
-	"version": "1.6.12",
-	"build": "2021-03-03T20:44:36.248Z",
+	"version": "1.6.13",
+	"build": "2021-04-26T22:09:07.231Z",
 	"newIssueUrl": "https://git.duniter.org/clients/cesium-grp/cesium/issues/new"
 })
 
diff --git a/www/js/services/device-services.js b/www/js/services/device-services.js
index a756a437d8d7cebc61b62fe65b6cd09aa61dc729..51da188d0acee7a0fd4b9bfa0e28b83d7cdd89b6 100644
--- a/www/js/services/device-services.js
+++ b/www/js/services/device-services.js
@@ -230,14 +230,14 @@ angular.module('cesium.device.services', ['cesium.utils.services', 'cesium.setti
         }
       };
 
-      exports.isIOS = function() {
-        return !!navigator.userAgent.match(/iPhone | iPad | iPod/i) || ionic.Platform.isIOS();
-      };
-
       exports.isOSX = function() {
         return !!navigator.userAgent.match(/Macintosh/i) || ionic.Platform.is("osx");
       };
 
+      exports.isIOS = function() {
+        return !!navigator.userAgent.match(/iPhone | iPad | iPod/i) || (!!navigator.userAgent.match(/Mobile/i) && !!navigator.userAgent.match(/Macintosh/i)) || ionic.Platform.isIOS();
+      };
+
       exports.isDesktop = function() {
         if (!angular.isDefined(cache.isDesktop)) {
           try {
@@ -269,7 +269,7 @@ angular.module('cesium.device.services', ['cesium.utils.services', 'cesium.setti
             if (exports.enable){
               exports.camera.enable = !!navigator.camera;
               exports.keyboard.enable = cordova && cordova.plugins && !!cordova.plugins.Keyboard;
-              exports.barcode.enable = cordova && cordova.plugins && !!cordova.plugins.barcodeScanner && !exports.isOSX();
+              exports.barcode.enable = cordova && cordova.plugins && !!cordova.plugins.barcodeScanner && (!exports.isOSX() || exports.isIOS());
               exports.clipboard.enable = cordova && cordova.plugins && !!cordova.plugins.clipboard;
               exports.intent.enable = window && !!window.plugins.launchmyapp;
 
diff --git a/www/license/license_g1-pt-PT.md b/www/license/license_g1-pt-PT.md
new file mode 100644
index 0000000000000000000000000000000000000000..9f783fd064f73ee9bc7d2ce2be59e065c2ae84ab
--- /dev/null
+++ b/www/license/license_g1-pt-PT.md
@@ -0,0 +1,97 @@
+Licença Ğ1 - v0.2.9
+===================
+
+:data: 2017-04-04 12:59
+:modificado: 2019-07-14 12:00
+
+**Licença da moeda e compromisso de responsabilidade.**
+
+Qualquer operação de certificação dum novo membro da Ğ1 deve ser previamente acompanhada pela transmissão desta licença da moeda Ğ1, a qual o certificador deve garantir que foi estudada, compreendida e aceite pela pessoa que será certificada.
+
+Encoraja-se que qualquer evento de grupo relativo à Ğ1 seja acompanhado por uma transmissão desta licença, que poderá ser lida em voz alta, e transmitida por quaisquer meios.
+
+Rede de confiança Ğ1 (RdC Ğ1)
+-----------------------------
+
+**Nota de precaução:** Certificarmos alguém não é apenas assegurar-mo-nos que encontrámos a pessoa, é assegurarmos à comunidade Ğ1 que conhecemos suficientemente bem a pessoa a certificar, de modo a conseguirmos contactar a pessoa facilmente, e de termos condições para localizar uma conta em duplicado feita pela pessoa que receberá a nossa certificação, ou outro tipo de problemas (desaparecimento da pessoa…) fazendo despistagens que eventualmente permitirão revelar um problema. 
+
+**Conselhos altamente recomendados**
+
+Conhecermos bem uma pessoa pressupõe que seremos capazes de contactá-la por vários meios diferentes (físicos, electrónicos ou outros ...) mas também pressupõe que conhecemos várias pessoas que a conhecem tão bem quanto nós e, portanto, também serão capazes de contactá-la da mesma forma. Em particular, se não conhecermos bem nenhum dos outros certificadores dessa pessoa, há um forte indício de que não conhecemos bem essa pessoa, e uma certificação deste tipo aciona um alerta para toda a comunidade Ğ1. Em caso de conhecimento insuficiente, é fortemente aconselhável não certificarmos.
+
+Nunca certifique alguém sozinho, mas faça-se acompanhar pelo menos por outro membro da RdC Ğ1 para evitar qualquer erro de manipulação. Em caso de erro, avise imediatamente os outros membros da RdC Ğ1.
+
+Antes de qualquer certificação, assegure-se de verificar se a conta dessa pessoa já recebeu uma ou mais certificações (quer esteja em processo de validação ou já seja membro). Eventualmente, peça as informações para entrar em contacto com os outros certificadores, a fim de, juntos, verificarem que conhecem essa pessoa que quer abrir uma nova conta de membro, assim como a chave pública correspondente.
+
+Verifique se o futuro certificado domina a gestão da sua conta: uma boa forma para verificar isto é transferir algumas Ğ1 da sua conta de membro para a conta dessa pessoa, e de seguida, solicitar o retorno do montante para a sua conta de membro…  isso garante que o futuro certificado possui um bom domínio da sua chave privada.
+
+Verifique que os seus contactos estudaram e compreenderam a licença Ğ1 em vigor.
+
+Se entender que um certificador real ou potencial de uma determinada conta não conhece a pessoa afecta a essa conta, alerte imediatamente especialistas no assunto dentro dos seus conhecidos na RdC Ğ1, para que o procedimento de validação seja verificado pela RdC Ğ1.
+
+Quando fizer parte dos membros da RdC Äž1 e estiver prestes a certificar uma nova conta:
+
+
+**Deverá assegurar-se que:**
+
+1°) Conhece suficientemente bem (não só "de vista") a pessoa que declara gerir a chave pública em questão (nova conta). Veja os conselhos altamente recomendados acima para garantir que “conhece bem a pessoa”.
+
+2°) Já verificou em particular com essa pessoa que a chave pública que está prestes a certificar lhe pertence realmente (veja os conselhos acima).
+
+3°) Já verificou em particular com essa pessoa que o seu documento Duniter de revogação da conta está criado, o que lhe permitirá eventualmente desactivar o seu estatuto de membro (no caso de roubo de uma conta, de uma mudança de identificação, de uma conta criada inadvertidamente, etc).
+
+4a°) Já se encontrou com essa pessoa fisicamente para se certificar de que é de facto a pessoa bem conhecida por si e que detém a chave pública correcta que será certificada por si.
+
+4b°) Ou então já verificou remotamente o conjunto pessoa / chave pública ao contactar essa pessoa por vários meios de comunicação diferentes, como o correio postal + rede social + fórum + email + videoconferência + telefone (reconhecendo a sua voz). Isto porque se eventualmente for possível piratear uma conta de e-mail ou uma conta de fórum, será muito mais difícil imaginar piratear quatro meios distintos de comunicação, de imitar a aparência da pessoa (vídeo), e além disso, de imitar a voz da pessoa.
+
+Todavia o 4a°) permanece preferencial em relação ao 4b°), enquanto os pontos 1°), 2°) e 3°) são previamente indispensáveis.
+
+**Regras abreviadas da RdC:**
+
+Cada membro poderá atribuir um stock de 100 certificações possíveis, e que não pode emitir a uma taxa superior a 1 certificação / cada 5 dias.
+
+Com uma validade de 2 meses, uma certificação para um novo membro só será definitivamente adoptada se no espaço desses 2 meses o membro certificado tiver obtido pelo menos 4 outras certificações, caso contrário, o processo de entrada terá de ser iniciado de novo.
+
+Por isso para se tornar um novo membro da RdC Ğ1, será necessário obter 5 certificações, e encontrar-se a uma distância <= 5 elos de relação com 80% dos membros referentes da RdC.
+
+Um membro da RdC Ğ1 torna-se membro referente a partir do momento em que ele terá recebido e emitido pelo menos Y [N] certificações, em que N é o número de membros da RdC e Y [N] = limite superior de N ^ (1/5). Exemplos:
+
+* Para 1024 <N ≤ 3125, temos Y [N] = 5
+* Para 7776 <N ≤ 16807, temos Y [N] = 7
+* Para 59049 <N ≤ 100.000 temos Y [N] = 10
+
+Logo que o novo membro tome lugar na RdC Ğ1, as suas certificações permanecerão válidas durante 2 anos.
+
+Para permanecer como membro, será necessário renovar o seu acordo regularmente com a sua chave privada (a cada 12 meses) e certificar-se de que tem sempre pelo menos 5 certificações válidas após os 2 anos iniciais. 
+
+Moeda Äž1
+--------
+
+A Ğ1 é criada por meio de um Dividendo Universal (DU) para qualquer ser humano membro da Rede de Confiança Ğ1 e que toma a seguinte forma:
+
+* 1 DU por pessoa por dia
+
+**Código monetário Ğ1**
+
+O valor em Ğ1 do DU é o mesmo a cada dia (com 1 dia = 86400 segundos) até ao dia de equinócio seguinte, onde o DU será então reavaliado de acordo com a fórmula:
+
+* DUdiário (até ao próximo equinócio) = DUdiário (no dia de equinócio) + c² (M / N) (no dia de equinócio) / (182,625 dias)
+
+Com os parâmetros:
+
+* c = 4,88% / cada intervalo de tempo correspondente a um equinócio
+* DU(0) = 10,00 Äž1
+
+E onde as variáveis são:
+
+* *M* a massa monetária total no dia de equinócio
+* *N* o número de membros no dia de equinócio
+
+Software Ğ1 e licença Ğ1
+------------------------
+
+Os programas informáticos Ğ1 que permitem aos utilizadores a gestão de utilização da Ğ1 devem transmitir esta licença com o programa informático, assim como o conjunto de parâmetros técnicos da moeda Ğ1 e da RdC Ğ1 que estão inscritos no bloco 0 da Ğ1. O programa informático que não cumpra estas obrigações da licença não é compatível com a Ğ1.
+
+Para melhor aprofundar os detalhes técnicos é possível consultar diretamente o código do Duniter, que é software livre, assim com consultar os dados da blockchain Ğ1, obtendo-os por meio de uma instância (ou nó) Duniter Ğ1. 
+
+Mais informações no sítio internet da equipa Duniter https://www.duniter.org
diff --git a/www/manifest.json b/www/manifest.json
index df7030dbaac8dcc10a30a75d3e7f319cc80d3242..6a2303881755cb32c733820bec5bb87af6c7e00a 100644
--- a/www/manifest.json
+++ b/www/manifest.json
@@ -2,7 +2,7 @@
   "short_name": "Cesium",
   "name": "Cesium",
   "manifest_version": 1,
-  "version": "1.6.12",
+  "version": "1.6.13",
   "default_locale": "fr",
   "description": "Cesium Wallet for Äž1 libre currency",
   "icons": [
diff --git a/www/templates/login/popover_methods.html b/www/templates/login/popover_methods.html
index 3c0a5dde79c1c95e5048dd3668c04c45a6a2ff21..15252f6bbba019b55984d56969459ff66d5e1cdc 100644
--- a/www/templates/login/popover_methods.html
+++ b/www/templates/login/popover_methods.html
@@ -1,5 +1,5 @@
 <ion-popover-view class="fit has-header popover-login-methods"
-  ng-class="{'auth': isAuth}">
+  ng-class="{'auth': isAuth, 'scan': $root.device.barcode.enable}">
   <ion-header-bar>
     <h1 class="title" translate>LOGIN.METHOD_POPOVER_TITLE</h1>
   </ion-header-bar>