diff --git a/apps/canvas/back/index.js b/apps/canvas/back/index.js
new file mode 100644
index 0000000..c5ffd89
--- /dev/null
+++ b/apps/canvas/back/index.js
@@ -0,0 +1,179 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const client_1 = require("@prisma/client");
+const express_1 = __importDefault(require("express"));
+const node_process_1 = require("node:process");
+const axios_1 = __importDefault(require("axios"));
+const db = new client_1.PrismaClient();
+const handleProjectCreate = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
+    try {
+        const { id } = yield 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 = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
+    try {
+        const r = yield 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 = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
+    try {
+        yield 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 = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
+    try {
+        const r = yield 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");
+            console.log(r);
+            if (r.draft == null) {
+                if (r.state == null) {
+                    resp.send({
+                        nodes: [],
+                        edges: [],
+                        viewport: { x: 0, y: 0, zoom: 1 },
+                    });
+                }
+                else {
+                    resp.send(JSON.parse(r.state.toString()));
+                }
+            }
+            else {
+                resp.send(JSON.parse(Buffer.from(r.state).toString("utf8")));
+            }
+        }
+    }
+    catch (e) {
+        console.log(e);
+        resp.status(500);
+    }
+    finally {
+        resp.end();
+    }
+});
+const handleDeploy = (req, resp) => __awaiter(void 0, void 0, void 0, function* () {
+    try {
+        console.log(req.params);
+        const state = Buffer.from(JSON.stringify(req.body.state));
+        yield db.project.update({
+            where: {
+                id: Number(req.params["projectId"]),
+            },
+            data: {
+                draft: state,
+            },
+        });
+        const r = yield axios_1.default.post("http://appmanager.hgrz-appmanager.svc.cluster.local/api/dodo-app", { config: req.body.config });
+        if (r.status === 200) {
+            const d = r.data;
+            yield db.project.update({
+                where: {
+                    id: Number(req.params["projectId"]),
+                },
+                data: {
+                    state,
+                    draft: null,
+                    instanceId: d.id,
+                    deployKey: d.deployKey,
+                },
+            });
+        }
+    }
+    catch (e) {
+        console.log(e);
+        resp.status(500);
+    }
+    finally {
+        resp.end();
+    }
+});
+function start() {
+    return __awaiter(this, void 0, void 0, function* () {
+        yield db.$connect();
+        const app = (0, express_1.default)();
+        app.use(express_1.default.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_1.default.static("../front/dist"));
+        app.listen(node_process_1.env.DODO_PORT_WEB, () => {
+            console.log("started");
+        });
+    });
+}
+start();
