1:"$Sreact.fragment" 2:I[5379,["915","static/chunks/915-e75e15b01ec6c60e.js","619","static/chunks/619-ba102abea3e3d0e4.js","284","static/chunks/284-7b00ddceae1508d2.js","177","static/chunks/app/layout-f47d2482c80930e1.js"],"ThemeProvider"] 3:I[120,["915","static/chunks/915-e75e15b01ec6c60e.js","619","static/chunks/619-ba102abea3e3d0e4.js","284","static/chunks/284-7b00ddceae1508d2.js","177","static/chunks/app/layout-f47d2482c80930e1.js"],"Header"] 4:I[9766,[],""] 5:I[8924,[],""] 6:I[6613,["915","static/chunks/915-e75e15b01ec6c60e.js","619","static/chunks/619-ba102abea3e3d0e4.js","284","static/chunks/284-7b00ddceae1508d2.js","177","static/chunks/app/layout-f47d2482c80930e1.js"],"Footer"] 7:I[7989,[],"ClientSegmentRoot"] 8:I[2086,["915","static/chunks/915-e75e15b01ec6c60e.js","284","static/chunks/284-7b00ddceae1508d2.js","584","static/chunks/app/blog/layout-56162451cf26531f.js"],"default"] a:I[2401,["915","static/chunks/915-e75e15b01ec6c60e.js","619","static/chunks/619-ba102abea3e3d0e4.js","696","static/chunks/app/blog/orbit/page-8e554d49cb7075d5.js"],"BackToBlog"] 56:I[7150,[],""] :HL["/cv/_next/static/media/4cf2300e9c8272f7-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/cv/_next/static/media/93f479601ee12b01-s.p.woff2","font",{"crossOrigin":"","type":"font/woff2"}] :HL["/cv/_next/static/css/d893c1b9853c3059.css","style"] 0:{"P":null,"b":"wIBcpDzxA6-tV9uMd1RSd","p":"/cv","c":["","blog","orbit"],"i":false,"f":[[["",{"children":["blog",{"children":["orbit",{"children":["__PAGE__",{}]}]}]},"$undefined","$undefined",true],["",["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/cv/_next/static/css/d893c1b9853c3059.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}]],["$","html",null,{"lang":"en","suppressHydrationWarning":true,"children":["$","body",null,{"className":"__variable_e0e7f9 __variable_49b421 bg-white tracking-tight antialiased dark:bg-zinc-950","children":["$","$L2",null,{"enableSystem":true,"attribute":"class","storageKey":"theme","defaultTheme":"system","children":["$","div",null,{"className":"flex min-h-screen w-full flex-col font-[family-name:var(--font-inter-tight)]","children":["$","div",null,{"className":"relative mx-auto w-full max-w-screen-sm flex-1 px-4 pt-20","children":[["$","$L3",null,{}],["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}],["$","$L6",null,{}]]}]}]}]}]}]]}],{"children":["blog",["$","$1","c",{"children":[null,["$","$L7",null,{"Component":"$8","slots":{"children":["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]},"params":{},"promise":"$@9"}]]}],{"children":["orbit",["$","$1","c",{"children":[null,["$","$L4",null,{"parallelRouterKey":"children","error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","forbidden":"$undefined","unauthorized":"$undefined"}]]}],{"children":["__PAGE__",["$","$1","c",{"children":[[["$","$La",null,{}],"\n",["$","figure",null,{"children":[["$","img",null,{"src":"/cv/images/orbit.png","alt":"","className":"rounded-xl"}],["$","figcaption",null,{"className":"text-center","children":"Orbit - Ryan J"}]]}],"\n",["$","h1",null,{"children":"🛰️ Orbit: The Game-Changing Kubernetes Cluster Manager for Multi-Cloud Environments"}],"\n",["$","p",null,{"children":["If you've ever found yourself drowning in a sea of Kubernetes clusters across multiple cloud providers, manually running ",["$","code",null,{"children":"aws eks update-kubeconfig"}],", ",["$","code",null,{"children":"gcloud container clusters get-credentials"}],", and ",["$","code",null,{"children":"az aks get-credentials"}]," commands, then ",["$","strong",null,{"children":"Orbit"}]," is about to change your life."]}],"\n",["$","h2",null,{"children":"The Problem We All Face"}],"\n",["$","p",null,{"children":["In today’s ",["$","strong",null,{"children":"multi-cloud world"}],", Kubernetes has become the de facto standard for container orchestration. But with that power comes complexity:"]}],"\n",["$","ul",null,{"children":["\n",["$","li",null,{"children":["Teams often juggle ",["$","strong",null,{"children":"clusters across AWS, GCP, and Azure"}],", each with its own CLI tools and authentication models."]}],"\n",["$","li",null,{"children":"Onboarding new engineers means teaching them three different ways of doing the same thing."}],"\n",["$","li",null,{"children":"Debugging production issues slows down when you can’t quickly locate or switch clusters."}],"\n",["$","li",null,{"children":["Maintaining kubeconfigs across environments is ","$Lb","."]}],"\n"]}],"\n","$Lc","\n","$Ld","\n","$Le","\n","$Lf","\n","$L10","\n","$L11","\n","$L12","\n","$L13","\n","$L14","\n","$L15","\n","$L16","\n","$L17","\n","$L18","\n","$L19","\n","$L1a","\n","$L1b","\n","$L1c","\n","$L1d","\n","$L1e","\n","$L1f","\n","$L20","\n","$L21","\n","$L22","\n","$L23","\n","$L24","\n","$L25","\n","$L26","\n","$L27","\n","$L28","\n","$L29","\n","$L2a","\n","$L2b","\n","$L2c","\n","$L2d","\n","$L2e","\n","$L2f","\n","$L30","\n","$L31","\n","$L32","\n","$L33","\n","$L34","\n","$L35","\n","$L36","\n","$L37","\n","$L38","\n","$L39","\n","$L3a","\n","$L3b","\n","$L3c","\n","$L3d","\n","$L3e","\n","$L3f","\n","$L40","\n","$L41","\n","$L42","\n","$L43","\n","$L44","\n","$L45","\n","$L46","\n","$L47","\n","$L48","\n","$L49","\n","$L4a","\n","$L4b","\n","$L4c","\n","$L4d","\n","$L4e","\n","$L4f","\n","$L50","\n","$L51","\n","$L52","\n","$L53"],null,"$L54"]}],{},null,false]},null,false]},null,false]},null,false],"$L55",false]],"m":"$undefined","G":["$56",[]],"s":false,"S":true} 57:I[4431,[],"OutletBoundary"] 59:I[5278,[],"AsyncMetadataOutlet"] 5b:I[4431,[],"ViewportBoundary"] 5d:I[4431,[],"MetadataBoundary"] 5e:"$Sreact.suspense" b:["$","strong",null,{"children":"time-consuming and error-prone"}] c:["$","p",null,{"children":"The result? Wasted engineering hours, frustrated teams, and higher operational risk."}] d:["$","h2",null,{"children":"Enter Orbit 🚀"}] e:["$","p",null,{"children":["$","img",null,{"src":"/cv/images/orbit1.png","alt":"orbit"}]}] f:["$","p",null,{"children":["Orbit is a ",["$","strong",null,{"children":"zero-configuration, multi-cloud Kubernetes cluster manager"}]," that unifies cluster access and discovery into a single streamlined experience. Instead of memorizing different cloud provider commands, you can:"]}] 10:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Automatically discover clusters"}]," across AWS EKS, Google GKE, and Azure AKS."]}],"\n",["$","li",null,{"children":["Use a ",["$","strong",null,{"children":"single interactive UI"}]," to search, filter, and connect to clusters instantly."]}],"\n",["$","li",null,{"children":"Manage credentials transparently without juggling cloud SDKs."}],"\n",["$","li",null,{"children":["Seamlessly integrate with your existing ",["$","code",null,{"children":"kubectl"}]," workflows."]}],"\n"]}] 11:["$","p",null,{"children":["With Orbit, you get the ",["$","strong",null,{"children":"best of both worlds"}],": speed and simplicity for developers, plus security and consistency for platform teams."]}] 12:["$","p",null,{"children":"Orbit eliminates the \"where’s my cluster?\" problem by giving every engineer instant visibility and access without extra setup."}] 13:["$","h2",null,{"children":"Why Orbit is Different"}] 14:["$","p",null,{"children":["Other tools provide partial solutions—wrappers around ",["$","code",null,{"children":"kubectl"}],", or dashboards tied to a single cloud provider. Orbit goes further by:"]}] 15:["$","ul",null,{"children":["\n",["$","li",null,{"children":["Supporting ",["$","strong",null,{"children":"true multi-cloud environments"}]," out of the box."]}],"\n",["$","li",null,{"children":["Offering a ",["$","strong",null,{"children":"frictionless onboarding experience"}],"—no configs, no YAMLs, no hidden dependencies."]}],"\n",["$","li",null,{"children":["Enabling ",["$","strong",null,{"children":"role-based access control (RBAC)"}]," to ensure compliance and security at scale."]}],"\n",["$","li",null,{"children":["Delivering a ",["$","strong",null,{"children":"developer-first UX"}]," that feels intuitive while still powerful under the hood."]}],"\n"]}] 16:["$","h2",null,{"children":"Real-World Use Cases 🌍"}] 17:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Enterprise DevOps Teams"}],": Centrally manage hundreds of clusters across business units without context-switching."]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Startups"}],": Scale quickly without investing weeks building internal tooling."]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Consultancies & Agencies"}],": Move between client clusters in seconds."]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Hybrid Cloud Environments"}],": Connect on-prem clusters alongside cloud-native ones for a single pane of glass."]}],"\n"]}] 18:["$","h2",null,{"children":"Technical Deep Dive 🔧"}] 19:["$","p",null,{"children":"Orbit is built on a modular architecture:"}] 1a:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Cluster Discovery Engine"}],": Detects and lists clusters across providers."]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Credential Manager"}],": Handles authentication flows automatically."]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Interactive TUI/CLI"}],": Lets developers search and connect without touching kubeconfig files directly."]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Extensibility Hooks"}],": Future-proof design for plugging in custom providers and identity platforms."]}],"\n"]}] 1b:["$","p",null,{"children":["$","img",null,{"src":"/cv/images/orbit3.png","alt":"orbit"}]}] 1c:["$","h2",null,{"children":"Key Features 🔑"}] 1d:["$","h3",null,{"children":"Terraform Style Planning"}] 1e:["$","p",null,{"children":"Orbit will generate a plan of actions to take upon updating your local kubeconfig file, it will also generate a backup of the original."}] 1f:["$","p",null,{"children":["$","img",null,{"src":"/cv/images/orbit4.png","alt":"orbit"}]}] 20:["$","h3",null,{"children":"Mock Data Mode"}] 21:["$","p",null,{"children":"Orbit has a mock provider which simulates EKS, AKS and GKE Clusters, there is also a sample kubeconfig file in the repo you can test with."}] 22:["$","p",null,{"children":["$","img",null,{"src":"/cv/images/orbit5.png","alt":"orbit"}]}] 23:["$","h3",null,{"children":"Context Switching"}] 24:["$","p",null,{"children":"You can navigate through currently added clusters and select the cluster you wish to switch context to using the 'C' binding, this is helpful quick switching without having to use kubectl, the current selected cluster is highlighted using the 🎯."}] 25:["$","h3",null,{"children":"Context Addition"}] 26:["$","p",null,{"children":"You can also add or remove a cluster depending on it's current state using the ENTER or SPACE key, upon making your selections you can exit using ESC or CTRL + C, this will then generate a plan of the changes to be made, if any cluster is removed that is set as the current context Orbit will handle it and assign a new context."}] 27:["$","h3",null,{"children":"Quick commands"}] 28:["$","p",null,{"children":"Orbit also supports some quick commands for quick actions in CLI environments or just scenarios where a UI isn't needed."}] 29:["$","pre",null,{"children":["$","code",null,{"className":"language-bash","children":"orbit # Basic usage with default settings (interactive mode)\norbit --debug # Enable debug logging\norbit -k ~/.kube/config # Use custom kubeconfig path\norbit -r # Enhanced GCP discovery (all projects)\norbit --use-resource-manager # Same as -r flag\norbit --mock # Enable mock mode for testing\norbit version # Show version information\n\n# Quick Operations (bypass interactive UI)\norbit --aws-add my-cluster # Quick add AWS EKS cluster to kubeconfig\norbit --aws-switch my-cluster # Quick switch to AWS EKS cluster context\norbit --gcp-add my-cluster # Quick add Google GKE cluster to kubeconfig\norbit --gcp-switch my-cluster # Quick switch to Google GKE cluster context\norbit --aks-add my-cluster # Quick add Azure AKS cluster to kubeconfig\norbit --aks-switch my-cluster # Quick switch to Azure AKS cluster context\n"}]}] 2a:["$","h3",null,{"children":"Visual Indicators"}] 2b:["$","p",null,{"children":"The interface uses clear visual cues:"}] 2c:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"✓"}],": Selected cluster"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"🟢"}],": Running/Active cluster"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"🟡"}],": Stopping cluster"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"🔴"}],": Stopped cluster"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"⚠️"}],": Error/unknown state"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"🔒"}],": Locked cluster (can't be deselected)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"🔓"}],": Unlocked cluster (can be deselected)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"🔵"}],": Current kubectl context"]}],"\n"]}] 2d:["$","p",null,{"children":["$","img",null,{"src":"/cv/images/orbit7.png","alt":""}]}] 2e:["$","h3",null,{"children":"Cluster Information"}] 2f:["$","p",null,{"children":"Each cluster shows:"}] 30:["$","ul",null,{"children":["\n",["$","li",null,{"children":["$","strong",null,{"children":"Name and provider"}]}],"\n",["$","li",null,{"children":["$","strong",null,{"children":"Region and version"}]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Status"}]," (running, stopped, error, etc.)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Resource ID"}]," (compact format for Azure, O will display full)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Kubeconfig status"}]," (new, existing, current context)"]}],"\n"]}] 31:["$","p",null,{"children":["$","img",null,{"src":"/cv/images/orbit6.png","alt":""}]}] 32:["$","h3",null,{"children":"Smart Kubeconfig Matching"}] 33:["$","p",null,{"children":"Orbit is smart about your existing kubeconfig:"}] 34:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Recognizes existing clusters"}]," by matching CA certificates"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Pre-selects existing clusters"}]," so you know they're already configured"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Locks existing clusters"}]," to prevent accidental removal"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Never touches external clusters"}]," (ones you didn't add via Orbit)"]}],"\n"]}] 35:["$","h3",null,{"children":"Multi-Cluster Selection"}] 36:["$","p",null,{"children":"When you select multiple clusters:"}] 37:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"All selected clusters"}]," are added to your kubeconfig"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"One cluster"}]," can be set as the current context"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Context selection prompt"}]," appears if you select multiple clusters"]}],"\n"]}] 38:["$","h3",null,{"children":"Cluster Locking"}] 39:["$","p",null,{"children":"Pre-selected clusters (existing in kubeconfig) are locked by default:"}] 3a:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Press 'U'"}]," to unlock a cluster and allow deselection"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Press 'U' again"}]," to re-lock it"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Unlocked clusters"}]," can be removed from kubeconfig if deselected"]}],"\n"]}] 3b:["$","h3",null,{"children":"Cluster Matching Strategies"}] 3c:["$","p",null,{"children":"Orbit uses different strategies to match discovered clusters with existing kubeconfig entries:"}] 3d:["$","p",null,{"children":["$","strong",null,{"children":"AWS EKS & Google GKE:"}]}] 3e:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Primary"}],": CA Certificate matching (most reliable)"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Secondary"}],": Server endpoint matching"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Fallback"}],": Context name matching"]}],"\n"]}] 3f:["$","p",null,{"children":["$","strong",null,{"children":"Azure AKS:"}]}] 40:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Primary"}],": Endpoint matching (FQDN comparison) - Very reliable due to unique Azure FQDNs"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Secondary"}],": Context name matching"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Fallback"}],": Cluster name matching"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Note"}],": CA certificate matching is not implemented for Azure due to API cost considerations"]}],"\n"]}] 41:["$","h2",null,{"children":"🪪 Credential Handling"}] 42:["$","p",null,{"children":["Orbit utilises a zero-setup approach by leveraging existing local credentials in your environment, the recommended approaches are below, Orbit does also support less secure/recommended\napproaches such as ",["$","strong",null,{"children":"'az login'"}]," for Azure, ",["$","strong",null,{"children":"'gcloud auth login'"}]," for GCP and ",["$","strong",null,{"children":"'~/.aws/credentials'"}]," local credentials for AWS too, but it will check for the more secure variations first before utilising these."]}] 43:["$","h4",null,{"children":"🟠 AWS EKS"}] 44:["$","p",null,{"children":"IAM roles or environment variables"}] 45:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"IAM roles"}]," (if running on EC2) - No credentials stored locally"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Environment variables"}]," (",["$","code",null,{"children":"AWS_ACCESS_KEY_ID"}],", ",["$","code",null,{"children":"AWS_SECRET_ACCESS_KEY"}],", etc.) - For CI/CD and automation"]}],"\n"]}] 46:["$","h4",null,{"children":"🟢 Google GKE"}] 47:["$","p",null,{"children":"Service Account with Application Default Credentials"}] 48:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Service Account Key"}]," via ",["$","code",null,{"children":"GOOGLE_APPLICATION_CREDENTIALS"}]," environment variable - Most secure for automation"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Service Account Key"}]," at ",["$","code",null,{"children":"~/.config/gcloud/service-account-key.json"}]," - Secure for local development"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Application Default Credentials"}]," at ",["$","code",null,{"children":"~/.config/gcloud/application_default_credentials.json"}]," - Good for development"]}],"\n"]}] 49:["$","h4",null,{"children":"🔵 Azure AKS"}] 4a:["$","p",null,{"children":"Managed Identity or Service Principal"}] 4b:["$","ul",null,{"children":["\n",["$","li",null,{"children":[["$","strong",null,{"children":"Managed Identity"}]," - Automatically provided when running on Azure resources (VMs, AKS nodes) - Most secure, no secrets stored"]}],"\n",["$","li",null,{"children":[["$","strong",null,{"children":"Service Principal"}]," via environment variables (",["$","code",null,{"children":"AZURE_CLIENT_ID"}],", ",["$","code",null,{"children":"AZURE_CLIENT_SECRET"}],", ",["$","code",null,{"children":"AZURE_TENANT_ID"}],") - Secure for CI/CD"]}],"\n"]}] 4c:["$","p",null,{"children":["This architecture ensures that Orbit is not just a short-term convenience tool—it’s a ",["$","strong",null,{"children":"long-term operations platform"}],"."]}] 4d:["$","h2",null,{"children":"Why Orbit?"}] 4e:["$","p",null,{"children":["Kubernetes adoption isn’t slowing down. Neither is the complexity of managing it in a ",["$","strong",null,{"children":"multi-cloud reality"}],". Orbit gives teams the superpower to cut through that complexity with a single, elegant solution."]}] 4f:["$","p",null,{"children":["Whether you’re a ",["$","strong",null,{"children":"platform engineer, SRE, or DevOps lead"}],", Orbit transforms Kubernetes from a daily headache into a seamless experience."]}] 50:["$","hr",null,{}] 51:["$","p",null,{"children":["$","strong",null,{"children":"Ready to simplify your Kubernetes journey?"}]}] 52:["$","p",null,{"children":"The full repository is linked below with more detail and instructions to get started!"}] 53:["$","p",null,{"children":["🔗 ",["$","a",null,{"href":"https://gitlab.com/RMJx1/orbit","children":"Orbit GitLab"}]]}] 54:["$","$L57",null,{"children":["$L58",["$","$L59",null,{"promise":"$@5a"}]]}] 55:["$","$1","h",{"children":[null,[["$","$L5b",null,{"children":"$L5c"}],["$","meta",null,{"name":"next-size-adjust","content":""}]],["$","$L5d",null,{"children":["$","div",null,{"hidden":true,"children":["$","$5e",null,{"fallback":null,"children":"$L5f"}]}]}]]}] 9:"$0:f:0:1:2:children:1:props:children:1:props:params" 5c:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","2",{"name":"theme-color","content":"#ffffff"}]] 58:null 60:I[622,[],"IconMark"] 5a:{"metadata":[["$","title","0",{"children":"Ryan Johnston - CV"}],["$","meta","1",{"name":"description","content":"Ryan Johnston - CV"}],["$","link","2",{"rel":"icon","href":"/cv/favicon.ico","type":"image/x-icon","sizes":"16x16"}],["$","$L60","3",{}]],"error":null,"digest":"$undefined"} 5f:"$5a:metadata"