npm Release Via GitHub Actions
jmfederico/pi-web
A skill your agent uses whenever the user asks for a new npm version, npm release, package release, new release, version bump, publishing to npm, cutting a GitHub release, tagging a release, or…
Full runbook for cutting a Blanc desktop release — scripts/release.sh mechanics and its required BLANCRELEASE env vars, macOS notarization via 1Password, the Touch ID provisioning profile and…
$ npx skills add bnfy/blanc --skill releasing-blanc -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install bnfy/blanc releasing-blanc --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/bnfy/blanc.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/releasing-blanc .claude/skills/releasing-blanc && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "releasing-blanc" agent skill from https://github.com/bnfy/blanc/tree/main/.claude/skills/releasing-blanc into .claude/skills/releasing-blanc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "releasing-blanc", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/bnfy/blanc/tree/main/.claude/skills/releasing-blancType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add bnfy/blanc --skill releasing-blanc -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install bnfy/blanc releasing-blanc --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bnfy/blanc.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/releasing-blanc .agents/skills/releasing-blanc && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "releasing-blanc" agent skill from https://github.com/bnfy/blanc/tree/main/.claude/skills/releasing-blanc into .agents/skills/releasing-blanc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "releasing-blanc", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bnfy/blanc --skill releasing-blanc -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install bnfy/blanc releasing-blanc --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bnfy/blanc.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/releasing-blanc .cursor/skills/releasing-blanc && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "releasing-blanc" agent skill from https://github.com/bnfy/blanc/tree/main/.claude/skills/releasing-blanc into .cursor/skills/releasing-blanc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "releasing-blanc", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/bnfy/blanc.git --path .claude/skills/releasing-blanc--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add bnfy/blanc --skill releasing-blanc -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install bnfy/blanc releasing-blanc --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bnfy/blanc.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/releasing-blanc .gemini/skills/releasing-blanc && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "releasing-blanc" agent skill from https://github.com/bnfy/blanc/tree/main/.claude/skills/releasing-blanc into .gemini/skills/releasing-blanc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "releasing-blanc", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install bnfy/blanc releasing-blancInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add bnfy/blanc --skill releasing-blanc -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/bnfy/blanc.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/releasing-blanc .github/skills/releasing-blanc && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "releasing-blanc" agent skill from https://github.com/bnfy/blanc/tree/main/.claude/skills/releasing-blanc into .github/skills/releasing-blanc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "releasing-blanc", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add bnfy/blanc --skill releasing-blanc -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install bnfy/blanc releasing-blanc --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/bnfy/blanc.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/releasing-blanc .opencode/skills/releasing-blanc && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "releasing-blanc" agent skill from https://github.com/bnfy/blanc/tree/main/.claude/skills/releasing-blanc into .opencode/skills/releasing-blanc/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "releasing-blanc", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
releasing-blancFull runbook for cutting a Blanc desktop release — scripts/release.sh mechanics and its required BLANCRELEASE env vars, macOS notarization via 1Password, the Touch ID provisioning profile and…
Releasing Blanc is an agent skill from bnfy/blanc. Full runbook for cutting a Blanc desktop release — scripts/release.sh mechanics and its required BLANCRELEASE env vars, macOS notarization via 1Password, the Touch ID provisioning profile and signing-certificate pinning, the Windows/Linux GitHub Actions build with Azure Trusted Signing, and the post-publication changelog + site-deploy steps. Use when running npm run release, debugging a signing/notarization failure, rotating the Developer ID certificate or provisioning profile, or changing the release workflow.
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in DevOps & Cloud, covering Changelog and release notes, Runbooks and postmortems and CI/CD. It works with macOS, Linux, npm and Microsoft Azure. The repository describes itself as: Open-source desktop browser with a minimal Island interface, built-in ad and tracker blocking, private tabs, and releases for macOS, Windows, and Linux. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 5b15b46. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
npmgitghFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, git and gh, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
GH_TOKENAPPLE_APP_SPECIFIC_PASSWORDAZURE_CLIENT_SECRETCSC_KEY_PASSWORDFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Releasing Blanc loads about 2.9k tokens when it runs. Until then it costs about 134 tokens; SKILL.md has 1,422 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
ld step is wrapped in `op run --env-file=.env.1password --no-masking -- ...`, pulling `APPLE_ID`/`APPLE_APP_SPECIFIC_PASAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from bnfy/blanc at commit 5b15b46, republished under its MIT licence (© bnfy). 1,422 words, ~2,926 tokens.
.claude/skills/releasing-blanc/SKILL.md (or your agent's skills folder).Released versions are immutable — always bump to a new version, never overwrite assets. The pipeline is draft-first and fail-closed: nothing is tagged or published until every gate passes, and a failed attempt leaves no public artifacts.
Release PR (squash-merged to main, titled "Release Blanc X.Y.Z") containing,
in one commit:
version bump in package.json + package-lock.json (consider the
electron devDependency too — it tracks Chromium stable, and Chromium can't be
swapped out of a running app);docs/press/release-notes/vX.Y.Z.md
(required; ordinary wrapped markdown — mirror the previous release's file);const VERSION = 'X.Y.Z' in site/src/pages/press.astro
and the literal version pin in test/unit/press-kit.test.js
(assert.equal(packageVersion, 'X.Y.Z')). The verify gate fails the release if
either lags the package version.Run the script from a checkout whose HEAD is exactly origin/main (the script
verifies this and refuses otherwise):
BLANC_RELEASE_MODE=stable BLANC_RELEASE_PLATFORMS=mac,windows,linux BLANC_MAC_ARCHES=arm64,x64 npm run releaseAll three env vars are required — the script exits immediately without them.
BLANC_RELEASE_MODE=candidate requires a prerelease version (X.Y.Z-rc.N) and
publishes with --prerelease; stable refuses prerelease versions. Every
release ships both Mac architectures: Apple Silicon (arm64) is the default
Mac build and the native host the script smoke-tests, and Intel (x64) ships
alongside it so Intel installs keep updating. The script refuses a single
architecture unless BLANC_MAC_ARCH_WAIVER gives the reason, which must also be
recorded in the release incident. The post-release prerelease-smoke.yml
dispatch verifies and launches the published Intel DMG on a native
macos-15-intel runner.
After publication, the script regenerates site/src/data/releases.json from
the GitHub release body (npm run site:changelog). Commit that as
"Record Blanc X.Y.Z in the public changelog" (its own PR), then deploy the site
(npm run site:deploy) — only from a checkout at origin/main: a production
Pages deploy ships whatever the local tree contains, and a deploy from a stale
checkout has silently rolled the live site back to older content before.
scripts/release.sh authenticates via the gh CLI's cached session (no GH_TOKEN
needed locally). In order: it refuses existing tags/releases for the version
(immutability), refuses dirty release sources (a broad list: src, build, test,
scripts, site, spec/substrate dirs, workflows, package.json/lock, the notes
file), refuses a HEAD that isn't origin/main, then runs npm ci and the
press verification gate (release:verify:press: substrate checks, unit tests,
acceptance dry-run + desktop run, cold-launch smoke, OAuth desktop test, DNS smoke,
npm audit --omit=dev --audit-level=high, site build). Only then does it build:
notarized mac artifacts, a packaged first-run smoke test, and a migration test that
downloads the public Stable base version and upgrades its profile. The immutable
source tag is pushed first so CI runners can check out the exact commit, the draft
release is created with the complete mac asset set (using gh release create
directly — electron-builder's own GitHub publisher races per-artifact uploads and
can leave a first publish missing latest-mac.yml or a blockmap), Windows/Linux
builds are dispatched and watched, the full draft asset set is re-downloaded and
verified against the expected manifest, SHA256SUMS is generated and uploaded, and
only then is the draft published and every download URL smoke-checked logged-out.
test/unit/press-kit.test.js hard-codes the version and
requires press.astro's VERSION to match — bump both in the release PR itself
(see step 1), not as an afterthought.undici under electron's
@electron/get). Fix is usually a lockfile-only npm audit fix --omit=dev,
committed to main.npm ci does not install the site's dependencies — run
npm --prefix site ci too, or the site build dies with astro: command not found.tee in a shell without
pipefail — a failed release then reports exit 0 and reads as success.Releasing from a throwaway git worktree works well when the primary checkout is
dirty or shared with concurrent sessions: git worktree add <dir> origin/main, land
the release PR, git checkout --detach origin/main in the worktree (detached HEAD
passes the HEAD-equals-origin/main check), install both dependency trees, run the
script, remove the worktree afterward.
Notarization: the build step is wrapped in op run --env-file=.env.1password --no-masking -- ..., pulling APPLE_ID/APPLE_APP_SPECIFIC_PASSWORD from the 1Password item "Apple Notarization" (vault Dev, username/password fields) plus a literal APPLE_TEAM_ID — electron-builder's @electron/notarize integration auto-detects those three env vars with no extra config (hardened runtime + the JIT/unsigned-memory/disable-library-validation entitlements it needs are already electron-builder's defaults). If op isn't installed, the script falls back to an unnotarized build with a warning instead of failing outright; if op is installed but the item can't be resolved (locked vault, wrong item name), it fails loudly rather than silently shipping unnotarized — a signed-but-unnotarized build gets quarantined and blocked by Gatekeeper the moment it's downloaded (e.g. by electron-updater during an auto-update), which is exactly what broke a stale pre-rebrand install after the v0.3.0 release.
Provisioning profile (Touch ID passkeys): the mac build embeds build/embedded.provisionprofile (wired via build.mac.provisioningProfile) because the WebAuthn keychain-access-groups entitlement is restricted — even for the app's own TeamID.BundleID group, AMFI SIGKILLs an app carrying it without a profile that authorizes it, and helpers can't carry a profile at all (so the inherit entitlements must never list the group). The profile is only honored when it embeds the exact certificate the build is signed with; the Apple account has several identically-named Developer ID Application certs, so the signer is made deterministic and verified twice. build.mac.identity pins the signing certificate by SHA-1 fingerprint (electron-builder substring-matches the qualifier against security find-identity lines, so a fingerprint selects exactly one identity — update the pin when the cert rotates). scripts/preflight-mac-signing.mjs (npm predist/predist:dir + release.sh) then fails the build early unless every certificate electron-builder could select — the pinned identity, a CSC_LINK p12 (parsed and validated, never skipped), or unpinned Developer ID identities — is embedded in the profile, and unless the profile is an unexpired, all-devices (ProvisionsAllDevices, never ProvisionedDevices), Platform: OSX Developer ID profile — a device-listed development-type profile would launch only on registered Macs, bricking every other install through auto-update, while end-user devices need nothing installed for the correct profile type (it ships inside the bundle). Finally scripts/after-sign-verify.js (build.afterSign) checks ground truth on every packaged app: the certificate that actually signed Blanc.app must be in the bundle's embedded profile (itself byte-identical to the repo's) with the WebAuthn entitlement present, throwing before any dmg/zip exists. Regenerate the profile on the developer portal whenever the signing cert rotates — and note every current Developer ID cert expires 2027-02-01 (G1 CA cap), so cert and profile rotation land together before then. test/unit/webauthn-packaging.test.js guards the static wiring cross-platform.
Windows & Linux: release.sh only builds macOS locally (it's a macOS dev machine), then dispatches .github/workflows/release-windows-linux.yml against the already-pushed source tag and watches the run to completion; the draft stays unpublished if the native build fails. That workflow builds NSIS on windows-latest and AppImage on ubuntu-latest and uploads both onto the same draft; duplicate asset uploads fail rather than overwrite an existing version.
Windows code signing is live as of v1.0.3 (2026-08-04) via Azure Trusted Signing: account blanc-signing, certificate profile blanc-profile, publisher CN "Bananify Creative" (org identity validation completed, expires 2028-10-28 — renewal reminders start 60 days out; certificate renewal stops if it lapses). The workflow's signing is tried in order: Azure Trusted Signing first (repo secrets AZURE_TENANT_ID/AZURE_CLIENT_ID/AZURE_CLIENT_SECRET for the blanc-github-signing service principal, which holds the "Artifact Signing Certificate Profile Signer" role on the account, plus repo variables AZURE_TRUSTED_SIGNING_ENDPOINT/AZURE_CODE_SIGNING_ACCOUNT_NAME/AZURE_CERTIFICATE_PROFILE_NAME/AZURE_PUBLISHER_NAME, passed via --config.win.azureSignOptions.* CLI overrides); then a traditional Authenticode cert via CSC_LINK/CSC_KEY_PASSWORD if Azure isn't configured; otherwise unsigned with a ::warning:: annotation. A healthy release logs ==> Signing via Azure Trusted Signing (blanc-signing/blanc-profile) in the windows job — if the unsigned warning ever reappears, a repo variable or secret has been lost. The Azure branch requires all three of AZURE_CLIENT_ID, AZURE_CODE_SIGNING_ACCOUNT_NAME, and AZURE_CERTIFICATE_PROFILE_NAME non-empty before it's attempted — a partially-configured setup must fall through rather than call Invoke-TrustedSigning with an empty profile name, which fails hard instead of degrading; this exact failure shipped once before the gate was tightened. Linux AppImages aren't code-signed (no OS-level equivalent to Gatekeeper/SmartScreen to satisfy).
Two electron-builder artifact-naming quirks the workflow's verify/upload steps depend on, found by reading actual CI output rather than the docs: the AppImage gets no -x86_64/arch suffix when built for the runner's default arch (only a non-default or multi-arch build adds one), and AppImage's block map is embedded in the file itself rather than shipped as a separate .blockmap (unlike the mac zip/dmg and the NSIS .exe, which do get one) — re-check the real dist/ output rather than assuming a pattern if this ever needs to change.
© bnfy, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/releasing-blanc of bnfy/blanc.
Open the folder on GitHubat commit 5b15b46
Releasing Blanc next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Releasing Blanc this skillbnfy/blanc | 115 | — | ~2.9k | Automated safety check: Notes | MIT | |
| npm Release Via GitHub Actionsjmfederico/pi-web | 871 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Running GitHub Actions Efficientlykajisho5/ffmpeg-skill | 1.9k | — | ~3.3k | Automated safety check: Notes | MIT | |
| Release And CIeser/stack | 128 | — | ~665 | Automated safety check: Pass | Custom licence | |
| CI Adhoc Testnubjs/nub | 4.4k | — | ~1.7k | Automated safety check: Pass | MIT | |
| Releasing MarchatCod-e-Codes/marchat | 137 | — | ~801 | Automated safety check: Pass | MIT |
jmfederico/pi-web
A skill your agent uses whenever the user asks for a new npm version, npm release, package release, new release, version bump, publishing to npm, cutting a GitHub release, tagging a release, or…
kajisho5/ffmpeg-skill
Cut GitHub Actions minutes and wall-clock time without losing coverage — the OS billing multiplier (macOS 10x / Windows 2x / Linux 1x), trigger hygiene that stops push+pullrequest double-firing…
eser/stack
Releases and CI for eserstack: the shared version of all packages, the release command, the tag-driven build.yml run, JSR and npm publishing, changelog and breaking changes, release recovery, GitHub…
nubjs/nub
Run ad-hoc / exploratory tests on a real OS or platform via CI when the behavior CANNOT be reproduced on the local host or in Docker — macOS Seatbelt / sandbox-exec / codesigning, Windows cmd.exe /…
Cod-e-Codes/marchat
Prepares marchat releases: version bumps, CHANGELOG, packaging checksums, GitHub Actions release workflow, and Docker tags.
tw93/Mole
Runbook for assessing and executing a Mole CLI release: distribution channels, pre-flight checks, capital-V tags, build artifacts and the handoff to curated release notes.
bnfy/blanc
Copy the current Chrome, Edge, Brave, Opera, or Vivaldi window into the current Blanc window through a private one-time handoff, with a new window available as an explicit choice in Blanc.
Categories
Full runbook for cutting a Blanc desktop release — scripts/release.sh mechanics and its required BLANCRELEASE env vars, macOS notarization via 1Password, the Touch ID provisioning profile and…. Releasing Blanc is an agent skill from bnfy/blanc.sh mechanics and its required BLANCRELEASE env vars, macOS notarization via 1Password, the Touch ID provisioning profile and signing-certificate pinning, the Windows/Linux GitHub Actions build with Azure Trusted Signing, and the post-publication changelog + site-deploy steps.
Releasing Blanc fits situations like: running npm run release; debugging a signing/notarization failure; rotating the Developer ID certificate; provisioning profile.
Run `npx skills add bnfy/blanc --skill releasing-blanc -a claude-code`. Or copy the skill folder (.claude/skills/releasing-blanc in bnfy/blanc) into .claude/skills/releasing-blanc in your project. Claude Code loads it when a task matches its description.
Run `npx skills add bnfy/blanc --skill releasing-blanc -a codex`. Or copy the skill folder (.claude/skills/releasing-blanc in bnfy/blanc) into .agents/skills/releasing-blanc in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add bnfy/blanc --skill releasing-blanc -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/releasing-blanc, .gemini/skills/releasing-blanc, .github/skills/releasing-blanc and .opencode/skills/releasing-blanc in your project.
Going by SKILL.md and its folder, Releasing Blanc needs the command-line tools its instructions call (npm, git and gh) and credentials named GH_TOKEN, APPLE_APP_SPECIFIC_PASSWORD, AZURE_CLIENT_SECRET and CSC_KEY_PASSWORD. Our summary lists: A credential in AZURE_CLIENT_SECRET.
SKILL.md contains no URLs. Its commands use npm, git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Releasing Blanc is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Releasing Blanc: npm Release Via GitHub Actions (jmfederico/pi-web, 871 stars), Running GitHub Actions Efficiently (kajisho5/ffmpeg-skill, 1.9k stars), Release And CI (eser/stack, 128 stars) and CI Adhoc Test (nubjs/nub, 4.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
bnfy (a GitHub user) maintains it in bnfy/blanc, which has 115 GitHub stars. The repository holds 2 skills in this directory. The repository was last updated on October 10, 2026.
Source: bnfy/blanc on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.