[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"technologies":3,"\u002Fopen-source\u002Fdxpdf":167,"glossary":1439},[4,10,15,21,26,32,38,43,48,53,58,63,68,73,77,82,87,92,97,103,108,113,118,123,128,133,138,143,147,152,157,162],{"title":5,"description":6,"slug":7,"category":8,"icon":9},"Android","Elke app die we uitbrengen bereikt Android — platform-API's, uitvoering op de achtergrond, permissies en de winkeleisen die daarbij horen.","android","framework","logos:android-icon",{"title":11,"description":12,"slug":13,"category":8,"icon":14},"Angular","Het front-endframework waarin we werken als een product al Angular is — een kant-en-klare structuur die past bij grote, langlevende applicaties.","angular","logos:angular-icon",{"title":16,"description":17,"slug":18,"category":19,"icon":20},"Dart","De taal waarin elke Flutter-app die we uitbrengen geschreven is — sound null safety, echte pattern matching, en een compiler voor native en web.","dart","language","logos:dart",{"title":22,"description":23,"slug":24,"category":8,"icon":25},"Django","Het Python-framework dat we pakken als een product op dag één een beheeromgeving, authenticatie en een echt datamodel nodig heeft.","django","logos:django-icon",{"title":27,"description":28,"slug":29,"category":30,"icon":31},"Docker","Elke service die we bouwen verschijnt als container, zodat wat op een laptop, in CI en in productie draait één artefact is en niet drie verschillende.","docker","infrastructure","logos:docker-icon",{"title":33,"description":34,"slug":35,"category":36,"icon":37},"Fastlane","De releaseautomatisering achter ons mobiele werk — ondertekenen, builds en winkeluploads draaien vanuit CI, niet vanaf één laptop.","fastlane","tools","logos:fastlane",{"title":39,"description":40,"slug":41,"category":8,"icon":42},"Flutter","Onze belangrijkste mobiele stack sinds 2018 — één Dart-codebase die uitkomt op iOS, Android, web en desktop zonder een apart team per platform.","flutter","logos:flutter",{"title":44,"description":45,"slug":46,"category":36,"icon":47},"Git","Elk project dat we aanraken leeft in Git — beoordeelde pull requests, CI op elke branch, en een historie die maanden later nog te volgen is.","git","logos:git-icon",{"title":49,"description":50,"slug":51,"category":19,"icon":52},"Go","Onze backendtaal voor realtime-API's en services onder belasting — kleine binaries, snelle builds, en gelijktijdigheid die leesbaar blijft.","go","logos:gopher",{"title":54,"description":55,"slug":56,"category":30,"icon":57},"Google Cloud","De cloud waarop onze productieworkloads draaien — beheerde Kubernetes, opslag en netwerken, zonder handgebouwde servers die niemand wil onderhouden.","gcp","logos:google-cloud",{"title":59,"description":60,"slug":61,"category":36,"icon":62},"Gradle","Het buildsysteem waar elke Android-release doorheen gaat — product flavours, ondertekeningsconfiguraties, en de afhankelijkheden onder een Flutter-app.","gradle","logos:gradle",{"title":64,"description":65,"slug":66,"category":30,"icon":67},"Helm","Hoe we een Kubernetes-uitrol verpakken — service, configuratie, secrets en ingress als één versiebeheerde eenheid die je kunt promoveren en terugdraaien.","helm","logos:helm",{"title":69,"description":70,"slug":71,"category":19,"icon":72},"Kotlin","Waar we naar grijpen als een Flutter-app echt Android eronder nodig heeft — platform channels, achtergrondwerk en integraties met native SDK's.","kotlin","logos:kotlin-icon",{"title":74,"description":75,"slug":76,"category":8,"icon":72},"Kotlin Multiplatform","Bedrijfslogica delen tussen iOS en Android terwijl elk platform zijn eigen native UI houdt — het alternatief wanneer Flutter niet past.","kmp",{"title":78,"description":79,"slug":80,"category":30,"icon":81},"Kubernetes","Hoe we services in productie draaien — Helm-uitrollen, rollouts die terug te draaien zijn, en schalen zonder dat iemand om 3 uur 's nachts wakker hoeft te zijn.","kubernetes","logos:kubernetes",{"title":83,"description":84,"slug":85,"category":30,"icon":86},"NATS","Lichtgewicht berichtenverkeer tussen services — publish\u002Fsubscribe en request\u002Freply zonder het beheergewicht van een volledig brokercluster.","nats","logos:nats-icon",{"title":88,"description":89,"slug":90,"category":8,"icon":91},"Nuxt","Vue met serverrendering, routering en SEO al geregeld — hoe we marketingsites en webapps bouwen die bij het eerste laden snel en vindbaar moeten zijn.","nuxt","logos:nuxt-icon",{"title":93,"description":94,"slug":95,"category":19,"icon":96},"PHP","Waar we met een bestaande PHP-backend werken — hem uitbreiden, ermee integreren, en de mobiele en webclients bouwen die hij moet bedienen.","php","logos:php",{"title":98,"description":99,"slug":100,"category":101,"icon":102},"PostgreSQL","Onze standaarddatabase — waar we naar grijpen tenzij een product een specifieke reden geeft om dat niet te doen, van schema tot indexen.","postgres","database","logos:postgresql",{"title":104,"description":105,"slug":106,"category":19,"icon":107},"Python","Onze taal voor backends, datawerk en AI-integraties — inclusief de Python-bindings die we bij onze eigen Rust-tooling leveren.","python","logos:python",{"title":109,"description":110,"slug":111,"category":8,"icon":112},"React","De front-endbibliotheek waarin we werken als een product al React is — componenten, hooks, en het ecosysteem dat eromheen is gegroeid.","react","logos:react",{"title":114,"description":115,"slug":116,"category":101,"icon":117},"Redis","Waar we data neerzetten die snel moet zijn en opnieuw op te bouwen valt — caches, sessies, verzoeklimieten en achtergrondwachtrijen.","redis","logos:redis",{"title":119,"description":120,"slug":121,"category":19,"icon":122},"Ruby","De taal waarin onze mobiele releaseautomatisering geschreven is — Fastlane-lanes, eigen acties, en de CI-lijm die builds naar de winkels brengt.","ruby","logos:ruby",{"title":124,"description":125,"slug":126,"category":19,"icon":127},"Rust","Waar we heen gaan als prestaties én correctheid allebei tellen — documenten renderen, CLI-tooling, en services die snel en voorspelbaar moeten blijven.","rust","simple-icons:rust",{"title":129,"description":130,"slug":131,"category":101,"icon":132},"SQLite","De database die meereist in de app — lokale caches, offline-first opslag, en alles wat ook zonder netwerk moet blijven werken.","sqlite","logos:sqlite",{"title":134,"description":135,"slug":136,"category":8,"icon":137},"Strapi","Een headless CMS waar we naar grijpen als redacteuren de content moeten beheren — een echte beheeromgeving en een schone API, zonder ze zelf te bouwen.","strapi","logos:strapi-icon",{"title":139,"description":140,"slug":141,"category":19,"icon":142},"Swift","Waar we naar grijpen als een Flutter-app echt iOS eronder nodig heeft — platform channels, integraties met native SDK's, widgets en App Clips.","swift","logos:swift",{"title":144,"description":145,"slug":146,"category":8,"icon":142},"SwiftUI","Het UI-framework van Apple, waar we de native oppervlakken bouwen die een Flutter-app niet kan afdekken — widgets, App Clips, extensies en systeemintegraties.","swiftui",{"title":148,"description":149,"slug":150,"category":8,"icon":151},"Tailwind CSS","Hoe we elke front-end die we bouwen vormgeven — utility-klassen en designtokens in plaats van een stylesheet die alleen maar groeit en nooit wordt opgeschoond.","tailwind","logos:tailwindcss-icon",{"title":153,"description":154,"slug":155,"category":19,"icon":156},"TypeScript","De standaard voor alles wat we voor de browser en voor Node-services schrijven — types die integratiebugs vangen voordat ze een review halen.","typescript","logos:typescript-icon",{"title":158,"description":159,"slug":160,"category":8,"icon":161},"Vue","Ons front-endframework voor beheerpanelen, dashboards voor winkeliers en webapps die jaren onderhoudbaar moeten blijven, geen sprints.","vue","logos:vue",{"title":163,"description":164,"slug":165,"category":36,"icon":166},"Whisper","Het opensource spraakherkenningsmodel van OpenAI — de transcriptiemotor achter spraakinvoer, draaiend als backendservice én op het toestel in de app.","whisper","simple-icons:openai",{"id":168,"title":169,"body":170,"description":1390,"extension":1391,"links":1392,"meta":1399,"metaDescription":1400,"metaTitle":1401,"navigation":635,"ogDescription":1402,"path":1403,"repository":1404,"seo":1407,"slug":169,"stem":1408,"technologies":1409,"updated":1410,"__hash__":1411,"stats":1412},"open_source_nl\u002Fopen-source\u002Fdxpdf.md","dxpdf",{"type":171,"value":172,"toc":1371},"minimark",[173,178,187,190,213,221,225,235,242,252,278,293,297,312,409,413,418,421,459,463,466,593,596,883,887,890,904,943,946,950,957,972,1109,1116,1137,1141,1150,1252,1258,1261,1265,1269,1275,1279,1282,1286,1289,1293,1296,1303,1307,1314,1355,1363,1367],[174,175,177],"h2",{"id":176},"het-probleem","Het probleem",[179,180,181,182,186],"p",{},"Word-documenten naar PDF omzetten is een van de meest voorkomende taken in bedrijfssoftware. Facturen, contracten, rapporten, complianceformulieren — ze beginnen als ",[183,184,185],"code",{},".docx","-bestand en moeten PDF worden om te delen, te archiveren of af te drukken.",[179,188,189],{},"De bestaande oplossingen brengen stuk voor stuk flinke nadelen mee:",[191,192,193,201,207],"ul",{},[194,195,196,200],"li",{},[197,198,199],"strong",{},"Microsoft Office \u002F LibreOffice"," — vereist een volledige kantoorsuite op elke server. De headlessmodus van LibreOffice is traag, vreet geheugen en levert per versie wisselende resultaten. Opschalen betekent meerdere instanties draaien die gigabytes aan RAM opslokken.",[194,202,203,206],{},[197,204,205],{},"Cloud-API's"," (Google Docs, Adobe, CloudConvert) — voegen vertraging toe, kosten geld per conversie, en sturen mogelijk gevoelige documenten naar servers van derden. Niet werkbaar voor gereguleerde sectoren of afgeschermde omgevingen.",[194,208,209,212],{},[197,210,211],{},"HTML-naar-PDF-tools"," (wkhtmltopdf, Puppeteer) — vereisen dat DOCX eerst HTML wordt, waarbij opmaakgetrouwheid verloren gaat. Tabellen, kop- en voetteksten en pagina-einden overleven die omweg zelden.",[179,214,215,216,220],{},"Geen van deze werkt goed wanneer je snelle, nauwkeurige, offline conversie op schaal nodig hebt — zeker niet in geautomatiseerde pijplijnen, ",[217,218],"term",{"slug":219},"ci-cd","-systemen of ingebedde applicaties waar LibreOffice installeren geen optie is.",[174,222,224],{"id":223},"hoe-dxpdf-dat-oplost","Hoe dxpdf dat oplost",[179,226,227,228,231,232,234],{},"dxpdf is een zelfstandige DOCX-naar-PDF-converter geschreven in Rust en aangedreven door Googles grafische bibliotheek ",[217,229],{"slug":230},"skia",". Hij leest ",[183,233,185],{},"-bestanden rechtstreeks, ontleedt de OOXML-structuur, en rendert pixelnauwkeurige PDF-uitvoer — alles in één binary zonder externe afhankelijkheden buiten Skia.",[179,236,237,238,241],{},"Een door Flutter geïnspireerd ",[197,239,240],{},"meten-dan-plaatsen","-model zorgt dat tekstafbreking, tabelafmetingen en pagina-einden overeenkomen met wat Microsoft Word oplevert:",[243,244,249],"pre",{"className":245,"code":247,"language":248},[246],"language-text","DOCX (ZIP) → Parse → Document Model → Resolve → Layout → Subset → Paint → PDF\n             Twips\u002FEmu\u002FHalfPoints        ←──── Pt throughout ────→      Skia\n","text",[183,250,247],{"__ignoreMap":251},"",[179,253,254,255,258,259,258,262,265,266,269,270,273,274,277],{},"Typeveilige afmetingen lopen door de hele pijplijn: OOXML-eenheden (",[183,256,257],{},"Twips",", ",[183,260,261],{},"Emu",[183,263,264],{},"HalfPoints",") liggen in het ontlede model op ",[183,267,268],{},"i64"," zodat ze verliesvrij heen en terug gaan, de lay-out rekent in typografische punten (",[183,271,272],{},"Pt","), en kale ",[183,275,276],{},"f32"," verschijnt pas op de rendergrens met Skia — zodat eenheden door elkaar halen een compileerfout is en geen document dat subtiel verkeerd is.",[179,279,280,281,284,285,288,289,292],{},"Het resultaat is een converter die een document van 3 pagina's met tabellen en afbeeldingen in ",[197,282,283],{},"170 ms"," naar PDF omzet met ",[197,286,287],{},"54 MB geheugen",", en een document van 171 pagina's en 14 MB in ",[197,290,291],{},"420 ms"," — snel genoeg om binnen een requesthandler te draaien of duizenden documenten in batch te verwerken.",[174,294,296],{"id":295},"wat-het-ondersteunt","Wat het ondersteunt",[179,298,299,300,303,304,311],{},"Getoetst aan ISO 29500 (Office Open XML): ",[197,301,302],{},"75 regels volledig geïmplementeerd, 12 gedeeltelijk, 11 nog niet ondersteund"," — de ",[305,306,310],"a",{"href":307,"rel":308},"https:\u002F\u002Fgithub.com\u002Fnerdy-pro\u002Fdxpdf#ooxml-feature-coverage",[309],"nofollow","volledige matrix"," noemt elke regel met zijn status. In het kort:",[191,313,314,320,326,332,338,344,354,360,366,372,378,388,394,403],{},[194,315,316,319],{},[197,317,318],{},"Tekstopmaak"," — vet, cursief, onderstreept, markeren, tekengrootte, lettertype, kleur, letterafstand, tekenschaling, superscript, subscript, arcering en randen op runs",[194,321,322,325],{},[197,323,324],{},"Alinea's"," — uitlijning (links, gecentreerd, rechts, uitvullen, verdelen), afstand, inspringing, tabstops (waaronder decimaal, balk en absolute positie), randen, arcering, bij volgende houden, regels bij elkaar houden, weduwe- en wezencontrole",[194,327,328,331],{},[197,329,330],{},"Tabellen"," — kolombreedtes, celmarges met cascade over 3 niveaus, samengevoegde cellen, rijhoogtes, randen, celarcering, tabelstijlen met voorwaardelijke opmaak, geneste en zwevende tabellen, rijen die over pagina's splitsen",[194,333,334,337],{},[197,335,336],{},"Afbeeldingen"," — inline (PNG, JPEG, GIF, BMP, WebP) en zwevend of verankerd met uitlijning, omloop, bijsnijden en positionering op percentage",[194,339,340,343],{},[197,341,342],{},"Vormen en tekstvakken"," — DrawingML- en VML-vormen, tekstinhoud van vormen met binnenmarges, verankering, automatisch passend maken, eigen geometrie",[194,345,346,349,350,353],{},[197,347,348],{},"Stijlen"," — alinea- en tekenstijlen met overerving via ",[183,351,352],{},"basedOn",", documentstandaarden, themalettertypes",[194,355,356,359],{},[197,357,358],{},"Kop- en voetteksten"," — tekst, afbeeldingen, paginanummers (veldcodes PAGE\u002FNUMPAGES), varianten voor de eerste pagina en voor even\u002Foneven",[194,361,362,365],{},[197,363,364],{},"Lijsten"," — nummering op meerdere niveaus: opsommingstekens, decimaal, letters, Romeins, rangtelwoorden en voluit geschreven tekst, plus niet-Latijnse reeksen en afbeeldingsbullets",[194,367,368,371],{},[197,369,370],{},"Navigatie"," — aanklikbare linkannotaties, bladwijzers en kruisverwijzingen als benoemde bestemmingen, en een PDF-overzicht opgebouwd uit kopniveaus",[194,373,374,377],{},[197,375,376],{},"Secties"," — meerdere paginaformaten en marges, sectie-einden, lay-out met meerdere kolommen, staande en liggende oriëntatie",[194,379,380,383,384,387],{},[197,381,382],{},"Formules"," — inline OMML-wiskunde (",[183,385,386],{},"m:oMath","): wiskundige runs, superscripts en breuken, gezet in het standaard wiskundelettertype van Word; een formule kan een hyperlink dragen en in een outlinetitel belanden",[194,389,390,393],{},[197,391,392],{},"Lay-out"," — automatische paginering, voet- en eindnoten, tekstafbreking, regelafstandmodi, tekstloop rond zwevende afbeeldingen",[194,395,396,399,400],{},[197,397,398],{},"Internationalisatie"," — regelafbreking volgens UAX #14 (waaronder Thai, Lao, Khmer, Birmees), bidirectionele tekst volgens UAX #9 met spiegeling, HarfBuzz-shaping voor verbindende schriften, en decimaalscheidingstekens, datumnotaties en voluit geschreven getallen gestuurd door ",[183,401,402],{},"w:lang",[194,404,405,408],{},[197,406,407],{},"Tekst en emoji"," — segmentatie die grafemen respecteert en emoji in volle kleur, inclusief ZWJ-, modifier-, keycap- en vlagreeksen",[174,410,412],{"id":411},"vier-manieren-om-het-te-gebruiken","Vier manieren om het te gebruiken",[414,415,417],"h3",{"id":416},"opdrachtregelprogramma","Opdrachtregelprogramma",[179,419,420],{},"Installeren en draaien met één commando:",[243,422,426],{"className":423,"code":424,"language":425,"meta":251,"style":251},"language-shell shiki shiki-themes material-theme-lighter github-light github-dark","cargo install dxpdf\ndxpdf input.docx -o output.pdf\n","shell",[183,427,428,444],{"__ignoreMap":251},[429,430,433,437,441],"span",{"class":431,"line":432},"line",1,[429,434,436],{"class":435},"sbgvK","cargo",[429,438,440],{"class":439},"s_sjI"," install",[429,442,443],{"class":439}," dxpdf\n",[429,445,447,449,452,456],{"class":431,"line":446},2,[429,448,169],{"class":435},[429,450,451],{"class":439}," input.docx",[429,453,455],{"class":454},"stzsN"," -o",[429,457,458],{"class":439}," output.pdf\n",[414,460,462],{"id":461},"rust-bibliotheek","Rust-bibliotheek",[179,464,465],{},"Eén functieaanroep — bytes erin, bytes eruit:",[243,467,470],{"className":468,"code":469,"language":126,"meta":251,"style":251},"language-rust shiki shiki-themes material-theme-lighter github-light github-dark","let docx_bytes = std::fs::read(\"document.docx\")?;\nlet pdf_bytes = dxpdf::convert(&docx_bytes)?;\nstd::fs::write(\"output.pdf\", &pdf_bytes)?;\n",[183,471,472,523,554],{"__ignoreMap":251},[429,473,474,478,482,486,489,492,495,497,501,505,509,512,514,517,520],{"class":431,"line":432},[429,475,477],{"class":476},"sbsja","let",[429,479,481],{"class":480},"su5hD"," docx_bytes ",[429,483,485],{"class":484},"smGrS","=",[429,487,488],{"class":435}," std",[429,490,491],{"class":484},"::",[429,493,494],{"class":435},"fs",[429,496,491],{"class":484},[429,498,500],{"class":499},"sGLFI","read",[429,502,504],{"class":503},"sP7_E","(",[429,506,508],{"class":507},"sjJ54","\"",[429,510,511],{"class":439},"document.docx",[429,513,508],{"class":507},[429,515,516],{"class":503},")",[429,518,519],{"class":484},"?",[429,521,522],{"class":503},";\n",[429,524,525,527,530,532,535,537,540,542,545,548,550,552],{"class":431,"line":446},[429,526,477],{"class":476},[429,528,529],{"class":480}," pdf_bytes ",[429,531,485],{"class":484},[429,533,534],{"class":435}," dxpdf",[429,536,491],{"class":484},[429,538,539],{"class":499},"convert",[429,541,504],{"class":503},[429,543,544],{"class":484},"&",[429,546,547],{"class":480},"docx_bytes",[429,549,516],{"class":503},[429,551,519],{"class":484},[429,553,522],{"class":503},[429,555,557,560,562,564,566,569,571,573,576,578,581,584,587,589,591],{"class":431,"line":556},3,[429,558,559],{"class":435},"std",[429,561,491],{"class":484},[429,563,494],{"class":435},[429,565,491],{"class":484},[429,567,568],{"class":499},"write",[429,570,504],{"class":503},[429,572,508],{"class":507},[429,574,575],{"class":439},"output.pdf",[429,577,508],{"class":507},[429,579,580],{"class":503},",",[429,582,583],{"class":484}," &",[429,585,586],{"class":480},"pdf_bytes",[429,588,516],{"class":503},[429,590,519],{"class":484},[429,592,522],{"class":503},[179,594,595],{},"Wil je meer controle, inspecteer dan het ontlede documentmodel vóór het renderen:",[243,597,599],{"className":468,"code":598,"language":126,"meta":251,"style":251},"use dxpdf::{docx, model, render};\n\nlet document = docx::parse(&std::fs::read(\"document.docx\")?)?;\n\nfor block in &document.body {\n    match block {\n        model::Block::Paragraph(p) => { \u002F* inspect paragraph *\u002F }\n        model::Block::Table(t) => { \u002F* inspect table *\u002F }\n        model::Block::SectionBreak(props) => { \u002F* inspect section properties *\u002F }\n    }\n}\n\nlet pdf_bytes = render::render(document, &dxpdf::RenderOptions::default())?;\n",[183,600,601,631,637,686,691,718,728,763,793,823,829,835,840],{"__ignoreMap":251},[429,602,603,607,609,611,614,618,620,623,625,628],{"class":431,"line":432},[429,604,606],{"class":605},"sw1J6","use",[429,608,534],{"class":435},[429,610,491],{"class":484},[429,612,613],{"class":503},"{",[429,615,617],{"class":616},"s3--O","docx",[429,619,580],{"class":503},[429,621,622],{"class":616}," model",[429,624,580],{"class":503},[429,626,627],{"class":616}," render",[429,629,630],{"class":503},"};\n",[429,632,633],{"class":431,"line":446},[429,634,636],{"emptyLinePlaceholder":635},true,"\n",[429,638,639,641,644,646,649,651,654,656,658,660,662,664,666,668,670,672,674,676,678,680,682,684],{"class":431,"line":556},[429,640,477],{"class":476},[429,642,643],{"class":480}," document ",[429,645,485],{"class":484},[429,647,648],{"class":435}," docx",[429,650,491],{"class":484},[429,652,653],{"class":499},"parse",[429,655,504],{"class":503},[429,657,544],{"class":484},[429,659,559],{"class":435},[429,661,491],{"class":484},[429,663,494],{"class":435},[429,665,491],{"class":484},[429,667,500],{"class":499},[429,669,504],{"class":503},[429,671,508],{"class":507},[429,673,511],{"class":439},[429,675,508],{"class":507},[429,677,516],{"class":503},[429,679,519],{"class":484},[429,681,516],{"class":503},[429,683,519],{"class":484},[429,685,522],{"class":503},[429,687,689],{"class":431,"line":688},4,[429,690,636],{"emptyLinePlaceholder":635},[429,692,694,698,701,704,706,709,712,715],{"class":431,"line":693},5,[429,695,697],{"class":696},"sVHd0","for",[429,699,700],{"class":480}," block ",[429,702,703],{"class":605},"in",[429,705,583],{"class":484},[429,707,708],{"class":480},"document",[429,710,711],{"class":484},".",[429,713,714],{"class":480},"body ",[429,716,717],{"class":503},"{\n",[429,719,721,724,726],{"class":431,"line":720},6,[429,722,723],{"class":696},"    match",[429,725,700],{"class":480},[429,727,717],{"class":503},[429,729,731,734,736,739,741,744,746,748,750,753,756,760],{"class":431,"line":730},7,[429,732,733],{"class":435},"        model",[429,735,491],{"class":484},[429,737,738],{"class":435},"Block",[429,740,491],{"class":484},[429,742,743],{"class":499},"Paragraph",[429,745,504],{"class":503},[429,747,179],{"class":480},[429,749,516],{"class":503},[429,751,752],{"class":484}," =>",[429,754,755],{"class":503}," {",[429,757,759],{"class":758},"sutJx"," \u002F* inspect paragraph *\u002F",[429,761,762],{"class":503}," }\n",[429,764,766,768,770,772,774,777,779,782,784,786,788,791],{"class":431,"line":765},8,[429,767,733],{"class":435},[429,769,491],{"class":484},[429,771,738],{"class":435},[429,773,491],{"class":484},[429,775,776],{"class":499},"Table",[429,778,504],{"class":503},[429,780,781],{"class":480},"t",[429,783,516],{"class":503},[429,785,752],{"class":484},[429,787,755],{"class":503},[429,789,790],{"class":758}," \u002F* inspect table *\u002F",[429,792,762],{"class":503},[429,794,796,798,800,802,804,807,809,812,814,816,818,821],{"class":431,"line":795},9,[429,797,733],{"class":435},[429,799,491],{"class":484},[429,801,738],{"class":435},[429,803,491],{"class":484},[429,805,806],{"class":499},"SectionBreak",[429,808,504],{"class":503},[429,810,811],{"class":480},"props",[429,813,516],{"class":503},[429,815,752],{"class":484},[429,817,755],{"class":503},[429,819,820],{"class":758}," \u002F* inspect section properties *\u002F",[429,822,762],{"class":503},[429,824,826],{"class":431,"line":825},10,[429,827,828],{"class":503},"    }\n",[429,830,832],{"class":431,"line":831},11,[429,833,834],{"class":503},"}\n",[429,836,838],{"class":431,"line":837},12,[429,839,636],{"emptyLinePlaceholder":635},[429,841,843,845,847,849,851,853,856,858,860,862,864,866,868,871,873,876,879,881],{"class":431,"line":842},13,[429,844,477],{"class":476},[429,846,529],{"class":480},[429,848,485],{"class":484},[429,850,627],{"class":435},[429,852,491],{"class":484},[429,854,855],{"class":499},"render",[429,857,504],{"class":503},[429,859,708],{"class":480},[429,861,580],{"class":503},[429,863,583],{"class":484},[429,865,169],{"class":435},[429,867,491],{"class":484},[429,869,870],{"class":435},"RenderOptions",[429,872,491],{"class":484},[429,874,875],{"class":499},"default",[429,877,878],{"class":503},"())",[429,880,519],{"class":484},[429,882,522],{"class":503},[414,884,886],{"id":885},"python-pakket","Python-pakket",[179,888,889],{},"Installeer vanaf PyPI en gebruik het in elke Python-applicatie:",[243,891,893],{"className":423,"code":892,"language":425,"meta":251,"style":251},"pip install dxpdf\n",[183,894,895],{"__ignoreMap":251},[429,896,897,900,902],{"class":431,"line":432},[429,898,899],{"class":435},"pip",[429,901,440],{"class":439},[429,903,443],{"class":439},[243,905,908],{"className":906,"code":907,"language":106,"meta":251,"style":251},"language-python shiki shiki-themes material-theme-lighter github-light github-dark","import dxpdf\n\n# Bytes erin, bytes eruit\npdf_bytes = dxpdf.convert(open(\"input.docx\", \"rb\").read())\n\n# Van bestand naar bestand\ndxpdf.convert_file(\"input.docx\", \"output.pdf\")\n",[183,909,910,915,919,924,929,933,938],{"__ignoreMap":251},[429,911,912],{"class":431,"line":432},[429,913,914],{},"import dxpdf\n",[429,916,917],{"class":431,"line":446},[429,918,636],{"emptyLinePlaceholder":635},[429,920,921],{"class":431,"line":556},[429,922,923],{},"# Bytes erin, bytes eruit\n",[429,925,926],{"class":431,"line":688},[429,927,928],{},"pdf_bytes = dxpdf.convert(open(\"input.docx\", \"rb\").read())\n",[429,930,931],{"class":431,"line":693},[429,932,636],{"emptyLinePlaceholder":635},[429,934,935],{"class":431,"line":720},[429,936,937],{},"# Van bestand naar bestand\n",[429,939,940],{"class":431,"line":730},[429,941,942],{},"dxpdf.convert_file(\"input.docx\", \"output.pdf\")\n",[179,944,945],{},"Sinds 0.8.1 geven beide aanroepen de GIL vrij zolang de Rust-kern werkt, zodat een threadpool die meerdere documenten tegelijk omzet ze ook echt parallel verwerkt in plaats van ze op de interpreter achter elkaar te zetten.",[414,947,949],{"id":948},"go-pakket","Go-pakket",[179,951,952,953,956],{},"Installeer met ",[183,954,955],{},"go get"," en gebruik het als elk ander pakket:",[243,958,960],{"className":423,"code":959,"language":425,"meta":251,"style":251},"go get github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo\n",[183,961,962],{"__ignoreMap":251},[429,963,964,966,969],{"class":431,"line":432},[429,965,51],{"class":435},[429,967,968],{"class":439}," get",[429,970,971],{"class":439}," github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo\n",[243,973,976],{"className":974,"code":975,"language":51,"meta":251,"style":251},"language-go shiki shiki-themes material-theme-lighter github-light github-dark","import \"github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo\"\n\n\u002F\u002F Bytes erin, bytes eruit\npdfBytes, err := dxpdf.Convert(docxBytes)\n\n\u002F\u002F Bestand naar bestand\nerr := dxpdf.ConvertFile(\"input.docx\", \"output.pdf\")\n\n\u002F\u002F De resolutie van ingesloten afbeeldingen overschrijven (standaard 220 DPI)\npdfBytes, err := dxpdf.ConvertWithOptions(docxBytes, 300)\n",[183,977,978,992,996,1001,1029,1033,1038,1071,1075,1080],{"__ignoreMap":251},[429,979,980,983,986,989],{"class":431,"line":432},[429,981,982],{"class":696},"import",[429,984,985],{"class":507}," \"",[429,987,988],{"class":435},"github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo",[429,990,991],{"class":507},"\"\n",[429,993,994],{"class":431,"line":446},[429,995,636],{"emptyLinePlaceholder":635},[429,997,998],{"class":431,"line":556},[429,999,1000],{"class":758},"\u002F\u002F Bytes erin, bytes eruit\n",[429,1002,1003,1006,1008,1011,1014,1016,1018,1021,1023,1026],{"class":431,"line":688},[429,1004,1005],{"class":480},"pdfBytes",[429,1007,580],{"class":503},[429,1009,1010],{"class":480}," err ",[429,1012,1013],{"class":484},":=",[429,1015,534],{"class":480},[429,1017,711],{"class":503},[429,1019,1020],{"class":499},"Convert",[429,1022,504],{"class":503},[429,1024,1025],{"class":480},"docxBytes",[429,1027,1028],{"class":503},")\n",[429,1030,1031],{"class":431,"line":693},[429,1032,636],{"emptyLinePlaceholder":635},[429,1034,1035],{"class":431,"line":720},[429,1036,1037],{"class":758},"\u002F\u002F Bestand naar bestand\n",[429,1039,1040,1043,1045,1047,1049,1052,1054,1056,1059,1061,1063,1065,1067,1069],{"class":431,"line":730},[429,1041,1042],{"class":480},"err ",[429,1044,1013],{"class":484},[429,1046,534],{"class":480},[429,1048,711],{"class":503},[429,1050,1051],{"class":499},"ConvertFile",[429,1053,504],{"class":503},[429,1055,508],{"class":507},[429,1057,1058],{"class":439},"input.docx",[429,1060,508],{"class":507},[429,1062,580],{"class":503},[429,1064,985],{"class":507},[429,1066,575],{"class":439},[429,1068,508],{"class":507},[429,1070,1028],{"class":503},[429,1072,1073],{"class":431,"line":765},[429,1074,636],{"emptyLinePlaceholder":635},[429,1076,1077],{"class":431,"line":795},[429,1078,1079],{"class":758},"\u002F\u002F De resolutie van ingesloten afbeeldingen overschrijven (standaard 220 DPI)\n",[429,1081,1082,1084,1086,1088,1090,1092,1094,1097,1099,1101,1103,1107],{"class":431,"line":825},[429,1083,1005],{"class":480},[429,1085,580],{"class":503},[429,1087,1010],{"class":480},[429,1089,1013],{"class":484},[429,1091,534],{"class":480},[429,1093,711],{"class":503},[429,1095,1096],{"class":499},"ConvertWithOptions",[429,1098,504],{"class":503},[429,1100,1025],{"class":480},[429,1102,580],{"class":503},[429,1104,1106],{"class":1105},"srdBf"," 300",[429,1108,1028],{"class":503},[179,1110,1111,1112,1115],{},"Het Go-pakket is een dunne cgo-laag over dezelfde Rust-kern die de CLI en het Python-pakket gebruiken, dus het vereist ",[183,1113,1114],{},"CGO_ENABLED=1"," en een C-compiler. De voorgebouwde bibliotheek voor elk ondersteund platform staat in de repository, zodat er geen aparte download- of bouwstap is. Het draait op linux\u002Famd64, linux\u002Farm64, darwin\u002Famd64, darwin\u002Farm64 en — sinds 0.8.1 — windows\u002Famd64.",[179,1117,1118,1119,1122,1123,1126,1127,1130,1131,258,1133,1136],{},"Windows wordt als enige anders uitgerold: de andere vier linken een statisch archief dat volledig in je binary wordt opgenomen, terwijl Windows ",[183,1120,1121],{},"dxpdf.dll"," dynamisch laadt. Je gebouwde executable heeft die DLL dus ernaast of op ",[183,1124,1125],{},"PATH"," nodig tijdens runtime; kopieer hem uit de modulecache naar je releasemap. Daarnaast heeft de module geen eigen tags, dus ",[183,1128,1129],{},"go get ...\u002Fgo@v0.8.1"," lost niet op; een gewone ",[183,1132,955],{},[183,1134,1135],{},"@main"," of een commit-SHA om vast te pinnen werkt wel.",[174,1138,1140],{"id":1139},"prestaties","Prestaties",[179,1142,1143,1144,1149],{},"Gemeten op een Apple M3 Max met ",[305,1145,1148],{"href":1146,"rel":1147},"https:\u002F\u002Fgithub.com\u002Fsharkdp\u002Fhyperfine",[309],"hyperfine"," (30 runs, 5 opwarmronden) bij v0.5.1, tegen fixtures die in de repository staan. Tijden zijn afgerond op 5 ms, en de spreiding tussen runs op een normaal belaste machine is ongeveer ±10 ms, dus kleinere verschillen zeggen niets:",[1151,1152,1153,1175],"table",{},[1154,1155,1156],"thead",{},[1157,1158,1159,1163,1166,1169,1172],"tr",{},[1160,1161,1162],"th",{},"Fixture",[1160,1164,1165],{},"Pagina's",[1160,1167,1168],{},"Invoer",[1160,1170,1171],{},"Conversietijd",[1160,1173,1174],{},"Piek-RSS",[1176,1177,1178,1197,1215,1234],"tbody",{},[1157,1179,1180,1184,1187,1190,1194],{},[1181,1182,1183],"td",{},"Zakelijk document van 3 pagina's",[1181,1185,1186],{},"3",[1181,1188,1189],{},"34 KB",[1181,1191,1192],{},[197,1193,283],{},[1181,1195,1196],{},"54 MB",[1157,1198,1199,1202,1205,1208,1212],{},[1181,1200,1201],{},"Document van 7 pagina's",[1181,1203,1204],{},"7",[1181,1206,1207],{},"10 KB",[1181,1209,1210],{},[197,1211,283],{},[1181,1213,1214],{},"51 MB",[1157,1216,1217,1220,1223,1226,1231],{},[1181,1218,1219],{},"Beeldrijk document van 9 pagina's",[1181,1221,1222],{},"9",[1181,1224,1225],{},"1,3 MB",[1181,1227,1228],{},[197,1229,1230],{},"55 ms",[1181,1232,1233],{},"40 MB",[1157,1235,1236,1239,1242,1245,1249],{},[1181,1237,1238],{},"Rapport van 171 pagina's",[1181,1240,1241],{},"171",[1181,1243,1244],{},"14 MB",[1181,1246,1247],{},[197,1248,291],{},[1181,1250,1251],{},"145 MB",[179,1253,1254,1257],{},[197,1255,1256],{},"Het vinden van lettertypen bepaalt wat een conversie kost, niet de documentgrootte."," De fixture van 9 pagina's bevat veertig keer zoveel invoer als die van 3 pagina's en converteert in een derde van de tijd, omdat de lettertypen ingesloten zijn of al op de host staan — dat pad kost ongeveer 4 ms, terwijl terugvallen op de metadata-index van de host 120–185 ms kost, eenmalig. Bij batchwerk is de nuttige vraag dus niet hoe groot de documenten zijn, maar of ze lettertypen noemen die de host heeft.",[179,1259,1260],{},"De juistheid van de conversie ligt vast in tests op basis van fixtures, waaronder visuele regressietests die gerenderde PDF's vergelijken met referentiedocumenten uit Word.",[174,1262,1264],{"id":1263},"toepassingen-in-de-praktijk","Toepassingen in de praktijk",[414,1266,1268],{"id":1267},"geautomatiseerde-documentpijplijnen","Geautomatiseerde documentpijplijnen",[179,1270,1271,1272,1274],{},"CI\u002FCD-systemen of batchverwerkers die contracten, facturen of rapporten uit ",[183,1273,185],{},"-sjablonen genereren. dxpdf draait als één binary — geen LibreOffice-installatie, geen Docker-image met een volledige desktopomgeving, geen API-kosten per document.",[414,1276,1278],{"id":1277},"gereguleerde-omgevingen","Gereguleerde omgevingen",[179,1280,1281],{},"Toepassingen in de zorg, de advocatuur en de financiële sector waar documenten het netwerk niet mogen verlaten. dxpdf draait volledig offline zonder aanroepen naar externe diensten, wat het geschikt maakt voor afgeschermde en lokale uitrol.",[414,1283,1285],{"id":1284},"embedded-en-edge","Embedded en edge",[179,1287,1288],{},"IoT-apparaten, kiosken of lichte containers waar een kantoorsuite van 500 MB installeren niet praktisch is. Het geheugengebruik van enkele tientallen megabytes en de conversietijden onder de seconde maken dxpdf haalbaar in omgevingen met weinig middelen.",[414,1290,1292],{"id":1291},"backends-in-python-en-go","Backends in Python en Go",[179,1294,1295],{},"Diensten in Django, Flask of FastAPI die geüploade DOCX-bestanden ter plekke moeten omzetten. De Python-bindings verpakken de Rust-kern via PyO3 en leveren native prestaties zonder subproces of externe dienst.",[179,1297,1298,1299,1302],{},"Go-diensten krijgen dezelfde kern via cgo: een handler roept ",[183,1300,1301],{},"dxpdf.Convert"," direct aan in plaats van een binary te starten of een sidecar te bevragen, waardoor de conversie binnen de goroutine en de foutafhandeling van het request zelf blijft.",[174,1304,1306],{"id":1305},"releasenotities","Releasenotities",[179,1308,1309,1310,1313],{},"De nieuwste release is ",[197,1311,1312],{},"0.8.1",". Sinds 0.5.0 zijn er vier releases uitgekomen, die samen een taalbinding en een nieuw soort inhoud toevoegden:",[191,1315,1316,1338,1344,1350],{},[194,1317,1318,1321,1322,1325,1326,1329,1330,1333,1334,1337],{},[197,1319,1320],{},"0.6.0"," — Go-bindings bovenop een nieuwe C-ABI, plus tabelcorrecties: de buitenrand van een tabel met celafstand, ",[183,1323,1324],{},"vMerge","-overloop die naar de laatste rij van de samenvoeging gaat, verticale ",[183,1327,1328],{},"inside","\u002F",[183,1331,1332],{},"outside","-randen die met de pariteit van de pagina meespiegelen, en verborgen ",[183,1335,1336],{},"w:vanish","-runs die uit de lay-out worden verwijderd in plaats van getekend.",[194,1339,1340,1343],{},[197,1341,1342],{},"0.7.0"," — het renderen van OMML-formules, samen met correcties voor overlappende kolommen bij een doorlopend sectie-einde, tokenafbreking volgens LB25 uit UAX #14, en de PUA-tabel van het Symbol-lettertype. Formules dragen hyperlinks en verschijnen in outlinetitels.",[194,1345,1346,1349],{},[197,1347,1348],{},"0.8.0"," — de wiskundeweg verfijnd: consistente breukgeometrie, superscripts boven een breuk, voetnootnummers die het lettertype van de openende formule overnemen, en correcte verwerking van het koppelteken bij niet-ASCII-cijfers. Daarnaast worden universele maten volgens §22.9.2.15 en procentnotaties volgens §22.9.2.9 gelezen.",[194,1351,1352,1354],{},[197,1353,1312],{}," — windows\u002Famd64 komt bij de Go-bindings, en de Python-bindings geven de GIL vrij voor de duur van een conversie.",[179,1356,1357,1358,1362],{},"Het uitgebreide verhaal over 0.5.0, ",[305,1359,1361],{"href":1360},"\u002Fblog\u002Fdxpdf-0-5-0-release","dxpdf 0.5.0: een DOCX-converter de rest van de wereld leren lezen",", beschrijft nog steeds het internationalisatiewerk waarop dit alles rust — regelafbreking volgens UAX #14, bidirectionele tekst volgens UAX #9, en getallen en datums die door CLDR worden gestuurd en de taal van het document volgen.",[1364,1365],"questions",{":items":1366},"[{\"title\":\"Heeft dxpdf Microsoft Office of LibreOffice nodig?\",\"text\":\"Nee. dxpdf is een zelfstandige converter die DOCX-bestanden rechtstreeks leest en PDF's rendert met Googles grafische engine Skia. Hij heeft geen enkele afhankelijkheid van een kantoorsuite.\"},{\"title\":\"Welke talen en platforms ondersteunt dxpdf?\",\"text\":\"dxpdf is geschreven in Rust en beschikbaar als CLI-tool (via cargo install), als Rust-bibliotheek (via crates.io), als Python-pakket (via PyPI) en als Go-bindings (via go get github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo). Alle vier draaien op macOS, Linux en Windows; de Go-bindings dekken linux\u002Famd64, linux\u002Farm64, darwin\u002Famd64, darwin\u002Farm64 en, sinds 0.8.1, windows\u002Famd64.\"},{\"title\":\"Hoe nauwkeurig is de conversie?\",\"text\":\"dxpdf gebruikt een door Flutter geïnspireerde pijplijn van meten-dan-plaatsen die is ontworpen op getrouwheid tot op de pixel, getoetst aan ISO 29500 met 75 regels volledig geïmplementeerd, 12 gedeeltelijk en 11 nog niet ondersteund. Visuele regressietests vergelijken de uitvoer met referenties uit Word.\"},{\"title\":\"Hoe snel is dxpdf?\",\"text\":\"Op een Apple M3 Max converteert dxpdf de meegeleverde fixtures in 55-170 ms en een document van 171 pagina's en 14 MB in ongeveer 420 ms. Het vinden van lettertypen weegt zwaarder dan de documentgrootte: lettertypen die ingesloten zijn of al op de host staan zijn in ongeveer 4 ms gevonden, terwijl terugvallen op de metadata-index van de host eenmalig 120-185 ms kost. Het is snel genoeg om binnen een webrequesthandler te draaien.\"},{\"title\":\"Kan ik dxpdf in een Python-applicatie gebruiken?\",\"text\":\"Ja. Installeer met pip install dxpdf. Het Python-pakket verpakt de Rust-kern via PyO3 en levert native prestaties. Gebruik dxpdf.convert() voor bytes erin en bytes eruit, of dxpdf.convert_file() voor conversie van bestand naar bestand.\"},{\"title\":\"Kan ik dxpdf vanuit Go gebruiken?\",\"text\":\"Ja, sinds 0.6.0. Voer go get github.com\u002Fnerdy-pro\u002Fdxpdf\u002Fgo uit en roep dxpdf.Convert aan voor bytes erin en bytes eruit, of dxpdf.ConvertFile voor bestand naar bestand; ConvertWithOptions en ConvertFileWithOptions nemen een afbeeldings-DPI. Het is een cgo-laag over dezelfde Rust-kern, dus het vereist CGO_ENABLED=1 en een C-compiler. Het ondersteunt linux en macOS op amd64 en arm64, en sinds 0.8.1 ook windows\u002Famd64 — op Windows laadt de binding dxpdf.dll dynamisch, dus lever die DLL mee naast je executable. De Go-module heeft geen eigen tags, dus pin met een commit-SHA in plaats van een versietag.\"},{\"title\":\"Welke DOCX-functies worden nog niet ondersteund?\",\"text\":\"Nog niet ondersteund: herordening van Indische schriften, automatische woordafbreking, bijgehouden wijzigingen en opmerkingen, SmartArt en grafieken, paginaranden en het documentraster, WMF- en SVG-afbeeldingen, de teksteffecten schaduw, contour, reliëf en gravure, patroonarcering van cellen, gespiegelde tabstops en nummeringslabels onder w:bidi, en de telsysteemnotaties zoals chineseCounting. Gedeeltelijk ondersteund: doorhaling en klein kapitaal worden wel gelezen maar niet gerenderd, de meeste randstijlen worden benaderd als doorlopende lijnen, strakke en doorlopende beeldomloop gebruiken het omhullende kader in plaats van een veelhoek, EMF-afbeeldingen decoderen slechts één ingesloten bitmap, sectie-einden even, odd en nextColumn worden als nextPage behandeld, celbreedtes in procenten en auto vallen terug op het tabelraster, en terugval per glyph haalt een ontbrekend teken uit elk host-lettertype dat het dekt, waardoor de uitvoer afhankelijk is van de host en er nog geen w:lang-hint wordt doorgegeven, wat Han-tekst de glyphvormen van de verkeerde taal kan geven.\"}]",[1368,1369,1370],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s3--O, html code.shiki .s3--O{--shiki-light:#E2931D;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":251,"searchDepth":446,"depth":446,"links":1372},[1373,1374,1375,1376,1382,1383,1389],{"id":176,"depth":446,"text":177},{"id":223,"depth":446,"text":224},{"id":295,"depth":446,"text":296},{"id":411,"depth":446,"text":412,"children":1377},[1378,1379,1380,1381],{"id":416,"depth":556,"text":417},{"id":461,"depth":556,"text":462},{"id":885,"depth":556,"text":886},{"id":948,"depth":556,"text":949},{"id":1139,"depth":446,"text":1140},{"id":1263,"depth":446,"text":1264,"children":1384},[1385,1386,1387,1388],{"id":1267,"depth":556,"text":1268},{"id":1277,"depth":556,"text":1278},{"id":1284,"depth":556,"text":1285},{"id":1291,"depth":556,"text":1292},{"id":1305,"depth":446,"text":1306},"Een snelle, zelfstandige DOCX-naar-PDF-converter geschreven in Rust en aangedreven door Skia — zonder Microsoft Office, LibreOffice of cloud-API. Beschikbaar als CLI-tool, Rust-bibliotheek, Python-pakket en Go-bindings.","md",[1393,1396],{"type":1394,"url":1395},"crates_io","https:\u002F\u002Fcrates.io\u002Fcrates\u002Fdxpdf",{"type":1397,"url":1398},"pypi","https:\u002F\u002Fpypi.org\u002Fproject\u002Fdxpdf\u002F",{},"Een snelle, zelfstandige DOCX-naar-PDF-converter in Rust, aangedreven door Skia — geen Office of cloud-API. Als CLI, Rust- of Go-bibliotheek en Python-pakket.",null,"Word-documenten naar PDF zonder Office, LibreOffice of cloud-API — één Rust-binary die OOXML rechtstreeks leest en via Skia tekent.","\u002Fopen-source\u002Fdxpdf",{"type":1405,"company":1406,"name":169},"github","nerdy-pro",{"title":169,"description":1390},"open-source\u002Fdxpdf",[126,106,51],"2026-09-14","D3OtxhHwgBsjdI4EEnJQLYXTn33ISyLtArP-jWvo8HE",{"forks":825,"stars":1413,"contributors":1414,"last_release":1434,"issues":1435,"has_contribution_guide":1436,"license":1437,"last_updated":1438,"watchers":1413},43,[1415,1420,1425,1430],{"login":1416,"profile_url":1417,"avatar_url":1418,"contributions":1419},"thenixan","https:\u002F\u002Fgithub.com\u002Fthenixan","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3602098?v=4",1080,{"login":1421,"profile_url":1422,"avatar_url":1423,"contributions":1424},"markovdigital","https:\u002F\u002Fgithub.com\u002Fmarkovdigital","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F15268617?v=4",29,{"login":1426,"profile_url":1427,"avatar_url":1428,"contributions":1429},"ikashapov","https:\u002F\u002Fgithub.com\u002Fikashapov","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F3253046?v=4",14,{"login":1431,"profile_url":1432,"avatar_url":1433,"contributions":446},"denizsafak","https:\u002F\u002Fgithub.com\u002Fdenizsafak","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F39929354?v=4","v0.8.1",19,false,"MIT","2026-09-21T16:10:10Z",[1440,1454,1475,1488,1502,1515,1529,1546,1559,1574,1588,1601,1616,1630,1646,1656,1669,1680,1690,1703,1715,1725,1740,1749,1762,1776,1783,1795,1808,1819,1834,1847,1860,1873,1886,1899,1912,1923,1934,1946,1957,1969,1979,1991,2004,2017,2029,2043,2054,2066,2080,2089,2101],{"slug":1441,"term":1442,"definition":1443,"category":1444,"aliases":1445,"links":1447,"related":1451,"readMore":-1,"target":1453,"hasArticle":1436},"aosp","AOSP","Het Android Open Source Project — Android zonder de Google-laag erbovenop, door iedereen vrij te forken. Kassaterminals, kiosken en autosystemen draaien op forks ervan, en werken op dat niveau legt delen van het OS bloot die een app-ontwikkelaar nooit ziet.","platform",[1446],"Android Open Source Project",[1448],{"kind":1449,"url":1450},"website","https:\u002F\u002Fsource.android.com\u002F",[1452],"host-card-emulation","\u002Fglossary#aosp",{"slug":1455,"term":1456,"definition":1457,"category":1458,"aliases":1459,"links":1464,"related":1470,"readMore":-1,"target":1474,"hasArticle":1436},"gdpr","AVG","De EU-verordening over persoonsgegevens van mensen in de EU: een rechtsgrond om ze te verzamelen, echte toestemming voor tracking, en het recht om ze in te zien en te laten wissen. Ze volgt je gebruikers, niet je servers, en geldt dus ongeacht waar het bedrijf staat ingeschreven.","practice",[1460,1461,1462,1463],"GDPR","General Data Protection Regulation","Algemene verordening gegevensbescherming","gegevensbescherming",[1465,1467],{"kind":1449,"url":1466},"https:\u002F\u002Fgdpr.eu\u002F",{"kind":1468,"url":1469},"wikipedia","https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGeneral_Data_Protection_Regulation",[1471,1472,1473],"pci-dss","soc-2","hipaa","\u002Fglossary#gdpr",{"slug":1476,"term":1477,"definition":1478,"category":1444,"aliases":1479,"links":1480,"related":1484,"readMore":-1,"target":1487,"hasArticle":1436},"app-clips","App Clips","Een Apple-functie die een klein stuk van een iOS-app draait — onder de 15 MB — zonder het geheel te installeren. Te starten via een QR-code, een NFC-tag of een link, voor als de eerste handeling van een gebruiker niet eerst een gang naar de App Store zou moeten vergen.",[],[1481],{"kind":1482,"url":1483},"documentation","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-clips\u002F",[1485,1486],"deep-linking","install-referrer","\u002Fglossary#app-clips",{"slug":1489,"term":1490,"definition":1491,"category":1444,"aliases":1492,"links":1493,"related":1498,"readMore":-1,"target":1501,"hasArticle":1436},"bigquery","BigQuery","Het analytische datawarehouse van Google Cloud. Je laat SQL los op miljarden rijen en het scant ze in seconden, op opslag die losstaat van de machines die de query uitvoeren — en juist dat houdt rapportage en verkenning weg bij de database die het live verkeer bedient.",[],[1494,1496],{"kind":1449,"url":1495},"https:\u002F\u002Fcloud.google.com\u002Fbigquery",{"kind":1468,"url":1497},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBigQuery",[1499,1500],"object-storage","elasticsearch","\u002Fglossary#bigquery",{"slug":219,"term":1503,"definition":1504,"category":1458,"aliases":1505,"links":1510,"related":1513,"readMore":-1,"target":1514,"hasArticle":1436},"CI\u002FCD","Automatisering die elke wijziging bouwt, test en uitlevert zonder dat iemand handmatig commando's uitvoert. Op mobiel is het wat van een release een druk op de knop maakt in plaats van een middag wachten tot iemand anders tijd heeft.",[1506,1507,1508,1509],"CI","continuous integration","continuous delivery","continue integratie",[1511],{"kind":1468,"url":1512},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCI\u002FCD",[],"\u002Fglossary#ci-cd",{"slug":1516,"term":1517,"definition":1518,"category":1519,"aliases":1520,"links":1522,"related":1525,"readMore":-1,"target":1528,"hasArticle":1436},"crud","CRUD","Create, read, update, delete — de vier bewerkingen achter zo goed als elk formulier en elk beheerscherm. Verzamelnaam voor de helft van een app die routinematig gegevensbeheer is, tegenover de delen die echte domeinlogica dragen.","architecture",[1521],"Create, Read, Update, Delete",[1523],{"kind":1468,"url":1524},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FCreate,_read,_update_and_delete",[1526,1527],"rest","graphql","\u002Fglossary#crud",{"slug":1530,"term":1531,"definition":1532,"category":1519,"aliases":1533,"links":1539,"related":1542,"readMore":-1,"target":1545,"hasArticle":1436},"container-registry","Containerregistry","Een gehoste opslagplaats voor container-images, aangesproken op naam en tag — Docker Hub, GitHub Container Registry, of die van je eigen cloudprovider. Een build daarheen pushen verandert 'werkt op mijn machine' in een image die iedereen ongewijzigd kan pullen en draaien.",[1534,1535,1536,1537,1538],"container registry","image registry","Docker registry","GHCR","ghcr.io",[1540],{"kind":1482,"url":1541},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fpackages\u002Fworking-with-a-github-packages-registry\u002Fworking-with-the-container-registry",[1543,1544],"dev-container","multi-arch-image","\u002Fglossary#container-registry",{"slug":1485,"term":1547,"definition":1548,"category":1444,"aliases":1549,"links":1554,"related":1557,"readMore":1558,"target":1558,"hasArticle":635},"Deep linking","Een link die een specifiek scherm in een geïnstalleerde app opent in plaats van het beginscherm of een webpagina. Deferred deep linking overleeft een installatie, zodat een tik die via de appwinkel loopt alsnog op het juiste scherm landt.",[1550,1551,1552,1553],"deferred deep linking","universal links","Android App Links","diepe links",[1555],{"kind":1468,"url":1556},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMobile_deep_linking",[1476,1486],"\u002Fglossary\u002Fdeep-linking",{"slug":1543,"term":1560,"definition":1561,"category":1458,"aliases":1562,"links":1567,"related":1572,"readMore":-1,"target":1573,"hasArticle":1436},"Dev Container","Een ontwikkelomgeving die één keer beschreven staat in devcontainer.json — het OS, de tools en de runtimeversies die een project nodig heeft — en die bij iedere bijdrager identiek in een container opent, in plaats van een installatiehandleiding die iedereen anders leest.",[1563,1564,1565,1566],"devcontainer.json","Dev Containers","VS Code Dev Containers","ontwikkelcontainer",[1568,1570],{"kind":1449,"url":1569},"https:\u002F\u002Fcontainers.dev\u002F",{"kind":1482,"url":1571},"https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fdevcontainers\u002Fcontainers",[1530],"\u002Fglossary#dev-container",{"slug":1575,"term":1576,"definition":1577,"category":1519,"aliases":1578,"links":1583,"related":1586,"readMore":-1,"target":1587,"hasArticle":1436},"floating-point","Drijvende komma","Het binaire IEEE 754-formaat achter double en float. Het kan 0,1 niet exact weergeven, dus 0.1 + 0.2 is 0.30000000000000004 — onzichtbaar in graphics en fataal bij geld, dat thuishoort in gehele kleinste eenheden (centen) of een decimaal type.",[1579,1580,1581,1582],"IEEE 754","double","floating point","zwevende komma",[1584],{"kind":1468,"url":1585},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FIEEE_754",[],"\u002Fglossary#floating-point",{"slug":1500,"term":1589,"definition":1590,"category":1444,"aliases":1591,"links":1594,"related":1599,"readMore":-1,"target":1600,"hasArticle":1436},"Elasticsearch","Een zoek- en analysemachine die records indexeert zodat je ze interactief kunt filteren en doorzoeken in plaats van ze te scannen. Waar je naar grijpt als de vraag 'laat me deze specifieke sessies zien, op zes manieren ingeperkt' is en niet 'tel deze kolom op'.",[1592,1593],"Elastic","ELK",[1595,1597],{"kind":1449,"url":1596},"https:\u002F\u002Fwww.elastic.co\u002Felasticsearch",{"kind":1468,"url":1598},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FElasticsearch",[1489],"\u002Fglossary#elasticsearch",{"slug":1602,"term":1603,"definition":1604,"category":1519,"aliases":1605,"links":1609,"related":1612,"readMore":-1,"target":1615,"hasArticle":1436},"end-to-end-encryption","End-to-end-versleuteling","Versleuteling die op het verzendende apparaat wordt aangebracht en pas op het ontvangende weer wordt weggehaald, zodat de dienst die het bericht vervoert het niet kan lezen — niet na een vordering, niet na een datalek. Het beschermt de inhoud, nooit de metadata.",[1606,1607,1608],"E2EE","end-to-end encryption","end-to-end versleuteld",[1610],{"kind":1468,"url":1611},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FEnd-to-end_encryption",[1613,1614],"tls","jwt","\u002Fglossary#end-to-end-encryption",{"slug":1617,"term":1618,"definition":1619,"category":1519,"aliases":1620,"links":1624,"related":1625,"readMore":-1,"target":1629,"hasArticle":1436},"fan-out","Fan-out","Eén keer uit een bron lezen en elke update afleveren bij iedere client die erop geabonneerd is. De naïeve versie schrijft in een lus naar abonnees en loopt vast zodra één socket traag is; een echte buffert per client en laat vallen wie niet kan bijbenen.",[1621,1622,1623],"fanout","broadcast","uitzending",[],[1626,1627,1628],"websocket","pub-sub","server-sent-events","\u002Fglossary#fan-out",{"slug":1631,"term":1632,"definition":1633,"category":1458,"aliases":1634,"links":1638,"related":1641,"readMore":-1,"target":1645,"hasArticle":1436},"feature-flags","Feature flags","Schakelaars die functionaliteit aan- of uitzetten vanuit configuratie in plaats van vanuit een release. Ze laten één binary zich per merk, markt of gebruiker anders gedragen, en laten je een riskante functie uitzetten zonder een nieuwe build door de review te sturen.",[1635,1636,1637],"feature flag","feature toggle","functieschakelaar",[1639],{"kind":1468,"url":1640},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FFeature_toggle",[1642,1643,1644],"staged-rollout","white-label","multi-tenancy","\u002Fglossary#feature-flags",{"slug":1642,"term":1647,"definition":1648,"category":1458,"aliases":1649,"links":1653,"related":1654,"readMore":-1,"target":1655,"hasArticle":1436},"Gefaseerde uitrol","Een build eerst naar een klein percentage gebruikers uitbrengen en pas verbreden als het crashvrije percentage standhoudt. Een slechte build die je bij tien procent betrapt is een slechte middag; dezelfde build bij honderd procent is een slechte week.",[1650,1651,1652],"staged rollout","gefaseerde release","canary release",[],[1631,219],"\u002Fglossary#staged-rollout",{"slug":1657,"term":1658,"definition":1659,"category":1458,"aliases":1660,"links":1664,"related":1667,"readMore":-1,"target":1668,"hasArticle":1436},"golden-test","Golden test","Een test die een widget rendert en het resultaat pixel voor pixel vergelijkt met een opgeslagen referentiebeeld. In Flutter is het de goedkoopste manier om te zien of een herontwerp de empty state brak op 320pt, in donkere modus, bij 200% tekstgrootte.",[1661,1662,1663],"golden tests","screenshottest","snapshottest",[1665],{"kind":1482,"url":1666},"https:\u002F\u002Fapi.flutter.dev\u002Fflutter\u002Fflutter_test\u002FmatchesGoldenFile.html",[219],"\u002Fglossary#golden-test",{"slug":1527,"term":1670,"definition":1671,"category":1519,"aliases":1672,"links":1673,"related":1678,"readMore":-1,"target":1679,"hasArticle":1436},"GraphQL","Een querytaal voor API's waarin de client precies de velden benoemt die hij wil en één antwoord terugkrijgt dat daarop past. Het haalt de over-fetching weg waar REST-endpoints naar afglijden, en voegt er een eigen faalmodus aan toe: een onbegrensde query die het hele datamodel afloopt.",[],[1674,1676],{"kind":1449,"url":1675},"https:\u002F\u002Fgraphql.org\u002F",{"kind":1468,"url":1677},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FGraphQL",[1526],"\u002Fglossary#graphql",{"slug":1473,"term":1681,"definition":1682,"category":1458,"aliases":1683,"links":1685,"related":1688,"readMore":-1,"target":1689,"hasArticle":1436},"HIPAA","De Amerikaanse wet over beschermde gezondheidsinformatie — hoe die opgeslagen, verstuurd, gelogd en gedeeld mag worden. Net als PCI-DSS is het een architectuurkeuze aan het begin, geen beleidsstuk dat je vlak voor de lancering toevoegt.",[1684],"Health Insurance Portability and Accountability Act",[1686],{"kind":1468,"url":1687},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHealth_Insurance_Portability_and_Accountability_Act",[1471,1455,1472],"\u002Fglossary#hipaa",{"slug":1691,"term":1692,"definition":1693,"category":1519,"aliases":1694,"links":1697,"related":1700,"readMore":-1,"target":1702,"hasArticle":1436},"headless-cms","Headless CMS","Een contentsysteem met een redactieomgeving en een API, maar zonder eigen front-end. Redacteuren publiceren op één plek, en de site of app rendert die content zelf — zodat de presentatielaag van jou is en niet van de CMS-leverancier.",[1695,1696],"headless contentmanagementsysteem","content-API",[1698],{"kind":1468,"url":1699},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FHeadless_content_management_system",[1701,1526],"server-side-rendering","\u002Fglossary#headless-cms",{"slug":1452,"term":1704,"definition":1705,"category":1444,"aliases":1706,"links":1710,"related":1713,"readMore":-1,"target":1714,"hasArticle":1436},"Host Card Emulation","Een Android-telefoon zich in software laten gedragen als een contactloze kaart via NFC, zonder secure element in hardware. Zo betaalt een wallet-app bij een terminal: de telefoon spreekt hetzelfde contactloze EMV-protocol als de plastic kaart zou hebben gedaan.",[1707,1708,1709],"HCE","EMV Contactless","contactloos betalen",[1711],{"kind":1482,"url":1712},"https:\u002F\u002Fdeveloper.android.com\u002Fdevelop\u002Fconnectivity\u002Fnfc\u002Fhce",[1471,1441],"\u002Fglossary#host-card-emulation",{"slug":1716,"term":1717,"definition":1718,"category":1444,"aliases":1719,"links":1720,"related":1723,"readMore":-1,"target":1724,"hasArticle":1436},"impeller","Impeller","De renderengine die Flutter vandaag gebruikt, standaard op iOS sinds 2023 en op Android sinds 2024. Hij compileert zijn shaders vooraf in plaats van tijdens de eerste animatie, wat de shader-jank wegnam die Flutters zichtbaarste productieprobleem was.",[],[1721],{"kind":1482,"url":1722},"https:\u002F\u002Fdocs.flutter.dev\u002Fperf\u002Fimpeller",[230],"\u002Fglossary#impeller",{"slug":1726,"term":1727,"definition":1728,"category":1729,"aliases":1730,"links":1734,"related":1737,"readMore":-1,"target":1739,"hasArticle":1436},"in-app-purchase","In-app-aankoop","Digitale goederen of een abonnement verkopen via de Apple- of Google-billing die beide winkels verplicht stellen voor digitale content en waarover ze commissie rekenen. Het moeilijke is nooit de aankoop; het is het herstellen ervan op een nieuw toestel en de rechten kloppend houden.","business",[1731,1732,1733],"IAP","in-app purchase","in-app-abonnement",[1735],{"kind":1482,"url":1736},"https:\u002F\u002Fdeveloper.apple.com\u002Fin-app-purchase\u002F",[1738],"product-market-fit","\u002Fglossary#in-app-purchase",{"slug":1486,"term":1741,"definition":1742,"category":1444,"aliases":1743,"links":1744,"related":1747,"readMore":-1,"target":1748,"hasArticle":1436},"Install Referrer","Een Google Play-API die een net geïnstalleerde Android-app de campagneparameters overhandigt van de link die tot de installatie leidde. De Android-helft van deferred deep linking, en de betrouwbare manier om te weten waar een gebruiker vandaan kwam.",[],[1745],{"kind":1482,"url":1746},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Finstallreferrer",[1485,1476],"\u002Fglossary#install-referrer",{"slug":1614,"term":1750,"definition":1751,"category":1752,"aliases":1753,"links":1755,"related":1760,"readMore":-1,"target":1761,"hasArticle":1436},"JWT","Een ondertekend token dat zijn eigen claims meedraagt, zodat een server kan zien bij wie een verzoek hoort zonder een sessie op te zoeken. Standaard voor mobiele authenticatie. De handtekening bewijst dat er niets is gewijzigd; ze verbergt niet wat erin staat.","protocol",[1754],"JSON Web Token",[1756,1758],{"kind":1449,"url":1757},"https:\u002F\u002Fjwt.io\u002F",{"kind":1468,"url":1759},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FJSON_Web_Token",[1471],"\u002Fglossary#jwt",{"slug":1763,"term":1764,"definition":1765,"category":1458,"aliases":1766,"links":1771,"related":1774,"readMore":-1,"target":1775,"hasArticle":1436},"kyc","KYC","Know Your Customer — de identiteitscontroles die een gereguleerd financieel product uitvoert voordat het iemand geld laat verplaatsen: documentscans, liveness, sanctie- en witwascontroles. Het bepaalt de onboarding sterker dan welke ontwerpkeuze ook.",[1767,1768,1769,1770],"Know Your Customer","AML","KYC\u002FAML","witwascontrole",[1772],{"kind":1468,"url":1773},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FKnow_your_customer",[1471,1455],"\u002Fglossary#kyc",{"slug":76,"term":74,"definition":1777,"category":1444,"aliases":1778,"links":1780,"related":1781,"readMore":1782,"target":1782,"hasArticle":1436},"Bedrijfslogica geschreven in Kotlin delen tussen Android, iOS en de server, terwijl elk platform zijn eigen native UI houdt. Het alternatief voor Flutter wanneer de interface native moet zijn maar de regels erachter niet.",[1779],"KMP",[],[],"\u002Ftechnologies\u002Fkmp",{"slug":1784,"term":1785,"definition":1786,"category":1729,"aliases":1787,"links":1790,"related":1793,"readMore":-1,"target":1794,"hasArticle":1436},"mvp","MVP","De kleinste versie van een product die je aan echte gebruikers kunt uitbrengen en die nog steeds de vraag beantwoordt waarvoor je het bouwde. Een besluit over scope, niet over kwaliteit — een MVP moet nog altijd werken.",[1788,1789],"minimum viable product","minimaal levensvatbaar product",[1791],{"kind":1468,"url":1792},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMinimum_viable_product",[1643],"\u002Fglossary#mvp",{"slug":1544,"term":1796,"definition":1797,"category":1519,"aliases":1798,"links":1803,"related":1806,"readMore":-1,"target":1807,"hasArticle":1436},"Multi-architectuur-image","Eén image-tag die per CPU-architectuur naar andere binaries verwijst — linux\u002Famd64 en linux\u002Farm64 zijn het gebruikelijke paar — zodat dezelfde docker pull ongewijzigd werkt op Intel- en AMD-servers en op Apple Silicon-laptops.",[1799,1800,1801,1802],"multi-arch build","multi-arch image","multi-platform image","linux\u002Famd64 + linux\u002Farm64",[1804],{"kind":1482,"url":1805},"https:\u002F\u002Fdocs.docker.com\u002Fbuild\u002Fbuilding\u002Fmulti-platform\u002F",[1530],"\u002Fglossary#multi-arch-image",{"slug":1644,"term":1809,"definition":1810,"category":1519,"aliases":1811,"links":1814,"related":1817,"readMore":-1,"target":1818,"hasArticle":1436},"Multi-tenancy","Eén deployment die veel klanten bedient, waarbij elke klant alleen zijn eigen data, configuratie en ingeschakelde functies ziet doordat de tenantcontext per verzoek wordt bepaald. Het is wat een vloot merkapps één product maakt in plaats van veel forks.",[1812,1813],"multi-tenant","tenant",[1815],{"kind":1468,"url":1816},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FMultitenancy",[1643,1631],"\u002Fglossary#multi-tenancy",{"slug":1820,"term":1821,"definition":1822,"category":1752,"aliases":1823,"links":1827,"related":1832,"readMore":-1,"target":1833,"hasArticle":1436},"oauth","OAuth","De standaard achter Inloggen met Apple, Google en de rest: de gebruiker geeft je app toestemming bij een aanbieder die hij al vertrouwt, en je app krijgt een token in plaats van zijn wachtwoord. Niemand hoeft nieuwe inloggegevens te verzinnen en jij bewaart ze nergens.",[1824,1825,1826],"OAuth 2.0","social login","Inloggen met Apple",[1828,1830],{"kind":1449,"url":1829},"https:\u002F\u002Foauth.net\u002F2\u002F",{"kind":1468,"url":1831},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOAuth",[1614],"\u002Fglossary#oauth",{"slug":1499,"term":1835,"definition":1836,"category":1519,"aliases":1837,"links":1842,"related":1845,"readMore":-1,"target":1846,"hasArticle":1436},"Objectopslag","Opslag die een heel bestand onder een sleutel bewaart in plaats van in een mappenboom — Amazon S3 en de vele diensten die zijn API spreken. Goedkoop, praktisch onbeperkt, en de gebruikelijke plek voor ruwe events, back-ups en media: eenmaal geschreven, zelden gelezen, eeuwig bewaard.",[1838,1839,1840,1841],"S3","S3-compatibele opslag","object storage","blob storage",[1843],{"kind":1468,"url":1844},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FObject_storage",[1489],"\u002Fglossary#object-storage",{"slug":1471,"term":1848,"definition":1849,"category":1458,"aliases":1850,"links":1853,"related":1858,"readMore":-1,"target":1859,"hasArticle":1436},"PCI-DSS","De beveiligingsstandaard van de kaartindustrie die iedereen bindt die kaartgegevens opslaat, verwerkt of verstuurt. De meeste apps blijven er bewust buiten door de kaartinvoer over te laten aan een gecertificeerde betaaldienstverlener.",[1851,1852],"PCI DSS","Payment Card Industry Data Security Standard",[1854,1856],{"kind":1449,"url":1855},"https:\u002F\u002Fwww.pcisecuritystandards.org\u002F",{"kind":1468,"url":1857},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPayment_Card_Industry_Data_Security_Standard",[1614],"\u002Fglossary#pci-dss",{"slug":1861,"term":1862,"definition":1863,"category":1444,"aliases":1864,"links":1868,"related":1871,"readMore":-1,"target":1872,"hasArticle":1436},"platform-channels","Platform channels","De brug waarmee een Flutter-app native iOS- en Android-code aanroept — Keychain en Keystore, biometrie, betaalschermen, elke SDK zonder Dart-pakket. Routinewerk maar echt werk, en de eerste plek waar een engineer die nooit buiten Dart kwam vastloopt.",[1865,1866,1867],"platform channel","method channel","platformkanaal",[1869],{"kind":1482,"url":1870},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fplatform-channels",[76],"\u002Fglossary#platform-channels",{"slug":1874,"term":1875,"definition":1876,"category":1752,"aliases":1877,"links":1881,"related":1884,"readMore":-1,"target":1885,"hasArticle":1436},"post-quantum-cryptography","Post-quantumcryptografie","Versleutelingsalgoritmen die veilig moeten blijven tegen een toekomstige quantumcomputer, inmiddels gestandaardiseerd door NIST. De migratie is nu al dringend, nog vóór die hardware bestaat, omdat verkeer dat vandaag wordt onderschept later alsnog te ontsleutelen valt.",[1878,1879,1880],"PQC","post-quantum cryptography","postkwantumcryptografie",[1882],{"kind":1468,"url":1883},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPost-quantum_cryptography",[1613,1602],"\u002Fglossary#post-quantum-cryptography",{"slug":1738,"term":1887,"definition":1888,"category":1729,"aliases":1889,"links":1893,"related":1896,"readMore":-1,"target":1898,"hasArticle":1436},"Product-market fit","Het punt waarop een product aantoonbaar mensen heeft gevonden die het willen — ze gebruiken het, komen terug en betalen. Daarvoor beantwoordt engineering een vraag; daarna bedient engineering de vraag.",[1890,1891,1892],"PMF","product\u002Fmarket fit","productmarktfit",[1894],{"kind":1468,"url":1895},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FProduct-market_fit",[1784,1897],"time-to-market","\u002Fglossary#product-market-fit",{"slug":1900,"term":1901,"definition":1902,"category":1458,"aliases":1903,"links":1906,"related":1909,"readMore":-1,"target":1911,"hasArticle":1436},"prompt-injection","Prompt injection","Een aanval waarbij tekst van een gebruiker door een taalmodel als instructie wordt gelezen in plaats van als data, en het model zo om zijn eigen regels heen wordt gestuurd. De LLM-variant van SQL-injectie, en hij duikt overal op waar gebruikersinvoer in een prompt wordt geplakt.",[1904,1905],"injectieaanval","injection attack",[1907],{"kind":1468,"url":1908},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPrompt_injection",[1910],"rate-limiting","\u002Fglossary#prompt-injection",{"slug":1627,"term":1913,"definition":1914,"category":1519,"aliases":1915,"links":1918,"related":1921,"readMore":-1,"target":1922,"hasArticle":1436},"Pub\u002FSub","Een berichtenpatroon waarin een producent een gebeurtenis publiceert en willekeurig veel consumenten die elk voor zich lezen, met een broker ertussen. De producent wacht nooit op ze, en zo blijft een verzoekpad snel terwijl het tragere werk erachter gebeurt.",[1916,1917],"publish\u002Fsubscribe","Google Cloud Pub\u002FSub",[1919],{"kind":1468,"url":1920},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FPublish%E2%80%93subscribe_pattern",[],"\u002Fglossary#pub-sub",{"slug":1526,"term":1924,"definition":1925,"category":1519,"aliases":1926,"links":1929,"related":1932,"readMore":-1,"target":1933,"hasArticle":1436},"REST","De gangbare stijl voor HTTP-API's: een URL benoemt een resource en het HTTP-werkwoord zegt wat ermee moet gebeuren. De standaardmanier waarop een app met een backend praat, en wat de meeste externe integraties verwachten aan te treffen.",[1927,1928],"REST API","Representational State Transfer",[1930],{"kind":1468,"url":1931},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FREST",[1626,1628],"\u002Fglossary#rest",{"slug":1910,"term":1935,"definition":1936,"category":1458,"aliases":1937,"links":1941,"related":1944,"readMore":-1,"target":1945,"hasArticle":1436},"Rate limiting","Een bovengrens op het aantal verzoeken dat één aanroeper binnen een bepaald venster mag doen. Het houdt tegen dat één enthousiaste gebruiker, een scraper of een bot in een middag een maand aan betaald API-budget opmaakt, en het moet aan jouw kant van de integratie staan.",[1938,1939,1940],"rate limit","throttling","verzoeklimiet",[1942],{"kind":1468,"url":1943},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FRate_limiting",[1900],"\u002Fglossary#rate-limiting",{"slug":1472,"term":1947,"definition":1948,"category":1458,"aliases":1949,"links":1952,"related":1955,"readMore":-1,"target":1956,"hasArticle":1436},"SOC 2","Een rapport van een externe auditor over hoe een organisatie met klantgegevens omgaat — beveiliging, beschikbaarheid, vertrouwelijkheid — en niet een certificaat dat je koopt. Zakelijke kopers vragen erom, en het beperkt de architectuur lang voordat de audit dat doet.",[1950,1951],"SOC2","System and Organization Controls",[1953],{"kind":1468,"url":1954},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSystem_and_Organization_Controls",[1471,1455,1473],"\u002Fglossary#soc-2",{"slug":1958,"term":1959,"definition":1960,"category":1729,"aliases":1961,"links":1964,"related":1967,"readMore":-1,"target":1968,"hasArticle":1436},"saas","SaaS","Software die als doorlopend abonnement op een gehost product wordt verkocht in plaats van als eenmalige licentie die de klant zelf installeert en draait. De leverancier beheert de servers, levert doorlopend updates en factureert per gebruiker of per verbruik.",[1962,1963],"Software as a Service","software-as-a-service",[1965],{"kind":1468,"url":1966},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSoftware_as_a_service",[1644,1643],"\u002Fglossary#saas",{"slug":1628,"term":1970,"definition":1971,"category":1752,"aliases":1972,"links":1974,"related":1977,"readMore":-1,"target":1978,"hasArticle":1436},"Server-Sent Events","Een eenrichtingsstroom van server naar client over een gewone HTTP-verbinding. Eenvoudiger dan een WebSocket en het volstaat overal waar alleen de server iets te melden heeft — een voortgangsfeed, een AI-antwoord dat token voor token binnenkomt.",[1973],"SSE",[1975],{"kind":1468,"url":1976},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-sent_events",[1626,1526],"\u002Fglossary#server-sent-events",{"slug":1701,"term":1980,"definition":1981,"category":1519,"aliases":1982,"links":1986,"related":1989,"readMore":-1,"target":1990,"hasArticle":1436},"Server-side rendering","Een pagina op de server als kant-en-klare HTML opbouwen, zodat het eerste antwoord de inhoud, koppen, metatags en gestructureerde data al meedraagt. Crawlers, linkvoorbeelden en trage apparaten lezen dat zonder JavaScript uit te voeren.",[1983,1984,1985],"SSR","server-rendered","renderen op de server",[1987],{"kind":1468,"url":1988},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FServer-side_scripting",[1691],"\u002Fglossary#server-side-rendering",{"slug":230,"term":1992,"definition":1993,"category":1444,"aliases":1994,"links":1997,"related":2002,"readMore":-1,"target":2003,"hasArticle":1436},"Skia","De opensource 2D-graphicsbibliotheek van Google die Chrome, Android en — tot Impeller — elk Flutter-frame tekent. Ze rendert net zo goed naar PDF als naar een scherm, en dat is wat print-naar-PDF in Chrome doet.",[1995,1996],"Skia Graphics Engine","skia-safe",[1998,2000],{"kind":1449,"url":1999},"https:\u002F\u002Fskia.org\u002F",{"kind":1468,"url":2001},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FSkia_Graphics_Engine",[1716],"\u002Fglossary#skia",{"slug":2005,"term":2006,"definition":2007,"category":1519,"aliases":2008,"links":2012,"related":2015,"readMore":-1,"target":2016,"hasArticle":1436},"state-management","State management","Hoe een app bepaalt waar een waarde leeft, wie hem mag wijzigen en welke delen van het scherm opnieuw tekenen als dat gebeurt. In Flutter is de keuze tussen Riverpod, BLoC en Provider een van de eerste architectuurbesluiten en het lastigst te herzien.",[2009,2010,2011],"statemanagement","BLoC","Riverpod",[2013],{"kind":1482,"url":2014},"https:\u002F\u002Fdocs.flutter.dev\u002Fdata-and-backend\u002Fstate-mgmt\u002Foptions",[1657],"\u002Fglossary#state-management",{"slug":1613,"term":2018,"definition":2019,"category":1752,"aliases":2020,"links":2024,"related":2027,"readMore":-1,"target":2028,"hasArticle":1436},"TLS","De versleutelingslaag onder HTTPS. Ze bewijst dat de server is wie zijn certificaat zegt, spreekt een verse sleutel voor de sessie af en versleutelt alles daarna — zodat het netwerk ertussen alleen cijfertekst ziet die het niet stiekem kan wijzigen.",[2021,2022,2023],"SSL","HTTPS","Transport Layer Security",[2025],{"kind":1468,"url":2026},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTransport_Layer_Security",[1602,1614],"\u002Fglossary#tls",{"slug":2030,"term":2031,"definition":2032,"category":1729,"aliases":2033,"links":2039,"related":2040,"readMore":-1,"target":2042,"hasArticle":1436},"staff-augmentation","Teamuitbreiding","Een inhuurmodel waarbij engineers van een externe partner bij je team komen en onder jouw aansturing werken — in jouw repository, jouw sprints, jouw proces — in plaats van een eigen project op te leveren. Je koopt capaciteit; de code en de context blijven bij jou.",[2034,2035,2036,2037,2038],"staff augmentation","team augmentation","dedicated developers","outstaffing","teamversterking",[],[2041,1897],"total-cost-of-ownership","\u002Fglossary#staff-augmentation",{"slug":1897,"term":2044,"definition":2045,"category":1729,"aliases":2046,"links":2049,"related":2052,"readMore":-1,"target":2053,"hasArticle":1436},"Time to market","Hoe lang het duurt om een product van besluit naar echte gebruikers te krijgen. De meeste discussies over stack en scope gaan eigenlijk over dit getal, want elke gewonnen week is een week omzet, feedback en concurrentiepositie.",[2047,1897,2048],"TTM","doorlooptijd tot de markt",[2050],{"kind":1468,"url":2051},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTime_to_market",[1784,2041],"\u002Fglossary#time-to-market",{"slug":2041,"term":2055,"definition":2056,"category":1729,"aliases":2057,"links":2061,"related":2064,"readMore":-1,"target":2065,"hasArticle":1436},"Total cost of ownership","Wat een product over zijn hele leven kost in plaats van alleen de bouw: onderhoud, upgrades, jaarlijkse OS- en winkelmigraties, en het tweede team dat je aanneemt om twee codebases gelijk te houden. Meestal groter dan de bouwofferte, en er vrijwel nooit in opgenomen.",[2058,2059,2060],"TCO","kosten van eigenaarschap","totale eigendomskosten",[2062],{"kind":1468,"url":2063},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTotal_cost_of_ownership",[1897],"\u002Fglossary#total-cost-of-ownership",{"slug":2067,"term":2068,"definition":2069,"category":1752,"aliases":2070,"links":2072,"related":2077,"readMore":-1,"target":2079,"hasArticle":1436},"webrtc","WebRTC","De standaard voor browsers en mobiel om audio, video en data rechtstreeks tussen twee apparaten te sturen, waarbij servers er alleen aan te pas komen om ze aan elkaar voor te stellen. Hierop is een videogesprek in een app gebouwd, tenzij er een gehuurde SDK onder zit.",[2071],"Web Real-Time Communication",[2073,2075],{"kind":1449,"url":2074},"https:\u002F\u002Fwebrtc.org\u002F",{"kind":1468,"url":2076},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebRTC",[2078,1626],"xmpp","\u002Fglossary#webrtc",{"slug":1626,"term":2081,"definition":2082,"category":1752,"aliases":2083,"links":2084,"related":2087,"readMore":-1,"target":2088,"hasArticle":1436},"WebSocket","Een protocol dat één verbinding openhoudt tussen client en server, zodat beide kanten op elk moment kunnen sturen in plaats van dat de client keer op keer vraagt. Waar live koersen, chat en aanwezigheidsindicatoren op draaien.",[],[2085],{"kind":1468,"url":2086},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWebSocket",[1628,1526],"\u002Fglossary#websocket",{"slug":1643,"term":2090,"definition":2091,"category":1729,"aliases":2092,"links":2096,"related":2099,"readMore":2100,"target":2100,"hasArticle":635},"White-label","Eén product dat onder veel merken wordt uitgebracht. Een white-label platform voor mobiel bouwt elke klant een winkelklare app met een eigen naam, ontwerp en content vanuit één gedeelde codebase, in plaats van het project per klant te forken.",[2093,2094,2095],"white label","multi-tenant app","merkloos product",[2097],{"kind":1468,"url":2098},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FWhite-label_product",[1784],"\u002Fglossary\u002Fwhite-label",{"slug":2078,"term":2102,"definition":2103,"category":1752,"aliases":2104,"links":2107,"related":2112,"readMore":-1,"target":2113,"hasArticle":1436},"XMPP","Een open, gefedereerd berichtenprotocol, en al lang het alternatief voor zelf een chatbackend schrijven of er een huren. Het dekt ook aanwezigheid, typindicatoren en bestandsoverdracht, en het is oud genoeg dat elk platform een volwassen clientbibliotheek heeft.",[2105,2106],"Jabber","Extensible Messaging and Presence Protocol",[2108,2110],{"kind":1449,"url":2109},"https:\u002F\u002Fxmpp.org\u002F",{"kind":1468,"url":2111},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FXMPP",[2067,1626],"\u002Fglossary#xmpp"]