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. Many ears.
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/), 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 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 section); 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 build-production # build into public/, what CI deploys
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 and sync-docs.yml |
site.yml |
test-scripts |
unit tests for the check scripts in .github/scripts/ |
site.yml |
site-check |
one production build, then the four checks below | site.yml |
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) |
docs-sync REF=... |
copy the product docs from a leecalcote/blowhorn checkout into content/en/docs/ (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 |
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: no CDN, no web fonts from elsewhere, no analytics. The one request to another host is the Download section's release lookup on GitHub's API (assets/js/download.js), which the privacy page discloses. 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.
