diff --git a/apps/canvas/back/src/github.ts b/apps/canvas/back/src/github.ts
index df8eacf..e201c49 100644
--- a/apps/canvas/back/src/github.ts
+++ b/apps/canvas/back/src/github.ts
@@ -1,11 +1,5 @@
 import axios from "axios";
-import {
-	GithubRepository,
-	GithubRepositoriesSchema,
-	DeployKeysSchema,
-	ListWebhooksResponseSchema,
-	DeployKeys,
-} from "config";
+import { GithubRepository, GithubRepositoriesSchema, DeployKeysSchema, ListWebhooksResponseSchema } from "config";
 
 export class GithubClient {
 	private token: string;
@@ -23,94 +17,118 @@
 	}
 
 	async getRepositories(): Promise<GithubRepository[]> {
-		const response = await axios.get("https://api.github.com/user/repos", {
-			headers: this.getHeaders(),
-		});
-		return GithubRepositoriesSchema.parse(response.data);
+		const allRepos: GithubRepository[] = [];
+		let url: string | null = "https://api.github.com/user/repos?per_page=100";
+
+		while (url) {
+			const response = await axios.get(url, {
+				headers: this.getHeaders(),
+			});
+
+			const reposOnPage = GithubRepositoriesSchema.parse(response.data);
+			allRepos.push(...reposOnPage);
+
+			const linkHeader = response.headers.link as string | undefined;
+			if (linkHeader) {
+				const nextLink = linkHeader.split(",").find((s) => s.includes('rel="next"'));
+				if (nextLink) {
+					const match = nextLink.match(/<(.*)>/);
+					url = match ? match[1] : null;
+				} else {
+					url = null;
+				}
+			} else {
+				url = null;
+			}
+		}
+		return allRepos;
 	}
 
