diff --git a/apps/canvas/front/src/components/actions.tsx b/apps/canvas/front/src/components/actions.tsx
index dbb5ea6..d87f458 100644
--- a/apps/canvas/front/src/components/actions.tsx
+++ b/apps/canvas/front/src/components/actions.tsx
@@ -11,7 +11,7 @@
 	DropdownMenuContent,
 	DropdownMenuTrigger,
 } from "./ui/dropdown-menu";
-import { LoaderCircle, Menu } from "lucide-react";
+import { Ellipsis, LoaderCircle } from "lucide-react";
 
 function toNodeType(t: string): string {
 	if (t === "ingress") {
@@ -70,7 +70,6 @@
 				return;
 			}
 			const data: { type: string; name: string; status: string }[] = await resp.json();
-			console.log(data);
 			for (const n of nodes) {
 				if (n.type === "network") {
 					continue;
@@ -269,7 +268,9 @@
 				</Button>
 				<DropdownMenu>
 					<DropdownMenuTrigger>
-						<Menu className="rounded-md bg-gray-200 opacity-50" />
+						<Button size="icon">
+							<Ellipsis />
+						</Button>
 					</DropdownMenuTrigger>
 					<DropdownMenuContent className="w-56">
 						<DropdownMenuGroup>
@@ -322,7 +323,9 @@
 				<Button onClick={save}>Save</Button>
 				<DropdownMenu>
 					<DropdownMenuTrigger>
-						<Menu />
+						<Button size="icon">
+							<Ellipsis />
+						</Button>
 					</DropdownMenuTrigger>
 					<DropdownMenuContent className="w-56">
 						<DropdownMenuGroup>
diff --git a/apps/canvas/front/src/components/canvas.tsx b/apps/canvas/front/src/components/canvas.tsx
index 861437f..96b8f03 100644
--- a/apps/canvas/front/src/components/canvas.tsx
+++ b/apps/canvas/front/src/components/canvas.tsx
@@ -31,7 +31,7 @@
 	onConnect: state.onConnect,
 });
 
-export function Canvas() {
+export function Canvas({ className }: { className?: string }) {
 	const { nodes, edges, onNodesChange, onEdgesChange, onConnect } = useStateStore(useShallow(selector));
 	const store = useStateStore();
 	const instance = useReactFlow();
@@ -101,7 +101,7 @@
 		[instance],
 	);
 	return (
-		<div style={{ width: "100%", height: "100%" }}>
+		<div style={{ width: "100%", height: "100%" }} className={className}>
 			<ReactFlow
 				nodeTypes={nodeTypes}
 				nodes={nodes}
@@ -119,7 +119,7 @@
 					gap={12}
 					size={1}
 				/>
-				<Panel position="bottom-right">
+				<Panel position="top-right">
 					<Actions />
 				</Panel>
 			</ReactFlow>
diff --git a/apps/canvas/front/src/components/node-app.tsx b/apps/canvas/front/src/components/node-app.tsx
index 7516d19..71fc358 100644
--- a/apps/canvas/front/src/components/node-app.tsx
+++ b/apps/canvas/front/src/components/node-app.tsx
@@ -13,21 +13,26 @@
 	AppNode,
 	GithubNode,
 	useEnv,
+	useGithubRepositories,
 } from "@/lib/state";
 import { KeyboardEvent, FocusEvent, useCallback, useEffect, useMemo, useState } from "react";
 import { z } from "zod";
-import { DeepPartial, EventType, useForm, ControllerRenderProps, FieldPath } from "react-hook-form";
+import { useForm, EventType, DeepPartial } from "react-hook-form";
 import { zodResolver } from "@hookform/resolvers/zod";
 import { Form, FormControl, FormField, FormItem, FormMessage } from "./ui/form";
 import { Button } from "./ui/button";
 import { Handle, Position, useNodes } from "@xyflow/react";
 import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select";
-import { PencilIcon, XIcon } from "lucide-react";
 import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "./ui/tooltip";
 import { Textarea } from "./ui/textarea";
 import { Input } from "./ui/input";
-import { Checkbox } from "./ui/checkbox";
+import { Switch } from "./ui/switch";
 import { Label } from "./ui/label";
+import { Tabs, TabsContent, TabsList, TabsTrigger } from "./ui/tabs";
+import { Code, Container, Network, Pencil, Variable } from "lucide-react";
+import { Icon } from "./icon";
+import { Badge } from "./ui/badge";
+import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from "./ui/accordion";
 
 export function NodeApp(node: ServiceNode) {
 	const { id, selected } = node;
@@ -71,11 +76,6 @@
 	type: z.enum(ServiceTypes),
 });
 
-const portSchema = z.object({
-	name: z.string().min(1, "required"),
-	value: z.coerce.number().gt(0, "must be positive").lte(65535, "must be less than 65535"),
-});
-
 const sourceSchema = z.object({
 	id: z.string().min(1, "required"),
 	branch: z.string(),
@@ -91,10 +91,124 @@
 	subdomain: z.string().min(1, "required"),
 });
 
-export function NodeAppDetails({ id, data, disabled }: ServiceNode & { disabled?: boolean }) {
+export function NodeAppDetails({ node, disabled }: { node: ServiceNode; disabled?: boolean }) {
+	const { data } = node;
+	return (
+		<>
+			<Name node={node} disabled={disabled} />
+			<Tabs defaultValue="runtime">
+				<TabsList className="w-full flex flex-row justify-between">
+					<TabsTrigger value="runtime">
+						<TooltipProvider>
+							<Tooltip>
+								<TooltipTrigger>
+									<Container />
+								</TooltipTrigger>
+								<TooltipContent>Runtime</TooltipContent>
+							</Tooltip>
+						</TooltipProvider>
+					</TabsTrigger>
+					<TabsTrigger value="ports">
+						<TooltipProvider>
+							<Tooltip>
+								<TooltipTrigger className="flex flex-row gap-1 items-center">
+									<Network />
+								</TooltipTrigger>
+								<TooltipContent>
+									Ports{" "}
+									<Badge variant="secondary" className="rounded-full">
+										{data.ports?.length ?? 0}
+									</Badge>
+								</TooltipContent>
+							</Tooltip>
+						</TooltipProvider>
+					</TabsTrigger>
+					<TabsTrigger value="vars">
+						<TooltipProvider>
+							<Tooltip>
+								<TooltipTrigger className="flex flex-row gap-1 items-center">
+									<Variable />
+								</TooltipTrigger>
+								<TooltipContent>
+									Variables{" "}
+									<Badge variant="secondary" className="rounded-full">
+										{data.envVars?.length ?? 0}
+									</Badge>
+								</TooltipContent>
+							</Tooltip>
+						</TooltipProvider>
+					</TabsTrigger>
+					<TabsTrigger value="dev">
+						<TooltipProvider>
+							<Tooltip>
+								<TooltipTrigger className="flex flex-row gap-1 items-center">
+									<Code />
+								</TooltipTrigger>
+								<TooltipContent>Dev</TooltipContent>
+							</Tooltip>
+						</TooltipProvider>
+					</TabsTrigger>
+				</TabsList>
+				<TabsContent value="runtime">
+					<Runtime node={node} disabled={disabled} />
+				</TabsContent>
+				<TabsContent value="ports">
+					<Ports node={node} disabled={disabled} />
+				</TabsContent>
+				<TabsContent value="vars">
+					<EnvVars node={node} disabled={disabled} />
+				</TabsContent>
+				<TabsContent value="dev">
+					<Dev node={node} disabled={disabled} />
+				</TabsContent>
+			</Tabs>
+		</>
+	);
+}
+
+function Name({ node, disabled }: { node: ServiceNode; disabled?: boolean }): React.ReactNode {
+	const { id, data } = node;
 	const store = useStateStore();
-	const nodes = useNodes<AppNode>();
-	const env = useEnv();
+	const [isEditing, setIsEditing] = useState(false);
+	useEffect(() => {
+		if (data.label === "" && !disabled) {
+			setIsEditing(true);
+		}
+	}, [data.label, disabled]);
+	return (
+		<div className="flex flex-row gap-1 items-center">
+			<Icon type="app" />
+			{isEditing ? (
+				<Input
+					placeholder="Name"
+					value={data.label}
+					onChange={(e) => store.updateNodeData(id, { label: e.target.value })}
+					onBlur={() => {
+						if (data.label !== "") {
+							setIsEditing(false);
+						}
+					}}
+					autoFocus={true}
+				/>
+			) : (
+				<h3
+					className="text-lg font-bold cursor-text select-none hover:outline-solid hover:outline-2 hover:outline-gray-200"
+					onClick={() => {
+						if (!disabled) {
+							setIsEditing(true);
+						}
+					}}
+				>
+					{data.label}
+				</h3>
+			)}
+		</div>
+	);
+}
+
+function Runtime({ node, disabled }: { node: ServiceNode; disabled?: boolean }): React.ReactNode {
+	const { id, data } = node;
+	const store = useStateStore();
 	const form = useForm<z.infer<typeof schema>>({
 		resolver: zodResolver(schema),
 		mode: "onChange",
@@ -103,41 +217,12 @@
 			type: data.type,
 		},
 	});
-	const portForm = useForm<z.infer<typeof portSchema>>({
-		resolver: zodResolver(portSchema),
-		mode: "onSubmit",
-		defaultValues: {
-			name: "",
-			value: 0,
-		},
-	});
-	const onSubmit = useCallback(
-		(values: z.infer<typeof portSchema>) => {
-			const portId = uuidv4();
-			store.updateNodeData<"app">(id, {
-				ports: (data.ports || []).concat({
-					id: portId,
-					name: values.name.toLowerCase(),
-					value: values.value,
-				}),
-				envVars: (data.envVars || []).concat({
-					id: uuidv4(),
-					source: null,
-					portId,
-					name: `DODO_PORT_${values.name.toUpperCase()}`,
-				}),
-			});
-			portForm.reset();
-		},
-		[id, data, portForm, store],
-	);
 	useEffect(() => {
 		const sub = form.watch(
 			(
 				value: DeepPartial<z.infer<typeof schema>>,
 				{ name, type }: { name?: keyof z.infer<typeof schema> | undefined; type?: EventType | undefined },
 			) => {
-				console.log({ name, type });
 				if (type !== "change") {
 					return;
 				}
@@ -163,21 +248,6 @@
 		);
 		return () => sub.unsubscribe();
 	}, [id, form, store]);
-	const focus = useCallback(
-		(field: ControllerRenderProps<z.infer<typeof schema>, FieldPath<z.infer<typeof schema>>>, name: string) => {
-			return (e: HTMLElement | null) => {
-				field.ref(e);
-				if (e != null && name === data.activeField) {
-					console.log(e);
-					e.focus();
-					store.updateNodeData(id, {
-						activeField: undefined,
-					});
-				}
-			};
-		},
-		[id, data, store],
-	);
 	const [typeProps, setTypeProps] = useState({});
 	useEffect(() => {
 		if (data.activeField === "type") {
@@ -189,82 +259,88 @@
 			setTypeProps({});
 		}
 	}, [id, data, store, setTypeProps]);
-	const editAlias = useCallback(
-		(e: BoundEnvVar) => {
-			return () => {
-				store.updateNodeData(id, {
-					...data,
-					envVars: data.envVars!.map((o) => {
-						if (o.id !== e.id) {
-							return o;
-						} else
-							return {
-								...o,
-								isEditting: true,
-							};
-					}),
-				});
-			};
-		},
-		[id, data, store],
-	);
-	const saveAlias = useCallback(
-		(e: BoundEnvVar, value: string, store: AppState) => {
-			store.updateNodeData(id, {
-				...data,
-				envVars: data.envVars!.map((o) => {
-					if (o.id !== e.id) {
-						return o;
-					}
-					if (value) {
-						return {
-							...o,
-							isEditting: false,
-							alias: value.toUpperCase(),
-						};
-					}
-					console.log(o);
-					if ("alias" in o) {
-						const { alias: _, ...rest } = o;
-						console.log(rest);
-						return {
-							...rest,
-							isEditting: false,
-						};
-					}
-					return {
-						...o,
-						isEditting: false,
-					};
-				}),
+	const setPreBuildCommands = useCallback(
+		(e: React.ChangeEvent<HTMLTextAreaElement>) => {
+			store.updateNodeData<"app">(id, {
+				preBuildCommands: e.currentTarget.value,
 			});
 		},
-		[id, data],
+		[id, store],
 	);
-	const saveAliasOnEnter = useCallback(
-		(e: BoundEnvVar) => {
-			return (event: KeyboardEvent<HTMLInputElement>) => {
-				if (event.key === "Enter") {
-					event.preventDefault();
-					saveAlias(e, event.currentTarget.value, store);
-				}
-			};
-		},
-		[store, saveAlias],
+	return (
+		<>
+			<SourceRepo node={node} disabled={disabled} />
+			<Form {...form}>
+				<form className="space-y-2">
+					<Label>Container Image</Label>
+					<FormField
+						control={form.control}
+						name="type"
+						render={({ field }) => (
+							<FormItem>
+								<Select
+									onValueChange={field.onChange}
+									value={field.value || ""}
+									{...typeProps}
+									disabled={disabled}
+								>
+									<FormControl>
+										<SelectTrigger>
+											<SelectValue />
+										</SelectTrigger>
+									</FormControl>
+									<SelectContent>
+										{ServiceTypes.map((t) => (
+											<SelectItem key={t} value={t}>
+												{t}
+											</SelectItem>
+										))}
+									</SelectContent>
+								</Select>
+								<FormMessage />
+							</FormItem>
+						)}
+					/>
+				</form>
+			</Form>
+			<Label>Pre-Build Commands</Label>
+			<Textarea
+				placeholder="new line separated list of commands to run before running the service"
+				value={data.preBuildCommands}
+				onChange={setPreBuildCommands}
+				disabled={disabled}
+			/>
+		</>
 	);
-	const saveAliasOnBlur = useCallback(
-		(e: BoundEnvVar) => {
-			return (event: FocusEvent<HTMLInputElement>) => {
-				saveAlias(e, event.currentTarget.value, store);
-			};
-		},
-		[store, saveAlias],
-	);
+}
+
+function Ports({ node, disabled }: { node: ServiceNode; disabled?: boolean }): React.ReactNode {
+	const { id, data } = node;
+	const store = useStateStore();
+	const [name, setName] = useState("");
+	const [value, setValue] = useState("");
+	const onSubmit = useCallback(() => {
+		const portId = uuidv4();
+		store.updateNodeData<"app">(id, {
+			ports: (data.ports || []).concat({
+				id: portId,
+				name: name.toUpperCase(),
+				value: Number(value),
+			}),
+			envVars: (data.envVars || []).concat({
+				id: uuidv4(),
+				source: null,
+				portId,
+				name: `DODO_PORT_${name.toUpperCase()}`,
+			}),
+		});
+		setName("");
+		setValue("");
+	}, [id, data, store, name, value, setName, setValue]);
 	const removePort = useCallback(
 		(portId: string) => {
 			// TODO(gio): this is ugly
 			const tcpRemoved = new Set<string>();
-			console.log(store.edges);
 			store.setEdges(
 				store.edges.filter((e) => {
 					if (e.source !== id || e.sourceHandle !== "ports") {
@@ -350,76 +426,174 @@
 		},
 		[id, data, store],
 	);
-	const setPreBuildCommands = useCallback(
-		(e: React.ChangeEvent<HTMLTextAreaElement>) => {
-			store.updateNodeData<"app">(id, {
-				preBuildCommands: e.currentTarget.value,
+	return (
+		<div className="flex flex-col gap-1">
+			<div className="grid grid-cols-[1fr_1fr_auto] gap-1">
+				{data &&
+					data.ports &&
+					data.ports.map((p) => (
+						<>
+							<div className="flex items-center px-3">{p.name.toUpperCase()}</div>
+							<div className="flex items-center px-3">{p.value}</div>
+							<div className="flex items-center">
+								<Button
+									variant="destructive"
+									className="w-full"
+									onClick={() => removePort(p.id)}
+									disabled={disabled}
+								>
+									Remove
+								</Button>
+							</div>
+						</>
+					))}
+				<div>
+					<Input
+						placeholder="name"
+						className="uppercase w-0 min-w-full"
+						disabled={disabled}
+						value={name}
+						onChange={(e) => setName(e.target.value)}
+					/>
+				</div>
+				<div>
+					<Input
+						placeholder="0"
+						className="w-0 min-w-full"
+						disabled={disabled}
+						value={value}
+						onChange={(e) => setValue(e.target.value)}
+					/>
+				</div>
+				<div>
+					<Button type="submit" className="w-full" disabled={disabled} onClick={onSubmit}>
+						Add
+					</Button>
+				</div>
+			</div>
+		</div>
+	);
+}
+
+function EnvVars({ node, disabled }: { node: ServiceNode; disabled?: boolean }): React.ReactNode {
+	const { id, data } = node;
+	const store = useStateStore();
+	const editAlias = useCallback(
+		(e: BoundEnvVar) => {
+			return () => {
+				store.updateNodeData(id, {
+					...data,
+					envVars: data.envVars!.map((o) => {
+						if (o.id !== e.id) {
+							return o;
+						} else
+							return {
+								...o,
+								isEditting: true,
+							};
+					}),
+				});
+			};
+		},
+		[id, data, store],
+	);
+	const saveAlias = useCallback(
+		(e: BoundEnvVar, value: string, store: AppState) => {
+			store.updateNodeData(id, {
+				...data,
+				envVars: data.envVars!.map((o) => {
+					if (o.id !== e.id) {
+						return o;
+					}
+					if (value) {
+						return {
+							...o,
+							isEditting: false,
+							alias: value.toUpperCase(),
+						};
+					}
+					if ("alias" in o) {
+						const { alias: _, ...rest } = o;
+						return {
+							...rest,
+							isEditting: false,
+						};
+					}
+					return {
+						...o,
+						isEditting: false,
+					};
+				}),
 			});
 		},
-		[id, store],
+		[id, data],
 	);
-
-	const sourceForm = useForm<z.infer<typeof sourceSchema>>({
-		resolver: zodResolver(sourceSchema),
-		mode: "onChange",
-		defaultValues: {
-			id: data?.repository?.id,
-			branch: data.repository && "branch" in data.repository ? data.repository.branch : undefined,
-			rootDir: data.repository && "rootDir" in data.repository ? data.repository.rootDir : undefined,
-		},
-	});
-	useEffect(() => {
-		const sub = sourceForm.watch(
-			(
-				value: DeepPartial<z.infer<typeof sourceSchema>>,
-				{ name }: { name?: keyof z.infer<typeof sourceSchema> | undefined; type?: EventType | undefined },
-			) => {
-				console.log(value);
-				if (name === "id") {
-					let edges = store.edges;
-					if (data?.repository?.id !== undefined) {
-						edges = edges.filter((e) => {
-							if (e.target === id && e.targetHandle === "repository" && e.source === data.repository.id) {
-								return false;
-							} else {
-								return true;
-							}
-						});
-					}
-					if (value.id !== undefined) {
-						edges = edges.concat({
-							id: uuidv4(),
-							source: value.id,
-							sourceHandle: "repository",
-							target: id,
-							targetHandle: "repository",
-						});
-					}
-					store.setEdges(edges);
-					store.updateNodeData<"app">(id, {
-						repository: {
-							id: value.id,
-						},
-					});
-				} else if (name === "branch") {
-					store.updateNodeData<"app">(id, {
-						repository: {
-							...data?.repository,
-							branch: value.branch,
-						},
-					});
-				} else if (name === "rootDir") {
-					store.updateNodeData<"app">(id, {
-						repository: {
-							...data?.repository,
-							rootDir: value.rootDir,
-						},
-					});
+	const saveAliasOnEnter = useCallback(
+		(e: BoundEnvVar) => {
+			return (event: KeyboardEvent<HTMLInputElement>) => {
+				if (event.key === "Enter") {
+					event.preventDefault();
+					saveAlias(e, event.currentTarget.value, store);
 				}
-			},
-		);
-		return () => sub.unsubscribe();
-	}, [id, data, sourceForm, store]);
+			};
+		},
+		[store, saveAlias],
+	);
+	const saveAliasOnBlur = useCallback(
+		(e: BoundEnvVar) => {
+			return (event: FocusEvent<HTMLInputElement>) => {
+				saveAlias(e, event.currentTarget.value, store);
+			};
+		},
+		[store, saveAlias],
+	);
+	return (
+		<ul>
+			{data &&
+				data.envVars &&
+				data.envVars.map((v) => {
+					if ("name" in v) {
+						const value = "alias" in v ? v.alias : v.name;
+						if (v.isEditting) {
+							return (
+								<li key={v.id}>
+									<Input
+										type="text"
+										className="uppercase"
+										defaultValue={value}
+										onKeyUp={saveAliasOnEnter(v)}
+										onBlur={saveAliasOnBlur(v)}
+										autoFocus={true}
+										disabled={disabled}
+									/>
+								</li>
+							);
+						}
+						return (
+							<li key={v.id} onClick={editAlias(v)}>
+								<TooltipProvider>
+									<Tooltip>
+										<TooltipTrigger className="w-full">
+											<div className="w-full flex flex-row items-center gap-1 cursor-text">
+												<Pencil className="w-4 h-4" />
+												<div className="uppercase">{value}</div>
+											</div>
+										</TooltipTrigger>
+										<TooltipContent>{v.name}</TooltipContent>
+									</Tooltip>
+								</TooltipProvider>
+							</li>
+						);
+					}
+				})}
+		</ul>
+	);
+}
+
+function Dev({ node, disabled }: { node: ServiceNode; disabled?: boolean }): React.ReactNode {
+	const { id, data } = node;
+	const env = useEnv();
+	const store = useStateStore();
 	const devForm = useForm<z.infer<typeof devSchema>>({
 		resolver: zodResolver(devSchema),
 		mode: "onChange",
@@ -627,215 +801,6 @@
 	}, [id, data, exposeForm, store]);
 	return (
 		<>
-			<Form {...exposeForm}>
-				<form className="space-y-2">
-					<FormField
-						control={form.control}
-						name="name"
-						render={({ field }) => (
-							<FormItem>
-								<FormControl>
-									<Input
-										placeholder="name"
-										className="lowercase"
-										{...field}
-										ref={focus(field, "name")}
-										disabled={disabled}
-									/>
-								</FormControl>
-								<FormMessage />
-							</FormItem>
-						)}
-					/>
-					<FormField
-						control={form.control}
-						name="type"
-						render={({ field }) => (
-							<FormItem>
-								<Select
-									onValueChange={field.onChange}
-									defaultValue={field.value}
-									{...typeProps}
-									disabled={disabled}
-								>
-									<FormControl>
-										<SelectTrigger>
-											<SelectValue placeholder="Runtime" />
-										</SelectTrigger>
-									</FormControl>
-									<SelectContent>
-										{ServiceTypes.map((t) => (
-											<SelectItem key={t} value={t}>
-												{t}
-											</SelectItem>
-										))}
-									</SelectContent>
-								</Select>
-								<FormMessage />
-							</FormItem>
-						)}
-					/>
-				</form>
-			</Form>
-			Source
-			<Form {...sourceForm}>
-				<form className="space-y-2">
-					<FormField
-						control={sourceForm.control}
-						name="id"
-						render={({ field }) => (
-							<FormItem>
-								<Select onValueChange={field.onChange} defaultValue={field.value} disabled={disabled}>
-									<FormControl>
-										<SelectTrigger>
-											<SelectValue placeholder="Repository" />
-										</SelectTrigger>
-									</FormControl>
-									<SelectContent>
-										{(
-											nodes.filter(
-												(n) => n.type === "github" && n.data.repository?.id !== undefined,
-											) as GithubNode[]
-										).map((n) => (
-											<SelectItem
-												key={n.id}
-												value={n.id}
-											>{`${n.data.repository?.fullName}`}</SelectItem>
-										))}
-									</SelectContent>
-								</Select>
-								<FormMessage />
-							</FormItem>
-						)}
-					/>
-					<FormField
-						control={sourceForm.control}
-						name="branch"
-						render={({ field }) => (
-							<FormItem>
-								<FormControl>
-									<Input placeholder="master" className="lowercase" {...field} disabled={disabled} />
-								</FormControl>
-								<FormMessage />
-							</FormItem>
-						)}
-					/>
-					<FormField
-						control={sourceForm.control}
-						name="rootDir"
-						render={({ field }) => (
-							<FormItem>
-								<FormControl>
-									<Input placeholder="/" {...field} disabled={disabled} />
-								</FormControl>
-								<FormMessage />
-							</FormItem>
-						)}
-					/>
-				</form>
-			</Form>
-			Ports
-			<ul>
-				{data &&
-					data.ports &&
-					data.ports.map((p) => (
-						<li key={p.id} className="flex flex-row items-center gap-1">
-							<Button
-								size={"icon"}
-								variant={"ghost"}
-								onClick={() => removePort(p.id)}
-								className="w-4 h-4"
-								disabled={disabled}
-							>
-								<XIcon />
-							</Button>
-							<div>
-								{p.name} - {p.value}
-							</div>
-						</li>
-					))}
-			</ul>
-			<Form {...portForm}>
-				<form className="flex flex-row space-x-1" onSubmit={portForm.handleSubmit(onSubmit)}>
-					<FormField
-						control={portForm.control}
-						name="name"
-						render={({ field }) => (
-							<FormItem>
-								<FormControl>
-									<Input placeholder="name" className="lowercase" {...field} disabled={disabled} />
-								</FormControl>
-								<FormMessage />
-							</FormItem>
-						)}
-					/>
-					<FormField
-						control={portForm.control}
-						name="value"
-						render={({ field }) => (
-							<FormItem>
-								<FormControl>
-									<Input placeholder="value" {...field} disabled={disabled} />
-								</FormControl>
-								<FormMessage />
-							</FormItem>
-						)}
-					/>
-					<Button type="submit" disabled={disabled}>
-						Add Port
-					</Button>
-				</form>
-			</Form>
-			Env Vars
-			<ul>
-				{data &&
-					data.envVars &&
-					data.envVars.map((v) => {
-						if ("name" in v) {
-							const value = "alias" in v ? v.alias : v.name;
-							if (v.isEditting) {
-								return (
-									<li key={v.id}>
-										<Input
-											type="text"
-											className="uppercase"
-											defaultValue={value}
-											onKeyUp={saveAliasOnEnter(v)}
-											onBlur={saveAliasOnBlur(v)}
-											autoFocus={true}
-											disabled={disabled}
-										/>
-									</li>
-								);
-							}
-							return (
-								<li key={v.id} onClick={editAlias(v)}>
-									<TooltipProvider>
-										<Tooltip>
-											<TooltipTrigger>
-												<div className="flex flex-row items-center gap-1">
-													<Button size={"icon"} variant={"ghost"} className="w-4 h-4">
-														<PencilIcon />
-													</Button>
-													<div>{value}</div>
-												</div>
-											</TooltipTrigger>
-											<TooltipContent>{v.name}</TooltipContent>
-										</Tooltip>
-									</TooltipProvider>
-								</li>
-							);
-						}
-					})}
-			</ul>
-			Pre-Build Commands
-			<Textarea
-				placeholder="new line separated list of commands to run before running the service"
-				value={data.preBuildCommands}
-				onChange={setPreBuildCommands}
-				disabled={disabled}
-			/>
-			Dev
 			<Form {...devForm}>
 				<form className="space-y-2">
 					<FormField
@@ -844,13 +809,13 @@
 						render={({ field }) => (
 							<FormItem>
 								<div className="flex flex-row gap-1 items-center">
-									<Checkbox
+									<Switch
 										id="devEnabled"
 										onCheckedChange={field.onChange}
 										checked={field.value}
 										disabled={disabled}
 									/>
-									<Label htmlFor="devEnabled">Enabled</Label>
+									<Label htmlFor="devEnabled">Dev VM</Label>
 								</div>
 								<FormMessage />
 							</FormItem>
@@ -861,6 +826,7 @@
 			{data.dev && data.dev.enabled && (
 				<Form {...exposeForm}>
 					<form className="space-y-2">
+						<Label>Network</Label>
 						<FormField
 							control={exposeForm.control}
 							name="network"
@@ -868,12 +834,12 @@
 								<FormItem>
 									<Select
 										onValueChange={field.onChange}
-										defaultValue={field.value}
+										value={field.value || ""}
 										disabled={disabled}
 									>
 										<FormControl>
 											<SelectTrigger>
-												<SelectValue placeholder="Network" />
+												<SelectValue />
 											</SelectTrigger>
 										</FormControl>
 										<SelectContent>
@@ -889,13 +855,14 @@
 								</FormItem>
 							)}
 						/>
+						<Label>Subdomain</Label>
 						<FormField
 							control={exposeForm.control}
 							name="subdomain"
 							render={({ field }) => (
 								<FormItem>
 									<FormControl>
-										<Input placeholder="subdomain" {...field} disabled={disabled} />
+										<Input {...field} disabled={disabled} />
 									</FormControl>
 									<FormMessage />
 								</FormItem>
@@ -907,3 +874,294 @@
 		</>
 	);
 }
+
+function SourceRepo({ node, disabled }: { node: ServiceNode; disabled?: boolean }): React.ReactNode {
+	const { id, data } = node;
+	const store = useStateStore();
+	const nodes = useNodes<AppNode>();
+	const repo = useMemo(() => {
+		return nodes
+			.filter((n): n is GithubNode => n.type === "github")
+			.find((n) => n.id === data.repository?.repoNodeId);
+	}, [nodes, data.repository?.repoNodeId]);
+	const repos = useGithubRepositories();
+	const sourceForm = useForm<z.infer<typeof sourceSchema>>({
+		resolver: zodResolver(sourceSchema),
+		mode: "onChange",
+		defaultValues: {
+			id: data?.repository?.id?.toString(),
+			branch: data.repository && "branch" in data.repository ? data.repository.branch : undefined,
+			rootDir: data.repository && "rootDir" in data.repository ? data.repository.rootDir : undefined,
+		},
+	});
+	useEffect(() => {
+		const sub = sourceForm.watch(
+			(
+				value: DeepPartial<z.infer<typeof sourceSchema>>,
+				{ name }: { name?: keyof z.infer<typeof sourceSchema> | undefined; type?: EventType | undefined },
+			) => {
+				if (name === "id") {
+					const newRepoId = value.id ? parseInt(value.id, 10) : undefined;
+					if (!newRepoId) return;
+
+					const oldGithubNodeId = data.repository?.repoNodeId;
+					const selectedRepo = repos.find((r) => r.id === newRepoId);
+
+					if (!selectedRepo) return;
+
+					// If a node for the selected repo already exists, connect to it.
+					const existingNodeForSelectedRepo = nodes
+						.filter((n): n is GithubNode => n.type === "github")
+						.find((n) => n.data.repository?.id === selectedRepo.id);
+
+					if (existingNodeForSelectedRepo) {
+						let { nodes, edges } = store;
+						if (oldGithubNodeId) {
+							edges = edges.filter(
+								(e) =>
+									!(
+										e.target === id &&
+										e.source === oldGithubNodeId &&
+										e.targetHandle === "repository"
+									),
+							);
+						}
+						edges = edges.concat({
+							id: uuidv4(),
+							source: existingNodeForSelectedRepo.id,
+							sourceHandle: "repository",
+							target: id,
+							targetHandle: "repository",
+						});
+						nodes = nodes.map((n) => {
+							if (n.id !== id) {
+								return n;
+							} else {
+								const sn = n as ServiceNode;
+								return {
+									...sn,
+									data: {
+										...sn.data,
+										repository: {
+											...sn.data.repository,
+											id: newRepoId,
+											repoNodeId: existingNodeForSelectedRepo.id,
+										},
+									},
+								};
+							}
+						});
+						if (oldGithubNodeId && oldGithubNodeId !== existingNodeForSelectedRepo.id) {
+							const isOldNodeStillUsed = edges.some(
+								(e) => e.source === oldGithubNodeId && e.sourceHandle === "repository",
+							);
+							if (!isOldNodeStillUsed) {
+								nodes = nodes.filter((n) => n.id !== oldGithubNodeId);
+							}
+						}
+						store.setNodes(nodes);
+						store.setEdges(edges);
+						return;
+					}
+
+					// No node for selected repo, decide whether to update old node or create a new one.
+					if (oldGithubNodeId) {
+						const isOldNodeShared =
+							store.edges.filter(
+								(e) =>
+									e.source === oldGithubNodeId && e.target !== id && e.sourceHandle === "repository",
+							).length > 0;
+
+						if (!isOldNodeShared) {
+							// Update old node
+							store.updateNodeData<"github">(oldGithubNodeId, {
+								repository: {
+									id: selectedRepo.id,
+									sshURL: selectedRepo.ssh_url,
+									fullName: selectedRepo.full_name,
+								},
+								label: selectedRepo.full_name,
+							});
+							store.updateNodeData<"app">(id, {
+								repository: {
+									...data.repository,
+									id: newRepoId,
+								},
+							});
+						} else {
+							// Create new node because old one is shared
+							const newGithubNodeId = uuidv4();
+							store.addNode({
+								id: newGithubNodeId,
+								type: "github",
+								data: {
+									repository: {
+										id: selectedRepo.id,
+										sshURL: selectedRepo.ssh_url,
+										fullName: selectedRepo.full_name,
+									},
+									label: selectedRepo.full_name,
+									envVars: [],
+									ports: [],
+								},
+							});
+
+							let edges = store.edges;
+							// remove old edge
+							edges = edges.filter(
+								(e) =>
+									!(
+										e.target === id &&
+										e.source === oldGithubNodeId &&
+										e.targetHandle === "repository"
+									),
+							);
+							// add new edge
+							edges = edges.concat({
+								id: uuidv4(),
+								source: newGithubNodeId,
+								sourceHandle: "repository",
+								target: id,
+								targetHandle: "repository",
+							});
+							store.setEdges(edges);
+							store.updateNodeData<"app">(id, {
+								repository: {
+									...data.repository,
+									id: newRepoId,
+									repoNodeId: newGithubNodeId,
+								},
+							});
+						}
+					} else {
+						// No old github node, so create a new one
+						const newGithubNodeId = uuidv4();
+						store.addNode({
+							id: newGithubNodeId,
+							type: "github",
+							data: {
+								repository: {
+									id: selectedRepo.id,
+									sshURL: selectedRepo.ssh_url,
+									fullName: selectedRepo.full_name,
+								},
+								label: selectedRepo.full_name,
+								envVars: [],
+								ports: [],
+							},
+						});
+						store.setEdges(
+							store.edges.concat({
+								id: uuidv4(),
+								source: newGithubNodeId,
+								sourceHandle: "repository",
+								target: id,
+								targetHandle: "repository",
+							}),
+						);
+						store.updateNodeData<"app">(id, {
+							repository: {
+								...data.repository,
+								id: newRepoId,
+								repoNodeId: newGithubNodeId,
+							},
+						});
+					}
+				} else if (name === "branch") {
+					store.updateNodeData<"app">(id, {
+						repository: {
+							...data?.repository,
+							branch: value.branch,
+						},
+					});
+				} else if (name === "rootDir") {
+					store.updateNodeData<"app">(id, {
+						repository: {
+							...data?.repository,
+							rootDir: value.rootDir,
+						},
+					});
+				}
+			},
+		);
+		return () => sub.unsubscribe();
+	}, [id, data, sourceForm, store, nodes, repos]);
+	const [isExpanded, setIsExpanded] = useState(false);
+	// useEffect(() => {
+	// 	if (data.repository === undefined) {
+	// 		setIsExpanded(true);
+	// 	}
+	// }, [data.repository, setIsExpanded]);
+	console.log(data.repository, isExpanded, repo);
+	return (
+		<Accordion type="single" collapsible>
+			<AccordionItem value="repository" className="border-none">
+				<AccordionTrigger onClick={() => setIsExpanded(!isExpanded)}>
+					Source {!isExpanded && repo !== undefined && repo.data.repository?.fullName}
+				</AccordionTrigger>
+				<AccordionContent className="px-1">
+					<Form {...sourceForm}>
+						<form className="space-y-2">
+							<Label>Repository</Label>
+							<FormField
+								control={sourceForm.control}
+								name="id"
+								render={({ field }) => (
+									<FormItem>
+										<Select onValueChange={field.onChange} value={field.value} disabled={disabled}>
+											<FormControl>
+												<SelectTrigger>
+													<SelectValue />
+												</SelectTrigger>
+											</FormControl>
+											<SelectContent>
+												{repos.map((r) => (
+													<SelectItem
+														key={r.id}
+														value={r.id.toString()}
+													>{`${r.full_name}`}</SelectItem>
+												))}
+											</SelectContent>
+										</Select>
+										<FormMessage />
+									</FormItem>
+								)}
+							/>
+							<Label>Branch</Label>
+							<FormField
+								control={sourceForm.control}
+								name="branch"
+								render={({ field }) => (
+									<FormItem>
+										<FormControl>
+											<Input
+												placeholder="master"
+												className="lowercase"
+												{...field}
+												disabled={disabled}
+											/>
+										</FormControl>
+										<FormMessage />
+									</FormItem>
+								)}
+							/>
+							<Label>Root Directory</Label>
+							<FormField
+								control={sourceForm.control}
+								name="rootDir"
+								render={({ field }) => (
+									<FormItem>
+										<FormControl>
+											<Input placeholder="/" {...field} disabled={disabled} />
+										</FormControl>
+										<FormMessage />
+									</FormItem>
+								)}
+							/>
+						</form>
+					</Form>
+				</AccordionContent>
+			</AccordionItem>
+		</Accordion>
+	);
+}
diff --git a/apps/canvas/front/src/components/node-details.tsx b/apps/canvas/front/src/components/node-details.tsx
index 2d9cd58..d120c76 100644
--- a/apps/canvas/front/src/components/node-details.tsx
+++ b/apps/canvas/front/src/components/node-details.tsx
@@ -22,7 +22,7 @@
 function NodeDetailsImpl(props: NodeDetailsProps) {
 	switch (props.type) {
 		case "app":
-			return <NodeAppDetails {...props} />;
+			return <NodeAppDetails node={props} disabled={props.disabled} />;
 		case "gateway-https":
 			return <NodeGatewayHttpsDetails {...props} />;
 		case "gateway-tcp":
diff --git a/apps/canvas/front/src/components/node-gateway-https.tsx b/apps/canvas/front/src/components/node-gateway-https.tsx
index 81c40c3..1eb0409 100644
--- a/apps/canvas/front/src/components/node-gateway-https.tsx
+++ b/apps/canvas/front/src/components/node-gateway-https.tsx
@@ -17,10 +17,10 @@
 import { Form, FormControl, FormField, FormItem, FormMessage } from "./ui/form";
 import { Input } from "./ui/input";
 import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select";
-import { Checkbox } from "./ui/checkbox";
 import { Label } from "./ui/label";
 import { Button } from "./ui/button";
 import { XIcon } from "lucide-react";
+import { Switch } from "./ui/switch";
 
 const schema = z.object({
 	network: z.string().min(1, "reqired"),
@@ -411,7 +411,7 @@
 								render={({ field }) => (
 									<FormItem>
 										<div className="flex flex-row gap-1 items-center">
-											<Checkbox
+											<Switch
 												id="authEnabled"
 												onCheckedChange={field.onChange}
 												checked={field.value}
diff --git a/apps/canvas/front/src/components/node-github.tsx b/apps/canvas/front/src/components/node-github.tsx
index dd7c68a..4373359 100644
--- a/apps/canvas/front/src/components/node-github.tsx
+++ b/apps/canvas/front/src/components/node-github.tsx
@@ -20,7 +20,6 @@
 import { Form, FormControl, FormField, FormItem, FormMessage } from "./ui/form";
 import { Handle, Position } from "@xyflow/react";
 import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./ui/select";
-import { GitHubRepository } from "../lib/github";
 import { useProjectId } from "@/lib/state";
 import { Alert, AlertDescription } from "./ui/alert";
 import { AlertCircle, LoaderCircle, RefreshCw } from "lucide-react";
@@ -64,36 +63,11 @@
 	const repoError = useGithubRepositoriesError();
 	const fetchStoreRepositories = useFetchGithubRepositories();
 
-	const [displayRepos, setDisplayRepos] = useState<GitHubRepository[]>([]);
-
 	const [isAnalyzing, setIsAnalyzing] = useState(false);
 	const [showModal, setShowModal] = useState(false);
 	const [discoveredServices, setDiscoveredServices] = useState<z.infer<typeof serviceAnalyzisSchema>[]>([]);
 	const [selectedServices, setSelectedServices] = useState<Record<string, boolean>>({});
 
-	useEffect(() => {
-		let currentRepoInStore = false;
-		if (data.repository) {
-			currentRepoInStore = storeRepos.some((r) => r.id === data.repository!.id);
-		}
-
-		if (data.repository && !currentRepoInStore) {
-			const currentRepoForDisplay: GitHubRepository = {
-				id: data.repository.id,
-				name: data.repository.sshURL.split("/").pop() || "",
-				full_name: data.repository.fullName || data.repository.sshURL.split("/").slice(-2).join("/"),
-				html_url: "",
-				ssh_url: data.repository.sshURL,
-				description: null,
-				private: false,
-				default_branch: "main",
-			};
-			setDisplayRepos([currentRepoForDisplay, ...storeRepos.filter((r) => r.id !== data.repository!.id)]);
-		} else {
-			setDisplayRepos(storeRepos);
-		}
-	}, [data.repository, storeRepos]);
-
 	const form = useForm<z.infer<typeof schema>>({
 		resolver: zodResolver(schema),
 		mode: "onChange",
@@ -118,7 +92,7 @@
 				switch (name) {
 					case "repositoryId":
 						if (value.repositoryId) {
-							const repo = displayRepos.find((r) => r.id === value.repositoryId);
+							const repo = storeRepos.find((r) => r.id === value.repositoryId);
 							if (repo) {
 								store.updateNodeData<"github">(id, {
 									repository: {
@@ -134,7 +108,7 @@
 			},
 		);
 		return () => sub.unsubscribe();
-	}, [form, store, id, displayRepos]);
+	}, [form, store, id, storeRepos]);
 
 	const analyze = useCallback(async () => {
 		if (!data.repository?.sshURL) return;
@@ -177,7 +151,8 @@
 				const newNodeData: Omit<ServiceData, "activeField" | "state"> = {
 					label: service.name,
 					repository: {
-						id: id,
+						id: data.repository!.id,
+						repoNodeId: id,
 					},
 					info: service,
 					type: "nodejs:24.0.2" as ServiceType,
@@ -239,7 +214,7 @@
 															githubService
 																? isLoadingRepos
 																	? "Loading..."
-																	: displayRepos.length === 0
+																	: storeRepos.length === 0
 																		? "No repositories found"
 																		: "Select a repository"
 																: "GitHub not configured"
@@ -248,7 +223,7 @@
 												</SelectTrigger>
 											</FormControl>
 											<SelectContent>
-												{displayRepos.map((repo) => (
+												{storeRepos.map((repo) => (
 													<SelectItem key={repo.id} value={repo.id.toString()}>
 														{repo.full_name}
 														{repo.description && ` - ${repo.description}`}
