Manifests and static winget source for jcollie's Windows programs
  • Python 83%
  • Shell 12.2%
  • HTML 3%
  • PowerShell 1%
  • Nix 0.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jeffrey C. Ollie 5fdbd1d19f
All checks were successful
test / test (push) Successful in 2m34s
test / publish (push) Successful in 2m13s
Merge pull request 'JCOllie.Harrier 0.15.0' (#46) from submit/JCOllie.Harrier/0.15.0 into main
Reviewed-on: #46
2026-10-27 00:14:15 -05:00
.forgejo/workflows test each change once, not on both its push and its pull request 2026-10-14 02:53:30 -05:00
certificate build a signed pre-indexed source for the Windows spike 2026-10-13 21:41:36 -05:00
docs/adr define the submitter and record where new versions are written 2026-10-14 01:00:56 -05:00
LICENSES start the manifest repository for a static winget source 2026-10-13 20:04:46 -05:00
manifests/j/JCOllie JCOllie.Harrier 0.15.0 2026-10-27 05:11:54 +00:00
spike build a signed pre-indexed source for the Windows spike 2026-10-13 21:41:36 -05:00
tests publish an index.html saying how to add the source 2026-10-14 13:38:44 -05:00
tools publish an index.html saying how to add the source 2026-10-14 13:38:44 -05:00
.gitignore build a signed pre-indexed source for the Windows spike 2026-10-13 21:41:36 -05:00
CONTRIBUTING.md read an MSI's ProductCode in new-version 2026-10-14 11:58:40 -05:00
flake.lock start the manifest repository for a static winget source 2026-10-13 20:04:46 -05:00
flake.nix write a package's first version with wingetsource new-package 2026-10-14 11:45:50 -05:00
GLOSSARY.md define the submitter and record where new versions are written 2026-10-14 01:00:56 -05:00
README.md publish an index.html saying how to add the source 2026-10-14 13:38:44 -05:00
REUSE.toml check manifests against the schemas and this repository's rules 2026-10-13 22:21:59 -05:00

winget-pkgs

The winget manifests for the Windows programs Jeff writes, and the tooling that turns them into a winget source served as a static site at https://winget.jcollie.dev/.

git clone https://git.jcollie.dev/jeff/winget-pkgs.git

It is mirrored at https://tangled.org/jcollie.dev/winget-pkgs.

Using the source

The source is signed with a self-signed certificate, so a Windows machine has to trust that certificate before winget will read it. From an elevated PowerShell:

irm https://winget.jcollie.dev/install.ps1 | iex

That imports the certificate into the machine's Trusted Root and Trusted People stores and adds the source under the name JCOllie, marked --trust-level trusted: winget then marks an installer whose hash matches its manifest as coming from the Trusted Sites zone rather than the Internet, so Windows does not warn about it before it runs. The trust level can only be set when a source is added, so a machine that added the source before it was set gets it by running the script again. After that the packages install and upgrade like any other:

winget install -s JCOllie JCOllie.Clipwatch
winget upgrade --all

Adding a source needs administrator rights, which is winget's rule rather than this source's. https://winget.jcollie.dev/ itself says the same, with the steps for doing it by hand, the certificate's hash to check, how to remove the source again, and every package the source holds.

How it works

Every package identifier is JCOllie.<Program>. The manifests live under manifests/ in exactly the layout of Microsoft's winget-pkgs repository — manifests/j/JCOllie/<Program>/<Version>/ — as the usual three files: the version file, the installer file and the default locale file. The installers themselves are not here: each manifest points at a release asset on the program's own repository and pins its SHA-256.

A new version arrives as a pull request. A package's first version is written by wingetsource new-package from what is particular to the program — its name, descriptions, license, tags and installers — reading an MSI's codes from the MSI itself; every later one is written by wingetsource new-version, which copies the package's newest version and replaces what changes with the release. A pull request is checked against Microsoft's published manifest JSON schemas and against rules of this repository's own — the identifier and version match the path, the publisher is JCOllie, and each installer downloads from git.jcollie.dev with the hash its manifest gives.

Every push to main rebuilds the whole source on Linux:

  1. a SQLite index of every manifest is written, in winget's schema 1.7;
  2. it is packed into source.msix, versioned from the merge commit's time;
  3. the package is signed;
  4. the package, the manifests, the certificate, install.ps1 and an index.html listing the packages are uploaded to git-pages.

All four steps are done by tools/wingetsource, a small Python program, with osslsigncode for the signature. Because a source can only point at one file per version, each multi-file manifest is published merged into a single ManifestType: merged document, named by its SHA-256 so that a changed manifest is never served from a stale cache. The files whose names never change — source.msix, the certificate, install.ps1 and index.html — are served with Cache-Control: no-cache through a git-pages _headers file, so that winget source update always checks for a new source.msix rather than installing a cached one.

winget reads it as a Microsoft.PreIndexed.Package source, the same kind as Microsoft's own, which needs nothing but plain files over HTTPS. The index has no specification beyond winget-cli's C++, so the writer follows that code: its tables and indices are those of the index inside Microsoft's own published source.msix, and its package name and publisher normalization passes winget-cli's own test data. Why it is built this way rather than with a REST server or Microsoft's Windows-only tools is recorded in docs/adr/.

Reporting issues

Report issues and send pull requests at https://tangled.org/jcollie.dev/winget-pkgs. See CONTRIBUTING.md for how the repository is laid out.

License

MIT. The repository follows the REUSE specification, and reuse lint passes.

References cited