diff --git a/server b/server
index acad9980d49fc2dd7676aaaafd229ec2cfb733ec..d4bcb66cc8fb18209dbed068c405bf4c540a4521 100755
--- a/server
+++ b/server
@@ -4,10 +4,8 @@ FOLDER="logs"
 FILE=$(date +%Y%m%d%H%M.log)
 LOGFILE=$FOLDER"/"$FILE
 
-#BIN="/home/anoe/projets/gargantext-hs/.stack-work/docker/_home/.local/bin/gargantext-server"
-#BIN="~/.local/bin/gargantext-server"
 
 mkdir -p $FOLDER
 
-env LANG=en_US.UTF-8 ~/.cabal/bin/gargantext-server --ini gargantext.ini --run Dev +RTS > $LOGFILE 2>&1 & tail -F $LOGFILE # -p
-#env LANG=en_US.UTF-8 stack --docker exec gargantext-server -- --ini gargantext.ini --run Dev +RTS > $LOGFILE 2>&1 & tail -F $LOGFILE # -p
+# In nix-shell run:
+cabal exec -- gargantext-server --ini gargantext.ini --run Dev +RTS > $LOGFILE 2>&1 & tail -F $LOGFILE
diff --git a/src/Gargantext/API/Admin/Auth.hs b/src/Gargantext/API/Admin/Auth.hs
index c06824ecc0241699d06391944fc48a665f63bbde..abedf31e4bedd7091310bee830a1e4e0ba90ecb4 100644
--- a/src/Gargantext/API/Admin/Auth.hs
+++ b/src/Gargantext/API/Admin/Auth.hs
@@ -18,6 +18,10 @@ Main authorization of Gargantext are managed in this module
 
 TODO-ACCESS Critical
 
