[{"data":1,"prerenderedAt":567},["ShallowReactive",2],{"navigation_docs":3,"-docs-community-contributing":86,"-docs-community-contributing-surround":562},[4,22,31,48,65],{"title":5,"path":6,"stem":7,"children":8,"page":21},"Api","\u002Fdocs\u002Fapi","docs\u002Fapi",[9,13,17],{"title":10,"path":11,"stem":12},"CLI Reference","\u002Fdocs\u002Fapi\u002Fcli-reference","docs\u002Fapi\u002F1.cli-reference",{"title":14,"path":15,"stem":16},"ZMQ Protocol Reference","\u002Fdocs\u002Fapi\u002Fzmq-protocol","docs\u002Fapi\u002F2.zmq-protocol",{"title":18,"path":19,"stem":20},"Error Codes","\u002Fdocs\u002Fapi\u002Ferror-codes","docs\u002Fapi\u002F3.error-codes",false,{"title":23,"path":24,"stem":25,"children":26,"page":21},"Community","\u002Fdocs\u002Fcommunity","docs\u002Fcommunity",[27],{"title":28,"path":29,"stem":30},"Contributing","\u002Fdocs\u002Fcommunity\u002Fcontributing","docs\u002Fcommunity\u002F1.contributing",{"title":32,"path":33,"stem":34,"children":35,"page":21},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002Fconcepts",[36,40,44],{"title":37,"path":38,"stem":39},"Architecture","\u002Fdocs\u002Fconcepts\u002Farchitecture","docs\u002Fconcepts\u002F1.architecture",{"title":41,"path":42,"stem":43},"Certificate Lifecycle","\u002Fdocs\u002Fconcepts\u002Fcertificate-lifecycle","docs\u002Fconcepts\u002F2.certificate-lifecycle",{"title":45,"path":46,"stem":47},"Security Model","\u002Fdocs\u002Fconcepts\u002Fsecurity-model","docs\u002Fconcepts\u002F3.security-model",{"title":49,"path":50,"stem":51,"children":52,"page":21},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started",[53,57,61],{"title":54,"path":55,"stem":56},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002Fgetting-started\u002F1.introduction",{"title":58,"path":59,"stem":60},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002Fgetting-started\u002F2.installation",{"title":62,"path":63,"stem":64},"Quick Start","\u002Fdocs\u002Fgetting-started\u002Fquick-start","docs\u002Fgetting-started\u002F3.quick-start",{"title":66,"path":67,"stem":68,"children":69,"page":21},"Guides","\u002Fdocs\u002Fguides","docs\u002Fguides",[70,74,78,82],{"title":71,"path":72,"stem":73},"Configuration","\u002Fdocs\u002Fguides\u002Fconfiguration","docs\u002Fguides\u002F1.configuration",{"title":75,"path":76,"stem":77},"Certificate Profiles","\u002Fdocs\u002Fguides\u002Fcertificate-profiles","docs\u002Fguides\u002F2.certificate-profiles",{"title":79,"path":80,"stem":81},"Docker Deployment","\u002Fdocs\u002Fguides\u002Fdocker-deployment","docs\u002Fguides\u002F3.docker-deployment",{"title":83,"path":84,"stem":85},"Importing an Existing CA","\u002Fdocs\u002Fguides\u002Fimporting-existing-ca","docs\u002Fguides\u002F4.importing-existing-ca",{"id":87,"title":28,"body":88,"description":556,"extension":557,"links":558,"meta":559,"navigation":186,"path":29,"seo":560,"stem":30,"__hash__":561},"docs\u002Fdocs\u002Fcommunity\u002F1.contributing.md",{"type":89,"value":90,"toc":542},"minimark",[91,96,100,105,108,112,142,146,257,262,284,288,380,384,428,432,435,468,475,479,499,503,506,524,528,538],[92,93,95],"h1",{"id":94},"contributing-to-upki-ca","Contributing to uPKI CA",[97,98,99],"p",{},"Thank you for your interest in contributing! Please read this guide before submitting patches.",[101,102,104],"h2",{"id":103},"code-of-conduct","Code of Conduct",[97,106,107],{},"Be respectful and inclusive. Focus on what is best for the project. We will not tolerate harassment of any kind.",[101,109,111],{"id":110},"getting-started","Getting started",[113,114,115,123,133],"ol",{},[116,117,118,122],"li",{},[119,120,121],"strong",{},"Fork"," the repository on GitHub",[116,124,125,128,129],{},[119,126,127],{},"Clone"," your fork: ",[130,131,132],"code",{},"git clone https:\u002F\u002Fgithub.com\u002FYOUR_USERNAME\u002Fupki-ca.git",[116,134,135,138,139],{},[119,136,137],{},"Create a branch",": ",[130,140,141],{},"git checkout -b feature\u002Fmy-feature",[101,143,145],{"id":144},"development-environment","Development environment",[147,148,153],"pre",{"className":149,"code":150,"language":151,"meta":152,"style":152},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Fcircle-rd\u002Fupki-ca.git\ncd upki-ca\n\npython -m venv .venv\nsource .venv\u002Fbin\u002Factivate\n\npip install -e \".[dev]\"\n\n# Verify\npytest\n","bash","",[130,154,155,171,181,188,203,212,217,239,244,251],{"__ignoreMap":152},[156,157,160,164,168],"span",{"class":158,"line":159},"line",1,[156,161,163],{"class":162},"sBMFI","git",[156,165,167],{"class":166},"sfazB"," clone",[156,169,170],{"class":166}," https:\u002F\u002Fgithub.com\u002Fcircle-rd\u002Fupki-ca.git\n",[156,172,174,178],{"class":158,"line":173},2,[156,175,177],{"class":176},"s2Zo4","cd",[156,179,180],{"class":166}," upki-ca\n",[156,182,184],{"class":158,"line":183},3,[156,185,187],{"emptyLinePlaceholder":186},true,"\n",[156,189,191,194,197,200],{"class":158,"line":190},4,[156,192,193],{"class":162},"python",[156,195,196],{"class":166}," -m",[156,198,199],{"class":166}," venv",[156,201,202],{"class":166}," .venv\n",[156,204,206,209],{"class":158,"line":205},5,[156,207,208],{"class":176},"source",[156,210,211],{"class":166}," .venv\u002Fbin\u002Factivate\n",[156,213,215],{"class":158,"line":214},6,[156,216,187],{"emptyLinePlaceholder":186},[156,218,220,223,226,229,233,236],{"class":158,"line":219},7,[156,221,222],{"class":162},"pip",[156,224,225],{"class":166}," install",[156,227,228],{"class":166}," -e",[156,230,232],{"class":231},"sMK4o"," \"",[156,234,235],{"class":166},".[dev]",[156,237,238],{"class":231},"\"\n",[156,240,242],{"class":158,"line":241},8,[156,243,187],{"emptyLinePlaceholder":186},[156,245,247],{"class":158,"line":246},9,[156,248,250],{"class":249},"sHwdD","# Verify\n",[156,252,254],{"class":158,"line":253},10,[156,255,256],{"class":162},"pytest\n",[258,259,261],"h3",{"id":260},"pre-commit-hooks","Pre-commit hooks",[147,263,265],{"className":149,"code":264,"language":151,"meta":152,"style":152},"pip install pre-commit\npre-commit install\n",[130,266,267,276],{"__ignoreMap":152},[156,268,269,271,273],{"class":158,"line":159},[156,270,222],{"class":162},[156,272,225],{"class":166},[156,274,275],{"class":166}," pre-commit\n",[156,277,278,281],{"class":158,"line":173},[156,279,280],{"class":162},"pre-commit",[156,282,283],{"class":166}," install\n",[101,285,287],{"id":286},"coding-standards","Coding standards",[289,290,291,304],"table",{},[292,293,294],"thead",{},[295,296,297,301],"tr",{},[298,299,300],"th",{},"Rule",[298,302,303],{},"Value",[305,306,307,316,326,336,346,356,364,372],"tbody",{},[295,308,309,313],{},[310,311,312],"td",{},"Language",[310,314,315],{},"English (code, comments, docs)",[295,317,318,321],{},[310,319,320],{},"File naming",[310,322,323],{},[130,324,325],{},"snake_case.py",[295,327,328,331],{},[310,329,330],{},"Class naming",[310,332,333],{},[130,334,335],{},"PascalCase",[295,337,338,341],{},[310,339,340],{},"Function naming",[310,342,343],{},[130,344,345],{},"snake_case",[295,347,348,351],{},[310,349,350],{},"Constants",[310,352,353],{},[130,354,355],{},"UPPER_SNAKE_CASE",[295,357,358,361],{},[310,359,360],{},"Line length",[310,362,363],{},"120 characters",[295,365,366,369],{},[310,367,368],{},"Type hints",[310,370,371],{},"Required on all public functions",[295,373,374,377],{},[310,375,376],{},"Docstrings",[310,378,379],{},"Google style, required on all public functions\u002Fclasses",[258,381,383],{"id":382},"linter-and-formatter","Linter and formatter",[147,385,387],{"className":149,"code":386,"language":151,"meta":152,"style":152},"# Lint\nruff check upki_ca\u002F tests\u002F\n\n# Format\nruff format upki_ca\u002F tests\u002F\n",[130,388,389,394,408,412,417],{"__ignoreMap":152},[156,390,391],{"class":158,"line":159},[156,392,393],{"class":249},"# Lint\n",[156,395,396,399,402,405],{"class":158,"line":173},[156,397,398],{"class":162},"ruff",[156,400,401],{"class":166}," check",[156,403,404],{"class":166}," upki_ca\u002F",[156,406,407],{"class":166}," tests\u002F\n",[156,409,410],{"class":158,"line":183},[156,411,187],{"emptyLinePlaceholder":186},[156,413,414],{"class":158,"line":190},[156,415,416],{"class":249},"# Format\n",[156,418,419,421,424,426],{"class":158,"line":205},[156,420,398],{"class":162},[156,422,423],{"class":166}," format",[156,425,404],{"class":166},[156,427,407],{"class":166},[101,429,431],{"id":430},"testing","Testing",[97,433,434],{},"All new code must include tests:",[147,436,438],{"className":149,"code":437,"language":151,"meta":152,"style":152},"pytest                          # run all tests\npytest tests\u002Ftest_core.py       # run a specific file\npytest --cov=upki_ca            # with coverage\n",[130,439,440,448,458],{"__ignoreMap":152},[156,441,442,445],{"class":158,"line":159},[156,443,444],{"class":162},"pytest",[156,446,447],{"class":249},"                          # run all tests\n",[156,449,450,452,455],{"class":158,"line":173},[156,451,444],{"class":162},[156,453,454],{"class":166}," tests\u002Ftest_core.py",[156,456,457],{"class":249},"       # run a specific file\n",[156,459,460,462,465],{"class":158,"line":183},[156,461,444],{"class":162},[156,463,464],{"class":166}," --cov=upki_ca",[156,466,467],{"class":249},"            # with coverage\n",[97,469,470,471,474],{},"Minimum coverage target: ",[119,472,473],{},"80%",".",[101,476,478],{"id":477},"submitting-changes","Submitting changes",[113,480,481,487,493,496],{},[116,482,483,484],{},"Push your branch: ",[130,485,486],{},"git push origin feature\u002Fmy-feature",[116,488,489,490],{},"Open a Pull Request against ",[130,491,492],{},"main",[116,494,495],{},"Fill in the PR template — describe what changes and why",[116,497,498],{},"Ensure all CI checks pass (tests, lint)",[101,500,502],{"id":501},"reporting-issues","Reporting issues",[97,504,505],{},"Use the GitHub issue tracker. Include:",[507,508,509,512,515,518,521],"ul",{},[116,510,511],{},"Python version",[116,513,514],{},"uPKI CA version",[116,516,517],{},"Steps to reproduce",[116,519,520],{},"Expected vs actual behaviour",[116,522,523],{},"Relevant log output",[101,525,527],{"id":526},"documentation","Documentation",[97,529,530,531,534,535,474],{},"Documentation contributions are welcome. The docs site lives in ",[130,532,533],{},"docs-site\u002F",". Add or update Markdown files under ",[130,536,537],{},"docs-site\u002Fcontent\u002Fdocs\u002F",[539,540,541],"style",{},"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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .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 .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":152,"searchDepth":173,"depth":173,"links":543},[544,545,546,549,552,553,554,555],{"id":103,"depth":173,"text":104},{"id":110,"depth":173,"text":111},{"id":144,"depth":173,"text":145,"children":547},[548],{"id":260,"depth":183,"text":261},{"id":286,"depth":173,"text":287,"children":550},[551],{"id":382,"depth":183,"text":383},{"id":430,"depth":173,"text":431},{"id":477,"depth":173,"text":478},{"id":501,"depth":173,"text":502},{"id":526,"depth":173,"text":527},"How to contribute to uPKI CA.","md",null,{},{"title":28,"description":556},"8-O7Ga-wEfO7xQRmoQ8bk4nt5zuWRUuVAm6bArlbY0g",[563,565],{"title":18,"path":19,"stem":20,"description":564,"children":-1},"ZMQ error responses from uPKI CA.",{"title":37,"path":38,"stem":39,"description":566,"children":-1},"How uPKI CA is structured internally and how it communicates with the outside world.",1775569478524]