Unified inbox
GitHub, Bitbucket, and GitLab activity merged, de-duplicated, and shown grouped by repository or as a flat newest-first list — one click to the page.
Trayage gathers your GitHub and Bitbucket Cloud activity into one place, opens the right page on a click, and raises native Windows toasts only for what you actually care about.
Trayage lives in the notification area and only speaks up when it should.
GitHub, Bitbucket, and GitLab activity merged, de-duplicated, and shown grouped by repository or as a flat newest-first list — one click to the page.
Real Windows notifications, per class of activity. Click one and the right page opens — no inbox archaeology. They use the Windows App Runtime; without it Trayage still tracks your inbox in the tray, and Settings links you straight to the install.
Pick repositories you care about and get all their activity — even when you're not directly involved.
OAuth tokens are encrypted at rest with Windows DPAPI — per-user, per-machine, never in plaintext.
A clean Windows 11 look with light, dark, and system themes — built on WPF and WPF-UI.
Set the poll interval, group or hide read items, toggle each notification class, and start with Windows. The first poll never floods you.
Each provider authenticates the way it's meant to — you just click Connect.
Reads your notifications inbox directly via the GitHub API.
Assembles an inbox from pull-request queries (Bitbucket has no notifications API).
Reads your to-do inbox directly via the GitLab API — a centralized inbox, like GitHub.
Honest about limits: because Bitbucket Cloud exposes no notification or mention feed, its mentions and CI status aren't surfaced in this version, and review-request detection is scoped to your watched repositories. See the README for details.
A small background loop does the work; the rules decide what's worth a toast.
Each connected provider is queried on your chosen interval, honouring server rate-limit hints.
Results become provider-agnostic items, de-duplicated into a single ordered inbox.
The new snapshot is compared with the last, so only genuinely new activity is surfaced.
The rule engine decides which new items toast — by class, or by watched repository.
Each tagged build carries a GitHub build-provenance attestation, a cosign keyless signature, and a CycloneDX SBOM — check all three in one command.
PS> ./Verify-Release.ps1 # 1/3 GitHub Attestation [PASS] trayage-v1.0.0-win-x64.zip [PASS] trayage-v1.0.0-win-arm64.zip # 2/3 Cosign Keyless Signature [PASS] trayage-v1.0.0-win-x64.zip [PASS] trayage-v1.0.0-win-arm64.zip # 3/3 SBOM Integrity (CycloneDX) [PASS] 84 dependency components listed Release v1.0.0 passed all verification checks.
Proves which workflow, commit, and runner built each archive.
gh attestation verify
Sigstore keyless signature via GitHub OIDC — no long-lived keys.
cosign verify-blob
A CycloneDX SBOM of the full dependency graph ships with every release.
trayage-<tag>-sbom.cdx.json
# 1 — GitHub build provenance gh attestation verify trayage-v1.0.0-win-x64.zip --repo michaelsanford/Trayage # 2 — cosign keyless signature (identity = the release workflow at that tag) cosign verify-blob ` --bundle trayage-v1.0.0-win-x64.zip.bundle ` --certificate-identity "https://github.com/michaelsanford/Trayage/.github/workflows/release.yml@refs/tags/v1.0.0" ` --certificate-oidc-issuer "https://token.actions.githubusercontent.com" ` trayage-v1.0.0-win-x64.zip
Trayage.AppWPF + WPF-UI shell — tray icon, inbox flyout, Settings window, toast notifier, and the generic-host DI root.Trayage.CoreProvider abstraction, inbox aggregation & diffing, polling service, notification rules, settings, and the DPAPI secret store.Trayage.Core.TestsxUnit coverage over aggregation, diffing, notification rules, settings, the secret store, and provider mappings.