From a397318f1674e73607768afa73046ff23a2bc0d6 Mon Sep 17 00:00:00 2001 From: YanNaingWinn Date: Sat, 20 Jun 2026 15:35:08 +0700 Subject: [PATCH] Add auto-generated PDF documentation (pdflatex) --- .github/workflows/deploy.yml | 18 +++++++++++ docs/source/_static/cryptnox-logo-dark.png | Bin 0 -> 3375 bytes docs/source/_static/icon-cli.png | Bin 0 -> 4120 bytes docs/source/_static/icon-hw.png | Bin 0 -> 4170 bytes docs/source/_static/icon-sdk.png | Bin 0 -> 4302 bytes docs/source/conf.py | 15 +++++++++ docs/source/index.rst | 34 +++++++++++++++++++++ 7 files changed, 67 insertions(+) create mode 100644 docs/source/_static/cryptnox-logo-dark.png create mode 100644 docs/source/_static/icon-cli.png create mode 100644 docs/source/_static/icon-hw.png create mode 100644 docs/source/_static/icon-sdk.png diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5743524..320792a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -32,6 +32,24 @@ jobs: - name: Build Sphinx run: sphinx-build -b html docs/source _site + - name: Install LaTeX for PDF + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends \ + latexmk texlive-latex-recommended texlive-latex-extra \ + texlive-fonts-recommended tex-gyre + + - name: Build PDF (pdflatex) + run: | + sphinx-build -M latexpdf docs/source docs/_build + cp docs/_build/latex/cryptnox-docs.pdf _site/cryptnox-docs.pdf + + - name: Upload PDF artifact (for PR review) + uses: actions/upload-artifact@v4 + with: + name: cryptnox-docs-pdf + path: docs/_build/latex/cryptnox-docs.pdf + - name: Add CNAME for custom domain run: echo "docs.cryptnox.com" > _site/CNAME diff --git a/docs/source/_static/cryptnox-logo-dark.png b/docs/source/_static/cryptnox-logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7ccc9df3648794f3387087474939d1ab9968e745 GIT binary patch literal 3375 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 FV1g~*d;9%I?wSZAA|*#cz= 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 bSPFas43x54zhHLw>I3Yo&R||z_$U4cW~6*Y literal 0 HcmV?d00001 diff --git a/docs/source/_static/icon-hw.png b/docs/source/_static/icon-hw.png new file mode 100644 index 0000000000000000000000000000000000000000..19732f8d441c97df3499a773cc8e9a5286d05203 GIT binary patch literal 4170 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/icon-sdk.png b/docs/source/_static/icon-sdk.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4b3873100b8c566769cd3a36dbf70e243ff3d1 GIT binary patch literal 4302 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 literal 0 HcmV?d00001 diff --git a/docs/source/conf.py b/docs/source/conf.py index e4a4d17..58bf472 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -56,3 +56,18 @@ html_show_sourcelink = False html_copy_source = False html_show_sphinx = False + +# -- Options for PDF (LaTeX) output ------------------------------------------ +# Built by CI with pdflatex, same as Yubico's tech manual. Output: cryptnox-docs.pdf + +latex_engine = 'pdflatex' +latex_logo = '_static/cryptnox-logo-dark.png' # white logo is invisible on white PDF title page +latex_documents = [ + ('index', 'cryptnox-docs.tex', 'Cryptnox Product Documentation', author, 'manual'), +] +latex_elements = { + 'papersize': 'a4paper', + 'pointsize': '11pt', + 'figure_align': 'H', + 'extraclassoptions': 'oneside,openany', # no blank filler pages (web PDF, not double-sided print) +} diff --git a/docs/source/index.rst b/docs/source/index.rst index 56423ab..dc9779e 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -2,6 +2,10 @@ Cryptnox Product Documentation ================================ +.. only:: html + + 📄 `Download the full documentation as PDF `__ + Cryptnox Hardware Wallet ========================= @@ -15,6 +19,11 @@ Cryptnox Hardware Wallet +.. only:: latex + + .. image:: _static/icon-hw.png + :height: 40px + *Cryptnox Hardware Wallet* is a JavaCard Open Platform 3 smartcard with an EAL6+ Common Criteria certified secure element. It provides hardware-secured private key storage and transaction signing for cryptocurrency applications over NFC and contact (T=1) interfaces. @@ -37,6 +46,11 @@ Cryptnox CLI +.. only:: latex + + .. image:: _static/icon-cli.png + :height: 40px + *Cryptnox CLI* brings full smartcard control to the terminal, handling card initialization, secure channel setup, PIN management, seed generation, key derivation, and transaction signing through a single command interface. @@ -59,6 +73,11 @@ Cryptnox SDK for Python +.. only:: latex + + .. image:: _static/icon-sdk.png + :height: 40px + *Cryptnox SDK for Python* brings Cryptnox smartcard support to the Python ecosystem, surfacing secure channel, APDU exchange, key derivation, and signing through a clean Python API. It integrates directly into desktop wallets, backend services, and automation workflows, adding hardware-secured @@ -82,6 +101,11 @@ Cryptnox SDK for ESP32 +.. only:: latex + + .. image:: _static/icon-sdk.png + :height: 40px + *Cryptnox SDK for ESP32* brings Cryptnox smartcard support to the ESP-IDF ecosystem, wrapping secure channel, APDU exchange, key derivation, and signing into a ready-to-use component for the ESP32's Wi-Fi/Bluetooth SoCs. Connected firmware gains hardware-secured key storage without ever handling the @@ -105,6 +129,11 @@ Cryptnox SDK for Arduino +.. only:: latex + + .. image:: _static/icon-sdk.png + :height: 40px + *Cryptnox SDK for Arduino* packages Cryptnox smartcard support as an Arduino library, exposing secure channel, APDU exchange, key derivation, and signing through a sketch-friendly API. Installable directly through the Arduino IDE and Library Manager, it adds hardware-secured keys to any board in @@ -128,6 +157,11 @@ Cryptnox SDK for C++ +.. only:: latex + + .. image:: _static/icon-sdk.png + :height: 40px + *Cryptnox SDK for C++* is the portable core at the heart of Cryptnox's embedded SDKs, implementing secure channel, APDU exchange, key derivation, and signing in platform-neutral C++. It ships no transport driver, crypto backend, or logging output, so porting Cryptnox support to a new native