Skip to content

feat: native package manager distribution — WinGet (Windows) and apt/deb (Linux) #278

Description

@malon64

Summary

Extend floe distribution to two additional native package managers, following the same pattern as the Homebrew tap (macOS/Linux) and Scoop bucket (Windows) already in place:

  • WinGet — Windows Package Manager, pre-installed on Windows 10/11
  • apt / deb — Debian/Ubuntu package, the dominant Linux system package manager

Both follow the same process: generate a versioned manifest/package from the GitHub Release binary artifact and submit/push it on each release.


WinGet (Windows)

How it works

WinGet packages live in the microsoft/winget-pkgs public repository. Each package is a set of YAML manifests under manifests/m/malon64/floe/. Submissions are pull requests reviewed by the WinGet team (typically auto-merged within hours via bot).

Manifest structure

manifests/m/malon64/floe/X.Y.Z/
  malon64.floe.yaml                 # version manifest
  malon64.floe.installer.yaml       # installer manifest (points to .zip)
  malon64.floe.locale.en-US.yaml    # locale manifest

Automation options

  • wingetcreate: CLI tool that generates and submits manifests automatically. Can be added as a release workflow step.
  • Manual: Use wingetcreate update locally after each release and open the PR by hand.

Recommended: automate via wingetcreate in release.yml, same pattern as the Scoop step.

Source artifact

floe-vX.Y.Z-x86_64-pc-windows-msvc.zip — already published to GitHub Releases.

End-user experience

winget install malon64.floe
winget upgrade malon64.floe

apt / deb (Linux)

How it works

There is no single centralised apt registry like crates.io. The standard approach for a project of this size is a self-hosted apt repository published to GitHub Pages (or similar static hosting), following the pattern used by tools like gh, netlify, sentry-cli, etc.

Recommended approach

  1. On each release, build a .deb package from the x86_64-unknown-linux-gnu binary using cargo-deb or a hand-crafted dpkg-deb invocation.
  2. Sign the package with a GPG key.
  3. Publish the signed .deb and the apt repository metadata (Packages, Release, InRelease) to a static host (GitHub Pages on malon64/apt-floe, or an existing Pages repo).
  4. Users add the repo once and get upgrades via apt upgrade.

End-user experience

curl -fsSL https://malon64.github.io/apt-floe/gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/floe.gpg
echo "deb [signed-by=/etc/apt/keyrings/floe.gpg] https://malon64.github.io/apt-floe stable main" \
  | sudo tee /etc/apt/sources.list.d/floe.list
sudo apt update
sudo apt install floe

Implementation checklist

WinGet

  • Add wingetcreate step to release.yml that opens a PR against microsoft/winget-pkgs on each tag
  • Add WINGET_TOKEN secret (PAT with public_repo scope, needed by wingetcreate)
  • Update docs/installation.md with winget install instructions

apt / deb

  • Create malon64/apt-floe repo with GitHub Pages enabled
  • Add cargo-deb configuration to floe-cli/Cargo.toml
  • Generate and sign .deb in release.yml after the Linux build step
  • Publish updated apt repo index to malon64/apt-floe Pages on each release
  • Add APT_REPO_TOKEN and APT_GPG_KEY secrets
  • Update docs/installation.md with apt install instructions

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions