Public home for PrintMaster, served by a small Go HTTP server with static assets embedded in the binary. No JavaScript framework or runtime dependency required.
go run .Open http://localhost:8080. Set PORT to change the listen port.
docker build -t printmaster-site .
docker run --rm -p 8080:8080 printmaster-siteEvery push to main runs tests and publishes the image to GitHub Container Registry:
docker pull ghcr.io/printmaster-org/printmaster.work:main
docker run -d --name printmaster-site --restart unless-stopped -p 8080:8080 ghcr.io/printmaster-org/printmaster.work:mainThe workflow also publishes an immutable sha-<commit> tag. Set the GHCR package to public in GitHub package settings for hosts that pull without registry credentials; package visibility is not changed automatically by the workflow. Pull the updated main image and recreate the container to deploy a newer build.
Health endpoint: /healthz.
The site reads public GitHub Release metadata once at startup and serves an in-memory catalog. It never downloads or proxies release binaries. After an Agent or Server Stable, Beta, or Dev release is published, the PrintMaster release workflow sends a signed notification to POST /api/releases/refresh; the site refreshes metadata and the downloads page links directly to GitHub assets. Duplicate notifications for a release already in the catalog are ignored.
GET /api/releases returns separate stable, beta, and dev arrays for each component, with at most five releases per channel. -dev/-dev.* tags go only to Dev; other prerelease tags or releases flagged as prereleases go to Beta. Build metadata does not change a channel. Stable and Beta sort by semantic version, and Dev by publication time. Catalog reads scan up to ten pages of 100 GitHub releases so frequent Dev publishing does not crowd Beta out.
Stable stays the featured production download. Beta is visible with testing and installation caveats. Dev is tucked into a collapsed Developer builds (Dev) disclosure with a warning, never mixed into Beta. Agent Beta releases have no MSI; download the executable or versioned DEB/RPM assets. APT/DNF repository commands remain Stable-only.
To enable automatic refresh:
- Generate one shared random secret (for example, with
openssl rand -hex 32). - Add it to the PrintMaster repo's Actions secrets as
PRINTMASTER_WEBSITE_RELEASE_SECRET. - Pass the same value to the website container as
RELEASE_WEBHOOK_SECRET. For example, addRELEASE_WEBHOOK_SECRET: ${RELEASE_WEBHOOK_SECRET}under the service'senvironment:block, then store the value in the host's.envfile.
The workflow skips notification if its secret is unset, and notification failures do not fail a product release. Restarting the website performs a fresh catalog read; if startup refresh fails, the first downloads-page API request retries. No recurring GitHub polling is configured. Optionally set GITHUB_TOKEN on the website container to a read-only GitHub token for higher API rate limits.
- Pull requests run Go tests,
go vet, and a Docker build without publishing. node --test tests/scans-embed.test.cjsvalidates iframe message handling and runs alongside Go checks in CI.- Pushes to
mainrun Go tests, then publish the image to GHCR. - Dependabot checks Go modules, Docker base images, and GitHub Actions weekly, using
chore(deps): …commit messages.
Commits use Conventional Commits (type(scope): summary); see AGENTS.md. Enable the enforcing hook once per clone:
git config core.hooksPath .githooks- Pages in
web/*.htmlare Go HTML templates, rendered once at startup and embedded alongside static assets. Shared navigation and footer live inweb/templates/header.htmlandweb/templates/footer.html; include both when adding a page and register its route inmain.go. - Homepage body copy uses 17–18px text, with labels and supporting text at least 14px; mobile layouts reflow rather than shrink the type. Shared navigation/footer use the same readable scale. Check narrow screens (down to 320px), keyboard navigation, and reduced motion when changing layout. The architecture diagram draws and animates the same SVG paths from each Agent to the optional Server; on phones it uses a static, connected vertical layout. Keep diagram card footer styles separate from the page footer.
- The shared footer loads site-wide navigation/year behavior and the async GoatCounter script (
//gc.zgo.at/count.js), reporting public page views tohttps://stats.www.printmaster.work/count. Analytics requires JavaScript and may be blocked by browser privacy settings; it does not run on API or health endpoints. This applies only to this public website, not the documentation site or self-hosted Agent/Server UIs. - Every page footer links Site stats to
https://stats.www.printmaster.work/. The custom stats hostname needs its GoatCounter CNAME and HTTPS configuration; dashboard visibility is controlled in GoatCounter. The docs site has its own separate analytics integration and stats link athttps://stats.docs.printmaster.work/. - Windows MSI downloads link directly to versioned GitHub Release assets from
/downloads. - The homepage, shared navigation, and footer link to
/scans/, which frames the independently deployed PrintMaster Scans inside this site's shared header/footer./scansredirects to/scans/. The utility is not included in Agent/Server downloads; docs remain normal external links. - Deploy Scans embed support first, then redeploy this website. The iframe's origin/source-checked handshake removes its own navigation, selects the matching dark palette, and reports height/anchor positions. The wrapper delegates clipboard writes, sandboxes the frame, and always offers a standalone link; after 15 seconds without sizing confirmation it reports a connection problem. The frame remains scrollable without the bridge. Test with real HTTPS origins or browser network interception; local origins are intentionally not trusted by the bridge. No proxy, copied Scans content, or runtime build dependency is introduced.
- Debian/Ubuntu and Fedora/RHEL installation commands point to the official package endpoints.
https://docs.printmaster.work/is the planned separate documentation site.- Product claims are limited to implemented Agent and Server behavior; printer data availability varies with device and SNMP configuration.