[{"data":1,"prerenderedAt":1076},["ShallowReactive",2],{"docs-list-en":3,"docs-en-contribution":924},[4,348,568,668,714,787],{"id":5,"title":6,"body":7,"description":17,"extension":341,"meta":342,"navigation":343,"path":344,"seo":345,"stem":346,"__hash__":347},"docs_en\u002Fen\u002Fdocs\u002Fcli.md","CLI Reference",{"type":8,"value":9,"toc":330},"minimark",[10,14,18,23,128,131,138,144,217,219,223,233,238,245,273,276,292,296,299,326],[11,12,6],"h1",{"id":13},"cli-reference",[15,16,17],"p",{},"Passerelle includes a powerful CLI to manage your local daemon, interactive UI, and configurations.",[19,20,22],"h2",{"id":21},"core-commands","Core Commands",[24,25,26,39],"table",{},[27,28,29],"thead",{},[30,31,32,36],"tr",{},[33,34,35],"th",{},"Command",[33,37,38],{},"Description",[40,41,42,54,64,74,84,98,108,118],"tbody",{},[30,43,44,51],{},[45,46,47],"td",{},[48,49,50],"code",{},"passerelle setup",[45,52,53],{},"Install and start the background PM2 daemon service.",[30,55,56,61],{},[45,57,58],{},[48,59,60],{},"passerelle link",[45,62,63],{},"Output direct login URL or terminal QR Code for Handoff.",[30,65,66,71],{},[45,67,68],{},[48,69,70],{},"passerelle status",[45,72,73],{},"Display diagnostics summary and running service state.",[30,75,76,81],{},[45,77,78],{},[48,79,80],{},"passerelle ui",[45,82,83],{},"Connect directly to the live interactive terminal dashboard.",[30,85,86,91],{},[45,87,88],{},[48,89,90],{},"passerelle version",[45,92,93,94,97],{},"Show version and commit (",[48,95,96],{},"--json"," available).",[30,99,100,105],{},[45,101,102],{},[48,103,104],{},"passerelle config",[45,106,107],{},"View or update persistent local settings.",[30,109,110,115],{},[45,111,112],{},[48,113,114],{},"passerelle register",[45,116,117],{},"Re-declare daemon presence directly to the Gateway.",[30,119,120,125],{},[45,121,122],{},[48,123,124],{},"passerelle restart",[45,126,127],{},"Restart the PM2 background daemon.",[129,130],"hr",{},[19,132,134,135,137],{"id":133},"interactive-management-passerelle-ui","Interactive Management (",[48,136,80],{},")",[15,139,140,141,143],{},"Connecting to ",[48,142,80],{}," opens a live, real-time management console in your terminal. You can invoke instant actions via these keyboard shortcuts:",[145,146,147,159,168,181,190,199,208],"ul",{},[148,149,150,153,154,158],"li",{},[48,151,152],{},"[r]"," ",[155,156,157],"strong",{},"Renew PIN",": Immediately generate a new security PIN and expire existing access credentials.",[148,160,161,153,164,167],{},[48,162,163],{},"[s]",[155,165,166],{},"Copy Link",": Copy the direct web login connection URL to your clipboard.",[148,169,170,173,174,153,177,180],{},[48,171,172],{},"[c]"," \u002F ",[48,175,176],{},"[l]",[155,178,179],{},"View Status & Services",": Inspect active remote sessions and local HTTP servers.",[148,182,183,153,186,189],{},[48,184,185],{},"[h]",[155,187,188],{},"Privacy Mode",": Toggle QR Code visibility for screen sharing in public environments.",[148,191,192,153,195,198],{},[48,193,194],{},"[k]",[155,196,197],{},"Kill Sessions",": Terminate all active remote client sessions instantaneously.",[148,200,201,153,204,207],{},[48,202,203],{},"[p]",[155,205,206],{},"Re-register",": Synchronize daemon presence to the Gateway.",[148,209,210,153,213,216],{},[48,211,212],{},"[d]",[155,214,215],{},"Detach",": Detach from the interactive console while leaving the PM2 service running.",[129,218],{},[19,220,222],{"id":221},"configuration","Configuration",[15,224,225,226,229,230,232],{},"Settings are stored in ",[48,227,228],{},"~\u002F.config\u002Fpasserelle\u002Fpasserelle-config.json"," (created by ",[48,231,50],{},").",[234,235,237],"h3",{"id":236},"command-allowlist","Command Allowlist",[15,239,240,241,244],{},"By default, any authenticated web client can start services listed in your ",[48,242,243],{},"services.json",". To restrict which commands can be launched via the web API, set a strict allowlist:",[246,247,252],"pre",{"className":248,"code":249,"language":250,"meta":251,"style":251},"language-bash shiki shiki-themes github-dark","passerelle config command_allowlist \"opencode,kilo,pm2\"\n","bash","",[48,253,254],{"__ignoreMap":251},[255,256,259,263,267,270],"span",{"class":257,"line":258},"line",1,[255,260,262],{"class":261},"svObZ","passerelle",[255,264,266],{"class":265},"sU2Wk"," config",[255,268,269],{"class":265}," command_allowlist",[255,271,272],{"class":265}," \"opencode,kilo,pm2\"\n",[15,274,275],{},"To remove restrictions, clear the allowlist:",[246,277,279],{"className":248,"code":278,"language":250,"meta":251,"style":251},"passerelle config command_allowlist \"\"\n",[48,280,281],{"__ignoreMap":251},[255,282,283,285,287,289],{"class":257,"line":258},[255,284,262],{"class":261},[255,286,266],{"class":265},[255,288,269],{"class":265},[255,290,291],{"class":265}," \"\"\n",[234,293,295],{"id":294},"revoking-api-access","Revoking API Access",[15,297,298],{},"To instantly revoke all 30-day fixed API tokens (used by scripts), set the revocation timestamp to now:",[246,300,302],{"className":248,"code":301,"language":250,"meta":251,"style":251},"passerelle config api_revoked_before $(date +%s)\n",[48,303,304],{"__ignoreMap":251},[255,305,306,308,310,313,317,320,323],{"class":257,"line":258},[255,307,262],{"class":261},[255,309,266],{"class":265},[255,311,312],{"class":265}," api_revoked_before",[255,314,316],{"class":315},"s95oV"," $(",[255,318,319],{"class":261},"date",[255,321,322],{"class":265}," +%s",[255,324,325],{"class":315},")\n",[327,328,329],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}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 pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}",{"title":251,"searchDepth":331,"depth":331,"links":332},2,[333,334,336],{"id":21,"depth":331,"text":22},{"id":133,"depth":331,"text":335},"Interactive Management (passerelle ui)",{"id":221,"depth":331,"text":222,"children":337},[338,340],{"id":236,"depth":339,"text":237},3,{"id":294,"depth":339,"text":295},"md",{},true,"\u002Fen\u002Fdocs\u002Fcli",{"title":6,"description":17},"en\u002Fdocs\u002Fcli","7ECb5hyvjukjZsD85KgHqoTIw798C72wkYfN2A8pDI4",{"id":349,"title":350,"body":351,"description":358,"extension":341,"meta":563,"navigation":343,"path":564,"seo":565,"stem":566,"__hash__":567},"docs_en\u002Fen\u002Fdocs\u002Fcontribution.md","Contributing",{"type":8,"value":352,"toc":557},[353,356,359,363,366,446,450,453,514,518,547,551,554],[11,354,350],{"id":355},"contributing",[15,357,358],{},"Thank you for your interest in contributing to Passerelle! We welcome all contributions, from bug reports to new features.",[19,360,362],{"id":361},"getting-started","Getting Started",[15,364,365],{},"To set up the development environment, you will need Docker and Node.js installed.",[367,368,369,400,428],"ol",{},[148,370,371,374,375],{},[155,372,373],{},"Clone the repository",":",[246,376,378],{"className":248,"code":377,"language":250,"meta":251,"style":251},"git clone https:\u002F\u002Fgithub.com\u002Fjules-gd-dev\u002Fpasserelle.git\ncd passerelle\n",[48,379,380,391],{"__ignoreMap":251},[255,381,382,385,388],{"class":257,"line":258},[255,383,384],{"class":261},"git",[255,386,387],{"class":265}," clone",[255,389,390],{"class":265}," https:\u002F\u002Fgithub.com\u002Fjules-gd-dev\u002Fpasserelle.git\n",[255,392,393,397],{"class":257,"line":331},[255,394,396],{"class":395},"sDLfK","cd",[255,398,399],{"class":265}," passerelle\n",[148,401,402,405,406],{},[155,403,404],{},"Start the development environment",":\nPasserelle uses Docker Compose to orchestrate the Gateway API, Web Dashboard, and Cloudflare Tunnel.",[246,407,409],{"className":248,"code":408,"language":250,"meta":251,"style":251},"docker compose -f docker-compose.dev.yml up\n",[48,410,411],{"__ignoreMap":251},[255,412,413,416,419,422,425],{"class":257,"line":258},[255,414,415],{"class":261},"docker",[255,417,418],{"class":265}," compose",[255,420,421],{"class":395}," -f",[255,423,424],{"class":265}," docker-compose.dev.yml",[255,426,427],{"class":265}," up\n",[148,429,430,374,433],{},[155,431,432],{},"Install CLI dependencies",[246,434,436],{"className":248,"code":435,"language":250,"meta":251,"style":251},"npm install\n",[48,437,438],{"__ignoreMap":251},[255,439,440,443],{"class":257,"line":258},[255,441,442],{"class":261},"npm",[255,444,445],{"class":265}," install\n",[19,447,449],{"id":448},"code-quality","Code Quality",[15,451,452],{},"We enforce strict formatting and linting. Before opening a Pull Request, please ensure your code passes all checks:",[246,454,456],{"className":248,"code":455,"language":250,"meta":251,"style":251},"# Format code\nnpm run format\n\n# Run linter\nnpm run lint\n\n# Run tests\nnpm test\n",[48,457,458,464,474,479,485,495,500,506],{"__ignoreMap":251},[255,459,460],{"class":257,"line":258},[255,461,463],{"class":462},"sAwPA","# Format code\n",[255,465,466,468,471],{"class":257,"line":331},[255,467,442],{"class":261},[255,469,470],{"class":265}," run",[255,472,473],{"class":265}," format\n",[255,475,476],{"class":257,"line":339},[255,477,478],{"emptyLinePlaceholder":343},"\n",[255,480,482],{"class":257,"line":481},4,[255,483,484],{"class":462},"# Run linter\n",[255,486,488,490,492],{"class":257,"line":487},5,[255,489,442],{"class":261},[255,491,470],{"class":265},[255,493,494],{"class":265}," lint\n",[255,496,498],{"class":257,"line":497},6,[255,499,478],{"emptyLinePlaceholder":343},[255,501,503],{"class":257,"line":502},7,[255,504,505],{"class":462},"# Run tests\n",[255,507,509,511],{"class":257,"line":508},8,[255,510,442],{"class":261},[255,512,513],{"class":265}," test\n",[19,515,517],{"id":516},"submitting-changes","Submitting Changes",[367,519,520,526,537,540],{},[148,521,522,523],{},"Create a feature branch: ",[48,524,525],{},"git checkout -b feature\u002Fmy-feature",[148,527,528,529,536],{},"Commit your changes following the ",[530,531,535],"a",{"href":532,"rel":533},"https:\u002F\u002Fwww.conventionalcommits.org\u002F",[534],"nofollow","Conventional Commits"," specification.",[148,538,539],{},"Push your branch and open a Pull Request.",[148,541,542,543,546],{},"Once merged, feel free to add your name to the ",[48,544,545],{},"AUTHORS.md"," file at the root of the repository!",[19,548,550],{"id":549},"ai-agents-automation","AI Agents & Automation",[15,552,553],{},"AI-generated contributions and autonomous agent Pull Requests are explicitly welcome! As long as the code strictly respects the linting, formatting, and design guidelines of the project, we gladly accept them. We recognize that these rules and the nature of software development itself will evolve rapidly, and we are excited to adapt alongside the ecosystem.",[327,555,556],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}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 pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":251,"searchDepth":331,"depth":331,"links":558},[559,560,561,562],{"id":361,"depth":331,"text":362},{"id":448,"depth":331,"text":449},{"id":516,"depth":331,"text":517},{"id":549,"depth":331,"text":550},{},"\u002Fen\u002Fdocs\u002Fcontribution",{"title":350,"description":358},"en\u002Fdocs\u002Fcontribution","MBfTl1r3PWFWaUwp8tdBEyFLqZAizOx7lkfaiYatsGE",{"id":569,"title":570,"body":571,"description":662,"extension":341,"meta":663,"navigation":343,"path":664,"seo":665,"stem":666,"__hash__":667},"docs_en\u002Fen\u002Fdocs\u002Finstall.md","Install",{"type":8,"value":572,"toc":657},[573,576,583,587,612,619,623,635,638,642,654],[11,574,570],{"id":575},"install",[15,577,578,579,582],{},"Require: Node.js 20+. ",[48,580,581],{},"cloudflared"," downloads automatically.",[19,584,586],{"id":585},"daemon","Daemon",[246,588,590],{"className":248,"code":589,"language":250,"meta":251,"style":251},"npm install -g @julesgd\u002Fpasserelle\npasserelle setup\n",[48,591,592,605],{"__ignoreMap":251},[255,593,594,596,599,602],{"class":257,"line":258},[255,595,442],{"class":261},[255,597,598],{"class":265}," install",[255,600,601],{"class":395}," -g",[255,603,604],{"class":265}," @julesgd\u002Fpasserelle\n",[255,606,607,609],{"class":257,"line":331},[255,608,262],{"class":261},[255,610,611],{"class":265}," setup\n",[15,613,614,615,618],{},"Registers with gateway, generates identity, starts under PM2. Returns a ",[155,616,617],{},"PIN"," to validate in dashboard.",[19,620,622],{"id":621},"validation-link","Validation Link",[246,624,626],{"className":248,"code":625,"language":250,"meta":251,"style":251},"passerelle link\n",[48,627,628],{"__ignoreMap":251},[255,629,630,632],{"class":257,"line":258},[255,631,262],{"class":261},[255,633,634],{"class":265}," link\n",[15,636,637],{},"Shows one-time link to open dashboard. PIN rotates after use.",[19,639,641],{"id":640},"status","Status",[246,643,645],{"className":248,"code":644,"language":250,"meta":251,"style":251},"passerelle status\n",[48,646,647],{"__ignoreMap":251},[255,648,649,651],{"class":257,"line":258},[255,650,262],{"class":261},[255,652,653],{"class":265}," status\n",[327,655,656],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}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);}",{"title":251,"searchDepth":331,"depth":331,"links":658},[659,660,661],{"id":585,"depth":331,"text":586},{"id":621,"depth":331,"text":622},{"id":640,"depth":331,"text":641},"Require: Node.js 20+. cloudflared downloads automatically.",{},"\u002Fen\u002Fdocs\u002Finstall",{"title":570,"description":662},"en\u002Fdocs\u002Finstall","ciuy9o6Vr3krwLFpNrdVZEJ3U6gdBYGb4VM0aN4_1uI",{"id":669,"title":670,"body":671,"description":678,"extension":341,"meta":709,"navigation":343,"path":710,"seo":711,"stem":712,"__hash__":713},"docs_en\u002Fen\u002Fdocs\u002Fintroduction.md","Introduction",{"type":8,"value":672,"toc":706},[673,676,679,683],[11,674,675],{"id":262},"Passerelle",[15,677,678],{},"Passerelle exposes local services through ephemeral Cloudflare tunnels orchestrated by a self-hosted gateway.",[19,680,682],{"id":681},"architecture","Architecture",[367,684,685,694,700],{},[148,686,687,689,690,693],{},[155,688,586],{}," (",[48,691,692],{},"@julesgd\u002Fpasserelle","): Runs on target machine. Opens Cloudflare tunnel, proxies requests to local services.",[148,695,696,699],{},[155,697,698],{},"Gateway",": Self-hosted Hono server. Authenticates daemons via WebSocket, issues one-time codes, serves PWA.",[148,701,702,705],{},[155,703,704],{},"Dashboard",": PWA to link machines, manage access, validate PINs.",{"title":251,"searchDepth":331,"depth":331,"links":707},[708],{"id":681,"depth":331,"text":682},{},"\u002Fen\u002Fdocs\u002Fintroduction",{"title":670,"description":678},"en\u002Fdocs\u002Fintroduction","1h844qDgDMoCy93LEIP5n3p2mvHll33qWbqxwdjDdT4",{"id":715,"title":716,"body":717,"description":251,"extension":341,"meta":782,"navigation":343,"path":783,"seo":784,"stem":785,"__hash__":786},"docs_en\u002Fen\u002Fdocs\u002Fsecurity.md","Security Model",{"type":8,"value":718,"toc":780},[719,722],[11,720,716],{"id":721},"security-model",[145,723,724,734,740,750,756,762,768,774],{},[148,725,726,729,730,733],{},[155,727,728],{},"Authentication",": Registration via machine secret. Re-registration with same ",[48,731,732],{},"machineId"," and different secret rejected.",[148,735,736,739],{},[155,737,738],{},"Direct Access Tokens",": Short-lived handoff tokens generated via WebSocket to authorize direct browser connections without passing credentials in URLs.",[148,741,742,745,746,749],{},[155,743,744],{},"Tokens",": Session token stored in httpOnly AES-256-GCM encrypted cookie (",[48,747,748],{},"__Host-passerelle_sessions","). Never accessible to browser.",[148,751,752,755],{},[155,753,754],{},"Service Access",": Uses one-time handoff code via WebSocket. Tokens never appear in URLs.",[148,757,758,761],{},[155,759,760],{},"PINs",": Invalidated immediately after use.",[148,763,764,767],{},[155,765,766],{},"SSRF",": Proxy rejects private and link-local addresses.",[148,769,770,773],{},[155,771,772],{},"Rate Limit",": PIN validation, proxy, and public APIs limited per IP.",[148,775,776,779],{},[155,777,778],{},"Defense",": Daemon runs under PM2 (least privilege), gateway container hardened (capabilities dropped).",{"title":251,"searchDepth":331,"depth":331,"links":781},[],{},"\u002Fen\u002Fdocs\u002Fsecurity",{"title":716,"description":251},"en\u002Fdocs\u002Fsecurity","ainUOwFqBkFmzXqEytkC72hrUp7mAxgOd458IIB3OWI",{"id":788,"title":789,"body":790,"description":251,"extension":341,"meta":919,"navigation":343,"path":920,"seo":921,"stem":922,"__hash__":923},"docs_en\u002Fen\u002Fdocs\u002Fself-host.md","Self-host",{"type":8,"value":791,"toc":914},[792,795,797,803,848,857,861,883,898,902,911],[11,793,789],{"id":794},"self-host",[19,796,222],{"id":221},[15,798,799,800,232],{},"Require: Cloudflare tunnel (",[48,801,802],{},"cloudflared tunnel create",[246,804,808],{"className":805,"code":806,"language":807,"meta":251,"style":251},"language-ini shiki shiki-themes github-dark","# .env\nTUNNEL_UUID=\u003Cyour-tunnel-uuid>\nTUNNEL_CREDENTIALS_PATH=\u002Fetc\u002Fcloudflared\u002F\u003Cyour-tunnel-uuid>.json\nTUNNEL_HOSTNAME=\u003Cyour-tunnel-hostname>\nSESSION_COOKIE_KEY=\u003C32-byte-hex-key>\n","ini",[48,809,810,815,824,832,840],{"__ignoreMap":251},[255,811,812],{"class":257,"line":258},[255,813,814],{"class":462},"# .env\n",[255,816,817,821],{"class":257,"line":331},[255,818,820],{"class":819},"snl16","TUNNEL_UUID",[255,822,823],{"class":315},"=\u003Cyour-tunnel-uuid>\n",[255,825,826,829],{"class":257,"line":339},[255,827,828],{"class":819},"TUNNEL_CREDENTIALS_PATH",[255,830,831],{"class":315},"=\u002Fetc\u002Fcloudflared\u002F\u003Cyour-tunnel-uuid>.json\n",[255,833,834,837],{"class":257,"line":481},[255,835,836],{"class":819},"TUNNEL_HOSTNAME",[255,838,839],{"class":315},"=\u003Cyour-tunnel-hostname>\n",[255,841,842,845],{"class":257,"line":487},[255,843,844],{"class":819},"SESSION_COOKIE_KEY",[255,846,847],{"class":315},"=\u003C32-byte-hex-key>\n",[849,850,851],"blockquote",{},[15,852,853,854],{},"Generate key: ",[48,855,856],{},"node -e \"console.log(require('crypto').randomBytes(32).toString('hex'))\"",[19,858,860],{"id":859},"start","Start",[246,862,864],{"className":248,"code":863,"language":250,"meta":251,"style":251},"docker compose -f docker-compose.prod.yml up -d\n",[48,865,866],{"__ignoreMap":251},[255,867,868,870,872,874,877,880],{"class":257,"line":258},[255,869,415],{"class":261},[255,871,418],{"class":265},[255,873,421],{"class":395},[255,875,876],{"class":265}," docker-compose.prod.yml",[255,878,879],{"class":265}," up",[255,881,882],{"class":395}," -d\n",[15,884,885,886,889,890,893,894,897],{},"Services: ",[48,887,888],{},"app"," (API + PWA), ",[48,891,892],{},"tunnel"," (cloudflared). Volume ",[48,895,896],{},"passerelle-data"," stores identities.",[19,899,901],{"id":900},"usage","Usage",[15,903,904,905,907,908,910],{},"Provide URL to daemon during ",[48,906,50],{},", or edit with ",[48,909,104],{},".",[327,912,913],{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}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 pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":251,"searchDepth":331,"depth":331,"links":915},[916,917,918],{"id":221,"depth":331,"text":222},{"id":859,"depth":331,"text":860},{"id":900,"depth":331,"text":901},{},"\u002Fen\u002Fdocs\u002Fself-host",{"title":789,"description":251},"en\u002Fdocs\u002Fself-host","kGHLqaV58M9csB-zdouNBWGMlkuLCz7jfCh5TFBiDUo",{"id":349,"title":350,"body":925,"description":358,"extension":341,"meta":1074,"navigation":343,"path":564,"seo":1075,"stem":566,"__hash__":567},{"type":8,"value":926,"toc":1068},[927,929,931,933,935,993,995,997,1043,1045,1062,1064,1066],[11,928,350],{"id":355},[15,930,358],{},[19,932,362],{"id":361},[15,934,365],{},[367,936,937,959,979],{},[148,938,939,374,941],{},[155,940,373],{},[246,942,943],{"className":248,"code":377,"language":250,"meta":251,"style":251},[48,944,945,953],{"__ignoreMap":251},[255,946,947,949,951],{"class":257,"line":258},[255,948,384],{"class":261},[255,950,387],{"class":265},[255,952,390],{"class":265},[255,954,955,957],{"class":257,"line":331},[255,956,396],{"class":395},[255,958,399],{"class":265},[148,960,961,405,963],{},[155,962,404],{},[246,964,965],{"className":248,"code":408,"language":250,"meta":251,"style":251},[48,966,967],{"__ignoreMap":251},[255,968,969,971,973,975,977],{"class":257,"line":258},[255,970,415],{"class":261},[255,972,418],{"class":265},[255,974,421],{"class":395},[255,976,424],{"class":265},[255,978,427],{"class":265},[148,980,981,374,983],{},[155,982,432],{},[246,984,985],{"className":248,"code":435,"language":250,"meta":251,"style":251},[48,986,987],{"__ignoreMap":251},[255,988,989,991],{"class":257,"line":258},[255,990,442],{"class":261},[255,992,445],{"class":265},[19,994,449],{"id":448},[15,996,452],{},[246,998,999],{"className":248,"code":455,"language":250,"meta":251,"style":251},[48,1000,1001,1005,1013,1017,1021,1029,1033,1037],{"__ignoreMap":251},[255,1002,1003],{"class":257,"line":258},[255,1004,463],{"class":462},[255,1006,1007,1009,1011],{"class":257,"line":331},[255,1008,442],{"class":261},[255,1010,470],{"class":265},[255,1012,473],{"class":265},[255,1014,1015],{"class":257,"line":339},[255,1016,478],{"emptyLinePlaceholder":343},[255,1018,1019],{"class":257,"line":481},[255,1020,484],{"class":462},[255,1022,1023,1025,1027],{"class":257,"line":487},[255,1024,442],{"class":261},[255,1026,470],{"class":265},[255,1028,494],{"class":265},[255,1030,1031],{"class":257,"line":497},[255,1032,478],{"emptyLinePlaceholder":343},[255,1034,1035],{"class":257,"line":502},[255,1036,505],{"class":462},[255,1038,1039,1041],{"class":257,"line":508},[255,1040,442],{"class":261},[255,1042,513],{"class":265},[19,1044,517],{"id":516},[367,1046,1047,1051,1056,1058],{},[148,1048,522,1049],{},[48,1050,525],{},[148,1052,528,1053,536],{},[530,1054,535],{"href":532,"rel":1055},[534],[148,1057,539],{},[148,1059,542,1060,546],{},[48,1061,545],{},[19,1063,550],{"id":549},[15,1065,553],{},[327,1067,556],{},{"title":251,"searchDepth":331,"depth":331,"links":1069},[1070,1071,1072,1073],{"id":361,"depth":331,"text":362},{"id":448,"depth":331,"text":449},{"id":516,"depth":331,"text":517},{"id":549,"depth":331,"text":550},{},{"title":350,"description":358},1785698531672]