diff --git a/src/Server.ts b/src/Server.ts
index 637b2df..2932cd5 100644
--- a/src/Server.ts
+++ b/src/Server.ts
@@ -14,6 +14,8 @@ import { errorHandlerMiddleware, frontendMiddleware, redirectMiddleware } from '
 import { execute, issueHttpsCertificate, pull } from 'utils/misc';
 import { frontendBuildDir, frontendBuiltDir, frontendDir, rootDir } from 'config/paths';
 
+import fs from 'fs-extra';
+
 const Webhook = require('express-github-webhook');
 
 export default class Server {
@@ -91,7 +93,23 @@ export default class Server {
   };
 
   async updateFrontend(commit?: string) {
-    await pull(frontendDir, 'algorithm-visualizer', commit);
+    if (fs.pathExistsSync(frontendDir)) {
+      await execute(`git fetch`, {
+        cwd: frontendDir,
+        stdout: process.stdout,
+        stderr: process.stderr,
+      });
+    } else {
+      await execute(`git clone https://github.com/likewu/algorithm-visualizer.git ${frontendDir}`, {
+        stdout: process.stdout,
+        stderr: process.stderr,
+      });
+    }
+    await execute(`git reset --hard origin/master`, {
+      cwd: frontendDir,
+      stdout: process.stdout,
+      stderr: process.stderr,
+    });
     await execute([
       'npm install',
       'npm run build',
diff --git a/src/config/constants.ts b/src/config/constants.ts
index 34f9787..97c5008 100644
--- a/src/config/constants.ts
+++ b/src/config/constants.ts
@@ -1,2 +1,2 @@
-export const memoryLimit = 256; // in megabytes
-export const timeLimit = 5000; // in milliseconds
+export const memoryLimit = 512; // in megabytes
+export const timeLimit = 50000; // in milliseconds
diff --git a/src/config/environments.ts b/src/config/environments.ts
index 912d9c8..d92f9d2 100644
--- a/src/config/environments.ts
+++ b/src/config/environments.ts
@@ -46,10 +46,10 @@ const missingVars = [
   ...(isEnabled(WEBHOOK_ENABLED) ? [
     'WEBHOOK_SECRET',
   ] : []),
-  'GITHUB_CLIENT_ID',
-  'GITHUB_CLIENT_SECRET',
-  'AWS_ACCESS_KEY_ID',
-  'AWS_SECRET_ACCESS_KEY',
+  //'GITHUB_CLIENT_ID',
+  //'GITHUB_CLIENT_SECRET',
+  //'AWS_ACCESS_KEY_ID',
+  //'AWS_SECRET_ACCESS_KEY',
 ].filter(variable => process.env[variable] === undefined);
 if (missingVars.length) throw new Error(`The following environment variables are missing: ${missingVars.join(', ')}`);
 
diff --git a/src/tracers/LspTracer.ts b/src/tracers/LspTracer.ts
new file mode 100644
index 0000000..cc415b6
--- /dev/null
+++ b/src/tracers/LspTracer.ts
@@ -0,0 +1,33 @@
+import AWS from 'aws-sdk';
+import express from 'express';
+import { Release, Tracer } from 'tracers/Tracer';
+import { awsAccessKeyId, awsSecretAccessKey } from 'config/environments';
+import { BadRequest } from 'ts-httpexceptions';
+
+export class LspTracer extends Tracer {
+  static lambda = new AWS.Lambda({
+    region: 'us-east-2',
+    accessKeyId: awsAccessKeyId,
+    secretAccessKey: awsSecretAccessKey,
+  });
+
+  async build(release: Release) {
+  }
+
+  route(router: express.Router) {
+    router.post(`/${this.lang}`, (req, res, next) => {
+      const {code} = req.body;
+      LspTracer.lambda.invoke({
+        FunctionName: `extractor-${this.lang}`,
+        InvocationType: 'RequestResponse',
+        Payload: JSON.stringify(code),
+      }, function (err, data) {
+        if (err) return next(err);
+        if (typeof data.Payload !== 'string') return next(new Error('Unexpected Payload Type'));
+        const payload = JSON.parse(data.Payload);
+        if (!payload.success) return next(new BadRequest(payload.errorMessage));
+        res.send(payload.commands);
+      });
+    });
+  }
+}
diff --git a/src/tracers/RunTracer.ts b/src/tracers/RunTracer.ts
new file mode 100644
index 0000000..d5ad01c
--- /dev/null
+++ b/src/tracers/RunTracer.ts
@@ -0,0 +1,44 @@
+import path from 'path';
+import { Release, Tracer } from 'tracers/Tracer';
+import express from 'express';
+import uuid from 'uuid';
+import fs from 'fs-extra';
+import { memoryLimit, timeLimit } from 'config/constants';
+import { codesDir } from 'config/paths';
+import { execute } from 'utils/misc';
+
+export class RunTracer extends Tracer {
+  private readonly directory: string;
+
+  constructor(lang: string) {
+    super(lang);
+    this.directory = path.resolve(__dirname, lang);
+  }
+
+  async build(release: Release) {
+    const {tag_name} = release;
+  }
+
+  route(router: express.Router) {
+    router.post(`/${this.lang}`, (req, res, next) => {
+      const {code} = req.body;
+      const tempPath = path.resolve(codesDir, uuid.v4());
+      fs.outputFile(path.resolve(tempPath, `Main.${this.lang}`), code)
+        .then(() => {
+          return execute([
+            'julia',
+            `${tempPath}`,
+          ].join(' ')).then((data) => {
+            //const payload = JSON.parse(data.Payload);
+            //if (!payload.success) return next(new BadRequest(payload.errorMessage));
+            //res.send(payload.commands);
+            res.send(data);
+          }).catch(error => {
+            throw error;
+          }).finally(() => {});
+        })
+        .catch(next)
+        .finally(() => fs.remove(tempPath));
+    });
+  }
+}
diff --git a/src/tracers/julia/JuliaTracer.ts b/src/tracers/julia/JuliaTracer.ts
new file mode 100644
index 0000000..5247bd4
--- /dev/null
+++ b/src/tracers/julia/JuliaTracer.ts
@@ -0,0 +1,19 @@
+//import { LspTracer } from 'tracers/LspTracer';
+import { RunTracer as LspTracer } from 'tracers/RunTracer';
+
+import { Release } from 'tracers/Tracer';
+import { GitHubApi } from 'utils/apis';
+
+export class JuliaTracer extends LspTracer {
+  constructor() {
+    super('julia');
+  }
+
+  async update(release?: Release) {
+    if (release) {
+      return this.build(release);
+    }
+    const {data} = await GitHubApi.getLatestRelease('likewu', `tracers.${this.lang}`);
+    return this.build(data);
+  }
+}