+	// TODO(giolekva): generate unique deploy key per repo and add it to the repo
 	async addDeployKey(repoPath: string, key: string) {
-		const sshUrl = repoPath;
-		const repoOwnerAndName = sshUrl.replace("git@github.com:", "").replace(".git", "");
-		let existingKeys: DeployKeys = [];
-		const response = await axios.get(`https://api.github.com/repos/${repoOwnerAndName}/keys`, {
-			headers: this.getHeaders(),
-		});
-		const parsedResult = DeployKeysSchema.safeParse(response.data);
-		if (parsedResult.success) {
-			existingKeys = parsedResult.data;
-		} else {
-			console.error("Failed to parse existing deploy keys:", parsedResult.error);
-		}
-		const keyToAddParts = key.trim().split(" ");
-		const mainKeyPartToAdd = keyToAddParts.length > 1 ? keyToAddParts.slice(0, 2).join(" ") : key.trim();
-		const keyAlreadyExists = existingKeys.some((existingKeyObj) => {
-			const existingKeyParts = existingKeyObj.key.trim().split(" ");
-			const mainExistingKeyPart =
-				existingKeyParts.length > 1 ? existingKeyParts.slice(0, 2).join(" ") : existingKeyObj.key.trim();
-			return mainExistingKeyPart === mainKeyPartToAdd;
-		});
-		if (keyAlreadyExists) {
-			return;
-		}
-		await axios.post(
-			`https://api.github.com/repos/${repoOwnerAndName}/keys`,
-			{
-				title: "dodo",
-				key: key,
-				read_only: true,
-			},
-			{
-				headers: this.getHeaders(),
-			},
-		);
+		await this.addSSHKey(key);
+		// 	const sshUrl = repoPath;
+		// 	const repoOwnerAndName = sshUrl.replace("git@github.com:", "").replace(".git", "");
+		// 	let existingKeys: DeployKeys = [];
+		// 	const response = await axios.get(`https://api.github.com/repos/${repoOwnerAndName}/keys`, {
+		// 		headers: this.getHeaders(),
+		// 	});
+		// 	const parsedResult = DeployKeysSchema.safeParse(response.data);
+		// 	if (parsedResult.success) {
+		// 		existingKeys = parsedResult.data;
+		// 	} else {
+		// 		console.error("Failed to parse existing deploy keys:", parsedResult.error);
+		// 	}
+		// 	const keyToAddParts = key.trim().split(" ");
+		// 	const mainKeyPartToAdd = keyToAddParts.length > 1 ? keyToAddParts.slice(0, 2).join(" ") : key.trim();
+		// 	const keyAlreadyExists = existingKeys.some((existingKeyObj) => {
+		// 		const existingKeyParts = existingKeyObj.key.trim().split(" ");
+		// 		const mainExistingKeyPart =
+		// 			existingKeyParts.length > 1 ? existingKeyParts.slice(0, 2).join(" ") : existingKeyObj.key.trim();
+		// 		return mainExistingKeyPart === mainKeyPartToAdd;
+		// 	});
+		// 	if (keyAlreadyExists) {
+		// 		return;
+		// 	}
+		// 	await axios.post(
+		// 		`https://api.github.com/repos/${repoOwnerAndName}/keys`,
+		// 		{
+		// 			title: "dodo",
+		// 			key: key,
+		// 			read_only: true,
+		// 		},
+		// 		{
+		// 			headers: this.getHeaders(),
+		// 		},
+		// 	);
 	}
 
 	async removeDeployKey(repoPath: string, key: string) {
-		const sshUrl = repoPath;
-		const repoOwnerAndName = sshUrl.replace("git@github.com:", "").replace(".git", "");
-		const response = await axios.get(`https://api.github.com/repos/${repoOwnerAndName}/keys`, {
-			headers: this.getHeaders(),
-		});
-		const result = DeployKeysSchema.safeParse(response.data);
-		if (!result.success) {
-			console.error("Failed to parse deploy keys response for removal:", result.error);
-			// Depending on desired robustness, you might throw an error or return early.
-			// For now, if parsing fails, we can't identify keys to remove.
-			throw new Error("Failed to parse deploy keys response during removal process");
-		}
+		this.removeSSHKey(key);
+		// const sshUrl = repoPath;
+		// const repoOwnerAndName = sshUrl.replace("git@github.com:", "").replace(".git", "");
+		// const response = await axios.get(`https://api.github.com/repos/${repoOwnerAndName}/keys`, {
+		// 	headers: this.getHeaders(),
+		// });
+		// const result = DeployKeysSchema.safeParse(response.data);
+		// if (!result.success) {
+		// 	console.error("Failed to parse deploy keys response for removal:", result.error);
+		// 	// Depending on desired robustness, you might throw an error or return early.
+		// 	// For now, if parsing fails, we can't identify keys to remove.
+		// 	throw new Error("Failed to parse deploy keys response during removal process");
+		// }
 
-		// Extract the main part of the key we intend to remove
-		const keyToRemoveParts = key.trim().split(" ");
-		const mainKeyPartToRemove = keyToRemoveParts.length > 1 ? keyToRemoveParts.slice(0, 2).join(" ") : key.trim();
+		// // Extract the main part of the key we intend to remove
+		// const keyToRemoveParts = key.trim().split(" ");
+		// const mainKeyPartToRemove = keyToRemoveParts.length > 1 ? keyToRemoveParts.slice(0, 2).join(" ") : key.trim();
 
-		const deployKeysToDelete = result.data.filter((existingKeyObj) => {
-			const existingKeyParts = existingKeyObj.key.trim().split(" ");
-			const mainExistingKeyPart =
-				existingKeyParts.length > 1 ? existingKeyParts.slice(0, 2).join(" ") : existingKeyObj.key.trim();
-			return mainExistingKeyPart === mainKeyPartToRemove;
-		});
+		// const deployKeysToDelete = result.data.filter((existingKeyObj) => {
+		// 	const existingKeyParts = existingKeyObj.key.trim().split(" ");
+		// 	const mainExistingKeyPart =
+		// 		existingKeyParts.length > 1 ? existingKeyParts.slice(0, 2).join(" ") : existingKeyObj.key.trim();
+		// 	return mainExistingKeyPart === mainKeyPartToRemove;
+		// });
 
-		if (deployKeysToDelete.length === 0) {
-			console.log(
-				`No deploy key matching '${mainKeyPartToRemove.substring(0, 50)}...' found in repo ${repoOwnerAndName} for removal.`,
-			);
-			return;
-		}
+		// if (deployKeysToDelete.length === 0) {
+		// 	console.log(
+		// 		`No deploy key matching '${mainKeyPartToRemove.substring(0, 50)}...' found in repo ${repoOwnerAndName} for removal.`,
+		// 	);
+		// 	return;
+		// }
 
-		await Promise.all(
-			deployKeysToDelete.map((deployKey) => {
-				console.log(
-					`Removing deploy key ID ${deployKey.id} ('${deployKey.key.substring(0, 50)}...') from repo ${repoOwnerAndName}`,
-				);
-				return axios.delete(`https://api.github.com/repos/${repoOwnerAndName}/keys/${deployKey.id}`, {
-					headers: this.getHeaders(),
-				});
-			}),
-		);
-		console.log(
-			`Successfully initiated removal of ${deployKeysToDelete.length} matching deploy key(s) from ${repoOwnerAndName}.`,
-		);
+		// await Promise.all(
+		// 	deployKeysToDelete.map((deployKey) => {
+		// 		console.log(
+		// 			`Removing deploy key ID ${deployKey.id} ('${deployKey.key.substring(0, 50)}...') from repo ${repoOwnerAndName}`,
+		// 		);
+		// 		return axios.delete(`https://api.github.com/repos/${repoOwnerAndName}/keys/${deployKey.id}`, {
+		// 			headers: this.getHeaders(),
+		// 		});
+		// 	}),
+		// );
+		// console.log(
+		// 	`Successfully initiated removal of ${deployKeysToDelete.length} matching deploy key(s) from ${repoOwnerAndName}.`,
+		// );
 	}
 
 	async addPushWebhook(repoPath: string, callbackAddress: string): Promise<boolean> {
@@ -163,4 +181,70 @@
 			throw error; // Re-throw to let the caller handle it
 		}
 	}
