[{"data":1,"prerenderedAt":1109},["ShallowReactive",2],{"navigation_docs":3,"-docs-managing-zeeq-local-development":208,"-docs-managing-zeeq-local-development-surround":1104},[4,40,73,112,136,151],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[10,15,20,25,30,35],{"title":11,"path":12,"stem":13,"icon":14},"Key Features","\u002Fdocs\u002Fgetting-started\u002Fkey-features","docs\u002F1.getting-started\u002F1.key-features","i-lucide-blocks",{"title":16,"path":17,"stem":18,"icon":19},"Why Zeeq?","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F2.introduction","i-lucide-house",{"title":21,"path":22,"stem":23,"icon":24},"Org Onboarding","\u002Fdocs\u002Fgetting-started\u002Forg-onboarding","docs\u002F1.getting-started\u002F3.org-onboarding","i-lucide-rocket",{"title":26,"path":27,"stem":28,"icon":29},"Connecting Agents","\u002Fdocs\u002Fgetting-started\u002Fconnecting-agents","docs\u002F1.getting-started\u002F4.connecting-agents","i-lucide-plug",{"title":31,"path":32,"stem":33,"icon":34},"Harness Tuning","\u002Fdocs\u002Fgetting-started\u002Fharness-tuning","docs\u002F1.getting-started\u002F5.harness-tuning","i-lucide-wrench",{"title":36,"path":37,"stem":38,"icon":39},"FAQ","\u002Fdocs\u002Fgetting-started\u002Ffaq","docs\u002F1.getting-started\u002F6.faq","i-lucide-circle-question-mark",{"title":41,"icon":6,"path":42,"stem":43,"children":44,"page":6},"Feature Overview","\u002Fdocs\u002Fkey-features","docs\u002F2.key-features",[45,49,53,57,61,65,69],{"title":46,"path":47,"stem":48,"icon":14},"Knowledge Libraries","\u002Fdocs\u002Fkey-features\u002Fknowledge-libraries","docs\u002F2.key-features\u002F1.knowledge-libraries",{"title":50,"path":51,"stem":52,"icon":14},"Code Reviews","\u002Fdocs\u002Fkey-features\u002Fcode-reviews","docs\u002F2.key-features\u002F2.code-reviews",{"title":54,"path":55,"stem":56,"icon":14},"Code Review as Agent Tool","\u002Fdocs\u002Fkey-features\u002Fcode-review-tool","docs\u002F2.key-features\u002F3.code-review-tool",{"title":58,"path":59,"stem":60,"icon":14},"Zeeq Tools Telemetry","\u002Fdocs\u002Fkey-features\u002Ftool-and-docs-telemetry","docs\u002F2.key-features\u002F4.tool-and-docs-telemetry",{"title":62,"path":63,"stem":64,"icon":14},"Session Telemetry","\u002Fdocs\u002Fkey-features\u002Fsession-telemetry","docs\u002F2.key-features\u002F5.session-telemetry",{"title":66,"path":67,"stem":68,"icon":14},"Dynamic Skills","\u002Fdocs\u002Fkey-features\u002Fdynamic-skills","docs\u002F2.key-features\u002F6.dynamic-skills",{"title":70,"path":71,"stem":72,"icon":14},"World Model (2026 Q3)","\u002Fdocs\u002Fkey-features\u002Fworld-model","docs\u002F2.key-features\u002F7.world-model",{"title":74,"path":75,"stem":76,"children":77,"page":6},"Managing Zeeq","\u002Fdocs\u002Fmanaging-zeeq","docs\u002F3.managing-zeeq",[78,83,88,93,97,102,107],{"title":79,"path":80,"stem":81,"icon":82},"Local Development","\u002Fdocs\u002Fmanaging-zeeq\u002Flocal-development","docs\u002F3.managing-zeeq\u002F0.local-development","i-lucide-square-terminal",{"title":84,"path":85,"stem":86,"icon":87},"GitHub Configuration","\u002Fdocs\u002Fmanaging-zeeq\u002Fgithub-configuration","docs\u002F3.managing-zeeq\u002F1.github-configuration","i-lucide-github",{"title":89,"path":90,"stem":91,"icon":92},"Organizations and Membership","\u002Fdocs\u002Fmanaging-zeeq\u002Forgs-membership-invitations","docs\u002F3.managing-zeeq\u002F2.orgs-membership-invitations","i-hugeicons-cube",{"title":46,"path":94,"stem":95,"icon":96},"\u002Fdocs\u002Fmanaging-zeeq\u002Fdocument-libraries","docs\u002F3.managing-zeeq\u002F3.document-libraries","i-lucide-library-big",{"title":98,"path":99,"stem":100,"icon":101},"LLM Settings Configuration","\u002Fdocs\u002Fmanaging-zeeq\u002Fllm-settings-configuration","docs\u002F3.managing-zeeq\u002F4.llm-settings-configuration","i-hugeicons-ai-magic",{"title":103,"path":104,"stem":105,"icon":106},"Agent Code Review","\u002Fdocs\u002Fmanaging-zeeq\u002Fagent-code-reviews","docs\u002F3.managing-zeeq\u002F5.agent-code-reviews","i-hugeicons-chat-spark-01",{"title":108,"path":109,"stem":110,"icon":111},"Credentials & API Tokens","\u002Fdocs\u002Fmanaging-zeeq\u002Fcredentials","docs\u002F3.managing-zeeq\u002F6.credentials","i-hugeicons-key-01",{"title":113,"path":114,"stem":115,"children":116,"page":6},"Runtime Configuration","\u002Fdocs\u002Fconfiguration","docs\u002F5.configuration",[117,122,126,131],{"title":118,"path":119,"stem":120,"icon":121},"Google Cloud Configuration","\u002Fdocs\u002Fconfiguration\u002Fgcp-runtime","docs\u002F5.configuration\u002F1.gcp-runtime","i-hugeicons-google",{"title":84,"path":123,"stem":124,"icon":125},"\u002Fdocs\u002Fconfiguration\u002Fgithub-configuration","docs\u002F5.configuration\u002F2.github-configuration","i-hugeicons-github",{"title":127,"path":128,"stem":129,"icon":130},"Local OpenIddict Certificates","\u002Fdocs\u002Fconfiguration\u002Flocal-openiddict-certificates","docs\u002F5.configuration\u002F3.local-openiddict-certificates","i-lucide-file-lock",{"title":132,"path":133,"stem":134,"icon":135},"System Admin Access","\u002Fdocs\u002Fconfiguration\u002Fsystem-admin-access","docs\u002F5.configuration\u002F4.system-admin-access","i-hugeicons-shield-01",{"title":137,"path":138,"stem":139,"children":140,"page":6},"Metrics","\u002Fdocs\u002Fmetrics","docs\u002F6.metrics",[141,146],{"title":142,"path":143,"stem":144,"icon":145},"Metrics Dashboard","\u002Fdocs\u002Fmetrics\u002Fmetrics-dashboard","docs\u002F6.metrics\u002F1.metrics-dashboard","i-hugeicons-analytics-01",{"title":147,"path":148,"stem":149,"icon":150},"Metrics Pipeline","\u002Fdocs\u002Fmetrics\u002Fmetrics-pipeline","docs\u002F6.metrics\u002F2.metrics-pipeline","i-hugeicons-database-02",{"title":152,"path":153,"stem":154,"children":155,"page":6},"Design and Architecture","\u002Fdocs\u002Farchitecture","docs\u002F9.architecture",[156,161,166,171,176,180,184,189,194,199,204],{"title":157,"path":158,"stem":159,"icon":160},"Key Architecture Principles","\u002Fdocs\u002Farchitecture\u002Fkey-principles","docs\u002F9.architecture\u002F0.key-principles","i-lucide-pencil-ruler",{"title":162,"path":163,"stem":164,"icon":165},"MCP Tools Inventory","\u002Fdocs\u002Farchitecture\u002Ftools-inventory","docs\u002F9.architecture\u002F1.tools-inventory","i-lucide-hammer",{"title":167,"path":168,"stem":169,"icon":170},"Caching","\u002Fdocs\u002Farchitecture\u002Fcaching","docs\u002F9.architecture\u002F2.caching","i-lucide-database",{"title":172,"path":173,"stem":174,"icon":175},"Messaging and Queueing","\u002Fdocs\u002Farchitecture\u002Fmessaging-and-queueing","docs\u002F9.architecture\u002F3.messaging-and-queueing","i-lucide-message-square",{"title":177,"path":178,"stem":179,"icon":87},"GitHub Comment Rendering","\u002Fdocs\u002Farchitecture\u002Fgithub-comment-rendering","docs\u002F9.architecture\u002F4.github-comment-rendering",{"title":181,"path":182,"stem":183,"icon":87},"GitHub Integration","\u002Fdocs\u002Farchitecture\u002Fgithub-integration","docs\u002F9.architecture\u002F5.github-integration",{"title":185,"path":186,"stem":187,"icon":188},"LLM Settings and Secret Storage","\u002Fdocs\u002Farchitecture\u002Fllm-settings-and-secret-storage","docs\u002F9.architecture\u002F6.llm-settings-and-secret-storage","i-lucide-key",{"title":190,"path":191,"stem":192,"icon":193},"Organization Activation and Routes","\u002Fdocs\u002Farchitecture\u002Forganization-activation-and-routes","docs\u002F9.architecture\u002F7.organization-activation-and-routes","i-lucide-door-open",{"title":195,"path":196,"stem":197,"icon":198},"MCP Uploaded-Diff Code Reviews","\u002Fdocs\u002Farchitecture\u002Fmcp-uploaded-diff-code-reviews","docs\u002F9.architecture\u002F8.mcp-uploaded-diff-code-reviews","i-lucide-file-search",{"title":200,"path":201,"stem":202,"icon":203},"Repository Content Ingest","\u002Fdocs\u002Farchitecture\u002Frepository-content-ingest","docs\u002F9.architecture\u002F9.repository-content-ingest","i-lucide-file-stack",{"title":205,"path":206,"stem":207},"Telemetry Ingest (2026 Q3)","\u002Fdocs\u002Farchitecture\u002Ftelemetry-ingest","docs\u002F9.architecture\u002F9.telemetry-ingest",{"id":209,"title":79,"body":210,"description":1097,"extension":1098,"links":1099,"meta":1100,"navigation":1101,"path":80,"seo":1102,"stem":81,"__hash__":1103},"docs\u002Fdocs\u002F3.managing-zeeq\u002F0.local-development.md",{"type":211,"value":212,"toc":1085},"minimark",[213,218,222,226,230,298,302,354,361,368,400,407,411,414,423,781,785,794,800,856,864,871,875,878,935,938,947,951,962,966,1006,1010,1013,1016,1039,1046,1051,1054,1081],[214,215,217],"h2",{"id":216},"summary","Summary",[219,220,221],"p",{},"This document describes how to get set up for local development or test driving on a local instance of Zeeq.",[223,224,225],"note",{},"The primary development target is an Apple Silicon MacBook Pro.  Adjust as necessary for your platform.",[214,227,229],{"id":228},"key-technologies","Key technologies",[231,232,233,246],"table",{},[234,235,236],"thead",{},[237,238,239,243],"tr",{},[240,241,242],"th",{},"Component",[240,244,245],{},"Technology",[247,248,249,258,266,290],"tbody",{},[237,250,251,255],{},[252,253,254],"td",{},"Frontend",[252,256,257],{},"Vue 3, Nuxt UI (Tailwind CSS), Pinia, Vite",[237,259,260,263],{},[252,261,262],{},"Backend",[252,264,265],{},"C#\u002F.NET 10, ASP.NET Core Minimal APIs, OpenIddict, EF Core + Npgsql, Testcontainers, TUnit",[237,267,268,271],{},[252,269,270],{},"Database",[252,272,273,274,278,279,278,282,285,286,289],{},"PostgreSQL 18, ",[275,276,277],"code",{},"pg_vector",", ",[275,280,281],{},"pg_cron",[275,283,284],{},"pg_partman"," (container is defined in ",[275,287,288],{},"build\u002Fpostgres\u002FDockerfile",")",[237,291,292,295],{},[252,293,294],{},"Messaging",[252,296,297],{},"Postgres, Google Cloud Pub\u002FSub",[214,299,301],{"id":300},"baseline-setup","Baseline setup",[231,303,304,317],{},[234,305,306],{},[237,307,308,311,314],{},[240,309,310],{},"Tooling",[240,312,313],{},"Description",[240,315,316],{},"Install from...",[247,318,319,340],{},[237,320,321,324,327],{},[252,322,323],{},"Mise",[252,325,326],{},"Manages local environment variables and tooling",[252,328,329,332,333],{},[275,330,331],{},"brew install mise"," See ",[334,335,339],"a",{"href":336,"rel":337},"https:\u002F\u002Fmise.jdx.dev\u002Finstalling-mise.html",[338],"nofollow","Installing mise",[237,341,342,345,348],{},[252,343,344],{},"Docker",[252,346,347],{},"Containerization and orchestration",[252,349,350],{},[334,351,344],{"href":352,"rel":353},"https:\u002F\u002Fwww.docker.com\u002Fget-started",[338],[223,355,356,357,360],{},"Install and configure ",[275,358,359],{},"mise"," first; that should install the other dependencies.",[219,362,363,364,367],{},"Once ",[275,365,366],{},"dotnet"," CLI is available, restore the tools:",[369,370,376],"pre",{"className":371,"code":372,"filename":373,"language":374,"meta":375,"style":375},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Restore all tools\ndotnet tool restore\n","Terminal","bash","",[275,377,378,387],{"__ignoreMap":375},[379,380,383],"span",{"class":381,"line":382},"line",1,[379,384,386],{"class":385},"sHwdD","# Restore all tools\n",[379,388,390,393,397],{"class":381,"line":389},2,[379,391,366],{"class":392},"sBMFI",[379,394,396],{"class":395},"sfazB"," tool",[379,398,399],{"class":395}," restore\n",[223,401,402,403],{},"If needed, install from here: ",[334,404,405],{"href":405,"rel":406},"https:\u002F\u002Fdotnet.microsoft.com\u002Fen-us\u002Fdownload",[338],[214,408,410],{"id":409},"setting-local-secrets","Setting local secrets",[219,412,413],{},"The runtime requires several local secrets to execute.",[219,415,416,417,422],{},"These are managed using ",[334,418,421],{"href":419,"rel":420},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Faspnet\u002Fcore\u002Fsecurity\u002Fapp-secrets?view=aspnetcore-10.0",[338],".NET local user secrets",".",[369,424,426],{"className":371,"code":425,"filename":373,"language":374,"meta":375,"style":375},"cd src\u002Fbackend\u002FZeeq.Runtime.Server\n\n# Non-secret settings are in  appsettings.Development.json\n\n# Initialize the secrets store\ndotnet user-secrets init\n\n# Add secrets to the store (see: src\u002Fbackend\u002FZeeq.Runtime.Server\u002Fappsettings.Development.json)\n\n# (✅  REQUIRED: Needed to generate embeddings for the search)\n# The API key to use for generating embeddings (always needed since there is no UI for this)\ndotnet user-secrets set AppSettings:Llm:Embeddings:ApiKey secret-value\n\n# (☑️  OPTIONAL: Required or use in-app managed keys; code reviews will not work without this)\n# The API key to use with the default \"fast\" LLM tier model.\n# Not needed if using in-app configured self-managed services.\ndotnet user-secrets set AppSettings:Llm:Models:Fast:ApiKey secret-value\n\n# (☑️  OPTIONAL: Only needed for testing signed imports)\n# The signing key used for importable Zeeq library export packages\ndotnet user-secrets set AppSettings:Documents:LibraryExportSigningKey \"$(openssl rand -base64 48 | tr -d '\\n')\"\n\n# (☑️  OPTIONAL: Only needed for GH integration testing locally)\n# The DEV GitHub app webhook secret (other configuration directly in file)\n# This is needed to test GitHub webhook flows locally since the GH app only has one webhook URL\n# Alternate: configure custom webhooks: https:\u002F\u002Fgithub.com\u002Fzeeq-ai\u002Fzeeq-app\u002Fsettings\u002Fhooks\ndotnet user-secrets set AppSettings:GitHub:WebhookSecret secret-value\n\n# (☑️  OPTIONAL: Only needed for GH integration testing locally)\n# The DEV GitHub app private key PEM for local testing\ndotnet user-secrets set AppSettings:GitHub:PrivateKeyPem secret-value\n\n# (☑️  OPTIONAL: Use the mock OAuth provider without need to hook up Google or GH OAuth)\n# The client secrets for OAuth providers (e.g. GitHub, Google, etc.) used for user login\n# Order matches appsettings.Development.json\ndotnet user-secrets set AppSettings:Auth:Providers:0:ClientSecret secret-value # Google\ndotnet user-secrets set AppSettings:Auth:Providers:1:ClientSecret secret-value # GitHub\n\n# (☑️  OPTIONAL: Use only for access to the system platform management panel)\n# The account identifiers prefixed with the provider that designate system level admins\n# The user will need to have an account first locally (or you already know the subject ID)\ndotnet user-secrets set AppSettings:Platform:SystemAdminSubjects:0 secret-value\n\n",[275,427,428,437,443,449,454,460,471,476,482,487,493,499,515,520,526,532,538,552,557,563,569,613,618,624,630,636,642,656,661,666,672,686,691,697,703,709,727,744,749,755,761,767],{"__ignoreMap":375},[379,429,430,434],{"class":381,"line":382},[379,431,433],{"class":432},"s2Zo4","cd",[379,435,436],{"class":395}," src\u002Fbackend\u002FZeeq.Runtime.Server\n",[379,438,439],{"class":381,"line":389},[379,440,442],{"emptyLinePlaceholder":441},true,"\n",[379,444,446],{"class":381,"line":445},3,[379,447,448],{"class":385},"# Non-secret settings are in  appsettings.Development.json\n",[379,450,452],{"class":381,"line":451},4,[379,453,442],{"emptyLinePlaceholder":441},[379,455,457],{"class":381,"line":456},5,[379,458,459],{"class":385},"# Initialize the secrets store\n",[379,461,463,465,468],{"class":381,"line":462},6,[379,464,366],{"class":392},[379,466,467],{"class":395}," user-secrets",[379,469,470],{"class":395}," init\n",[379,472,474],{"class":381,"line":473},7,[379,475,442],{"emptyLinePlaceholder":441},[379,477,479],{"class":381,"line":478},8,[379,480,481],{"class":385},"# Add secrets to the store (see: src\u002Fbackend\u002FZeeq.Runtime.Server\u002Fappsettings.Development.json)\n",[379,483,485],{"class":381,"line":484},9,[379,486,442],{"emptyLinePlaceholder":441},[379,488,490],{"class":381,"line":489},10,[379,491,492],{"class":385},"# (✅  REQUIRED: Needed to generate embeddings for the search)\n",[379,494,496],{"class":381,"line":495},11,[379,497,498],{"class":385},"# The API key to use for generating embeddings (always needed since there is no UI for this)\n",[379,500,502,504,506,509,512],{"class":381,"line":501},12,[379,503,366],{"class":392},[379,505,467],{"class":395},[379,507,508],{"class":395}," set",[379,510,511],{"class":395}," AppSettings:Llm:Embeddings:ApiKey",[379,513,514],{"class":395}," secret-value\n",[379,516,518],{"class":381,"line":517},13,[379,519,442],{"emptyLinePlaceholder":441},[379,521,523],{"class":381,"line":522},14,[379,524,525],{"class":385},"# (☑️  OPTIONAL: Required or use in-app managed keys; code reviews will not work without this)\n",[379,527,529],{"class":381,"line":528},15,[379,530,531],{"class":385},"# The API key to use with the default \"fast\" LLM tier model.\n",[379,533,535],{"class":381,"line":534},16,[379,536,537],{"class":385},"# Not needed if using in-app configured self-managed services.\n",[379,539,541,543,545,547,550],{"class":381,"line":540},17,[379,542,366],{"class":392},[379,544,467],{"class":395},[379,546,508],{"class":395},[379,548,549],{"class":395}," AppSettings:Llm:Models:Fast:ApiKey",[379,551,514],{"class":395},[379,553,555],{"class":381,"line":554},18,[379,556,442],{"emptyLinePlaceholder":441},[379,558,560],{"class":381,"line":559},19,[379,561,562],{"class":385},"# (☑️  OPTIONAL: Only needed for testing signed imports)\n",[379,564,566],{"class":381,"line":565},20,[379,567,568],{"class":385},"# The signing key used for importable Zeeq library export packages\n",[379,570,572,574,576,578,581,585,588,591,595,598,601,604,607,610],{"class":381,"line":571},21,[379,573,366],{"class":392},[379,575,467],{"class":395},[379,577,508],{"class":395},[379,579,580],{"class":395}," AppSettings:Documents:LibraryExportSigningKey",[379,582,584],{"class":583},"sMK4o"," \"$(",[379,586,587],{"class":392},"openssl",[379,589,590],{"class":395}," rand -base64 ",[379,592,594],{"class":593},"sbssI","48",[379,596,597],{"class":583}," |",[379,599,600],{"class":392}," tr",[379,602,603],{"class":395}," -d ",[379,605,606],{"class":583},"'",[379,608,609],{"class":395},"\\n",[379,611,612],{"class":583},"')\"\n",[379,614,616],{"class":381,"line":615},22,[379,617,442],{"emptyLinePlaceholder":441},[379,619,621],{"class":381,"line":620},23,[379,622,623],{"class":385},"# (☑️  OPTIONAL: Only needed for GH integration testing locally)\n",[379,625,627],{"class":381,"line":626},24,[379,628,629],{"class":385},"# The DEV GitHub app webhook secret (other configuration directly in file)\n",[379,631,633],{"class":381,"line":632},25,[379,634,635],{"class":385},"# This is needed to test GitHub webhook flows locally since the GH app only has one webhook URL\n",[379,637,639],{"class":381,"line":638},26,[379,640,641],{"class":385},"# Alternate: configure custom webhooks: https:\u002F\u002Fgithub.com\u002Fzeeq-ai\u002Fzeeq-app\u002Fsettings\u002Fhooks\n",[379,643,645,647,649,651,654],{"class":381,"line":644},27,[379,646,366],{"class":392},[379,648,467],{"class":395},[379,650,508],{"class":395},[379,652,653],{"class":395}," AppSettings:GitHub:WebhookSecret",[379,655,514],{"class":395},[379,657,659],{"class":381,"line":658},28,[379,660,442],{"emptyLinePlaceholder":441},[379,662,664],{"class":381,"line":663},29,[379,665,623],{"class":385},[379,667,669],{"class":381,"line":668},30,[379,670,671],{"class":385},"# The DEV GitHub app private key PEM for local testing\n",[379,673,675,677,679,681,684],{"class":381,"line":674},31,[379,676,366],{"class":392},[379,678,467],{"class":395},[379,680,508],{"class":395},[379,682,683],{"class":395}," AppSettings:GitHub:PrivateKeyPem",[379,685,514],{"class":395},[379,687,689],{"class":381,"line":688},32,[379,690,442],{"emptyLinePlaceholder":441},[379,692,694],{"class":381,"line":693},33,[379,695,696],{"class":385},"# (☑️  OPTIONAL: Use the mock OAuth provider without need to hook up Google or GH OAuth)\n",[379,698,700],{"class":381,"line":699},34,[379,701,702],{"class":385},"# The client secrets for OAuth providers (e.g. GitHub, Google, etc.) used for user login\n",[379,704,706],{"class":381,"line":705},35,[379,707,708],{"class":385},"# Order matches appsettings.Development.json\n",[379,710,712,714,716,718,721,724],{"class":381,"line":711},36,[379,713,366],{"class":392},[379,715,467],{"class":395},[379,717,508],{"class":395},[379,719,720],{"class":395}," AppSettings:Auth:Providers:0:ClientSecret",[379,722,723],{"class":395}," secret-value",[379,725,726],{"class":385}," # Google\n",[379,728,730,732,734,736,739,741],{"class":381,"line":729},37,[379,731,366],{"class":392},[379,733,467],{"class":395},[379,735,508],{"class":395},[379,737,738],{"class":395}," AppSettings:Auth:Providers:1:ClientSecret",[379,740,723],{"class":395},[379,742,743],{"class":385}," # GitHub\n",[379,745,747],{"class":381,"line":746},38,[379,748,442],{"emptyLinePlaceholder":441},[379,750,752],{"class":381,"line":751},39,[379,753,754],{"class":385},"# (☑️  OPTIONAL: Use only for access to the system platform management panel)\n",[379,756,758],{"class":381,"line":757},40,[379,759,760],{"class":385},"# The account identifiers prefixed with the provider that designate system level admins\n",[379,762,764],{"class":381,"line":763},41,[379,765,766],{"class":385},"# The user will need to have an account first locally (or you already know the subject ID)\n",[379,768,770,772,774,776,779],{"class":381,"line":769},42,[379,771,366],{"class":392},[379,773,467],{"class":395},[379,775,508],{"class":395},[379,777,778],{"class":395}," AppSettings:Platform:SystemAdminSubjects:0",[379,780,514],{"class":395},[214,782,784],{"id":783},"starting-the-runtime","Starting the runtime",[219,786,787,788,793],{},"Zeeq runs using ",[334,789,792],{"href":790,"rel":791},"https:\u002F\u002Faspire.dev\u002F",[338],"Aspire"," as the orchestration layer which launches all processes and containers.",[219,795,796,797,799],{},"Assuming you have ",[275,798,359],{}," set up properly, switching into the source directory:",[369,801,803],{"className":371,"code":802,"filename":373,"language":374,"meta":375,"style":375},"# Smoke test\ndotnet --version\n\n# Start aspire which will start the stack\naspire run --detach --non-interactive\n\n# To stop the stack since it is detached in the background\naspire stop\n",[275,804,805,810,817,821,826,840,844,849],{"__ignoreMap":375},[379,806,807],{"class":381,"line":382},[379,808,809],{"class":385},"# Smoke test\n",[379,811,812,814],{"class":381,"line":389},[379,813,366],{"class":392},[379,815,816],{"class":395}," --version\n",[379,818,819],{"class":381,"line":445},[379,820,442],{"emptyLinePlaceholder":441},[379,822,823],{"class":381,"line":451},[379,824,825],{"class":385},"# Start aspire which will start the stack\n",[379,827,828,831,834,837],{"class":381,"line":456},[379,829,830],{"class":392},"aspire",[379,832,833],{"class":395}," run",[379,835,836],{"class":395}," --detach",[379,838,839],{"class":395}," --non-interactive\n",[379,841,842],{"class":381,"line":462},[379,843,442],{"emptyLinePlaceholder":441},[379,845,846],{"class":381,"line":473},[379,847,848],{"class":385},"# To stop the stack since it is detached in the background\n",[379,850,851,853],{"class":381,"line":478},[379,852,830],{"class":392},[379,854,855],{"class":395}," stop\n",[219,857,858,859,863],{},"The Aspire stack is now at ",[334,860,861],{"href":861,"rel":862},"http:\u002F\u002Flocalhost:15010",[338],":",[219,865,866],{},[867,868],"img",{"alt":869,"src":870},"aspire-dashboard","\u002Fscreens\u002Faspire-dashboard.png",[872,873,874],"warning",{},"The Aspire stack keeps Postgres and Pub\u002FSub containers as persistent lifetime so they remain running in the background.  This is by design to allow faster restarts without restarting these two containers.",[219,876,877],{},"The application uses YARP to run on the following endpoints:",[231,879,880,889],{},[234,881,882],{},[237,883,884,887],{},[240,885,886],{},"Endpoint",[240,888,313],{},[247,890,891,902,913,924],{},[237,892,893,899],{},[252,894,895],{},[334,896,897],{"href":897,"rel":898},"http:\u002F\u002Fzeeq-web.localhost:8095",[338],[252,900,901],{},"The main application entrypoint",[237,903,904,910],{},[252,905,906],{},[334,907,908],{"href":908,"rel":909},"http:\u002F\u002Fzeeq-docs.localhost:8095\u002Fdocs",[338],[252,911,912],{},"The local docs app backed by the docs-root Aspire parameter",[237,914,915,921],{},[252,916,917],{},[334,918,919],{"href":919,"rel":920},"http:\u002F\u002Fzeeq-api.localhost:8095\u002Fscalar",[338],[252,922,923],{},"The local Scalar UI for the API",[237,925,926,932],{},[252,927,928],{},[334,929,930],{"href":930,"rel":931},"http:\u002F\u002Fzeeq-inspector.localhost:8095",[338],[252,933,934],{},"The local MCP inspector UI for the API",[223,936,937],{},"You may need to edit your hosts file.",[369,939,945],{"className":940,"code":942,"filename":943,"language":944,"meta":375},[941],"language-text","127.0.0.1       zeeq-web.localhost\n127.0.0.1       zeeq-api.localhost\n127.0.0.1       zeeq-docs.localhost\n127.0.0.1       zeeq-inspector.localhost\n","\u002Fetc\u002Fhosts","text",[275,946,942],{"__ignoreMap":375},[214,948,950],{"id":949},"connecting","Connecting",[219,952,953,954,957,958,961],{},"Follow the guide in ",[955,956,26],"strong",{}," but use the endpoint: ",[275,959,960],{},"http:\u002F\u002Fzeeq-web.localhost:8095\u002Fmcp"," as the target.",[214,963,965],{"id":964},"common-problems","Common problems",[967,968,969,975,991,999],"accordion",{},[970,971,974],"accordion-item",{"icon":972,"label":973},"i-lucide-circle-help","Why does the initial startup take a long time?","The initial startup requires several containers for Postgres, the OpenTelemetry collector, the Pub\u002FSub emulator; this may take some time to pull in.",[970,976,978,979,982,983,986,987,990],{"icon":972,"label":977},"The zeeq-server resource didn't start","The most likely issue is that it is waiting on the Pub\u002FSub container (",[275,980,981],{},"gcp-pubsub-emulator",") to be ready.  This container may take a bit of time to download.  You may occasionally need to run ",[275,984,985],{},"aspire stop"," and ",[275,988,989],{},"aspire run --detach --non-interactive"," again to reconnect to the container.",[970,992,994,995,998],{"icon":972,"label":993},"I can't get the inbound webhooks to work","The inbound webhooks require that you set up an externally facing proxy using either the built-in ",[275,996,997],{},"devtunnel","s integration with Aspire or using ngrok yourself.",[970,1000,1002,1003,1005],{"icon":972,"label":1001},"The tunnel fails after a period of time","The authentication token for the ",[275,1004,997],{}," has a relatively short lifetime so you are likely going to need to reauthenticate once a day.",[214,1007,1009],{"id":1008},"normal-development-workflow","Normal development workflow",[219,1011,1012],{},"During normal development, you should not need to manually stop and start the Aspire stack.",[219,1014,1015],{},"On rebuilds:",[369,1017,1019],{"className":371,"code":1018,"filename":373,"language":374,"meta":375,"style":375},"# Rebuild and restart the resource.\naspire resource zeeq-server --rebuild\n",[275,1020,1021,1026],{"__ignoreMap":375},[379,1022,1023],{"class":381,"line":382},[379,1024,1025],{"class":385},"# Rebuild and restart the resource.\n",[379,1027,1028,1030,1033,1036],{"class":381,"line":389},[379,1029,830],{"class":392},[379,1031,1032],{"class":395}," resource",[379,1034,1035],{"class":395}," zeeq-server",[379,1037,1038],{"class":395}," --rebuild\n",[219,1040,1041,1042,1045],{},"When changes are made in the backend, the API stubs are automatically re-generated via a .NET background build process that will output the OpenAPI schema to ",[275,1043,1044],{},"src\u002Fweb\u002Fsrc\u002Fapi\u002Fzeeq-api.json",".  Kubb is used to generate the client stub from here.",[1047,1048,1050],"h3",{"id":1049},"build-and-test","Build and test",[219,1052,1053],{},"Typical operations for building and testing:",[369,1055,1057],{"className":371,"code":1056,"filename":373,"language":374,"meta":375,"style":375},"dotnet build && dotnet test --no-restore --no-build\n",[275,1058,1059],{"__ignoreMap":375},[379,1060,1061,1063,1066,1069,1072,1075,1078],{"class":381,"line":382},[379,1062,366],{"class":392},[379,1064,1065],{"class":395}," build",[379,1067,1068],{"class":583}," &&",[379,1070,1071],{"class":392}," dotnet",[379,1073,1074],{"class":395}," test",[379,1076,1077],{"class":395}," --no-restore",[379,1079,1080],{"class":395}," --no-build\n",[1082,1083,1084],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":375,"searchDepth":389,"depth":389,"links":1086},[1087,1088,1089,1090,1091,1092,1093,1094],{"id":216,"depth":389,"text":217},{"id":228,"depth":389,"text":229},{"id":300,"depth":389,"text":301},{"id":409,"depth":389,"text":410},{"id":783,"depth":389,"text":784},{"id":949,"depth":389,"text":950},{"id":964,"depth":389,"text":965},{"id":1008,"depth":389,"text":1009,"children":1095},[1096],{"id":1049,"depth":445,"text":1050},"Setting up a local development environment for Zeeq","md",null,{},{"icon":82},{"title":79,"description":1097},"hRN1hIM5slzUI0-Lq6nnc56v4DAk5r6XNwWv6LnlkZs",[1105,1107],{"title":70,"path":71,"stem":72,"description":1106,"icon":14,"children":-1},"An overview of the key features of Zeeq",{"title":84,"path":85,"stem":86,"description":1108,"icon":87,"children":-1},"Connecting Zeeq to your GitHub repositories",1785298595369]