This repository is two things for Layer5 Blowhorn:
- The marketing site at blowhorn.ai. It is a Hugo site with Docsy as a Hugo module, built like docs.layer5.io and deployed to GitHub Pages by
site.yml. The Pages custom domain is already blowhorn.ai, so the project URL https://layer5io.github.io/blowhorn-site/ only redirects there; the site is reachable once the domain's DNS points at Pages, asdocs/deploy.mddescribes. - Public downloads. macOS disk images and their checksums are published as GitHub Releases on this repository. No release binary is committed here.
Blowhorn is a social media console that takes one message and broadcasts, reposts and amplifies it across every profile and platform your community runs, on autopilot. One message out, many ears in.
Once the first stable release is public, this link always points at the newest universal macOS build:
https://github.com/layer5io/blowhorn-site/releases/latest/download/Blowhorn-mac.dmg
Every release carries a SHA256SUMS.txt. Check the image before you open it:
shasum -a 256 -c SHA256SUMS.txtThe Chrome extension ships through the Chrome Web Store, not from this repository.
| Site configuration | hugo.toml; the pinned toolchain is go.mod (Docsy as a Hugo module), package.json (Hugo extended, postcss) and .nvmrc (Node.js) |
| Pages | content/en/: the home page's front matter, the Trust Center and its privacy and terms pages (legal/), the onboarding pages and short redirect paths at the root (welcome.md, signup.md, ...), and the docs/ section scaffold (landing, quadrant, group, and CLI indexes) in Markdown |
| Templates | layouts/: the home page (home.html), the shared shell (baseof.html), the Trust Center hub (trust-center.html), the legal pages (legal.html), the onboarding pages (onboarding.html), the redirect pages (redirect.html), the 404 page, the header, footer and icon sprite partials, the llms.txt and Markdown outputs, and the Docsy-based docs shell (layouts/docs/) |
| Styles and script | assets/css/site.css and assets/js/download.js (the /download/ page); Hugo minifies and fingerprints both. The docs section's Blowhorn skin over Docsy is assets/scss/, with its sidebar toggle and offline search in assets/js/ |
| Brand assets | static/assets/brand/, served at /assets/brand/: version 1 of the brand kit (logo system, Major Blowhorn, marketing art, tokens.json) and the three self-hosted fonts; attribution in LICENSES.md |
| How the site deploys and how the domain is wired | docs/deploy.md |
| How releases are published | docs/distribution.md |
| Release binaries | Releases on this repository |
| Product source and build pipeline | Private: leecalcote/blowhorn |
Reporting problems. The product repository is private, so use this repository's issues for everything public: site content, a download that will not open, a wrong checksum, or a bug in the app. Maintainers triage app bugs into the product repository. The Layer5 Slack works too.
You need Go (Hugo modules), Node.js and npm (the pinned Hugo extended and postcss come from package.json), Python 3 and make. The build targets follow the shared contract of layer5io/docs. make help lists every target.
make setup # npm install: the pinned Hugo extended and postcss
make site # serve at http://localhost:1313 with live reload
make serve # serve once, without live reload
make build # local build with draft, future and expired content
make build-production # public production build into public/, what CI deploys
make site-internal # internal build into public-internal/ (needs ../blowhorn)
make check # every check, against a fresh production build
make ci # exactly what site.yml's check job runs, starting with npm ciEvery CI step that runs repository logic is a make target, and the workflow calls that target, so one make command reproduces any CI step:
| Target | What it runs | Run by |
|---|---|---|
setup-ci |
npm ci (the locked dependencies) |
site.yml |
workflow-check |
actionlint on site.yml, publish-dmg.yml, sync-docs.yml, cloud-auth-smoke.yml and product-ci.yml |
site.yml |
test-scripts |
unit tests for the check scripts in .github/scripts/ |
site.yml |
site-check |
one production build, then the checks below | site.yml |
check-schemas |
data/hero.json (the home page hero variants and rotation) and data/roles.json (the /for/<role>/ pages) validate against their schemas in schemas/ (docs/hero-variants.md) |
site-check |
validate-html |
html-validate on every built page | site-check |
check-links |
every local link, image, font and srcset reference resolves |
site-check |
check-third-party |
no page, or stylesheet or script it loads, requests another host (except the disclosed GitHub release lookup) | site-check |
check-urls |
every published URL and anchor still exists | site-check |
dmg-resolve, dmg-download, dmg-package, dmg-verify, dmg-release |
the five steps of publishing a DMG release, each reading its inputs from the environment (docs/distribution.md) | publish-dmg.yml |
dmg-check DMG=... |
sanity-check a disk image before publishing | dmg-package runs the same script (check-dmg.sh) |
dmg-sync-docs |
after a public release, start sync-docs.yml at the product tag desktop-<version> |
publish-dmg.yml |
docs-cli-reference |
regenerate the CLI reference pages in the product checkout from its CLI schema and parser, before the sync (docs/deploy.md) | sync-docs.yml |
docs-sync REF=... |
copy the product docs from a leecalcote/blowhorn checkout into content/en/docs/ (docs/deploy.md) |
sync-docs.yml |
docs-sync-base |
check out the docs-sync branch on the open sync PR's head, or on master when none is open (docs/deploy.md) |
sync-docs.yml |
docs-sync-start-checks |
start site.yml on the docs-sync branch after a sync (docs/deploy.md) |
sync-docs.yml |
product-ci SUITE=python|desktop |
run the private product repo's CI on a checkout of it, printing only step results and pass/fail counts (output stays in a private log; public logs never show product code) | product-ci.yml |
Each check target builds for production first, so it also runs on its own. labeler.yml, label-commenter.yml and slack.yml only call third-party actions and run no repository logic, so they have no target.
The site follows the brand kit exactly: every colour, type style, spacing, radius and shadow in assets/css/site.css is a token from static/assets/brand/tokens.json, with light as the default theme and dark following the operating system. Brand SVGs are used as files and never recoloured. The one-to-many hero illustration and the platform marks are inline SVG drawn in currentColor.
Nothing on the site loads from another host except Google Analytics 4, and that only with consent: no CDN and no web fonts from elsewhere. The id is in [services.googleAnalytics] in hugo.toml. layouts/_partials/analytics.html sets Google Consent Mode v2 to denied, and assets/js/consent.js loads gtag.js only after the reader accepts the cookie notice (layouts/_partials/consent.html). Both render in production builds only. The other request to another host while browsing is the download page's release lookup on GitHub's API (assets/js/download.js). The footer newsletter form posts to Layer5's Mailchimp list only when submitted. The privacy page discloses all three. make site-check fails a build that loads anything else from another host. The public URLs (/, /privacy.html, /terms.html, /assets/brand/...) and the home page's anchors (#platforms, #how, #trust, #download) are linked from outside this repository; the same check fails a build that loses one.
The site also publishes /llms.txt, /llms-full.txt and a Markdown copy of every page (/legal/privacy/index.md), as docs.layer5.io does.
| Workflow | When | What it does |
|---|---|---|
site.yml |
Pull requests, pushes to master, manual runs |
Lints the workflows, runs the check-script unit tests, builds the site with the pinned Hugo, Go and Node.js, runs make site-check and uploads the Pages artifact. On master it deploys the artifact to GitHub Pages. |
publish-dmg.yml |
Manual, or repository_dispatch (publish-dmg) from product CI |
Downloads a built DMG over HTTPS, checks it, verifies signing and notarization on a macOS runner (required for any public release), then creates the release with versioned assets, the Blowhorn-mac.dmg alias and checksums. Drafts by default; never overwrites. |
sync-docs.yml |
Manual, or repository_dispatch (sync-docs) from product CI |
Checks out the product docs at the requested ref, opens or updates the docs-sync pull request (docs: sync from <ref>), and starts the site checks on it itself (gh workflow run site.yml); merging deploys once those checks pass. |
Our projects are community-built and welcome collaboration. 👍 Be sure to see the Layer5 Community Welcome Guide for a tour of resources available to you and jump into our Slack!
MeshMates are experienced Layer5 community members, who will help you learn your way around, discover live projects and expand your community network. Become a Meshtee today!
Find out more on the Layer5 community.
✔️ Join any or all of the weekly meetings on community calendar.
✔️ Watch community meeting recordings.
✔️ Access the Community Drive by completing a community Member Form.
✔️ Discuss in the Community Forum.
✔️Explore more in the Community Handbook.
Not sure where to start? Grab an open issue with the help-wanted label.
