Skip to content

panos-response-pages

Modern, responsive response pages for PAN-OS. Generate response pages to delight users while protecting them from threats.

Preview

panos-response-pages generates responsive response pages for Desktop and Mobile which support both dark and light mode by default. For a full preview of all available themes and options take a look at the dedicated Preview pages.

Shown in the Beacon Field style. The Preview gallery adds the other six styles, mobile widths and the four GlobalProtect login states.

Install

pip install panos-response-pages

Install (From Source)

uv tool install panos-response-pages
uvx panos-response-pages build          # or run it without installing

Quickstart

panos-response-pages build              # every style, into ./out
panos-response-pages themes             # what styles are available
panos-response-pages palettes           # what colour schemes are available

Output lands in two places:

Path Contents
out/deploy/<style>/<palette>/ Deployable pages, PAN-OS tokens intact
out/preview/<style>/<palette>/ The same pages with sample data, for visual review
out/preview/index.html Clickthrough gallery — style, palette, page, language, viewport, colour scheme

Import from out/deploy/. The preview build substitutes sample values for the PAN-OS tokens so the pages render in a browser; it is not deployable.

The preview gallery fetches what you ask for and nothing else. Switching palette reloads the frames from a sibling preview/blobs-<palette>.js; switching language pulls that language's dictionary from preview/lang-<code>.js. That is why preview/ holds one file per palette and one per non-base language — the base language has no sidecar, being the text the frames are already served in.

The point of the split is that index.html stays the same size whatever you ship: about 1.83 MB with two languages and about 1.83 MB with thirteen. Inlined, it would be a 5.9 MB document, most of it never looked at.

Style and palette are independent. A style that pins its own palette (nyan does) decides only which palette the gallery opens on; every style is still built in every palette, because the point of building all of them is to choose.

Customising

The shipped shells, palettes, themes and default config are packaged with the tool. To change any of them, copy them out first:

panos-response-pages init               # copies to ~/.panos_response_pages
panos-response-pages build              # picks that up automatically

Resolution order, first hit wins:

  1. --config-dir PATH, or $PANOS_RESPONSE_PAGES_DIR
  2. ~/.panos_response_pages, if it exists
  3. the data shipped inside the package

It resolves as a whole tree rather than per file. Themes and shells are coupled — a local themes/ over packaged templates/shells/ could name a shell that is not there — so it is all-or-nothing, and init makes copying everything cheap. build -v reports which directory it used and which rule chose it.

Where to go next