diff --git a/apps/canvas/back/index.js b/apps/canvas/back/index.js
index 6117e46..ef3449f 100644
--- a/apps/canvas/back/index.js
+++ b/apps/canvas/back/index.js
@@ -199,6 +199,43 @@
         resp.end();
     }
 });
+const handleStatus = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
+    try {
+        const projectId = Number(req.params["projectId"]);
+        const p = yield db.project.findUnique({
+            where: {
+                id: projectId,
+            },
+            select: {
+                instanceId: true,
+            },
+        });
+        console.log(projectId, p);
+        if (p === null) {
+            resp.status(404);
+            return;
+        }
+        if (p.instanceId == null) {
+            resp.status(404);
+            return;
+        }
+        const r = yield axios_1.default.request({
+            url: `http://appmanager.hgrz-appmanager.svc.cluster.local/api/tasks/${p.instanceId}`,
+            method: "get",
+        });
+        resp.status(r.status);
+        if (r.status === 200) {
+            resp.write(JSON.stringify(r.data));
+        }
+    }
+    catch (e) {
+        console.log(e);
+        resp.status(500);
+    }
+    finally {
+        resp.end();
+    }
+});
 function start() {
     return __awaiter(this, void 0, void 0, function* () {
         yield db.$connect();
@@ -207,6 +244,7 @@
         app.post("/api/project/:projectId/saved", handleSave);
         app.get("/api/project/:projectId/saved", handleSavedGet);
         app.post("/api/project/:projectId/deploy", handleDeploy);
+        app.get("/api/project/:projectId/status", handleStatus);
         app.get("/api/project", handleProjectAll);
         app.post("/api/project", handleProjectCreate);
         app.use("/", express_1.default.static("../front/dist"));
diff --git a/apps/canvas/back/index.ts b/apps/canvas/back/index.ts
index 0f7a573..d10a4a6 100644
--- a/apps/canvas/back/index.ts
+++ b/apps/canvas/back/index.ts
@@ -6,197 +6,234 @@
 const db = new PrismaClient();
 
 const handleProjectCreate: express.Handler = async (req, resp) => {
-  try {
-    const { id } = await db.project.create({
-      data: {
-        userId: "gio", // req.get("x-forwarded-userid")!,
-        name: req.body.name,
-      },
-    });
-    resp.status(200);
-    resp.header("Content-Type", "application/json");
-    resp.write(
-      JSON.stringify({
-        id,
-      }),
-    );
-  } catch (e) {
-    console.log(e);
-    resp.status(500);
-  } finally {
-    resp.end();
-  }
+    try {
+        const { id } = await db.project.create({
+            data: {
+                userId: "gio", // req.get("x-forwarded-userid")!,
+                name: req.body.name,
+            },
+        });
+        resp.status(200);
+        resp.header("Content-Type", "application/json");
+        resp.write(
+            JSON.stringify({
+                id,
+            }),
+        );
+    } catch (e) {
+        console.log(e);
+        resp.status(500);
+    } finally {
+        resp.end();
+    }
 };
 
 const handleProjectAll: express.Handler = async (req, resp) => {
-  try {
-    const r = await db.project.findMany({
-      where: {
-        userId: "gio", // req.get("x-forwarded-userid")!,
-      },
-    });
-    resp.status(200);
-    resp.header("Content-Type", "application/json");
-    resp.write(
-      JSON.stringify(
-        r.map((p) => ({
-          id: p.id.toString(),
-          name: p.name,
-        })),
-      ),
-    );
-  } catch (e) {
-    console.log(e);
-    resp.status(500);
-  } finally {
-    resp.end();
-  }
+    try {
+        const r = await db.project.findMany({
+            where: {
+                userId: "gio", // req.get("x-forwarded-userid")!,
+            },
+        });
+        resp.status(200);
+        resp.header("Content-Type", "application/json");
+        resp.write(
+            JSON.stringify(
+                r.map((p) => ({
+                    id: p.id.toString(),
+                    name: p.name,
+                })),
+            ),
+        );
+    } catch (e) {
+        console.log(e);
+        resp.status(500);
+    } finally {
+        resp.end();
+    }
 };
 
 const handleSave: express.Handler = async (req, resp) => {
-  try {
-    await db.project.update({
-      where: {
-        id: Number(req.params["projectId"]),
-      },
-      data: {
-        draft: Buffer.from(JSON.stringify(req.body)),
-      },
-    });
-    resp.status(200);
-  } catch (e) {
-    console.log(e);
-    resp.status(500);
-  } finally {
-    resp.end();
-  }
+    try {
+        await db.project.update({
+            where: {
+                id: Number(req.params["projectId"]),
+            },
+            data: {
+                draft: Buffer.from(JSON.stringify(req.body)),
+            },
+        });
+        resp.status(200);
+    } catch (e) {
+        console.log(e);
+        resp.status(500);
+    } finally {
+        resp.end();
+    }
 };
 
 const handleSavedGet: express.Handler = async (req, resp) => {
-  try {
-    const r = await db.project.findUnique({
-      where: {
-        id: Number(req.params["projectId"]),
-      },
-      select: {
-        state: true,
-        draft: true,
-      },
-    });
-    if (r == null) {
-      resp.status(404);
-    } else {
-      resp.status(200);
-      resp.header("content-type", "application/json");
-      if (r.draft == null) {
-        if (r.state == null) {
-          resp.send({
-            nodes: [],
-            edges: [],
-            viewport: { x: 0, y: 0, zoom: 1 },
-          });
+    try {
+        const r = await db.project.findUnique({
+            where: {
+                id: Number(req.params["projectId"]),
+            },
+            select: {
+                state: true,
+                draft: true,
+            },
+        });
+        if (r == null) {
+            resp.status(404);
         } else {
-          resp.send(JSON.parse(Buffer.from(r.state).toString("utf8")));
+            resp.status(200);
+            resp.header("content-type", "application/json");
+            if (r.draft == null) {
+                if (r.state == null) {
+                    resp.send({
+                        nodes: [],
+                        edges: [],
+                        viewport: { x: 0, y: 0, zoom: 1 },
+                    });
+                } else {
+                    resp.send(JSON.parse(Buffer.from(r.state).toString("utf8")));
+                }
+            } else {
+                resp.send(JSON.parse(Buffer.from(r.draft).toString("utf8")));
+            }
         }
-      } else {
-        resp.send(JSON.parse(Buffer.from(r.draft).toString("utf8")));
-      }
+    } catch (e) {
+        console.log(e);
+        resp.status(500);
+    } finally {
+        resp.end();
     }
-  } catch (e) {
-    console.log(e);
-    resp.status(500);
-  } finally {
-    resp.end();
-  }
 };
 
 const handleDeploy: express.Handler = async (req, resp) => {
-  try {
-    const projectId = Number(req.params["projectId"]);
-    const state = Buffer.from(JSON.stringify(req.body.state));
-    const p = await db.project.findUnique({
-      where: {
-        id: projectId,
-      },
-      select: {
-        instanceId: true,
-      },
-    });
-    if (p === null) {
-      resp.status(404);
-      return;
-    }
-    await db.project.update({
-      where: {
-        id: projectId,
-      },
-      data: {
-        draft: state,
-      },
-    });
-    let r: { status: number; data: { id: string; deployKey: string } };
-    if (p.instanceId == null) {
-      r = await axios.request({
-        url: "http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app",
-        method: "post",
-        data: {
-          config: req.body.config,
-        },
-      });
-      if (r.status === 200) {
-        await db.project.update({
-          where: {
-            id: projectId,
-          },
-          data: {
-            state,
-            draft: null,
-            instanceId: r.data.id,
-            deployKey: r.data.deployKey,
-          },
+    try {
+        const projectId = Number(req.params["projectId"]);
+        const state = Buffer.from(JSON.stringify(req.body.state));
+        const p = await db.project.findUnique({
+            where: {
+                id: projectId,
+            },
+            select: {
+                instanceId: true,
+            },
         });
-      }
-    } else {
-      r = await axios.request({
-        url: `http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app/${p.instanceId}`,
-        method: "put",
-        data: {
-          config: req.body.config,
-        },
-      });
-      if (r.status === 200) {
+        if (p === null) {
+            resp.status(404);
+            return;
+        }
         await db.project.update({
-          where: {
-            id: projectId,
-          },
-          data: {
-            state,
-            draft: null,
-          },
+            where: {
+                id: projectId,
+            },
+            data: {
+                draft: state,
+            },
         });
-      }
+        let r: { status: number; data: { id: string; deployKey: string } };
+        if (p.instanceId == null) {
+            r = await axios.request({
+                url: "http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app",
+                method: "post",
+                data: {
+                    config: req.body.config,
+                },
+            });
+            if (r.status === 200) {
+                await db.project.update({
+                    where: {
+                        id: projectId,
+                    },
+                    data: {
+                        state,
+                        draft: null,
+                        instanceId: r.data.id,
+                        deployKey: r.data.deployKey,
+                    },
+                });
+            }
+        } else {
+            r = await axios.request({
+                url: `http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app/${p.instanceId}`,
+                method: "put",
+                data: {
+                    config: req.body.config,
+                },
+            });
+            if (r.status === 200) {
+                await db.project.update({
+                    where: {
+                        id: projectId,
+                    },
+                    data: {
+                        state,
+                        draft: null,
+                    },
+                });
+            }
+        }
+    } catch (e) {
+        console.log(e);
+        resp.status(500);
+    } finally {
+        resp.end();
     }
-  } catch (e) {
-    console.log(e);
-    resp.status(500);
-  } finally {
-    resp.end();
-  }
+};
+
+const handleStatus: express.Handler = async (req, resp) => {
+    try {
+        const projectId = Number(req.params["projectId"]);
+        const p = await db.project.findUnique({
+            where: {
+                id: projectId,
+            },
+            select: {
+                instanceId: true,
+            },
+        });
+        console.log(projectId, p);
+        if (p === null) {
+            resp.status(404);
+            return;
+        }
+        if (p.instanceId == null) {
+            resp.status(404);
+            return;
+        }
+        const r = await axios.request({
+            url: `http://appmanager.hgrz-appmanager.svc.cluster.local/api/tasks/${p.instanceId}`,
+            method: "get",
+        });
+        resp.status(r.status);
+        if (r.status === 200) {
+            resp.write(JSON.stringify(r.data));
+        }
+    } catch (e) {
+        console.log(e);
+        resp.status(500);
+    } finally {
+        resp.end();
+    }
 };
 
 async function start() {
-  await db.$connect();
-  const app = express();
-  app.use(express.json());
-  app.post("/api/project/:projectId/saved", handleSave);
-  app.get("/api/project/:projectId/saved", handleSavedGet);
-  app.post("/api/project/:projectId/deploy", handleDeploy);
-  app.get("/api/project", handleProjectAll);
-  app.post("/api/project", handleProjectCreate);
-  app.use("/", express.static("../front/dist"));
-  app.listen(env.DODO_PORT_WEB, () => {
-    console.log("started");
-  });
+    await db.$connect();
+    const app = express();
+    app.use(express.json());
+    app.post("/api/project/:projectId/saved", handleSave);
+    app.get("/api/project/:projectId/saved", handleSavedGet);
+    app.post("/api/project/:projectId/deploy", handleDeploy);
+    app.get("/api/project/:projectId/status", handleStatus);
+    app.get("/api/project", handleProjectAll);
+    app.post("/api/project", handleProjectCreate);
+    app.use("/", express.static("../front/dist"));
+    app.listen(env.DODO_PORT_WEB, () => {
+        console.log("started");
+    });
 }
 
 start();
