diff --git a/middlewares/checkHeaders.js b/middlewares/checkHeaders.js
index cfea3fd..bf465b7 100755
--- a/middlewares/checkHeaders.js
+++ b/middlewares/checkHeaders.js
@@ -1,7 +1,6 @@
 const conf = require(`../../conf/townconf.json`);
-const l=require('../tools/log.js');
-//l.showlog= true; // force log as well in prod and dev
-l.context="apxtri";
+const currentmod='checkHeaders';
+const log = conf.api.activelog.includes(currentmod)
   /**
    * @api {get} http://header/CheckHeaders  - CheckHeaders  
    * @apiGroup Middlewares
@@ -55,9 +54,9 @@ const checkHeaders = (req, res, next) => {
   if (!req.header("xlang") && req.header("Content-Language"))
     req.params.xlang = req.header("Content-Language");
   let missingheader = [];
-  //console.log("req.headers", req.headers);
+  if (log) console.log(currentmod," req.headers", req.headers);
   for (const h of conf.api.exposedHeaders) {
-    //console.log( h, req.header( h ) )
+    if (log) console.log(currentmod, h, req.header( h ) )
     if (req.params[h]) {
       header[h] = req.params[h];
     } else if (req.header(h)) {
@@ -66,7 +65,7 @@ const checkHeaders = (req, res, next) => {
       missingheader.push(h);
     }
   }
-  // console.log( 'pass header', header )
+  if (log) console.log( currentmod, ' pass header', header )
   // store in session the header information
   req.session.header = header;
   // Each header have to be declared
@@ -96,8 +95,8 @@ const checkHeaders = (req, res, next) => {
   }
   if (!conf.api.languages.includes(header.xlang)) {
     const info="warning language requested does not exist force to english";
-    l.og(info);
-    l.ogprod(req.header("xtribe"),info);
+    if (log) console.log(currentmod, info);
+    console.log(Date.now(),currentmod, req.header("xtribe"),info);
     header.xlang = "en";
   }
   //set anonymous profil
diff --git a/middlewares/isAuthenticated.js b/middlewares/isAuthenticated.js
index 55e292f..ea94ae6 100755
--- a/middlewares/isAuthenticated.js
+++ b/middlewares/isAuthenticated.js
@@ -6,9 +6,9 @@ const glob = require("glob");
 // const openpgp = require("/media/phil/usbfarm/apxtri/node_modules/openpgp/dist/node/openpgp.js");
 const openpgp = require("openpgp");
 
-const l=require('../tools/log.js');
-l.showlog= false; // force log as well in prod and dev
-l.context="isAuthenticated";
+const conf = require(`../../conf/townconf.json`);
+const currentmod='isAuthenticated';
+const log = conf.api.activelog.includes(currentmod)
 /**
  * @api {get} http://header/istauthenticated - isAuthenticated
  * @apiGroup Middlewares
@@ -42,7 +42,7 @@ const isAuthenticated = async (req, res, next) => {
   let menagedone = fs.existsSync(
     `../tmp/tokens/menagedone${currentday}`
   );
-  l.og(`menagedone${currentday} was it done today?:${menagedone}`);
+  if (menagedone) console.log(Date.now(),`menagedone${currentday} was it done today?:${menagedone}`);
   if (!menagedone) {
     // clean oldest
     const tsday = dayjs().valueOf(); // now in timestamp format
@@ -67,7 +67,7 @@ const isAuthenticated = async (req, res, next) => {
     );
   }
   //Check register in tmp/tokens/
-  l.og("isAuthenticate?", req.session.header, req.body);
+  if (log) console.log( currentmod," isAuthenticate?", req.session.header, req.body);
 
   const resnotauth = {
     ref: "middlewares",
@@ -81,7 +81,7 @@ const isAuthenticated = async (req, res, next) => {
     req.session.header.xalias == "anonymous" ||
     req.session.header.xhash == "anonymous"
   ) {
-    l.og("alias anonymous means not auth");
+    if (log) console.log(currentmod,"alias anonymous means not auth");
     resnotauth.status = 401;
     return res.status(resnotauth.status).json(resnotauth);
   }
@@ -100,9 +100,9 @@ const isAuthenticated = async (req, res, next) => {
     const failstamp = `../tmp/tokens/${alias}.json`;
     if (action == "clean") {
       //to reinit bruteforce checker
-      l.og("try to clean penalty file ", failstamp);
+      if (log) console.log(currentmod, "try to clean penalty file ", failstamp);
       fs.remove(failstamp, (err) => {
-        if (err) console.log("Check forcebrut ", err);
+        if (err) console.log(Date.now(),currentmod,"Check forcebrut ", err);
       });
     } else if (action == "penalty") {
       const stamp = fs.existsSync(failstamp)
@@ -111,17 +111,14 @@ const isAuthenticated = async (req, res, next) => {
       stamp.lastfail = dayjs().format();
       stamp.numberfail += 1;
       fs.outputJSON(failstamp, stamp);
-      l.og("penalty:", stamp);
+      if (log) console.log(currentmod,"penalty:", stamp);
       await sleep(stamp.numberfail * 100); //increase of 0,1 second the answer time per fail
-      l.og("time out penalty");
+      if (log) console.log(currentmod,"time out penalty");
     }
   };
   if (!fs.existsSync(tmpfs)) {
     // need to check detached sign
     let publickey = "";
-    l.og(process.cwd());
-    l.og(process.env.PWD);
-    l.og(__dirname);
     const aliasinfo = `../nationchains/pagans/itm/${req.session.header.xalias}.json`;
     if (fs.existsSync(aliasinfo)) {
       publickey = fs.readJsonSync(aliasinfo).publickey;
@@ -130,26 +127,26 @@ const isAuthenticated = async (req, res, next) => {
       publickey = req.body.publickey;
     }
     if (publickey == "") {
-      l.og("alias unknown");
+      if (log) console.log(currentmod,"header xalias unknown:",req.session.header.xalias);
       resnotauth.status = 404;
       resnotauth.data.xaliasexists = false;
       return res.status(resnotauth.status).send(resnotauth);
     }
-    l.og("publickey", publickey);
+    if (log) console.log(currentmod,"publickey", publickey);
     if (publickey.substring(0, 31) !== "-----BEGIN PGP PUBLIC KEY BLOCK") {
-      l.og("Publickey is not valid as armored key:", publickey);
+      console.log(Date.now(),currentmod,"Publickey is not valid as armored key:", publickey);
       await bruteforcepenalty(req.session.header.xalias, "penalty");
       resnotauth.status = 404;
       return res.status(resnotauth.status).send(resnotauth);
     }
     const clearmsg = Buffer.from(req.session.header.xhash, "base64").toString();
     if (clearmsg.substring(0, 10) !== "-----BEGIN") {
-      l.og("xhash conv is not valid as armored key:", clearmsg);
+      if (log) console.log(currentmod,"xhash conv is not valid as armored key:", clearmsg);
       await bruteforcepenalty(req.session.header.xalias, "penalty");
       resnotauth.status = 404;
       return res.status(resnotauth.status).send(resnotauth);
     }
-    l.og("clearmsg", clearmsg);
+    if (log) console.log(currentmod, "clearmsg", clearmsg);
     let signedMessage=""
     const pubkey = await openpgp.readKey({ armoredKey: publickey });
     try{
@@ -163,8 +160,8 @@ const isAuthenticated = async (req, res, next) => {
       message: signedMessage,
       verificationKeys: pubkey,
     });
-    l.og(verificationResult);
-    l.og(verificationResult.signatures[0].keyID.toHex());
+    if (log) console.log(currentmod,verificationResult);
+    if (log) console.log(currentmod,verificationResult.signatures[0].keyID.toHex());
     try {
       await verificationResult.signatures[0].verified;
       if (
@@ -172,8 +169,7 @@ const isAuthenticated = async (req, res, next) => {
         `${req.session.header.xalias}_${req.session.header.xdays}`
       ) {
         resnotauth.msg = "signaturefailled";
-        l.og(
-            `message recu:${verificationResult.data} , message attendu:${req.session.header.xalias}_${req.session.header.xdays}`
+        if (log) console.log(currentmod,`message recu:${verificationResult.data} , message attendu:${req.session.header.xalias}_${req.session.header.xdays}`
           );
         await bruteforcepenalty(req.session.header.xalias, "penalty");
         resnotauth.status = 401;
@@ -181,18 +177,18 @@ const isAuthenticated = async (req, res, next) => {
       }
     } catch (e) {
       resnotauth.msg = "signaturefailled";
-      l.og("erreur", e);
+      if (log) console.log(currentmod,"erreur", e);
       await bruteforcepenalty(req.session.header.xalias, "penalty");
       resnotauth.status = 401;
       return res.status(resnotauth.status).send(resnotauth);
     }
     // authenticated then get person profils (person = pagan for a xtrib)
-    const person = `${process.env.dirtown}/tribes/${req.session.header.xtribe}/objects/persons/itm/${req.session.header.xalias}.json`;
-    l.og("Profils tribe/app management");
-    l.og("person", person);
+    const person = `../nationchains/tribes/${req.session.header.xtribe}/objects/persons/itm/${req.session.header.xalias}.json`;
+    if (log) console.log(currentmod,"Profils tribe/app management");
+    if (log) console.log(currentmod,"person", person);
     if (fs.existsSync(person)) {
       const infoperson = fs.readJSONSync(person);
-      l.og(infoperson);
+      if (log) console.log(currentmod,"infoperson",infoperson);
       infoperson.profils.forEach((p) => {
         if (!req.session.header.xprofils.includes(p)) req.session.header.xprofils.push(p);
       })
@@ -205,7 +201,7 @@ const isAuthenticated = async (req, res, next) => {
     req.session.header.xprofils = fs.readJSONSync(tmpfs);
   }
   bruteforcepenalty(req.session.header.xalias, "clean");
-  l.og(`${req.session.header.xalias} Authenticated`);
+  if (log) console.log(currentmod,`${req.session.header.xalias} Authenticated`);
   next();
 };
 module.exports = isAuthenticated;
diff --git a/models/Odmdb.js b/models/Odmdb.js
index e3b77bd..6b3249f 100644
--- a/models/Odmdb.js
+++ b/models/Odmdb.js
@@ -6,7 +6,8 @@ const axios = require("axios");
 const conf = require(`../../conf/townconf.json`);
 const Checkjson = require(`./Checkjson.js`);
 const { promiseHooks } = require("v8");
-
+const currentmod = "Odmdb";
+const log = conf.api.activelog.includes(currentmod);
 /**
  * This manage Objects for indexing, searching, checking and act to CRUD
  * @objectPathName = objectpath/objectname 
@@ -25,7 +26,7 @@ const { promiseHooks } = require("v8");
  * }
  * 
  * Specifics key in schema to apxtri:
- * apxid : the field value to use to store item 
+ * apxid : the field value to use to store item apx
  * apxuniquekey : list of field that has to be unique you cannot have 2 itm with same key value
  * apxidx : list of index file /idx/
  *  { "name":"lst_fieldA", "keyval": "alias" }, => lst_fieldA.json = [fieldAvalue1,...]
@@ -47,7 +48,8 @@ const { promiseHooks } = require("v8");
 const Odmdb = {};
 
 /**
- * @api syncObject
+ *const Checkjson = require(`../../../../../apxtri/models/Checkjson`);
+ @api syncObject
  * @param {string} url to an existing object conf (/objectname/conf.json)
  * @param {timestamp} timestamp
  *                     0  => rebuild local object from all_{idapx}.json
@@ -150,40 +152,71 @@ Odmdb.updateObject = (objectPathname, meta) => {};
  *
  * todo only local schema => plan a sync each 10minutes
  * @schemaPath local path adminapi/schema/objectName.json or /tribename/schema/objectName
- * @validschema boolean if necessary to check schema or not mainly use when change schema
+ * @validschema boolean if necessary to check schema or not mainly use when change schema;
+ * @lg language you want to get schema
  * @return {status:200,data:{conf:"schemaconf",schema:"schemacontent"} }
  */
