This is the MkDocs-based documentation website for the Rosen Center for Advanced Computing (RCAC) at Purdue University. It provides comprehensive user guides, tutorials, reference material, software catalogs, datasets, blog articles, and workshop materials for RCAC's HPC systems (Anvil and Gautschi).
Primary URL: https://docs.rcac.purdue.edu (served from the Geddes Kubernetes cluster) Source Repository: https://github.com/PurdueRCAC/RCAC-Docs
The following HPC documentation sites use a similar MkDocs Material framework and serve as design/content references:
- https://docs.tacc.utexas.edu/
- https://docs.alcf.anl.gov/
- https://docs.ncsa.illinois.edu/en/latest/
- https://docs.jetstream-cloud.org/
- https://docs.hpc.ucdavis.edu/
RCAC-Docs/
├── .github/
│ ├── ISSUE_TEMPLATE/ # Bug/feature request templates
│ └── workflows/ # GitHub Actions automation
├── docs/ # Main documentation content
│ ├── assets/ # Images, CSS, JS, fonts, data files
│ ├── blog/ # Blog posts
│ ├── datasets/ # Dataset documentation
│ ├── snippets/ # Reusable content snippets
│ ├── software/ # Software catalog pages (auto-generated)
│ ├── stylesheets/ # extra.css and theme overrides
│ ├── userguides/ # User guides (Anvil, Gautschi)
│ ├── workshops/ # Workshop materials (HPC Exchange, Matplotlib, etc.)
│ ├── contact.md # Contact page
│ ├── faq.md # FAQ page
│ ├── index.md # Homepage
│ ├── tags.md # Tag index page
│ └── templates.md # Template examples
├── hooks/ # MkDocs hooks (e.g., social media)
├── k8s/geddes-prod/ # Kubernetes manifests for production deployment
├── modulefiles/ # HPC module files (software installations)
├── overrides/ # Material theme customizations (main.html, partials)
├── tools/ # Automation scripts for software catalog
├── .gitignore
├── .readthedocs.yaml # Read the Docs configuration (legacy/secondary)
├── Dockerfile.geddes-prod # Image built and pushed to GHCR for Geddes
├── main.py # MkDocs macros plugin definitions
├── mkdocs.yml # MkDocs configuration
├── README.md
└── requirements.txt # Python dependencies
- MkDocs: Static site generator (v1.6.1)
- Material for MkDocs: Theme (v9.6.16)
- Python 3.x: Runtime environment (Dockerfile uses
python:3.11-slim) - GitHub Actions: CI/CD automation
- Docker / GHCR: Production image at
ghcr.io/purduercac/rcac-docs-prod:latest(served bynginx:alpine) - Kubernetes (Geddes): Production hosting in the
rcac-docsnamespace
mkdocs-material: Material Design thememkdocs-material-extensionsmaterial/blog(built-in blog plugin): Blog functionality with categories and paginationmaterial/tags(built-in tags plugin): Content taggingmkdocs-git-revision-date-localized-plugin: Git-based timestampsmkdocs-macros-plugin: Dynamic content macros (seemain.py)search: Built-in search
pymdownx(details, blocks.caption, emoji, snippets, highlight, inlinehilite, superfences, tabbed)admonition: Callout boxestables: Table supportattr_listandmd_in_html: HTML attributes / inline HTML in markdowntoc: Table of contents with permalinks
- HPC User Guides: Comprehensive guides for Anvil and Gautschi clusters (plus external links to Bell, Negishi, Gilbreth, Scholar)
- Storage User Guides: External links to Data Depot, Fortress, Scratch, Home, Box
- Blog: News and updates categorized by system/topic (Anvil, Gautschi, Software, Slurm, Workflows)
- Software Catalog: Auto-generated catalog of available software
- Datasets: AI, Hydrological, Meteorological, Geospatial, Covariates, GeoAI, Igenomes
- Workshops: HPC Exchange (weeks 1–4), Anvil Kubernetes, Scientific Visualization with Matplotlib
- FAQs and Contact pages
The software catalog is automatically generated from HPC module files: Process Flow:
modulefiles/→ Module files for installed softwaretools/update_apps_inventory.sh→ Extracts app names, versions, clusters →rcac_apps_inventory.jsontools/generate_apps_topics.py→ Categorizes apps by topic →apps_topics.jsontools/gen_apps_descriptions.pyandtools/update_apps_descriptions_from_inventory.sh→ Fetches descriptions from Spack / Wikipedia / PyPI →apps_descriptions.jsontools/generate_md.sh→ Creates individual markdown files underdocs/software/apps_md/tools/update_apps_catalog.sh→ Updates catalog index pagedocs/software/app_catalog.mdTopics: MPI, Compilers, Audio/Visual, Climate, Chemistry, Fluid Dynamics, Geoscience, Library, Material Science, Math/Stat, Engineering, Programming, Utilities, Workflow, Misc.
Heads-up for agents and new contributors: despite its name,
devis not a generic development/integration branch. Do not treat it the way you would adevbranch in a conventional dev→main flow. Read the section below before pushing, merging, or opening PRs involvingdev.
main: trunk and the only production branch. All normal content and feature work targetsmaindirectly via PR.mainis what deploys to https://docs.rcac.purdue.edu.dev: a long-lived, permanently-divergent WCAG 2.1 accessibility remediation branch. It carries an experimental Material theme override layer (ARIA labels, dedup'd form labels, contrast fixes) that is not yet ready for production. It is served separately from its own Geddes environment (k8s/geddes-dev/,Dockerfile.geddes,deploy_to_geddes_dev.yml) for WAVE re-audits. Seedev.mdon thedevbranch for the remediation plan and phase history.- Data flow is main → dev, not the other way around.
sync_main_to_dev.ymlforward-mergesmainintodevon every push so the a11y preview stays current with content, while preserving the dev-only framework layer. - Direct PRs from
devintomainare blocked by CI (block_dev_to_main.yml). When the a11y work is complete and accepted, the expected endgame is a deliberate, curated PR of the theme layer intomain— not an automatic merge.
- Default working branch for any content, nav, workflow, infra, or macro change is
main(usually via a short-lived feature/wipbranch PR'd intomain). - Do not cherry-pick, rebase, or PR from
devintomainwithout an explicit human request tied to the a11y rollout. - When editing files in the dev-only a11y layer (
docs/stylesheets/extra.css,overrides/partials/toc.html,docs/assets/js/a11y.js, thea11y.jsentry inmkdocs.yml,overrides/base.html,overrides/partials/{header,logo,nav,nav-item,palette,search}.html,dev.md,Dockerfile.geddes,k8s/geddes-dev/,deploy_to_geddes_dev.yml,wcag_audit/), work ondev— changes made onmainto these files can be overwritten or clobbered by the sync workflow's "preserve dev" logic. - The sync workflow's list of preserved paths is hardcoded in
sync_main_to_dev.yml; if a11y work expands to new files, that workflow must be updated or those files will be overwritten on the next sync.
- Triggers: Push to
main(excludingmodulefiles/**,tools/**,wcag_audit/**); also manualworkflow_dispatch - Process:
- Logs into GHCR with
GITHUB_TOKEN - Builds
Dockerfile.geddes-prod(multi-stage:python:3.11-slim→mkdocs build→nginx:alpine) - Pushes
ghcr.io/purduercac/rcac-docs-prod:latest
- Logs into GHCR with
- Rollout: The in-cluster
rcac-docs-prod-restartCronJob (every 5 minutes) runskubectl rollout restart deployment/rcac-docs-prod -n rcac-docs, which re-pulls:latest(becauseimagePullPolicy: Always)
- Triggers: Completion of the catalog rebuild workflow, push to
main/auto_publish(excludingmodulefiles/**andtools/**), orworkflow_dispatch - Process: Builds the site and syncs to the Ceph S3 bucket
s3://rcac-docs/athttps://s3.rcac.purdue.edu - Status: No longer the canonical production target; retained for mirror/backup purposes
- Triggers: Push to
mainordevwhenmodulefiles/**ortools/**change - Purpose: Automatically regenerate the software catalog
- Process:
- Runs
makeintools/ - Stages/rebases/commits updated catalog files (
docs/software/apps_md/,app_catalog.md,index.md) - Pushes using GitHub App token (
purduercac-docs-bot)
- Runs
- Triggers: Push to
mainordevwhenmkdocs.ymlchanges - Purpose: Regenerate navigation breadcrumbs
- Process: Runs
tools/generate_breadcrumbs.py, updatesdocs/assets/data/breadcrumbs.json, commits via App token - Logic: Only includes parent titles if parent has an
index.md; root/is excluded
- Triggers: Push to
main; manualworkflow_dispatch - Purpose: Forward-merge
maininto the a11y remediation branchdevso it stays current with production content, while hardcoded-preserving the dev-only a11y framework layer:docs/stylesheets/,overrides/partials/toc.html, and thea11y.jsentry inmkdocs.yml(re-added viasedif absent). - Caveat: the preserved-paths list is hardcoded. If the a11y work adds or moves files outside that list, this workflow must be updated or those files will be clobbered on the next sync.
- Triggers: Pull requests targeting
main - Purpose: Fail CI if the PR source branch is
dev. This is a guardrail against accidentally shipping the experimental a11y theme layer to production — not a statement that the workflow is inverted. See the Branches section above for the intended model.
Manifests live in k8s/geddes-prod/ and are applied to the rcac-docs namespace on the Geddes cluster:
deployment.yaml:rcac-docs-prodDeployment, 1 replica, imageghcr.io/purduercac/rcac-docs-prod:latest,imagePullPolicy: Always,imagePullSecrets: ghcr-secret, modest CPU/memory limitsservice.yaml:ClusterIPService exposing port 80ingress.yaml:ingressClassName: public, TLS hostdocs.rcac.purdue.edu(secretrcac-docs-prod-tls)cronjob.yaml:rcac-docs-prod-restartCronJob running every 5 minutes; usesbitnami/kubectl(fromgeddes-registry.rcac.purdue.edu/docker-hub-cache/) with a mountedkubeconfig-secrettokubectl rollout restartthe deployment so new:latestimages are pulled
- Name:
purduercac-docs-bot - Purpose: Automated commits that push to
main/devwithout triggering recursive workflows - Configuration:
PURDUERCAC_DOCS_BOT_APP_IDandPURDUERCAC_DOCS_BOT_PRIVATE_KEYin repository secrets; commits authored aspurduercac-docs-bot@users.noreply.github.com
.readthedocs.yamlis still present (Ubuntu 24.04, Python 3,pip install -r requirements.txt) but is no longer the primary deployment path. The Geddes/Kubernetes pipeline above servesdocs.rcac.purdue.edu.
# Clone repository
git clone git@github.com:PurdueRCAC/RCAC-Docs.git
cd RCAC-Docs
# Create Python environment (conda or venv)
conda create -n rcac-docs python
conda activate rcac-docs
# Install dependencies
python -m pip install -r requirements.txt
# Start local server
mkdocs serve # Default: http://localhost:8000
mkdocs serve -a localhost:8080 # Custom portdocker build -f Dockerfile.geddes-prod -t rcac-docs-prod:local .
docker run --rm -p 8080:80 rcac-docs-prod:local- Edit markdown files in
docs/ - Test locally with
mkdocs serve - Open a PR into
mainfrom a short-lived feature orwipbranch. Do not PR fromdevintomain— it is blocked by CI, anddevis the a11y remediation branch, not a staging branch for content. - On merge to
main,deploy_to_geddes_prod.ymlbuilds and pushes the image; the Geddes CronJob rolls the deployment within ~5 minutes.sync_main_to_dev.ymlseparately forwards the merge ontodevfor the a11y preview.
- Add/modify module files in
modulefiles/ - Push/merge to
main(ordev) rebuild_on_module_tools_change.ymlrunsmakeand bot-commits the regenerated catalog
- Edit
nav:inmkdocs.yml - Push/merge to
main(ordev) update_breadcrumbs.ymlregeneratesdocs/assets/data/breadcrumbs.json
cd tools
make # Runs all steps in correct order
# Or run individually:
./update_apps_inventory.sh -v
./generate_apps_topics.py
./update_apps_descriptions_from_inventory.sh
./generate_md.sh
./update_apps_catalog.shReusable content snippets defined as Python functions (via mkdocs-macros-plugin):
login_snippet(host, cluster): SSH login instructionsaccount_snippet(host, cluster): Account creation infossh_keys_snippet(resource): SSH key setup guide (macOS/Linux/Windows/PuTTY)ssh_x11_snippet(resource): X11 forwarding setupthinlinc_snippet(resource): ThinLinc client instructions
hooks/socialmedia.py: Social-media share button support (currently commented out inmkdocs.yml)
- Logo/Favicon: Purdue branding (
docs/assets/purdue.png,docs/assets/purdue_favicon.png) - Color Schemes: Auto / light / dark (Material palette toggles)
- Fonts: Roboto (text), Consolas (code)
- Custom CSS:
docs/stylesheets/extra.css - Custom JS:
docs/assets/js/—tablefilter.js,init-tablefilter.js,breadcrumbs.js,external-links.js(plusa11y.jsondev) - Theme overrides:
overrides/main.htmlandoverrides/partials/
- Google Analytics (property:
G-3D80JBWGP0) - Page feedback widget (thumbs up/down) with link to a feedback issue template
- Use admonitions for important notes/warnings
- Include code blocks with proper syntax highlighting
- Link to related pages within user guides
- Tag blog posts with appropriate categories (Anvil, Gautschi, Software, Slurm, Workflows)
- Land all content/feature/workflow changes on
mainvia PR;sync_main_to_dev.ymlwill forward them to the a11ydevbranch automatically - Touch
devdirectly only for WCAG/a11y remediation work on the override layer; never backportdevtomainoutside of an explicit, curated a11y rollout - Oz-assisted commits include trailer:
Co-Authored-By: Oz <oz-agent@warp.dev> - Bot commits are authored as:
purduercac-docs-bot@users.noreply.github.com
- Always test locally with
mkdocs servebefore pushing - Optionally validate the production image with
docker build -f Dockerfile.geddes-prod - Verify breadcrumbs render correctly after
mkdocs.ymlchanges - Verify software catalog after module file changes
mkdocs.yml: Main configuration, navigation, plugins, markdown extensionsrequirements.txt: Python dependencies (pinned)main.py: MkDocs macroshooks/socialmedia.py: Optional social-share hooktools/Makefileandtools/README.md: Software catalog build automationDockerfile.geddes-prod: Production image for Geddes (builder + nginx serve stage)k8s/geddes-prod/*.yaml: Kubernetes Deployment, Service, Ingress, CronJob.github/workflows/: CI/CD automation (deploy to Geddes, S3 mirror, catalog, breadcrumbs, branch sync/guards).readthedocs.yaml: Read the Docs build config (secondary)
- Organization: Rosen Center for Advanced Computing
- Email: rcac-help@purdue.edu
- GitHub: https://github.com/PurdueRCAC
- Discord: https://discord.gg/RmtKZmaQW9