[{"data":1,"prerenderedAt":604},["ShallowReactive",2],{"navigation_en":3,"-docs-guides-run-dev-servers-in-parallel":153,"-docs-guides-run-dev-servers-in-parallel-surround":599},{"gettingStarted":4,"guides":41,"cli":87,"configuration":123},[5],{"title":6,"icon":7,"path":8,"stem":9,"children":10,"page":7},"Getting Started",false,"\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started",[11,16,21,26,31,36],{"title":12,"path":13,"stem":14,"icon":15},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002Fgetting-started\u002F01.introduction","i-lucide-house",{"title":17,"path":18,"stem":19,"icon":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002Fgetting-started\u002F02.installation","i-lucide-download",{"title":22,"path":23,"stem":24,"icon":25},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002Fgetting-started\u002F03.quick-start","i-lucide-zap",{"title":27,"path":28,"stem":29,"icon":30},"How It Works","\u002Fdocs\u002Fgetting-started\u002Fhow-it-works","docs\u002Fgetting-started\u002F04.how-it-works","i-lucide-workflow",{"title":32,"path":33,"stem":34,"icon":35},"Refs","\u002Fdocs\u002Fgetting-started\u002Frefs","docs\u002Fgetting-started\u002F05.refs","i-lucide-git-branch",{"title":37,"path":38,"stem":39,"icon":40},"Workspaces & Worktrees","\u002Fdocs\u002Fgetting-started\u002Fworkspaces","docs\u002Fgetting-started\u002F06.workspaces","i-lucide-folder-tree",[42],{"title":43,"icon":7,"path":44,"stem":45,"children":46,"page":7},"Guides","\u002Fdocs\u002Fguides","docs\u002Fguides",[47,52,57,62,67,72,77,82],{"title":48,"path":49,"stem":50,"icon":51},"Review a Pull Request","\u002Fdocs\u002Fguides\u002Freview-a-pull-request","docs\u002Fguides\u002F01.review-a-pull-request","i-lucide-git-pull-request",{"title":53,"path":54,"stem":55,"icon":56},"Run Dev Servers in Parallel","\u002Fdocs\u002Fguides\u002Frun-dev-servers-in-parallel","docs\u002Fguides\u002F02.run-dev-servers-in-parallel","i-lucide-plug",{"title":58,"path":59,"stem":60,"icon":61},"Seed Local Files","\u002Fdocs\u002Fguides\u002Fseed-local-files","docs\u002Fguides\u002F03.seed-local-files","i-lucide-sprout",{"title":63,"path":64,"stem":65,"icon":66},"Refresh a Workspace","\u002Fdocs\u002Fguides\u002Frefresh-a-workspace","docs\u002Fguides\u002F04.refresh-a-workspace","i-lucide-refresh-cw",{"title":68,"path":69,"stem":70,"icon":71},"Clean Up Workspaces","\u002Fdocs\u002Fguides\u002Fclean-up-workspaces","docs\u002Fguides\u002F05.clean-up-workspaces","i-lucide-trash-2",{"title":73,"path":74,"stem":75,"icon":76},"Script with uxd","\u002Fdocs\u002Fguides\u002Fscript-with-uxd","docs\u002Fguides\u002F06.script-with-uxd","i-lucide-braces",{"title":78,"path":79,"stem":80,"icon":81},"Install Shell Completions","\u002Fdocs\u002Fguides\u002Fshell-completions","docs\u002Fguides\u002F07.shell-completions","i-lucide-keyboard",{"title":83,"path":84,"stem":85,"icon":86},"Troubleshooting","\u002Fdocs\u002Fguides\u002Ftroubleshooting","docs\u002Fguides\u002F08.troubleshooting","i-lucide-stethoscope",[88],{"title":89,"icon":7,"path":90,"stem":91,"children":92,"page":7},"CLI Reference","\u002Fdocs\u002Fcli","docs\u002Fcli",[93,98,103,108,113,118],{"title":94,"path":95,"stem":96,"icon":97},"Command Grammar","\u002Fdocs\u002Fcli\u002Foverview","docs\u002Fcli\u002F01.overview","i-lucide-terminal",{"title":99,"path":100,"stem":101,"icon":102},"Workspace Verbs","\u002Fdocs\u002Fcli\u002Fworkspace-verbs","docs\u002Fcli\u002F02.workspace-verbs","i-lucide-folder-git-2",{"title":104,"path":105,"stem":106,"icon":107},"Project Verbs","\u002Fdocs\u002Fcli\u002Fproject-verbs","docs\u002Fcli\u002F03.project-verbs","i-lucide-boxes",{"title":109,"path":110,"stem":111,"icon":112},"Top-Level Verbs","\u002Fdocs\u002Fcli\u002Ftop-level-verbs","docs\u002Fcli\u002F04.top-level-verbs","i-lucide-wrench",{"title":114,"path":115,"stem":116,"icon":117},"Global Flags","\u002Fdocs\u002Fcli\u002Fglobal-flags","docs\u002Fcli\u002F05.global-flags","i-lucide-flag",{"title":119,"path":120,"stem":121,"icon":122},"Exit Codes","\u002Fdocs\u002Fcli\u002Fexit-codes","docs\u002Fcli\u002F06.exit-codes","i-lucide-circle-alert",[124],{"title":125,"icon":7,"path":126,"stem":127,"children":128,"page":7},"Configuration","\u002Fdocs\u002Fconfiguration","docs\u002Fconfiguration",[129,134,139,144,148],{"title":130,"path":131,"stem":132,"icon":133},"Overview","\u002Fdocs\u002Fconfiguration\u002Foverview","docs\u002Fconfiguration\u002F01.overview","i-lucide-settings",{"title":135,"path":136,"stem":137,"icon":138},"Project File","\u002Fdocs\u002Fconfiguration\u002Fproject-file","docs\u002Fconfiguration\u002F02.project-file","i-lucide-file-code",{"title":140,"path":141,"stem":142,"icon":143},"Commands & Hooks","\u002Fdocs\u002Fconfiguration\u002Fcommands-and-hooks","docs\u002Fconfiguration\u002F03.commands-and-hooks","i-lucide-play",{"title":145,"path":146,"stem":147,"icon":76},"Environment & Templates","\u002Fdocs\u002Fconfiguration\u002Fenvironment-and-templates","docs\u002Fconfiguration\u002F04.environment-and-templates",{"title":149,"path":150,"stem":151,"icon":152},"Editors","\u002Fdocs\u002Fconfiguration\u002Feditors","docs\u002Fconfiguration\u002F05.editors","i-lucide-app-window",{"id":154,"title":53,"body":155,"description":591,"extension":592,"links":593,"meta":594,"navigation":595,"path":54,"seo":596,"stem":55,"__hash__":598},"docs_guides\u002Fdocs\u002Fguides\u002F02.run-dev-servers-in-parallel.md",{"type":156,"value":157,"toc":583},"minimark",[158,167,172,183,251,257,300,310,314,317,375,400,413,417,423,443,450,454,478,484,488,502,510,517,536,540,543,563,573,579],[159,160,161,162,166],"p",{},"Two branches, two dev servers, one machine. ",[163,164,165],"code",{},"uxd"," allocates a port block per\nworkspace; your job is to hand those ports to your app.",[168,169,171],"h2",{"id":170},"single-port","Single port",[159,173,174,175,178,179,182],{},"Most apps need one. Interpolate ",[163,176,177],{},"{port}"," into ",[163,180,181],{},"[env]",":",[184,185,191],"pre",{"className":186,"code":187,"filename":188,"language":189,"meta":190,"style":190},"language-toml shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","[env]\nPORT = \"{port}\"\n\n[commands.dev]\nrun = \"pnpm dev\"\n","~\u002F.uxd\u002Fmy-project.toml","toml","",[163,192,193,209,219,226,242],{"__ignoreMap":190},[194,195,198,202,206],"span",{"class":196,"line":197},"line",1,[194,199,201],{"class":200},"s7iLA","[",[194,203,205],{"class":204},"szw1H","env",[194,207,208],{"class":200},"]\n",[194,210,212,215],{"class":196,"line":211},2,[194,213,214],{"class":200},"PORT = ",[194,216,218],{"class":217},"semJd","\"{port}\"\n",[194,220,222],{"class":196,"line":221},3,[194,223,225],{"emptyLinePlaceholder":224},true,"\n",[194,227,229,231,234,237,240],{"class":196,"line":228},4,[194,230,201],{"class":200},[194,232,233],{"class":204},"commands",[194,235,236],{"class":200},".",[194,238,239],{"class":204},"dev",[194,241,208],{"class":200},[194,243,245,248],{"class":196,"line":244},5,[194,246,247],{"class":200},"run = ",[194,249,250],{"class":217},"\"pnpm dev\"\n",[159,252,253,254,182],{},"Now every workspace gets its own ",[163,255,256],{},"PORT",[184,258,262],{"className":259,"code":260,"language":261,"meta":190,"style":190},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","uxd my-project feat\u002Flogin run dev    # PORT=3053\nuxd my-project feat\u002Fsearch run dev   # PORT=3011\n","bash",[163,263,264,284],{"__ignoreMap":190},[194,265,266,268,271,274,277,280],{"class":196,"line":197},[194,267,165],{"class":204},[194,269,270],{"class":217}," my-project",[194,272,273],{"class":217}," feat\u002Flogin",[194,275,276],{"class":217}," run",[194,278,279],{"class":217}," dev",[194,281,283],{"class":282},"sq92B","    # PORT=3053\n",[194,285,286,288,290,293,295,297],{"class":196,"line":211},[194,287,165],{"class":204},[194,289,270],{"class":217},[194,291,292],{"class":217}," feat\u002Fsearch",[194,294,276],{"class":217},[194,296,279],{"class":217},[194,298,299],{"class":282},"   # PORT=3011\n",[301,302,303,306,307,309],"note",{},[163,304,305],{},"$UXD_PORT"," is exported to every child process whether or not your config\nreferences it. ",[163,308,181],{}," is how you map it onto the variable name your app\nactually reads.",[168,311,313],{"id":312},"several-ports-per-workspace","Several ports per workspace",[159,315,316],{},"An app that needs a web port, an API port, and a database port asks for a\nblock:",[184,318,320],{"className":186,"code":319,"filename":188,"language":189,"meta":190,"style":190},"ports = 3\n\n[env]\nPORT = \"{port}\"\nAPI_PORT = \"{port+1}\"\nDB_PORT = \"{port+2}\"\nVITE_API_URL = \"http:\u002F\u002Flocalhost:{port+1}\"\n",[163,321,322,331,335,343,349,357,366],{"__ignoreMap":190},[194,323,324,327],{"class":196,"line":197},[194,325,326],{"class":200},"ports = ",[194,328,330],{"class":329},"ssYy9","3\n",[194,332,333],{"class":196,"line":211},[194,334,225],{"emptyLinePlaceholder":224},[194,336,337,339,341],{"class":196,"line":221},[194,338,201],{"class":200},[194,340,205],{"class":204},[194,342,208],{"class":200},[194,344,345,347],{"class":196,"line":228},[194,346,214],{"class":200},[194,348,218],{"class":217},[194,350,351,354],{"class":196,"line":244},[194,352,353],{"class":200},"API_PORT = ",[194,355,356],{"class":217},"\"{port+1}\"\n",[194,358,360,363],{"class":196,"line":359},6,[194,361,362],{"class":200},"DB_PORT = ",[194,364,365],{"class":217},"\"{port+2}\"\n",[194,367,369,372],{"class":196,"line":368},7,[194,370,371],{"class":200},"VITE_API_URL = ",[194,373,374],{"class":217},"\"http:\u002F\u002Flocalhost:{port+1}\"\n",[159,376,377,380,381,384,385,388,389,392,393,396,397,236],{},[163,378,379],{},"ports"," accepts 1–10. ",[163,382,383],{},"{port+N}"," is valid for ",[163,386,387],{},"N \u003C ports","; asking for\n",[163,390,391],{},"{port+3}"," with ",[163,394,395],{},"ports = 3"," is a config error, caught by ",[163,398,399],{},"uxd config validate",[159,401,402,403,405,406,409,410,236],{},"The same values reach child processes as ",[163,404,305],{},", ",[163,407,408],{},"$UXD_PORT_1",",\n",[163,411,412],{},"$UXD_PORT_2",[168,414,416],{"id":415},"pinning-the-window","Pinning the window",[159,418,419,420,422],{},"By default ",[163,421,165],{}," derives a per-project base port. Pin it when you want\npredictable ranges across a team, or to keep two projects out of each other's\nway:",[184,424,426],{"className":186,"code":425,"filename":188,"language":189,"meta":190,"style":190},"base_port = 5700\nports = 2\n",[163,427,428,436],{"__ignoreMap":190},[194,429,430,433],{"class":196,"line":197},[194,431,432],{"class":200},"base_port = ",[194,434,435],{"class":329},"5700\n",[194,437,438,440],{"class":196,"line":211},[194,439,326],{"class":200},[194,441,442],{"class":329},"2\n",[159,444,445,446,449],{},"Allocation starts at a deterministic candidate derived from the workspace slug\nwithin a 100-stride window above ",[163,447,448],{},"base_port",", and only scans upward if that\nblock is claimed or already listening. So a given branch keeps the same port\nacross sessions — bookmarks and OAuth callback URLs keep working.",[168,451,453],{"id":452},"overriding-for-one-run","Overriding for one run",[184,455,457],{"className":259,"code":456,"language":261,"meta":190,"style":190},"uxd my-project 42 run dev --port 6000\n",[163,458,459],{"__ignoreMap":190},[194,460,461,463,465,468,470,472,475],{"class":196,"line":197},[194,462,165],{"class":204},[194,464,270],{"class":217},[194,466,467],{"class":329}," 42",[194,469,276],{"class":217},[194,471,279],{"class":217},[194,473,474],{"class":329}," --port",[194,476,477],{"class":329}," 6000\n",[159,479,480,483],{},[163,481,482],{},"--port"," changes the environment for that invocation only. Nothing is\npersisted, and the workspace keeps its allocated block.",[168,485,487],{"id":486},"checking-what-a-workspace-holds","Checking what a workspace holds",[184,489,491],{"className":259,"code":490,"language":261,"meta":190,"style":190},"uxd my-project list\n",[163,492,493],{"__ignoreMap":190},[194,494,495,497,499],{"class":196,"line":197},[194,496,165],{"class":204},[194,498,270],{"class":217},[194,500,501],{"class":217}," list\n",[184,503,508],{"className":504,"code":506,"language":507},[505],"language-text","SLUG        KIND    BRANCH      STATUS  PORT  AGE  LAST USED\nfeat-login  branch  feat\u002Flogin  clean   3053  0m   0m\n","text",[163,509,506],{"__ignoreMap":190},[159,511,512,513,516],{},"Or for one workspace, with ",[163,514,515],{},"--json"," if you are scripting:",[184,518,520],{"className":259,"code":519,"language":261,"meta":190,"style":190},"uxd my-project feat\u002Flogin info --json\n",[163,521,522],{"__ignoreMap":190},[194,523,524,526,528,530,533],{"class":196,"line":197},[194,525,165],{"class":204},[194,527,270],{"class":217},[194,529,273],{"class":217},[194,531,532],{"class":217}," info",[194,534,535],{"class":329}," --json\n",[168,537,539],{"id":538},"seeing-the-computed-environment","Seeing the computed environment",[159,541,542],{},"Not sure what your app will receive? Ask, without running anything:",[184,544,546],{"className":259,"code":545,"language":261,"meta":190,"style":190},"uxd my-project feat\u002Flogin run dev --dry-run\n",[163,547,548],{"__ignoreMap":190},[194,549,550,552,554,556,558,560],{"class":196,"line":197},[194,551,165],{"class":204},[194,553,270],{"class":217},[194,555,273],{"class":217},[194,557,276],{"class":217},[194,559,279],{"class":217},[194,561,562],{"class":329}," --dry-run\n",[159,564,565,568,569,572],{},[163,566,567],{},"--dry-run"," prints the environment as ",[163,570,571],{},"export"," lines followed by the\nshell-quoted command:",[184,574,577],{"className":575,"code":576,"language":507},[505],"export UXD_PATH=~\u002Fdev\u002Fuxd\u002Fmy-project\u002Ftrees\u002Ffeat-login\nexport UXD_REPO_PATH=~\u002Fdev\u002Fuxd\u002Fmy-project\u002Frepo\nexport UXD_DATA_DIR=~\u002Fdev\u002Fuxd\u002Fmy-project\u002Ftrees\u002F.data\u002Ffeat-login\nexport UXD_PROJECT=my-project\nexport UXD_REF=feat\u002Flogin\nexport UXD_BRANCH=feat\u002Flogin\nexport UXD_SLUG=feat-login\nexport UXD_PORT=3053\nexport PORT=3053\nbash -c 'pnpm dev \"$@\"' uxd\n",[163,578,576],{"__ignoreMap":190},[580,581,582],"style",{},"html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}",{"title":190,"searchDepth":211,"depth":211,"links":584},[585,586,587,588,589,590],{"id":170,"depth":211,"text":171},{"id":312,"depth":211,"text":313},{"id":415,"depth":211,"text":416},{"id":452,"depth":211,"text":453},{"id":486,"depth":211,"text":487},{"id":538,"depth":211,"text":539},"Configure ports so several workspaces can run at the same time without colliding.","md",null,{},{"icon":56},{"title":53,"description":597},"Configure uxd's port allocation so multiple workspaces run dev servers simultaneously — single ports, multi-port blocks, and per-run overrides.","NSYhHBWkKP3YHFc9APJiVJtb6S-y_Iind6qera6Sut0",[600,602],{"title":48,"path":49,"stem":50,"description":601,"icon":51,"children":-1},"Take a PR from a link to a running app you can click through, then dispose of it when it merges.",{"title":58,"path":59,"stem":60,"description":603,"icon":61,"children":-1},"Get .env.local and other untracked files into every new workspace automatically.",1784975262002]