diff --git a/apps/canvas/back/src/github.ts b/apps/canvas/back/src/github.ts
new file mode 100644
index 0000000..850185d
--- /dev/null
+++ b/apps/canvas/back/src/github.ts
@@ -0,0 +1,51 @@
+import axios from "axios";
+import { z } from "zod";
+
+export const GithubRepositorySchema = z.object({
+	id: z.number(),
+	name: z.string(),
+	full_name: z.string(),
+	html_url: z.string(),
+	ssh_url: z.string(),
+});
+
+export type GithubRepository = z.infer<typeof GithubRepositorySchema>;
+
+export class GithubClient {
+	private token: string;
+
+	constructor(token: string) {
+		this.token = token;
+	}
+
+	private getHeaders() {
+		return {
+			Authorization: `Bearer ${this.token}`,
+			Accept: "application/vnd.github.v3+json",
+		};
+	}
+
+	async getRepositories(): Promise<GithubRepository[]> {
+		const response = await axios.get("https://api.github.com/user/repos", {
+			headers: this.getHeaders(),
+		});
+		return z.array(GithubRepositorySchema).parse(response.data);
+	}
+
+	async addDeployKey(repoPath: string, key: string) {
+		const sshUrl = repoPath;
+		const repoOwnerAndName = sshUrl.replace("git@github.com:", "").replace(".git", "");
+
+		await axios.post(
+			`https://api.github.com/repos/${repoOwnerAndName}/keys`,
+			{
+				title: "dodo",
+				key: key,
+				read_only: true,
+			},
+			{
+				headers: this.getHeaders(),
+			},
+		);
+	}
+}
diff --git a/apps/canvas/back/src/index.ts b/apps/canvas/back/src/index.ts
new file mode 100644
index 0000000..65eab15
--- /dev/null
+++ b/apps/canvas/back/src/index.ts
@@ -0,0 +1,394 @@
+import { PrismaClient } from "@prisma/client";
+import express from "express";
+import { env } from "node:process";
+import axios from "axios";
+import { GithubClient } from "./github";
+
+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();
+	}
+};
+
+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();
+	}
+};
+
+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();
+	}
+};
+
+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 },
+					});
+				} else {
+					resp.send(JSON.parse(Buffer.from(r.state).toString("utf8")));
+				}
+			} else {
+				resp.send(JSON.parse(Buffer.from(r.draft).toString("utf8")));
+			}
+		}
+	} catch (e) {
+		console.log(e);
+		resp.status(500);
+	} finally {
+		resp.end();
+	}
+};
+
+const handleDelete: express.Handler = async (req, resp) => {
+	try {
+		const projectId = Number(req.params["projectId"]);
+		const p = await db.project.findUnique({
+			where: {
+				id: projectId,
+			},
+			select: {
+				instanceId: true,
+			},
+		});
+		if (p === null) {
+			resp.status(404);
+			return;
+		}
+		const r = await axios.request({
+			url: `http://appmanager.hgrz-appmanager.svc.cluster.local/api/instance/${p.instanceId}/remove`,
+			method: "post",
+		});
+		if (r.status === 200) {
+			await db.project.delete({
+				where: {
+					id: projectId,
+				},
+			});
+		}
+		resp.status(200);
+	} 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,
+				githubToken: true,
+				deployKey: 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,
+				},
+			});
+			console.log(r);
+			if (r.status === 200) {
+				await db.project.update({
+					where: {
+						id: projectId,
+					},
+					data: {
+						state,
+						draft: null,
+						instanceId: r.data.id,
+						deployKey: r.data.deployKey,
+					},
+				});
+
+				if (p.githubToken && r.data.deployKey) {
+					const stateObj = JSON.parse(JSON.parse(state.toString()));
+					const githubNodes = stateObj.nodes.filter(
+						(n: any) => n.type === "github" && n.data?.repository?.id,
+					);
+
+					const github = new GithubClient(p.githubToken);
+					for (const node of githubNodes) {
+						try {
+							await github.addDeployKey(node.data.repository.sshURL, r.data.deployKey);
+						} catch (error) {
+							console.error(
+								`Failed to add deploy key to repository ${node.data.repository.sshURL}:`,
+								error,
+							);
+						}
+					}
+				}
+			}
+		} 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();
+	}
+};
+
+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/instance/${p.instanceId}/status`,
+			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();
+	}
+};
+
+const handleGithubRepos: express.Handler = async (req, resp) => {
+	try {
+		const projectId = Number(req.params["projectId"]);
+		const project = await db.project.findUnique({
+			where: { id: projectId },
+			select: { githubToken: true },
+		});
+
+		if (!project?.githubToken) {
+			resp.status(400);
+			resp.write(JSON.stringify({ error: "GitHub token not configured" }));
+			return;
+		}
+
+		const github = new GithubClient(project.githubToken);
+		const repositories = await github.getRepositories();
+
+		resp.status(200);
+		resp.header("Content-Type", "application/json");
+		resp.write(JSON.stringify(repositories));
+	} catch (e) {
+		console.log(e);
+		resp.status(500);
+		resp.write(JSON.stringify({ error: "Failed to fetch repositories" }));
+	} finally {
+		resp.end();
+	}
+};
+
+const handleUpdateGithubToken: express.Handler = async (req, resp) => {
+	try {
+		const projectId = Number(req.params["projectId"]);
+		const { githubToken } = req.body;
+
+		await db.project.update({
+			where: { id: projectId },
+			data: { githubToken },
+		});
+
+		resp.status(200);
+	} catch (e) {
+		console.log(e);
+		resp.status(500);
+	} finally {
+		resp.end();
+	}
+};
+
+const handleEnv: express.Handler = async (req, resp) => {
+	const projectId = Number(req.params["projectId"]);
+	try {
+		const project = await db.project.findUnique({
+			where: { id: projectId },
+			select: {
+				deployKey: true,
+				githubToken: true,
+			},
+		});
+
+		if (!project) {
+			resp.status(404);
+			resp.write(JSON.stringify({ error: "Project not found" }));
+			return;
+		}
+
+		resp.status(200);
+		resp.write(
+			JSON.stringify({
+				deployKey: project.deployKey,
+				integrations: {
+					github: !!project.githubToken,
+				},
+				networks: [
+					{
+						name: "Public",
+						domain: "v1.dodo.cloud",
+					},
+					{
+						name: "Private",
+						domain: "p.v1.dodo.cloud",
+					},
+				],
+			}),
+		);
+	} catch (error) {
+		console.error("Error checking integrations:", error);
+		resp.status(500);
+		resp.write(JSON.stringify({ error: "Internal server error" }));
+	} 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/:projectId/status", handleStatus);
+	app.delete("/api/project/:projectId", handleDelete);
+	app.get("/api/project", handleProjectAll);
+	app.post("/api/project", handleProjectCreate);
+	app.get("/api/project/:projectId/repos/github", handleGithubRepos);
+	app.post("/api/project/:projectId/github-token", handleUpdateGithubToken);
+	app.get("/api/project/:projectId/env", handleEnv);
+	app.use("/", express.static("../front/dist"));
+	app.listen(env.DODO_PORT_WEB, () => {
+		console.log("started");
+	});
+}
+
+start();
