diff --git a/deadlock-plugins/deadlock-extension/src/core/gitMission.ts b/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
index 209f131e766272e17cca5ffeed7689030979352f..91bc7b5d9a8a3365d4bfdc037a428bee3c91d1f7 100644
--- a/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/gitMission.ts
@@ -63,12 +63,10 @@ export default class GitMission {
 
   async init() {
     try {
-      this.log('Setup ssh agent');
       await this.setupSshAgent();
 
       await this.git.init();
 
-      this.log('Init Git mission..');
       const remote = await this.readRemote();
 
       if (remote === defaultRemote) {
diff --git a/deadlock-plugins/deadlock-extension/src/extension.ts b/deadlock-plugins/deadlock-extension/src/extension.ts
index 2874e24f9b845d3f417eb6f3b3d414a24056e2e3..ef68935d76c628a47ace6b4891187050e8f2e32c 100644
--- a/deadlock-plugins/deadlock-extension/src/extension.ts
+++ b/deadlock-plugins/deadlock-extension/src/extension.ts
@@ -1,18 +1,18 @@
 import { window, ExtensionContext, workspace, commands } from 'vscode';
 import Controller from './core/controller';
 import isDocker from './core/utils/isdocker';
-import Recorder from './recorder';
+import Recorder from './recorder/recorder';
 import { extensionError as error } from './recorder/utils/log';
 import { DepNodeProvider } from './theia/deadlockPanel';
 import UserConfigTheia from './theia/userConfigTheia';
 import { CommandTreeProvider } from './view/CommandTree';
 import StartedMissionsView from './view/startedMissionsView';
 
+// TODO: refactor remove this
 export const userConfig = new UserConfigTheia();
 
 export async function activate(context: ExtensionContext) {
   window.showInformationMessage('Bienvenue sur Deadlock!');
-
   Controller.getInstance(context);
 
   const workspaceFolders = workspace.workspaceFolders?.toString() ?? '';
@@ -34,6 +34,6 @@ export async function activate(context: ExtensionContext) {
     error('Cannot init userConfig');
   }
   if (isDocker()) {
-    new Recorder().run();
+    Recorder.instance.run();
   }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/index.ts b/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
similarity index 66%
rename from deadlock-plugins/deadlock-extension/src/recorder/index.ts
rename to deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
index 618b332a53adf1716963de7ea9cfca88a31bf885..0d9d69ef7cbe50a00db3afe67df128a0fba291e7 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/index.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/recorder.ts
@@ -10,6 +10,26 @@ import { clearFilesExceptGit, copyProjectSources, renameTempToUserGitFiles } fro
 import aquirePermissions from './utils/permission';
 
 export default class Recorder {
+  private _gitMission?: GitMission;
+  private userConfig?: UserConfigNode;
+  private static _instance?: Recorder;
+
+  private constructor() {
+    Recorder._instance = this;
+  }
+
+  public static get instance(): Recorder {
+    if (!this._instance) {
+      return new Recorder();
+    }
+    return this._instance;
+  }
+
+  public get gitMission(): GitMission {
+    // TODO refactor remove !
+    return this._gitMission!;
+  }
+
   async setupProject(userConfig: UserConfig, gitMission?: GitMission) {
     if (!userConfig.isProfessor()) {
       await copyProjectSources(PROJECT_SRC_PATH, PROJECT_DEADLOCK_DESKTOP_PATH, ['.git/']);
@@ -41,32 +61,24 @@ export default class Recorder {
   }
 
   async run() {
-    const userConfig = new UserConfigNode();
-
-    let gitMission;
+    this.userConfig = new UserConfigNode();
 
     try {
       await aquirePermissions();
-      await userConfig.init();
-      gitMission = await new GitMission(userConfig).init();
-
-      await this.setupFromRemoteRepo(gitMission);
+      // TODO refactor remove this
+      await this.userConfig.init();
+      this._gitMission = await new GitMission(this.userConfig).init();
+      await this.setupFromRemoteRepo(this._gitMission);
+      await this.setupProject(this.userConfig, this._gitMission);
+      try {
+        if (ENABLE_AUTOMATIC_SAVE) new AutomaticSave(PROJECT_DEADLOCK_DESKTOP_PATH, this._gitMission);
+      } catch (e) {
+        error('Error while setup automatic save');
+        error(e);
+      }
     } catch (e) {
       error('Cannot setup user repo.');
       error(e);
     }
-    try {
-      await this.setupProject(userConfig, gitMission);
-    } catch (e) {
-      error('Error while setup project sources');
-      error(e);
-    }
-
-    try {
-      if (ENABLE_AUTOMATIC_SAVE) new AutomaticSave(PROJECT_DEADLOCK_DESKTOP_PATH, gitMission);
-    } catch (e) {
-      error('Error while setup automatic save');
-      error(e);
-    }
   }
 }
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/services/file-watcher.ts b/deadlock-plugins/deadlock-extension/src/recorder/services/file-watcher.ts
index 133048b84824e25cb69b094e29764a4f24a71ff5..dbd626085094abb8e8d102f2751d126623773d6a 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/services/file-watcher.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/services/file-watcher.ts
@@ -1,4 +1,4 @@
-import * as chokidar from 'chokidar';
+import { watch } from 'chokidar';
 
 export default class FileWatcher {
   constructor(
@@ -11,7 +11,7 @@ export default class FileWatcher {
   }
 
   setupWatcher() {
-    const watcher = chokidar.watch(this.watchFilePatterns, {
+    const watcher = watch(this.watchFilePatterns, {
       cwd: this.folderToWatch,
       ignored: this.ignoreFilePatterns,
       ignoreInitial: true,
diff --git a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
index a3dfc65a9268438718add2953114cdfddcf34232..ac0bf7411214af33844fb293cca48f0dd979307a 100644
--- a/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
+++ b/deadlock-plugins/deadlock-extension/src/recorder/utils/workdir.ts
@@ -1,9 +1,9 @@
 import { exec as execCallback, execSync } from 'child_process';
-import { copyFileSync, existsSync, lstatSync, PathLike, readdirSync, renameSync, rmdirSync } from 'fs';
+import { copyFileSync, existsSync, lstatSync, PathLike, readdirSync, renameSync } from 'fs';
 import { join } from 'path';
 import { log } from './log';
 import { promisify } from 'util';
-import { mkdir, rmdir, unlink, rm } from 'fs/promises';
+import { mkdir, unlink, rm } from 'fs/promises';
 
 const exec = promisify(execCallback);
 const PREFIX = '[DEADLOCK-RECORDER]';
@@ -24,7 +24,7 @@ export async function clearFilesExceptGit(path: string) {
     if (file !== '.git') {
       const curPath = join(path, file);
       if (lstatSync(curPath).isDirectory()) {
-        rmdirSync(curPath, { recursive: true });
+        await rm(curPath, { recursive: true });
       } else {
         await unlink(curPath);
       }
@@ -90,7 +90,7 @@ export async function removeFilesOrDirectories(...paths: string[]) {
 
 export async function emptyDirectories(...directoryPaths: string[]) {
   directoryPaths.forEach(async (directoryPath) => {
-    await rmdir(directoryPath, { recursive: true });
+    await rm(directoryPath, { recursive: true });
     await mkdir(directoryPath);
   });
 }
diff --git a/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts b/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts
index 1e3a3f38ec04d3bc91db24aed696102581d1d888..a762606e7cdf8459d0289554aa775f72ab5f9991 100644
--- a/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts
+++ b/deadlock-plugins/deadlock-extension/src/view/CommandTree.ts
@@ -3,6 +3,8 @@ import ChallengeYaml, { MissionCommand as MissionCommandYaml } from '../model/ch
 import { parse } from 'yaml';
 import { readFileSync } from 'fs';
 import { commands, ExtensionContext, ThemeColor, ThemeIcon, TreeDataProvider, TreeItem, window } from 'vscode';
+import { commitAndPushOnQueue, CommitFrom } from '../recorder/utils/gitea';
+import Recorder from '../recorder/recorder';
 
 export class CommandTreeProvider implements TreeDataProvider<MissionCommand> {
   challenge: ChallengeYaml;
@@ -48,6 +50,7 @@ class MissionCommand extends TreeItem {
         });
       terminal.sendText(missionCommandYaml.command);
       terminal.show();
+      commitAndPushOnQueue(Recorder.instance.gitMission, CommitFrom.Run);
     });
     this.command = {
       title: missionCommandYaml.name,