+To see the authors:
+- gource src
+And you have the main viz
+
 -}
 
 {-# LANGUAGE MonoLocalBinds      #-}
diff --git a/src/Gargantext/API/GraphQL/Contact.sh b/src/Gargantext/API/GraphQL/Contact.sh
new file mode 100644
index 0000000000000000000000000000000000000000..a7bcdddcea054a856ab5d67ad3e8308dabc3f39a
--- /dev/null
+++ b/src/Gargantext/API/GraphQL/Contact.sh
@@ -0,0 +1,197 @@
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+
+module Gargantext.API.GraphQL.Contact where
+
+import Control.Lens
+import Data.Morpheus.Types
+  ( GQLType
+  , Resolver
+  , ResolverM
+  , QUERY
+  , lift
+  )
+import Data.Text (Text)
+import qualified Data.Text as T
+import Gargantext.API.Prelude (GargM, GargError)
+import Gargantext.Core.Mail.Types (HasMail)
+import Gargantext.Database.Admin.Types.Hyperdata
+  ( HyperdataUser(..)
+  , hc_source
+  , hc_title
+  , hu_shared)
+import Gargantext.Database.Admin.Types.Hyperdata.Contact
+  ( HyperdataContact
+  , ContactWho
+  , ContactWhere
+  , cw_city
+  , cw_country
+  , cw_firstName
+  , cw_lastName
+  , cw_labTeamDepts
+  , cw_office
+  , cw_organization
+  , cw_role
+  , cw_touch
+  , ct_mail
+  , ct_phone
+  , hc_who
+  , hc_where)
+import Gargantext.Database.Prelude (HasConnectionPool, HasConfig)
+import Gargantext.Database.Query.Table.Node.UpdateOpaleye (updateHyperdata)
+import Gargantext.Database.Query.Table.User (getUsersWithHyperdata, getUsersWithNodeHyperdata)
+import Gargantext.Database.Schema.User (UserLight(..))
+import Gargantext.Database.Schema.Node (node_id, node_hyperdata)
+import Gargantext.Prelude
+import GHC.Generics (Generic)
+
+data UserInfo = UserInfo
+  { ui_id             :: Int
+  , ui_username       :: Text
+  , ui_email          :: Text
+  , ui_title          :: Maybe Text
+  , ui_source         :: Maybe Text
+  , ui_cwFirstName    :: Maybe Text
+  , ui_cwLastName     :: Maybe Text
+  , ui_cwCity         :: Maybe Text
+  , ui_cwCountry      :: Maybe Text
+  , ui_cwOrganization :: [Text]
+  , ui_cwLabTeamDepts :: [Text]
+  , ui_cwOffice       :: Maybe Text
+  , ui_cwRole         :: Maybe Text
+  , ui_cwTouchPhone   :: Maybe Text
+  , ui_cwTouchMail    :: Maybe Text }
+  deriving (Generic, GQLType, Show)
+
+-- | Arguments to the "user info" query.
+data UserInfoArgs
+  = UserInfoArgs
+    { user_id :: Int
+    } deriving (Generic, GQLType)
+
+-- | Arguments to the "user info" mutation,
+data UserInfoMArgs
+  = UserInfoMArgs
+    { ui_id             :: Int
+    , ui_username       :: Maybe Text
+    , ui_email          :: Maybe Text
+    , ui_title          :: Maybe Text
+    , ui_source         :: Maybe Text
+    , ui_cwFirstName    :: Maybe Text
+    , ui_cwLastName     :: Maybe Text
+    , ui_cwCity         :: Maybe Text
+    , ui_cwCountry      :: Maybe Text
+    , ui_cwOrganization :: Maybe [Text]
+    , ui_cwLabTeamDepts :: Maybe [Text]
+    , ui_cwOffice       :: Maybe Text
+    , ui_cwRole         :: Maybe Text
+    , ui_cwTouchPhone   :: Maybe Text
+    , ui_cwTouchMail    :: Maybe Text
+    } deriving (Generic, GQLType)
+
+type GqlM e env = Resolver QUERY e (GargM env GargError)
+
+-- | Function to resolve user from a query.
+resolveUserInfos
+  :: (HasConnectionPool env, HasConfig env, HasMail env)
+  => UserInfoArgs -> GqlM e env [UserInfo]
+resolveUserInfos UserInfoArgs { user_id } = do
+  lift $ printDebug "[resolveUserInfo] ui_id" user_id
+  dbUsers user_id
+
+-- | Mutation for user info
+updateUserInfo
+  :: (HasConnectionPool env, HasConfig env, HasMail env)
+  => UserInfoMArgs -> ResolverM e (GargM env GargError) Int
+updateUserInfo (UserInfoMArgs { ui_id, .. }) = do
+  lift $ printDebug "[updateUserInfo] ui_id" ui_id
+  users <- lift (getUsersWithNodeHyperdata ui_id)
+  case users of
+    [] -> panic $ "[updateUserInfo] User with id " <> (T.pack $ show ui_id) <> " doesn't exist."
+    ((_u, node_u):_) -> do
+      let u_hyperdata = node_u ^. node_hyperdata
+      -- lift $ printDebug "[updateUserInfo] u" u
+      let u_hyperdata' = uh ui_titleL ui_title $
+                         uh ui_sourceL ui_source $
+                         uh ui_cwFirstNameL ui_cwFirstName $
+                         uh ui_cwLastNameL ui_cwLastName $
+                         uh ui_cwCityL ui_cwCity $
+                         uh ui_cwCountryL ui_cwCountry $
+                         uh' ui_cwLabTeamDeptsL ui_cwLabTeamDepts $
+                         uh' ui_cwOrganizationL ui_cwOrganization $
+                         uh ui_cwOfficeL ui_cwOffice $
+                         uh ui_cwRoleL ui_cwRole $
+                         uh ui_cwTouchMailL ui_cwTouchMail $
+                         uh ui_cwTouchPhoneL ui_cwTouchPhone $
+                         u_hyperdata
+      -- lift $ printDebug "[updateUserInfo] with firstName" u_hyperdata'
+      _ <- lift $ updateHyperdata (node_u ^. node_id) u_hyperdata'
+      --let _newUser = toUser (u, u_hyperdata')
+      pure 1
+  where
+    uh _ Nothing u_hyperdata = u_hyperdata
+    uh lens' (Just val) u_hyperdata = u_hyperdata & lens' .~ Just val
+    uh' _ Nothing u_hyperdata = u_hyperdata
+    uh' lens' (Just val) u_hyperdata = u_hyperdata & lens' .~ val
+
+-- | Inner function to fetch the user from DB.
+dbUsers
+  :: (HasConnectionPool env, HasConfig env, HasMail env)
+  => Int -> GqlM e env [UserInfo]
+dbUsers user_id = do
+  -- lift $ printDebug "[dbUsers]" user_id
+--  user <- getUsersWithId user_id
+--  hyperdata <- getUserHyperdata user_id
+--  lift (map toUser <$> zip user hyperdata)
+  lift (map toUser <$> (getUsersWithHyperdata user_id))
+
+toUser :: (UserLight, HyperdataUser) -> UserInfo
+toUser (UserLight { .. }, u_hyperdata) =
+  UserInfo { ui_id             = userLight_id
+           , ui_username       = userLight_username
+           , ui_email          = userLight_email
+           , ui_title          = u_hyperdata ^. ui_titleL
+           , ui_source         = u_hyperdata ^. ui_sourceL
+           , ui_cwFirstName    = u_hyperdata ^. ui_cwFirstNameL
+           , ui_cwLastName     = u_hyperdata ^. ui_cwLastNameL
+           , ui_cwCity         = u_hyperdata ^. ui_cwCityL
+           , ui_cwCountry      = u_hyperdata ^. ui_cwCountryL
+           , ui_cwLabTeamDepts = u_hyperdata ^. ui_cwLabTeamDeptsL
+           , ui_cwOrganization = u_hyperdata ^. ui_cwOrganizationL
+           , ui_cwOffice       = u_hyperdata ^. ui_cwOfficeL
+           , ui_cwRole         = u_hyperdata ^. ui_cwRoleL
+           , ui_cwTouchMail    = u_hyperdata ^. ui_cwTouchMailL
+           , ui_cwTouchPhone   = u_hyperdata ^. ui_cwTouchPhoneL }
+
+sharedL :: Traversal' HyperdataUser HyperdataContact
+sharedL = hu_shared . _Just
+ui_titleL :: Traversal' HyperdataUser (Maybe Text)
+ui_titleL = sharedL . hc_title
+ui_sourceL :: Traversal' HyperdataUser (Maybe Text)
+ui_sourceL = sharedL . hc_source
+contactWhoL :: Traversal' HyperdataUser ContactWho
+contactWhoL = sharedL . hc_who . _Just
+ui_cwFirstNameL :: Traversal' HyperdataUser (Maybe Text)
+ui_cwFirstNameL = contactWhoL . cw_firstName
+ui_cwLastNameL :: Traversal' HyperdataUser (Maybe Text)
+ui_cwLastNameL = contactWhoL . cw_lastName
+contactWhereL :: Traversal' HyperdataUser ContactWhere
+contactWhereL = sharedL . hc_where . (ix 0)
+ui_cwCityL :: Traversal' HyperdataUser (Maybe Text)
+ui_cwCityL = contactWhereL . cw_city
+ui_cwCountryL :: Traversal' HyperdataUser (Maybe Text)
+ui_cwCountryL = contactWhereL . cw_country
+ui_cwLabTeamDeptsL :: Traversal' HyperdataUser [Text]
+ui_cwLabTeamDeptsL = hu_shared . _Just . (hc_where . (ix 0) . cw_labTeamDepts)
+ui_cwOrganizationL :: Traversal' HyperdataUser [Text]
+ui_cwOrganizationL = hu_shared . _Just . (hc_where . (ix 0) . cw_organization)
+ui_cwOfficeL :: Traversal' HyperdataUser (Maybe Text)
+ui_cwOfficeL = contactWhereL . cw_office
+ui_cwRoleL :: Traversal' HyperdataUser (Maybe Text)
+ui_cwRoleL = contactWhereL . cw_role
+ui_cwTouchMailL :: Traversal' HyperdataUser (Maybe Text)
+ui_cwTouchMailL = hu_shared . _Just . (hc_where . (ix 0) . cw_touch . _Just . ct_mail)
+--ui_cwTouchMailL = contactWhereL . cw_touch . _Just . ct_mail
+ui_cwTouchPhoneL :: Traversal' HyperdataUser (Maybe Text)
+ui_cwTouchPhoneL = hu_shared . _Just . (hc_where . (ix 0) . cw_touch . _Just . ct_phone)
+--ui_cwTouchPhoneL = contactWhereL . cw_touch . _Just . ct_phone
diff --git a/src/Gargantext/Core/Text/Corpus/Parsers/Telegram.hs b/src/Gargantext/Core/Text/Corpus/Parsers/Telegram.hs
new file mode 100644
index 0000000000000000000000000000000000000000..2793a3172dbe36d6bdbaab8676dca0b92826258b
--- /dev/null
+++ b/src/Gargantext/Core/Text/Corpus/Parsers/Telegram.hs
@@ -0,0 +1,109 @@
+module Gargantext.Core.Text.Corpus.Parsers.Telegram
+  where
+
+import Data.Aeson
+import Data.Text (Text)
+--import Data.Time
+import GHC.Generics (Generic)
+--import Gargantext.Core (Lang(..))
+--import Gargantext.Database.Admin.Types.Hyperdata (HyperdataDocument(..))
+import Gargantext.Prelude
+import System.FilePath (FilePath)
+import qualified Data.ByteString.Lazy as DBL
+
+readFile_Telegram :: FilePath -> IO [TelegramMsg]
+readFile_Telegram fp = do
+  raw <- DBL.readFile fp
+  let mayIssues = decode raw
+  case mayIssues of
+    Just is -> pure is
+    Nothing -> pure []
+
+
+data TelegramMsg = TelegramMsg { _action_entities :: !Text
+                   , _broadcastg :: !Text
+                   , _buttonsg :: !Text
+                   , _buttons_countg :: !Text
+                   , _buttons_flatg :: !Text
+                   , _chatg :: !Text
+                   , _chat_peerg :: !Text
+                   , _fileg :: !Text
+                   , _forwardg :: !Text
+                   , _input_chatg :: !Text
+                   , _input_senderg :: !Text
+                   , _linked_chatg :: !Text
+                   , _reply_messageg :: !Text
+                   , _senderg :: !Text
+                   , _sender_idg :: !Text
+                   , _textg :: !Text
+                   , _via_botg :: !Text
+                   , _via_input_botg :: !Text
+                   , actiong :: !Text
+                   , dateg :: !Text
+                   , edit_dateg :: !Text
+                   , edit_hideg :: !Text
+                   , entitiesg :: !Text
+                   , forwardsg :: !Text
+                   , from_idg :: !Text
+                   , from_scheduledg :: !Text
+                   , fwd_fromg :: !Text
+                   , grouped_idg :: !Text
+                   , idg :: !Text
+                   , legacyg :: !Text
+                   , mediag :: !Text
+                   , media_unreadg :: !Text
+                   , mentionedg :: !Text
+                   , messageg :: !Text
+                   , noforwardsg :: !Text
+                   , outg :: !Text
+                   , peer_idg :: !Text
+                   , pinnedg :: !Text
+                   , postg :: !Text
+                   , post_authorg :: !Text
+                   , reactionsg :: !Text
+                   , repliesg :: !Text
+                   , reply_markupg :: !Text
+                   , reply_tog :: !Text
+                   , restriction_reasong :: !Text
+                   , silentg :: !Text
+                   , ttl_periodg :: !Text
+                   , via_bot_idg :: !Text
+                   , views :: !Text
+                  }
+  deriving (Show, Generic)
+
+instance FromJSON TelegramMsg
+
+{-
+gitlabIssue2hyperdataDocument :: Issue -> HyperdataDocument
+gitlabIssue2hyperdataDocument issue = HyperdataDocument
+    { _hd_bdd = Nothing
+    , _hd_doi = Nothing
+    , _hd_url = Nothing
+    , _hd_uniqId = Nothing
+    , _hd_uniqIdBdd = Nothing
+    , _hd_page = Nothing
+    , _hd_title = Just (_issue_title issue)
+    , _hd_authors = Nothing
+    , _hd_institutes = Nothing
+    , _hd_source = Nothing
+    , _hd_abstract = Just (_issue_content issue)
+    , _hd_publication_date = Just $ DT.pack $ show date
+    , _hd_publication_year = Just $ fromIntegral year
+    , _hd_publication_month = Just month
+    , _hd_publication_day = Just day
+    , _hd_publication_hour = Just (todHour tod)
+    , _hd_publication_minute = Just (todMin tod)
+    , _hd_publication_second = Just (round $ todSec tod)
+    , _hd_language_iso2 = Just $ (DT.pack . show) lang
+    }
+  where lang = EN
+        date = _issue_created issue
+        (year, month, day) = toGregorian $ localDay date
+        tod = localTimeOfDay date
+-}
+
+{-
+readFile_IssuesAsDocs :: FilePath -> IO [HyperdataDocument]
+readFile_IssuesAsDocs = fmap (fmap gitlabIssue2hyperdataDocument) . readFile_Issues
+-}