Vitreous ships unsigned today, so Windows SmartScreen shows a one-time "More info → Run anyway" on first run. To remove that, we sign the installer with the SignPath Foundation certificate — free for qualifying open-source projects. Publisher then reads "SignPath Foundation".
SignPath is not a .pfx you install locally. It signs artifacts that were
built in a trusted CI. The flow:
- GitHub Actions builds the unsigned installer (
.github/workflows/release.yml). - The workflow submits the
.exeto SignPath's cloud. - SignPath signs it with the Foundation certificate and returns the signed file.
- We regenerate
latest.yml+.blockmapso electron-updater's hash matches the signed installer (skipping this silently breaks auto-update). - The signed installer + metadata are attached to the GitHub Release.
It's an OV certificate (not EV), so SmartScreen still builds reputation over the first downloads — but a signed build clears the warning far faster than unsigned, and identifies the publisher.
| Requirement | Status |
|---|---|
| Public GitHub repo | ✅ subhasisbiswal012/Vitreous |
| OSI-approved license | ✅ MIT |
| Built by a supported CI | ✅ GitHub Actions workflow added |
| SignPath Foundation application approved | ⬜ you must apply |
Note: SignPath Foundation reviews each project for legitimacy/relevance. A brand-new project may be asked to show it's real and distributed — having this repo public, the download page live, and a first (even unsigned) release available strengthens the application. If they decline pre-release, publish one unsigned
0.1.0first, then apply.
- Go to https://signpath.org/apply and submit Vitreous (GitHub URL, MIT license).
Use the public email
subhasis.biswal.hustle@gmail.com. - After approval, in the SignPath console:
- Note your Organization ID.
- Create a Project (slug
vitreous) connected to the GitHub repo. - Create a Signing Policy (slug e.g.
release-signing) using the Foundation cert. - Generate a CI user API token.
- In the GitHub repo → Settings → Secrets and variables → Actions, add:
- Secret
SIGNPATH_API_TOKEN= the API token. - Variable
SIGNPATH_ORG_ID= your Organization ID. - Variable
SIGNPATH_ENABLED=true(turns the signing job on).
- Secret
- Tell me when that's done — I'll un-comment and finalize the
signjob inrelease.yml(the scaffold is already there), wire the metadata regeneration script, and switch publishing to attach the signed artifacts.
release.ymlbuilds the unsigned installer +latest.yml+.blockmapand uploads them as a workflow artifact (working now — testable via Run workflow).- The
signjob (commented scaffold inrelease.yml) submits to SignPath, then ascripts/update-release-metadata.mjsstep recomputes the sha512/size inlatest.ymland regenerates the blockmap for the signed.exebefore release.
- ✅ CI build workflow added (
.github/workflows/release.yml). - ⬜ SignPath Foundation application (you) → secrets/variables → finalize
signjob. - ⬜ Then: publish the first signed Release + point the download page CTA at it.