QVANTUM
Publishing the Qvantum internal web

How to publish the Qvantum internal web

How to publish a change to the internal sites — the current GitHub → Azure auto-deploy flow.

Publishing changed in June 2026. The internal sites are hosted on Azure Static Web Apps and deploy themselves from GitHub — there is no manual upload, no SFTP, and no deploy token to paste. The flow is simply edit → git push → live in a minute or two.

Want the full picture? How the sign-in & hosting works covers the GitHub → Azure deploy and the Microsoft sign-in gate in depth; How the dashboard works covers how the dashboard content is produced.

The current way — push to deploy all three sites

Each site is its own GitHub repo under QvantumSiteManager, wired to its own Azure Static Web App. A GitHub Actions workflow deploys every push to main automatically — usually live within 1–2 minutes.

  1. Edit the files on the work laptop, in that tool's folder under home_work/<tool>/.
    • Dashboard pages are generated, not hand-edited — refresh them first (next section).
    • The AI hub and UK Document Builder are edited directly.
  2. Push to GitHub: one git push to that repo's main branch (work identity via the github-work SSH alias).
  3. Azure publishes it automatically — the workflow .github/workflows/azure-static-web-apps-<resource>.yml runs Azure/static-web-apps-deploy@v1 (skip_app_build: true for these static sites). Watch it go green in the repo's Actions tab.
Never commit secrets. The dashboard's project root holds .env tokens — publish only the site files, never .env. The Entra sign-in id/secret live as Azure app settings, not in any repo.

Refresh the dashboard content first dashboard only

The NPI/CPI dashboard pages are generated from source text — never hand-edit npi_cpi.html. The pipeline lives in its own work repo, QvantumSiteManager/qvantum-npi-dashboard-source. From a clone of it run the one-command refresh (or the Claude Code slash commands):

# one command: backup → Jira refresh → render npi_cpi.html
./scripts/refresh_all.sh

# or, in Claude Code, the equivalent slash commands:
/update-dashboard      # re-render from projects/*.txt
/refresh-releases      # re-pull the read-only Jira release cards

A backup runs automatically before every re-render. Then copy the generated site/npi_cpi.html into a checkout of this deploy repo (QvantumSiteManager/qvantum-dashboard) and push main — that is what goes live. Full runbook: docs/refresh-and-deploy.md in the source repo.

⚠️ Jira access note: /refresh-releases uses an API token in qvantum-npi-dashboard-source/.env tied to Jacob's account; it stops working after 2026-06-26, after which the release cards silently stop updating. Rotate it now — step-by-step in Rotate the Jira API token below.

Rotate the Jira API token do before 2026-06-26

The read-only Jira connection that fills the Display (QD) and App (QHA) release cards authenticates with an Atlassian API token kept in qvantum-npi-dashboard-source/.env. The current token is tied to Jacob's account and stops working after 2026-06-26 — after that, /refresh-releases fails and the release cards silently stop updating. Rotate it under a still-employed account:

  1. Pick the account. A still-employed Atlassian account that can read the QD and QHA Jira projects (a person's account, or a service account).
  2. Create a new API token. Signed in as that account, open id.atlassian.com → Security → API tokens, click Create API token, name it (e.g. qvantum-dashboard-refresh) and copy it — Atlassian shows the value only once.
  3. Get the repo. With GitHub access, clone the source repo QvantumSiteManager/qvantum-npi-dashboard-source (work identity / the github-work SSH alias).
  4. Set the two values in .env. In that clone (local only — .env is gitignored, never committed). If there is no .env yet, create it first: cp .env.example .env. Then set both lines to the same still-active account: JIRA_USER=you@qvantum.com and Jira_dashboard_token=<your token>. Both must belong to the same account — changing only one fails with a 401. Never paste the token into chat.
  5. Run the refresh. From the repo root: ./scripts/refresh_all.sh (or just /refresh-releases in Claude Code). It should pull the releases with no auth error.
  6. Publish. Copy the generated site/npi_cpi.html into a checkout of the deploy repo QvantumSiteManager/qvantum-dashboard and git push main — live in 1–2 minutes.
  7. Clean up. Once the cards update, revoke the old token under Jacob's Atlassian account.
Authoritative steps live in the “Jira token — rotating to a new owner” section of CLAUDE.md in the source repo (also docs/refresh-and-deploy.md). The two keys are JIRA_USER (login email) and Jira_dashboard_token (personal API token); the token needs read/browse on projects QD and QHA.

The three sites

SiteGitHub repo (main)How it's edited
NPI/CPI dashboardQvantumSiteManager/qvantum-dashboard Generated in qvantum-npi-dashboard-source, synced in, pushed
AI hubQvantumSiteManager/qvantum-ai Hand-edited HTML, pushed
UK Document BuilderQvantumSiteManager/uk_document_builder Hand-edited app, pushed

Each pushes to its own main and auto-deploys to its own Azure Static Web App.

Old methods — retired don't use

Earlier versions of this page described manual SFTP upload, a combined qvantum-web-<date>.zip, swa deploy with pasted deployment tokens, and an SSH deploy_staging.sh. Those are superseded by the GitHub → Azure auto-deploy above and should no longer be used.