Skip to content

Install

recon-gen is a single PyPI package with opt-in extras — pick the extras matching what you actually run, since the CLI surface is broad (emit JSON, deploy to AWS, seed a demo DB, render audit PDFs, build the docs site) and the dependency footprint of each surface is unrelated.

The bare install is intentionally tiny (Click + PyYAML + the Graphviz Python wrapper) so consumers who just want to emit JSON for their own deploy pipeline don't pull boto3 / reportlab / mkdocs / DB drivers.

What each extra unlocks

Extra Adds Unlocks
(none) click, pyyaml, graphviz recon-gen json apply — emits JSON to disk for hand-off to your own pipeline
[deploy] boto3, botocore[crt] json apply --execute (push to AWS QuickSight); json clean --execute (sweep ManagedBy:recon-gen resources). botocore[crt] is needed for AWS SSO (aws sso login) auth
[demo] psycopg2-binary schema apply --execute, data apply --execute, data refresh --execute against PostgreSQL 17+
[demo-oracle] oracledb (thin mode) Same --execute verbs against Oracle 19c+. No Oracle Instant Client install needed
[audit] reportlab, pypdf, pyhanko audit apply --execute -o report.pdf (regulator-ready PDF). pyhanko covers both auto-signing (when config.yaml carries a signing: block) and the empty reviewer-signature widgets that land on every render
[docs] mkdocs, mkdocs-material, mkdocstrings, mkdocs-click, mkdocs-macros-plugin, graphviz docs apply / docs serve to build or live-preview this handbook
[dev] All of the above plus pytest, pytest-cov, pyright, boto3-stubs, build, twine Full developer environment — runs every test suite + type-check
[e2e] pytest, pytest-xdist, boto3, botocore[crt], playwright End-to-end test suite (browser + API) against deployed dashboards. Also requires a one-time playwright install webkit to download the browser binary

Common shapes

"I just want the JSON"

pip install recon-gen
recon-gen json apply -c config.yaml -o out/

Writes out/*.json for the four bundled apps. Your own pipeline picks them up. No AWS credentials or DB drivers needed.

"I want to deploy to AWS"

pip install "recon-gen[deploy]"
recon-gen json apply -c config.yaml -o out/ --execute

--execute does a delete-then-create against AWS QuickSight using the credentials your environment already has (env vars, ~/.aws/, SSO session, instance profile).

"I want to seed the demo database"

pip install "recon-gen[deploy,demo]"           # PostgreSQL 17+
pip install "recon-gen[deploy,demo,demo-oracle]"  # add Oracle 19c+

Then:

recon-gen schema apply -c config.yaml --execute
recon-gen data   apply -c config.yaml --execute
recon-gen data   refresh -c config.yaml --execute
recon-gen json   apply -c config.yaml -o out/ --execute

"I want to render the audit PDF"

pip install "recon-gen[deploy,demo,audit]"
recon-gen audit apply -c config.yaml --execute -o report.pdf

For digitally-signed PDFs, add a signing: block to config.yaml — the same [audit] extra covers it (no separate install step). pyHanko picks up the PEM key + cert at render time and stamps a CMS signature on the cover page.

"I want to hack on the source"

git clone https://github.com/chotchki/recon-gen
cd recon-gen
uv sync --all-extras            # everything, locked from uv.lock
.venv/bin/recon-gen --help
.venv/bin/pytest

For a leaner dev install, pick only the extras you need:

uv sync --frozen --extra dev --extra audit

(uv sync always installs the [dev] group + any extras you ask for. --frozen fails if uv.lock is out of date — drop it locally if you're iterating on pyproject.toml.)

Two non-Python tools the test session uses (the pytest sessionstart hook gates on both): pyright (a [dev] dep — uv sync brings it) and biome (the App 2 JS linter). Biome isn't pip-installable here — the biome-js PyPI wrapper ships only a linux-x86_64 wheel — so install it your platform's way:

brew install biome          # macOS / Linuxbrew
# or: see https://biomejs.dev/guides/getting-started/ for npm / scoop /
# nix / mise / standalone-binary options

If biome isn't on PATH the JS-lint gate just skips locally (CI always runs it via the biomejs/setup-biome action) — your tests still pass, you just won't catch a JS-lint regression before pushing.

Quoting note

The square brackets in recon-gen[demo,audit] are shell metacharacters — quote them or your shell will interpret them as glob patterns:

pip install "recon-gen[demo,audit]"     # works in bash + zsh
pip install 'recon-gen[demo,audit]'     # also works
pip install recon-gen\[demo,audit\]     # also works

Without quoting you'll get zsh: no matches found: recon-gen[demo,audit] or pip will install only the bare package, silently dropping the extras.