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