+
+	async addSSHKey(key: string) {
+		let existingKeys: { key: string }[] = [];
+		const response = await axios.get(`https://api.github.com/user/keys`, {
+			headers: this.getHeaders(),
+		});
+		if (Array.isArray(response.data)) {
+			existingKeys = response.data;
+		}
+		const keyToAddParts = key.trim().split(" ");
+		const mainKeyPartToAdd = keyToAddParts.length > 1 ? keyToAddParts.slice(0, 2).join(" ") : key.trim();
+		const keyAlreadyExists = existingKeys.some((existingKeyObj) => {
+			const existingKeyParts = existingKeyObj.key.trim().split(" ");
+			const mainExistingKeyPart =
+				existingKeyParts.length > 1 ? existingKeyParts.slice(0, 2).join(" ") : existingKeyObj.key.trim();
+			return mainExistingKeyPart === mainKeyPartToAdd;
+		});
+
+		if (keyAlreadyExists) {
+			return;
+		}
+		await axios.post(
+			`https://api.github.com/user/keys`,
+			{
+				title: "dodo",
+				key: key,
+			},
+			{
+				headers: this.getHeaders(),
+			},
+		);
+	}
+
+	async removeSSHKey(key: string) {
+		const response = await axios.get(`https://api.github.com/user/keys`, {
+			headers: this.getHeaders(),
+		});
+
+		const result = DeployKeysSchema.safeParse(response.data);
+		if (!result.success) {
+			throw new Error("Failed to parse deploy keys response during removal process");
+		}
+
+		// Extract the main part of the key we intend to remove
+		const keyToRemoveParts = key.trim().split(" ");
+		const mainKeyPartToRemove = keyToRemoveParts.length > 1 ? keyToRemoveParts.slice(0, 2).join(" ") : key.trim();
+
+		const deployKeysToDelete = result.data.filter((existingKeyObj) => {
+			const existingKeyParts = existingKeyObj.key.trim().split(" ");
+			const mainExistingKeyPart =
+				existingKeyParts.length > 1 ? existingKeyParts.slice(0, 2).join(" ") : existingKeyObj.key.trim();
+			return mainExistingKeyPart === mainKeyPartToRemove;
+		});
+
+		if (deployKeysToDelete.length === 0) {
+			return;
+		}
+
+		await Promise.all(
+			deployKeysToDelete.map((deployKey) => {
+				return axios.delete(`https://api.github.com/user/keys/${deployKey.id}`, {
+					headers: this.getHeaders(),
+				});
+			}),
+		);
+	}
 }
