[{"data":1,"prerenderedAt":786},["ShallowReactive",2],{"doc-\u002Fde\u002Fgetting-started":3,"docnav-de":227},{"id":4,"title":5,"body":6,"description":219,"extension":220,"meta":221,"nav":48,"navigation":222,"path":223,"seo":224,"stem":225,"__hash__":226},"docs\u002Fde\u002Fgetting-started.md","Erste Schritte",{"type":7,"value":8,"toc":212},"minimark",[9,14,23,27,35,120,127,131,142,146,153,175,178,182,208],[10,11,13],"h2",{"id":12},"was-ist-kvellman","Was ist kvellman?",[15,16,17,18,22],"p",{},"kvellman ist ein selbst-gehostetes, ",[19,20,21],"strong",{},"winget-kompatibles"," Paket-Repository. Du trägst es als\nzusätzliche winget-Quelle ein — die winget-CLI fragt es genauso ab wie die offizielle\nMicrosoft-Quelle. Keine Client-Änderungen, keine eigenen Installer.",[10,24,26],{"id":25},"_1-origin-starten-docker","1. Origin starten (Docker)",[15,28,29,30,34],{},"Die Community-Edition läuft aus einem einzigen ",[31,32,33],"code",{},"docker compose","-Stack (App + PostgreSQL). Mit einer\nDomain, die auf deinen Host zeigt, und offenen Ports 80\u002F443:",[36,37,42],"pre",{"className":38,"code":39,"language":40,"meta":41,"style":41},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone \u003Copen-core-repo> kvellman && cd kvellman\ncp .env.deploy.example .env.deploy   # DOMAIN, NUXT_SESSION_PASSWORD, POSTGRES_PASSWORD setzen\ndocker compose --env-file .env.deploy up -d\n","bash","",[31,43,44,84,100],{"__ignoreMap":41},[45,46,49,53,57,61,64,68,71,74,77,81],"span",{"class":47,"line":48},"line",1,[45,50,52],{"class":51},"sBMFI","git",[45,54,56],{"class":55},"sfazB"," clone",[45,58,60],{"class":59},"sMK4o"," \u003C",[45,62,63],{"class":55},"open-core-rep",[45,65,67],{"class":66},"sTEyZ","o",[45,69,70],{"class":59},">",[45,72,73],{"class":55}," kvellman",[45,75,76],{"class":59}," &&",[45,78,80],{"class":79},"s2Zo4"," cd",[45,82,83],{"class":55}," kvellman\n",[45,85,87,90,93,96],{"class":47,"line":86},2,[45,88,89],{"class":51},"cp",[45,91,92],{"class":55}," .env.deploy.example",[45,94,95],{"class":55}," .env.deploy",[45,97,99],{"class":98},"sHwdD","   # DOMAIN, NUXT_SESSION_PASSWORD, POSTGRES_PASSWORD setzen\n",[45,101,103,106,109,112,114,117],{"class":47,"line":102},3,[45,104,105],{"class":51},"docker",[45,107,108],{"class":55}," compose",[45,110,111],{"class":55}," --env-file",[45,113,95],{"class":55},[45,115,116],{"class":55}," up",[45,118,119],{"class":55}," -d\n",[15,121,122,123,126],{},"Die DB-Migrationen laufen beim Start automatisch. Öffne ",[31,124,125],{},"https:\u002F\u002Fdeine-domain",", um den ersten\nAdmin-Account anzulegen.",[10,128,130],{"id":129},"_2-paket-bereitstellen","2. Paket bereitstellen",[15,132,133,134,137,138,141],{},"In der Web-UI: ein ",[19,135,136],{},"Site-Token"," anlegen (Admin → Site-Tokens), dann ein ",[19,139,140],{},"Manifest hochladen","\noder aus dem winget-Katalog importieren. Optional den Installer lokal speichern, damit er von deiner\nOrigin ausgeliefert wird.",[10,143,145],{"id":144},"_3-quelle-am-client-hinzufügen","3. Quelle am Client hinzufügen",[15,147,148,149,152],{},"winget verlangt ",[19,150,151],{},"HTTPS"," für eine REST-Quelle. Auf einem Windows-Client (PowerShell):",[36,154,158],{"className":155,"code":156,"language":157,"meta":41,"style":41},"language-powershell shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","winget source add --name kvellman --type Microsoft.Rest --arg \"https:\u002F\u002Fdeine-domain\u002Fapi\u002F\u003Csite-token>\"\nwinget search --source kvellman \u003Cbegriff>\nwinget install --source kvellman \u003CPackage.Identifier>\n","powershell",[31,159,160,165,170],{"__ignoreMap":41},[45,161,162],{"class":47,"line":48},[45,163,164],{},"winget source add --name kvellman --type Microsoft.Rest --arg \"https:\u002F\u002Fdeine-domain\u002Fapi\u002F\u003Csite-token>\"\n",[45,166,167],{"class":47,"line":86},[45,168,169],{},"winget search --source kvellman \u003Cbegriff>\n",[45,171,172],{"class":47,"line":102},[45,173,174],{},"winget install --source kvellman \u003CPackage.Identifier>\n",[15,176,177],{},"Fertig — Clients installieren interne Software jetzt über deine eigene winget-Quelle.",[10,179,181],{"id":180},"nächste-schritte","Nächste Schritte",[183,184,185,194,201],"ul",{},[186,187,188,193],"li",{},[189,190,192],"a",{"href":191},"\u002Fdocs\u002Fdeployment","Deployment"," — Docker, Reverse-Proxys (Caddy\u002FTraefik), Edge-Nodes, TLS.",[186,195,196,200],{},[189,197,199],{"href":198},"\u002Fdocs\u002Farchitecture","Architektur"," — wie winget-API, Site-Tokens und Spiegelung zusammenspielen.",[186,202,203,207],{},[189,204,206],{"href":205},"\u002Fdocs\u002Feditions-licensing","Editionen & Lizenzierung"," — Community vs. Enterprise.",[209,210,211],"style",{},"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 .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 pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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}",{"title":41,"searchDepth":86,"depth":86,"links":213},[214,215,216,217,218],{"id":12,"depth":86,"text":13},{"id":25,"depth":86,"text":26},{"id":129,"depth":86,"text":130},{"id":144,"depth":86,"text":145},{"id":180,"depth":86,"text":181},"Eine kvellman-Origin starten und in Minuten als winget-Quelle hinzufügen.","md",{},true,"\u002Fde\u002Fgetting-started",{"title":5,"description":219},"de\u002Fgetting-started","rrhJf7cKGwzix7mvmIM-3b6lWdutwJBMUkWAKsyAAUk",[228,356,483,669],{"id":4,"title":5,"body":229,"description":219,"extension":220,"meta":354,"nav":48,"navigation":222,"path":223,"seo":355,"stem":225,"__hash__":226},{"type":7,"value":230,"toc":347},[231,233,237,239,243,293,297,299,305,307,311,327,329,331,345],[10,232,13],{"id":12},[15,234,17,235,22],{},[19,236,21],{},[10,238,26],{"id":25},[15,240,29,241,34],{},[31,242,33],{},[36,244,245],{"className":38,"code":39,"language":40,"meta":41,"style":41},[31,246,247,269,279],{"__ignoreMap":41},[45,248,249,251,253,255,257,259,261,263,265,267],{"class":47,"line":48},[45,250,52],{"class":51},[45,252,56],{"class":55},[45,254,60],{"class":59},[45,256,63],{"class":55},[45,258,67],{"class":66},[45,260,70],{"class":59},[45,262,73],{"class":55},[45,264,76],{"class":59},[45,266,80],{"class":79},[45,268,83],{"class":55},[45,270,271,273,275,277],{"class":47,"line":86},[45,272,89],{"class":51},[45,274,92],{"class":55},[45,276,95],{"class":55},[45,278,99],{"class":98},[45,280,281,283,285,287,289,291],{"class":47,"line":102},[45,282,105],{"class":51},[45,284,108],{"class":55},[45,286,111],{"class":55},[45,288,95],{"class":55},[45,290,116],{"class":55},[45,292,119],{"class":55},[15,294,122,295,126],{},[31,296,125],{},[10,298,130],{"id":129},[15,300,133,301,137,303,141],{},[19,302,136],{},[19,304,140],{},[10,306,145],{"id":144},[15,308,148,309,152],{},[19,310,151],{},[36,312,313],{"className":155,"code":156,"language":157,"meta":41,"style":41},[31,314,315,319,323],{"__ignoreMap":41},[45,316,317],{"class":47,"line":48},[45,318,164],{},[45,320,321],{"class":47,"line":86},[45,322,169],{},[45,324,325],{"class":47,"line":102},[45,326,174],{},[15,328,177],{},[10,330,181],{"id":180},[183,332,333,337,341],{},[186,334,335,193],{},[189,336,192],{"href":191},[186,338,339,200],{},[189,340,199],{"href":198},[186,342,343,207],{},[189,344,206],{"href":205},[209,346,211],{},{"title":41,"searchDepth":86,"depth":86,"links":348},[349,350,351,352,353],{"id":12,"depth":86,"text":13},{"id":25,"depth":86,"text":26},{"id":129,"depth":86,"text":130},{"id":144,"depth":86,"text":145},{"id":180,"depth":86,"text":181},{},{"title":5,"description":219},{"id":357,"title":192,"body":358,"description":477,"extension":220,"meta":478,"nav":86,"navigation":222,"path":479,"seo":480,"stem":481,"__hash__":482},"docs\u002Fde\u002Fdeployment.md",{"type":7,"value":359,"toc":471},[360,364,375,379,382,403,433,440,444,451,455,458,468],[10,361,363],{"id":362},"winget-verlangt-https","winget verlangt HTTPS",[15,365,366,367,370,371,374],{},"Eine winget-REST-Quelle muss über ",[19,368,369],{},"HTTPS mit vertrauenswürdigem Zertifikat"," laufen (bei neueren\nwinget-Versionen auch für ",[31,372,373],{},"localhost","). Plane TLS für jeden Endpunkt, mit dem Clients sprechen.",[10,376,378],{"id":377},"origin-via-docker","Origin via Docker",[15,380,381],{},"Der Community-Stack ist App + PostgreSQL. Zwei Reverse-Proxy-Varianten sind dabei:",[183,383,384,394],{},[186,385,386,389,390,393],{},[19,387,388],{},"Caddy"," (",[31,391,392],{},"docker-compose.yml",") — automatisches Let's Encrypt für eine öffentliche Domain.",[186,395,396,389,399,402],{},[19,397,398],{},"Vorhandener Traefik",[31,400,401],{},"docker-compose.traefik.yml",") — ohne Caddy; die App hängt sich in\nTraefiks Netz und wird per Labels geroutet. Ideal, wenn Port 80\u002F443 schon von Traefik belegt ist.",[36,404,406],{"className":38,"code":405,"language":40,"meta":41,"style":41},"# hinter vorhandenem Traefik:\ndocker compose -f docker-compose.traefik.yml --env-file .env.deploy up -d\n",[31,407,408,413],{"__ignoreMap":41},[45,409,410],{"class":47,"line":48},[45,411,412],{"class":98},"# hinter vorhandenem Traefik:\n",[45,414,415,417,419,422,425,427,429,431],{"class":47,"line":86},[45,416,105],{"class":51},[45,418,108],{"class":55},[45,420,421],{"class":55}," -f",[45,423,424],{"class":55}," docker-compose.traefik.yml",[45,426,111],{"class":55},[45,428,95],{"class":55},[45,430,116],{"class":55},[45,432,119],{"class":55},[15,434,435,436,439],{},"Setze ",[31,437,438],{},"KVELLMAN_IMAGE"," auf ein vorgebautes Image (woanders gebaut und in eine Registry gepusht), um\nnicht auf einem kleinen Server zu bauen; Migrationen laufen beim Container-Start automatisch.",[10,441,443],{"id":442},"edge-mirror-nodes-enterprise","Edge-\u002FMirror-Nodes (Enterprise)",[15,445,446,447,450],{},"Ein Standort kann einen headless ",[19,448,449],{},"Edge-Node"," betreiben, der die winget-API und Installer-Downloads\nlokal ausliefert und bei Bedarf von der Origin cached. Clients tragen den Node als Quelle ein; die\nerste Installation zieht über den Node, der Rest aus dem LAN. Nodes enrollen sich bei der Origin\n(Einmal-Key → dauerhafte mTLS-Identität) und werden zentral gesteuert (Paket-Scope, Installer-Filter,\nPush\u002FVorab-Spiegeln, Health).",[10,452,454],{"id":453},"telemetrie-schalter","Telemetrie & Schalter",[15,456,457],{},"Repository-Nutzungstelemetrie (Suchen, Manifest-Abrufe, Downloads) ist standardmäßig aus und wird\nper Umgebungsvariable aktiviert. Gleiches Muster gilt für den Upstream-Katalog-Sync und einen\nGitHub-Token für Importe.",[459,460,461],"blockquote",{},[15,462,463,464,467],{},"Die vollständige Schritt-für-Schritt-Anleitung (Origin, Edge-Node unter WSL, TLS für LAN\u002Flocalhost,\nRegistry-Workflow) steht in ",[31,465,466],{},"DEPLOYMENT.md"," im Open-Core-Repository.",[209,469,470],{},"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);}",{"title":41,"searchDepth":86,"depth":86,"links":472},[473,474,475,476],{"id":362,"depth":86,"text":363},{"id":377,"depth":86,"text":378},{"id":442,"depth":86,"text":443},{"id":453,"depth":86,"text":454},"Origin mit Docker hinter Caddy oder vorhandenem Traefik betreiben, plus Edge-Nodes.",{},"\u002Fde\u002Fdeployment",{"title":192,"description":477},"de\u002Fdeployment","-j5lkcIPmI1PgQ0FNATHb8ZLE9OJTWjDhlPpUOyAKxA",{"id":484,"title":206,"body":485,"description":663,"extension":220,"meta":664,"nav":102,"navigation":222,"path":665,"seo":666,"stem":667,"__hash__":668},"docs\u002Fde\u002Feditions-licensing.md",{"type":7,"value":486,"toc":658},[487,491,505,581,589,593,600,634,637,641,644],[10,488,490],{"id":489},"open-core","Open Core",[15,492,493,494,496,497,500,501,504],{},"kvellman ist ",[19,495,490],{},". Die Plattform ist quelloffen unter ",[19,498,499],{},"Apache-2.0","; erweiterte Funktionen\nkommen als ",[19,502,503],{},"kommerzielle Plugins"," (z. B. SSO, MFA), die nur mit gültiger Enterprise-Lizenz aktiv\nwerden.",[506,507,508,523],"table",{},[509,510,511],"thead",{},[512,513,514,517,520],"tr",{},[515,516],"th",{},[515,518,519],{},"Community",[515,521,522],{},"Enterprise",[524,525,526,537,548,559,570],"tbody",{},[512,527,528,532,534],{},[529,530,531],"td",{},"Lizenz",[529,533,499],{},[529,535,536],{},"Kommerzielles Abo",[512,538,539,542,545],{},[529,540,541],{},"Nutzer",[529,543,544],{},"Einzeln \u002F lokale Konten",[529,546,547],{},"Mehrbenutzer, RBAC",[512,549,550,553,556],{},[529,551,552],{},"Auth",[529,554,555],{},"Lokal",[529,557,558],{},"SSO (OIDC) + MFA (TOTP)",[512,560,561,564,567],{},[529,562,563],{},"Skalierung",[529,565,566],{},"Single-Node",[529,568,569],{},"Hochverfügbarkeit, Edge-Nodes",[512,571,572,575,578],{},[529,573,574],{},"Betrieb",[529,576,577],{},"Kern",[529,579,580],{},"Genehmigungs-Workflow + Audit, Air-Gap, Release-Scraper",[15,582,583,584,588],{},"Der vollständige Vergleich steht unter ",[189,585,587],{"href":586},"\u002Fpricing","Preise",".",[10,590,592],{"id":591},"wie-die-lizenzierung-funktioniert","Wie die Lizenzierung funktioniert",[15,594,595,596,599],{},"Enterprise-Funktionen werden über eine ",[19,597,598],{},"offline, signaturbasierte"," Lizenz freigeschaltet — kein\nAktivierungsserver, funktioniert also air-gapped:",[601,602,603,609,616,631],"ol",{},[186,604,605,606,588],{},"Eine Lizenz ist ein vom Hersteller ",[19,607,608],{},"Ed25519-signiertes Token",[186,610,611,612,615],{},"Das Produkt enthält nur den ",[19,613,614],{},"öffentlichen Schlüssel"," und prüft das Token lokal.",[186,617,618,619,622,623,626,627,630],{},"Das Token nennt Kunde und aktive ",[19,620,621],{},"Entitlements"," (z. B. ",[31,624,625],{},"sso",", ",[31,628,629],{},"mfa",") sowie ein Ablaufdatum.",[186,632,633],{},"Ein Admin fügt das Token in der UI ein; passende Plugins werden sofort aktiv — ohne Neustart,\nohne Internet.",[15,635,636],{},"Da die Prüfung lokal erfolgt, kann selbst der vollständige Open-Source-Code keine gültige Lizenz\nfälschen, solange der private Schlüssel des Herstellers geheim bleibt.",[10,638,640],{"id":639},"entwickler-pakete","Entwickler-Pakete",[15,642,643],{},"Die gemeinsamen, öffentlichen Bausteine liegen auf npm unter Apache-2.0:",[183,645,646,652],{},[186,647,648,651],{},[31,649,650],{},"@kvellman\u002Fwinget-contract"," — der von Origin und Nodes geteilte winget-REST-\u002FTypen-Vertrag.",[186,653,654,657],{},[31,655,656],{},"@kvellman\u002Fplugin-sdk"," — Typen zum Bauen von Auth-\u002FEntitlement-Plugins.",{"title":41,"searchDepth":86,"depth":86,"links":659},[660,661,662],{"id":489,"depth":86,"text":490},{"id":591,"depth":86,"text":592},{"id":639,"depth":86,"text":640},"Open-Core-Modell — Community (Apache-2.0) vs. Enterprise, und wie die Lizenzierung funktioniert.",{},"\u002Fde\u002Feditions-licensing",{"title":206,"description":663},"de\u002Feditions-licensing","w0UfaQHHod93tPhOw66j1b5BDgIOEAQiOFMI9e-wC7I",{"id":670,"title":199,"body":671,"description":779,"extension":220,"meta":780,"nav":781,"navigation":222,"path":782,"seo":783,"stem":784,"__hash__":785},"docs\u002Fde\u002Farchitecture.md",{"type":7,"value":672,"toc":772},[673,677,680,700,704,735,739,758,762,765,769],[10,674,676],{"id":675},"winget-source-api","winget-Source-API",[15,678,679],{},"kvellman setzt den winget-Source-REST-Vertrag exakt um, sodass die winget-CLI es wie jede andere\nQuelle behandelt:",[183,681,682,688,694],{},[186,683,684,687],{},[31,685,686],{},"GET \u002Fapi\u002F{siteToken}\u002Finformation"," — Quell-Metadaten und unterstützte Versionen.",[186,689,690,693],{},[31,691,692],{},"POST \u002Fapi\u002F{siteToken}\u002FmanifestSearch"," — Volltextsuche.",[186,695,696,699],{},[31,697,698],{},"GET \u002Fapi\u002F{siteToken}\u002FpackageManifests\u002F{id}"," — Manifest-Auslieferung mit serverseitiger Auflösung.",[10,701,703],{"id":702},"site-kontext","Site-Kontext",[15,705,706,707,709,710,713,714,717,718,721,722,626,725,626,728,626,731,734],{},"winget sendet keine eigenen Header, daher steckt der Standort-Kontext im URL-",[19,708,136],{},"\n(primär), ergänzt durch ",[19,711,712],{},"Subnetz"," und ",[19,715,716],{},"mTLS-Client-Zertifikat",". Der aufgelöste Kontext steuert\nserverseitige ",[31,719,720],{},"InstallerUrl","-Platzhalter (",[31,723,724],{},"$REPO_URL",[31,726,727],{},"$SITE",[31,729,730],{},"$LOCATION",[31,732,733],{},"$LANG",") — so kann\ndasselbe Manifest auf eine standortlokale SMB\u002FDFS-Freigabe zeigen, ohne geforkt zu werden.",[10,736,738],{"id":737},"manifeste-overlays-ablage","Manifeste, Overlays & Ablage",[15,740,741,742,745,746,749,750,753,754,757],{},"Manifeste sind versioniertes YAML, beim Upload gegen die offiziellen winget-JSON-Schemas validiert.\nLokale Änderungen liegen als ",[19,743,744],{},"Overlay"," über dem unangetasteten Upstream, und ",[19,747,748],{},"Overlay-Vorlagen","\nje Paket machen wiederkehrende Anpassungen (z. B. eine interne Mirror-URL mit ",[31,751,752],{},"$VERSION","\u002F",[31,755,756],{},"$ARCH",")\nüber Versionen hinweg einfach. Installer lassen sich nach S3\u002FMinIO oder SMB spiegeln; Hashes werden\nbei der Auslieferung neu berechnet.",[10,759,761],{"id":760},"edge-mirror-nodes","Edge-\u002FMirror-Nodes",[15,763,764],{},"Edge-Nodes sind schlanke Cache-Proxys, die die winget-API + Downloads lokal ausliefern und lazy von\nder Origin holen. Sie halten einen Offline-Suchindex, enrollen via mTLS und werden zentral\neingeschränkt (welche Pakete, welche Installer-Architekturen\u002F-Scopes) und von der Origin überwacht.",[10,766,768],{"id":767},"stack","Stack",[15,770,771],{},"Nuxt 4 (Vue 3 + Nitro), TypeScript, PostgreSQL + Drizzle ORM, S3-kompatible Ablage, BullMQ\u002FRedis für\nHintergrundjobs. Ausschließlich On-Premise — voll selbst-hostbar, inklusive Air-Gap-Betrieb.",{"title":41,"searchDepth":86,"depth":86,"links":773},[774,775,776,777,778],{"id":675,"depth":86,"text":676},{"id":702,"depth":86,"text":703},{"id":737,"depth":86,"text":738},{"id":760,"depth":86,"text":761},{"id":767,"depth":86,"text":768},"Wie winget-Source-API, Site-Kontext, Spiegelung und Edge-Nodes zusammenspielen.",{},4,"\u002Fde\u002Farchitecture",{"title":199,"description":779},"de\u002Farchitecture","GmvMCx1uCHAIyNFsm-SDay1Ou_VPhUgf02yYI3oKgaY",1782195177368]