-Odmdb.Schema = (objectPathname, validschema) => {
-  const getpath = (schemaPath) => {
+Odmdb.Schema = (objectPathname, validschema, lg="en") => {
+
+  const replacelg = (data)=>{
+    // data.en version schema de base, data.fr version schema traduite
+    Object.keys(data.lg).forEach(k=>{
+      console.log(k)
+      if (data.lg[k].title) data.en[k].title = data.lg[k].title
+      if (data.lg[k].description) data.en[k].description = data.lg[k].description
+      if (data.lg.properties){
+        console.log('properties')
+        console.log(data.en.properties)
+        console.log(data.lg.properties)
+        const res = replacelg({en:data.en.properties,lg:data.lg.properties})
+        data.lg.properties=res.lg
+        data.en.properties=res.en
+      } 
+    })
+    return data
+  }
+  const getschemalg = (schemaPath,lg) => {
     if (schemaPath.slice(-5) != ".json") schemaPath += ".json";
     if (schemaPath.substring(0, 4) == "http") {
       // lance requete http pour recuperer le schema avec un await axios
     } else {
       schemaPath = `../nationchains/tribes/${schemaPath}`;
-      /*if (schemaPath.substring(0, 9) == "adminapi/") {
-        schemaPath = `${conf.dirapi}/${schemaPath}`;
-      } else {
-        schemaPath = `${conf.dirtown}/tribes/${schemaPath}`;
-      }*/
+      console.log(path.resolve(schemaPath))
       if (!fs.existsSync(schemaPath)) {
         return {};
       } else {
-        return fs.readJsonSync(schemaPath);
+        let schemalg = fs.readJsonSync(schemaPath);
+        if (lg!="en"){
+          let lgtrans={}
+          try{
+           lgtrans=fs.readJsonSync(schemaPath.replace('/schema/','/schema/lg/').replace('.json',`_${lg}.json`));
+           const res= replacelg({en:schemalg,lg:lgtrans})
+           //console.log(res.en.title,res.lg.title)
+           schemalg=res.en
+          }catch(err){
+            // console.log('Err',err)
+            // no translation file deliver en by default
+          }
+        }
+         return schemalg
       }
     }
   };
-  console.log(`${objectPathname}/conf.json`);
-  const confschema = fs.readJsonSync(`${objectPathname}/conf.json`);
-  console.log(confschema);
-  const res = {
-    status: 200,
-    ref: "Odmdb",
-    msg: "getschema",
-    data: { conf: confschema },
-  };
-  res.data.schema = getpath(confschema.schema);
+  if (log) console.log(currentmod,`${objectPathname}/conf.json`);
+    const res = {
+      status: 200,
+      ref: "Odmdb",
+      msg: "getschema",
+      data: {},
+    };
 
-  if (Object.keys(res.data.schema).length == 0) {
+  if (fs.existsSync(`${objectPathname}/conf.json`)) {
+    res.data.conf=fs.readJsonSync(`${objectPathname}/conf.json`);
+    res.data.schema = getschemalg(res.data.conf.schema,lg)
+  }else{
+    res.data.conf={}
+  }
+  if (!res.data.schema || Object.keys(res.data.schema).length == 0 ) {
     return {
       status: 404,
       ref: "Odmdb",
@@ -192,9 +225,9 @@ Odmdb.Schema = (objectPathname, validschema) => {
     };
   }
 
-  //looking for type:object with $ref to load and replace by ref content (ref must be adminapi/ or tribeid/)
   //@todo only 1 level $ref if multi level need to rewrite with recursive call
   Object.keys(res.data.schema.properties).forEach((p) => {
+    //looking for type:object with $ref to load and replace by ref content (ref must be adminapi/ or tribeid/)
     if (
       res.data.schema.properties[p].type == "object" &&
       res.data.schema.properties[p]["$ref"]
@@ -210,6 +243,25 @@ Odmdb.Schema = (objectPathname, validschema) => {
         res.data.schema.properties[p] = subschema;
       }
     }
+    //looking for options:{"$ref":"../objects/options/xxx.json"}
+    //to add enum:[] = content of options available
+    if (
+      res.data.schema.properties[p].options &&
+      res.data.schema.properties[p].options["$ref"]
+    ) {
+      const optionsfile = path.resolve(`${objectPathname}/${res.data.schema.properties[p].options["$ref"]}`)
+      if (!fs.existsSync(optionsfile)){
+        res.status = 404;
+        res.msg = "missingref";
+        res.data.missingref = res.data.schema.properties[p]["$ref"];
+        return res;
+      }else{
+        if (!res.data.schema.apxref) {res.data.schema.apxref=[]}
+        if (!res.data.schema.apxref.includes(res.data.schema.properties[p].options["$ref"]))
+        res.data.schema.apxref.push(res.data.schema.properties[p].options["$ref"]) 
+        res.data.schema.properties[p].enum=fs.readJSONSync(optionsfile)
+      }
+    }
   });
 
   if (!res.data.schema.apxid) {
@@ -300,7 +352,7 @@ Odmdb.r = (objectPathname, apxid, role) => {
       status: 403,
       ref: "Odmdb",
       msg: "profilnotallow",
-      data: { person: apxid, },
+      data: { person: apxid },
     };
   }
   const data = {};
@@ -384,8 +436,8 @@ Odmdb.ASUPreads = (objectPathname, apxidlist, role, propertiesfilter) => {
  * example: {"C":[],"R":[properties list],"U":[properties ist],"D":[]}
  */
 Odmdb.accessright = (apxaccessrights, role) => {
-  //console.log("apxaccessrights",apxaccessrights)
-  //console.log("role",role)
+  //if (log) console.log(currentmod,"apxaccessrights",apxaccessrights)
+  //if (log) console.log(currentmod,"role",role)
   const accessright = {};
   role.xprofils.forEach((p) => {
     if (apxaccessrights[p]) {
@@ -397,7 +449,7 @@ Odmdb.accessright = (apxaccessrights, role) => {
             ...new Set([...accessright[act], ...apxaccessrights[p][act]]),
           ];
         }
-        //console.log(act,accessright[act])
+        //if (log) console.log(currentmod,act,accessright[act])
       });
     }
   });
@@ -483,7 +535,7 @@ Odmdb.cud = (objectPathname, crud, itm, role, runindex = true) => {
     getschema.data.schema.apxaccessrights,
     role
   );
-  console.log("accessright", accessright);
+  if (log) console.log(currentmod,"accessright", accessright);
   if (
     (crud == "C" && !accessright.C) ||
     (crud == "D" && !accessright.D) ||
@@ -526,17 +578,17 @@ Odmdb.cud = (objectPathname, crud, itm, role, runindex = true) => {
     if (chkdata.status != 200) return chkdata;
     if (!getschema.data.schema.apxuniquekey)
       getschema.data.schema.apxuniquekey = [];
-    console.log(`${objectPathname}/itm/${chkdata.data.apxid}.json`);
-    console.log(chkdata.data.itm);
+    if (log) console.log(currentmod,`${objectPathname}/itm/${chkdata.data.apxid}.json`);
+    if (log) console.log(currentmod,chkdata.data.itm);
     fs.outputJSONSync(
       `${objectPathname}/itm/${chkdata.data.apxid}.json`,
       chkdata.data.itm
     );
   }
-  //console.log("getschema", getschema);
+  //if (log) console.log(currentmod,"getschema", getschema);
   //rebuild index if requested
-  console.log("runidx", runindex);
-  console.log(objectPathname);
+  if (log) console.log(currentmod,"runidx", runindex);
+  if (log) console.log(currentmod,objectPathname);
   if (runindex) Odmdb.runidx(objectPathname, getschema.data.schema);
   getschema.data.conf.lastupdatedata = dayjs().toISOString();
   fs.outputJSONSync(`${objectPathname}/conf.json`, getschema.data.conf);
@@ -559,7 +611,7 @@ Odmdb.cud = (objectPathname, crud, itm, role, runindex = true) => {
  *
  */
 Odmdb.runidx = (objectPathname, schema) => {
-  console.log(`idx for ${objectPathname}`);
+  if (log) console.log(currentmod,`idx for ${objectPathname}`);
   if (!schema || !schema.apxid) {
     const getschema = Odmdb.Schema(objectPathname, true);
     if (getschema.status != 200) return getschema;
@@ -634,13 +686,18 @@ Odmdb.runidx = (objectPathname, schema) => {
           ventil[n].data[val].push(itm[schema.apxid]);
         });
       }
-      if (keep && ventil[n].type == "distribution" && ventil[n].isobject && itm[ventil[n].keyval.split('.')[0]]) {
+      if (
+        keep &&
+        ventil[n].type == "distribution" &&
+        ventil[n].isobject &&
+        itm[ventil[n].keyval.split(".")[0]]
+      ) {
         let itmval = JSON.parse(JSON.stringify(itm));
-        console.log( ventil[n].keyval)
-        console.log(itmval)
+        if (log) console.log(currentmod,ventil[n].keyval);
+        if (log) console.log(currentmod,itmval);
         ventil[n].keyval
           .split(".")
-          .forEach((i) => itmval = itmval[i] ? itmval[i] : null);
+          .forEach((i) => (itmval = itmval[i] ? itmval[i] : null));
         if (itmval) {
           if (!ventil[n].data[itmval]) ventil[n].data[itmval] = [];
           ventil[n].data[itmval].push(itm[schema.apxid]);
@@ -649,7 +706,7 @@ Odmdb.runidx = (objectPathname, schema) => {
     });
   });
   Object.keys(ventil).forEach((n) => {
-    //console.log(`${objectPathname}/idx/${ventil[n].name}.json`)
+    //if (log) console.log(currentmod,`${objectPathname}/idx/${ventil[n].name}.json`)
     fs.outputJSON(
       `${objectPathname}/idx/${ventil[n].name}.json`,
       ventil[n].data
@@ -687,15 +744,15 @@ Odmdb.ASUPidxfromitm = (
   idxs = [],
   schema
 ) => {
-  console.log(`idxfromitem for ${objectPathname} action:${crud}`);
+  if (log) console.log(currentmod,`idxfromitem for ${objectPathname} action:${crud}`);
   if (!schema || !schema.apxid) {
     const getschema = Odmdb.Schema(objectPathname, true);
     if (getschema.status != 200) return getschema;
     schema = getschema.data.schema;
   }
-  console.log(schema.apxuniquekey);
+  if (log) console.log(currentmod,schema.apxuniquekey);
   const itms = crud == "I" ? glob.sync(`${objectPathname}/itm/*.json`) : [itm];
-  console.log(itms);
+  if (log) console.log(currentmod,itms);
   if (crud == "I") {
     //reinit all idx
     idxs.forEach((idx) => {
@@ -708,7 +765,7 @@ Odmdb.ASUPidxfromitm = (
     if (crud == "I") {
       itm = fs.readJSONSync(i);
     }
-    //console.log(itm);
+    //if (log) console.log(currentmod,itm);
     idxs.forEach((idx) => {
       const keyvalisunique = schema.apxuniquekey.includes(idx.keyval); // check if keyval is unique mean  store as an object (or string) else store as an array
       const idxsrc = `${objectPathname}/idx/${idx.name}.json`;
@@ -722,8 +779,8 @@ Odmdb.ASUPidxfromitm = (
             idxtoreindex.push(idx); //@todo
           }
         }
-        console.log(idx.keyval);
-        console.log(itm[idx.keyval]);
+        if (log) console.log(currentmod,idx.keyval);
+        if (log) console.log(currentmod,itm[idx.keyval]);
 
         if (
           ["C", "U", "I"].includes(crud) &&
diff --git a/models/lg/Notifications_fr.json b/models/lg/Notifications_fr.json
index 83faab3..40e6ffa 100644
--- a/models/lg/Notifications_fr.json
+++ b/models/lg/Notifications_fr.json
@@ -5,5 +5,7 @@
     "errsendmail":"Une erreur s'est produite lors de l'envoie de l'email",
     "successfullsentemail":"Email correctement envoyé",
     "errsendsms":"Une erreur s'est produite lors de l'envoie du sms",
-    "successfullsentsms":"Sms bien envoyé à {{To}}"
+    "successfullsentsms":"Sms bien envoyé à {{To}}",
+    "registersuccess":"Vous avez bien été enregistré pour être recontacté.",
+    "formaterror":"Verifier vos données"
 }
\ No newline at end of file
diff --git a/package.json b/package.json
index bd6b082..db3763b 100755
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
   },
   "scripts": {
     "startapx": "pm2 start apxtri.js --log-date-format 'DD-MM HH:mm:ss.SSS'",
-    "restartapx": "pm2 restart --log-date-format 'DD-MM HH:mm:ss.SSS'",
+    "restartapx": "pm2 restart apxtri.js --log-date-format 'DD-MM HH:mm:ss.SSS'",
     "dev": "NODE_MODE=dev node apxtri.js",
     "unittest": "node unittest.js",
     "apidoc": "apidoc -c ../conf/apidoc/apidoc_$tribe.json -o ../nationchains/tribes/$tribe/www/cdn/apidoc/",
diff --git a/routes/trackings.js b/routes/trackings.js
index e6f39d5..4934efd 100644
--- a/routes/trackings.js
+++ b/routes/trackings.js
@@ -14,59 +14,51 @@ const router = express.Router();
  * @api {get} https://dns.xx/trk/pathtofile? - tracking system
  * @apiGroup Trackings
  * @apiName trackingsystem
- * @apiDescription   
- *  without header:
- * https://dns.xx/trk/pathtofile?alias=anonymous&uuid=1b506f71-1bff-416c-9057-cb8b86296f60&src=btnregister&version=1&lg=fr 
+ * @apiDescription  
+ * 
+ * **WARNING** a cors issue must be fix, currently this tracking work for the same domain.
+ *  
+ * without header:
+ * https://dns.xx/trk/pathtofile?alias=anonymous&uuid=1b506f71-1bff-416c-9057-cb8b86296f60&srckey=btnregister&version=1&lg=fr 
  * 
  * with header
  * https://dns.xx/trk/pathtofile?srckey=btnregister&version=1
  * 
  * where pathtofile is a ressource accessible from  https://dns.xx/pathtofile 
-* html usage to track a loading page or email when a picture is load
+ * For dummy pathtofile for apxtri project, you have:
+ *   /cdn/log/1x1.png (a 1pixel image 95 bytes )
+ *   /cdn/log/empty.json (an empty jason 2 bytes)
+ * 
+ * html usage to track a loading page or email when a picture is load
  * using apxwebapp in /src/ we got:
  *  < img src="static/img/photo.jpg" data-trksrckey="loadpage" data-version="1"  > 
  * 
- * using html + apx.js (or at least with header {xalias,xuuid,xlang})
- * < img lazysrc="trk/static/img/photo.jpg data-trksrckey="loadpage" data-version="1" >
- * 
  * in js action:
  * 
- *  
- *   
- *   
- *   
- *   
- * #will hit an eventlistener
- *  axios.get("https://dns.xx/trk/cdn/empty.json?alias=anonymous&uuid=1b506f71-1bff-416c-9057-cb8b86296f60&srckey=btnregister&version=1");
- * 
+ *  
+ *   
+ * To hit an eventlistener
+ *  axios.get("https://dns.xx/trk/cdn/empty.json?alias=anonymous&uuid=1b506f71-1bff-416c-9057-cb8b86296f60&srckey=btnregister&version=1");
  *  
- * #or if no js available (example:email or pdf document)
+ * If no js available (example:email or pdf document)
  *  < img src="https://dns.xx/trk/static/img/photo.jpg?alias=anonymous&uuid=1b506f71-1bff-416c-9057-cb8b86296f60&srckey=loadpage&version=1" 
  *  
- * 
- * 
+ * 
  *  
- * will hit a tracker then redirect to url> * 
- * 
- * 
+ * This will hit a tracker then redirect to url> * 
  * 
  * **if you use apx.js** : in html add in < button >, < img >, < a > tag data-trksrc="srckey"
  * 
  *  < img src="https://dns.xx/static/img/photo.jpg" data-trkversion="1" data-trksrckey="registerform">
  *  < button data-trksrc="https://dns.xx/static/img/photo.jpg" data-trkversion="1" data-trksrckey="registerform">
  * 
+ * A lazyloader can also be track. 
+ * < img lazysrc="trk/static/img/photo.jpg data-trksrckey="loadpage" data-version="1" >
+ 
  * 
- * Tracking log are store into tribe/logs/nginx/tribe_appname.trk.log
- * Src have to be manage in tribe/api/models/lg/src_en.json
- * {"srckey":{
- *        "app":"presentation|app|apptest",
- *        "title":"",
- *        "description":""
- *      }
- * }
- * 
+ * Tracking log are store into tribe/logs/nginx/tribe_appname.trk.log
+ * Src have to be manage in tribe/api/models/lg/src_en.json
+ * {"srckey":{"app":"presentation|app|apptest","title":"","description":""}}
  *
  * @apiParam {String} alias=anonymous if authenticated we get from headers
  * @apiParam {String} uuid a uuid v4 generate the first time a web page is open on a browser
diff --git a/tools/log.js b/tools/log.js
index 2305de4..01df882 100644
--- a/tools/log.js
+++ b/tools/log.js
@@ -1,27 +1,26 @@
 const fs = require("fs-extra");
 const dayjs = require("dayjs");
+const conf = require(`../../conf/townconf.json`);
 const l = {};
 l.context="";
-l.showlog=(process.env.NODE_MODE=="dev");
 l.og = (...infos) => {
-  // by default if NODE_MODE is dev => l.showlog at true
-  // if l.showlog is set to false then it does not output log 
-  // l.context is a prefixe to help understanding
+  // in apxtowns/towns/conf/townconf.json .api.activelog a list of context to log
   // usage:
   //    const l=require('./tools/log.js');
-  //    l.showlog= true; // force log as well in prod and dev
-  //    l.context="apxtri";
-  //  l.og(stringify)
-  
-  if (l.showlog) {
-    console.log(l.context,'-', infos);
+  //    l.context="apxtri"; // name of model route to find it easily
+  //  then l.og(str1,str2,array1,objet,...)
+  //console.log(infos)
+  if (conf.api.activelog.includes(l.context)) {
+    console.log(l.context,'-', ...infos);
   }
+
+  //console.assert(conf.api.activelog.includes(l.context),infos)
+
 };
 
 l.ogprod = (tribe,info) => {
-  //store log in file /nationchains/tribes/{tribe}/logs/apxtri/apxtri_{tribe}.log
   const logf = `../../nationchains/tribes/${tribe}/logs/apxtri/apxtri_${tribe}.log`;
-  const msg = `${days.js().toISOString()}###${tribe}###${info}`;
+  const msg = `${days.js().toISOString()}###${l.context}###${tribe}###${info}`;
   fs.appendFileSync(logf, msg);
   console.log(msg)
 };