From 1b6e1cd69350b86b2610caa975d6804dbd58eb0b Mon Sep 17 00:00:00 2001
From: Noisemaker111
Date: Fri, 13 Feb 2026 02:11:19 -0500
Subject: [PATCH 1/5] docs: strengthen contributor and feature-gating guidance
---
AGENTS.md | 45 ++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 40 insertions(+), 5 deletions(-)
diff --git a/AGENTS.md b/AGENTS.md
index df07a85..9744b86 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,6 +1,13 @@
# AGENTS.md
Guide for agentic coding assistants working in `openusage-mono`.
+## 0) Contributor Operating Contract
+- Operate as a core contributor to this project, not a code generator.
+- Behave like a high-signal senior engineer: understand context first, then change code once.
+- Aim to get it right the first time: read nearby code, follow local patterns, and run relevant checks before finishing.
+- Protect reliability: avoid speculative refactors, avoid hidden behavior changes, and call out release impact clearly.
+- Prefer explicit tradeoffs in PR notes when behavior or release flow changes.
+
## 1) Repo Overview
- Package manager: `bun`
- Monorepo runner: `turbo`
@@ -73,14 +80,42 @@ Guide for agentic coding assistants working in `openusage-mono`.
When Vercel Production Branch is switched to `dev`, step 6 is no longer required for web deploys (but keep `dev -> main` for stable release promotion/tagging discipline).
-## 6) Release Version Sync
+## 6) Branch Isolation and Feature Gating
+- Use branch purpose prefixes and keep one concern per branch:
+ - `feature/...` new behavior
+ - `fix/...` bug fixes
+ - `chore/...` tooling/docs/refactors
+- Canonical release gating model:
+ - Merge feature PRs into `dev` normally.
+ - For selective production release, create a branch from `main` and `cherry-pick` only approved commit(s) from `dev`.
+ - Open PR from that release branch into `main`.
+ - Treat this cherry-pick step as the feature gate for production.
+- To make cherry-picking reliable:
+ - Keep one shippable concern per PR/commit.
+ - Avoid mixing unrelated changes in the same commit.
+ - Prefer commit structure that can be promoted independently.
+- After selective promotion:
+ - If `main` got commits not yet present in `dev`, forward-port them to `dev` to keep branches aligned.
+- For urgent production fixes while `dev` has risky work:
+ - Branch from `main` (`fix/hotfix-...`), merge to `main`, then forward-port to `dev`.
+- Prefer git-based isolation over runtime/build flags for rollout control:
+ - Keep one shippable concern per branch and avoid stacking unrelated work.
+ - Validate experiments on feature branches via preview deploys; do not merge until ready.
+ - Merge/cherry-pick those same commits back to `dev` to keep history aligned.
+ - If a merged change is not ready for production, revert it on `main` (do not rewrite history).
+- Release-channel guidance:
+ - Stable should map to stable GitHub releases.
+ - Beta/experimental should map to prereleases or explicitly gated UI paths.
+ - If both should coexist, render both options (stable + beta) instead of replacing one with the other.
+
+## 7) Release Version Sync
- Before stable tagging run: `bun run release:version 0.6.1`
- This updates:
- `packages/tauri-src/package.json`
- `packages/tauri-src/src-tauri/tauri.conf.json`
- `packages/tauri-src/src-tauri/Cargo.toml`
-## 7) Code Style Expectations
+## 8) Code Style Expectations
### General
- Keep changes minimal and focused.
- Prefer readable, explicit code over clever abstractions.
@@ -123,17 +158,17 @@ When Vercel Production Branch is switched to `dev`, step 6 is no longer required
- Prefer behavior-focused tests over implementation details.
- Add regression tests for bug fixes when practical.
-## 8) Important Gotchas
+## 9) Important Gotchas
- Tauri updater pubkey must be base64-encoded minisign public key payload in `packages/tauri-src/src-tauri/tauri.conf.json` at `plugins.updater.pubkey`.
- Using raw `RWS...` key text fails release builds (`failed to decode pubkey`).
- Keep `TAURI_SIGNING_PRIVATE_KEY` and `TAURI_SIGNING_PRIVATE_KEY_PASSWORD` in GitHub secrets.
- Landing download CTA logic is in `apps/web/src/routes/index.tsx`; prefer direct installer links over generic releases pages.
-## 9) Cursor/Copilot Rules
+## 10) Cursor/Copilot Rules
- No `.cursor/rules/`, `.cursorrules`, or `.github/copilot-instructions.md` exist currently.
- If these files are added later, treat them as authoritative and update this file.
-## 10) Agent Completion Checklist
+## 11) Agent Completion Checklist
- Run relevant build/typecheck/test commands for touched areas.
- Prefer single-test runs first, then broader suites as needed.
- Confirm branch/release assumptions (`dev` vs `main`) before workflow edits.
From bf32d7a497f0c95a20e7eeb8d6dd00533ad6980d Mon Sep 17 00:00:00 2001
From: Noisemaker111
Date: Fri, 13 Feb 2026 02:15:11 -0500
Subject: [PATCH 2/5] feat: show stable and beta download tracks side-by-side
---
apps/web/src/routes/index.tsx | 282 ++++++++++++++++++++++------------
1 file changed, 185 insertions(+), 97 deletions(-)
diff --git a/apps/web/src/routes/index.tsx b/apps/web/src/routes/index.tsx
index 0cb2e35..2a8f9a9 100644
--- a/apps/web/src/routes/index.tsx
+++ b/apps/web/src/routes/index.tsx
@@ -37,6 +37,7 @@ const productionBodyHtml = openUsageBodyHtmlRaw.replace(/
-
\ No newline at end of file
+
diff --git a/packages/tauri-src/CONTRIBUTING.md b/packages/tauri-src/CONTRIBUTING.md
index 78e69c4..b8be6af 100644
--- a/packages/tauri-src/CONTRIBUTING.md
+++ b/packages/tauri-src/CONTRIBUTING.md
@@ -41,7 +41,7 @@ Each provider is a plugin. See the [Plugin API docs](docs/plugins/api.md) for th
4. Test it locally with `bun tauri dev`
5. Open a PR with screenshots showing it working
-You can also [open an issue](https://github.com/robinebers/openusage/issues/new?template=new_provider.yml) to request a provider without building it yourself.
+You can also [open an issue](https://github.com/Noisemaker111/openusage-mono/issues/new?template=new_provider.yml) to request a provider without building it yourself.
### Fix a bug
@@ -52,7 +52,7 @@ You can also [open an issue](https://github.com/robinebers/openusage/issues/new?
### Request a feature
-Don't open a PR for large features without discussing first. [Open an issue](https://github.com/robinebers/openusage/issues/new?template=feature_request.yml) and make your case.
+Don't open a PR for large features without discussing first. [Open an issue](https://github.com/Noisemaker111/openusage-mono/issues/new?template=feature_request.yml) and make your case.
## What Gets Accepted
@@ -79,4 +79,4 @@ Don't open a PR for large features without discussing first. [Open an issue](htt
## Questions?
-Open a [bug report](https://github.com/robinebers/openusage/issues/new?template=bug_report.yml) or [feature request](https://github.com/robinebers/openusage/issues/new?template=feature_request.yml) using the issue templates.
+Open a [bug report](https://github.com/Noisemaker111/openusage-mono/issues/new?template=bug_report.yml) or [feature request](https://github.com/Noisemaker111/openusage-mono/issues/new?template=feature_request.yml) using the issue templates.
diff --git a/packages/tauri-src/README.md b/packages/tauri-src/README.md
index 6b5644a..33df159 100644
--- a/packages/tauri-src/README.md
+++ b/packages/tauri-src/README.md
@@ -33,12 +33,12 @@ OpenUsage lives in your menu bar and shows you how much of your AI coding subscr
### Maybe Soon
-- [Factory / Droid](https://github.com/robinebers/openusage/issues/16)
-- [Gemini](https://github.com/robinebers/openusage/issues/13)
-- [Vercel AI Gateway](https://github.com/robinebers/openusage/issues/18)
+- [Factory / Droid](https://github.com/Noisemaker111/openusage-mono/issues/16)
+- [Gemini](https://github.com/Noisemaker111/openusage-mono/issues/13)
+- [Vercel AI Gateway](https://github.com/Noisemaker111/openusage-mono/issues/18)
Community contributions welcome.
-Want a provider that's not listed? [Open an issue.](https://github.com/robinebers/openusage/issues/new)
+Want a provider that's not listed? [Open an issue.](https://github.com/Noisemaker111/openusage-mono/issues/new)
## Open Source, Community Driven
@@ -60,7 +60,7 @@ See [`docs/release-flow.md`](docs/release-flow.md) for the `dev` -> `main` promo
- **Add a provider.** Each one is just a plugin. See the [Plugin API](docs/plugins/api.md).
- **Fix a bug.** PRs welcome. Provide before/after screenshots.
-- **Request a feature.** [Open an issue](https://github.com/robinebers/openusage/issues/new) and make your case.
+- **Request a feature.** [Open an issue](https://github.com/Noisemaker111/openusage-mono/issues/new) and make your case.
Keep it simple. No feature creep, no AI-generated commit messages, test your changes.
diff --git a/packages/tauri-src/SECURITY.md b/packages/tauri-src/SECURITY.md
index 0961ef2..09e7f93 100644
--- a/packages/tauri-src/SECURITY.md
+++ b/packages/tauri-src/SECURITY.md
@@ -6,7 +6,7 @@ If you find a security vulnerability in OpenUsage, please report it responsibly.
### Preferred: GitHub Security Advisories
-1. Go to the [Security Advisories page](https://github.com/robinebers/openusage/security/advisories/new)
+1. Go to the [Security Advisories page](https://github.com/Noisemaker111/openusage-mono/security/advisories/new)
2. Click "Report a vulnerability"
3. Fill in the details
diff --git a/packages/tauri-src/src/components/about-dialog.tsx b/packages/tauri-src/src/components/about-dialog.tsx
index b52f61e..49d663a 100644
--- a/packages/tauri-src/src/components/about-dialog.tsx
+++ b/packages/tauri-src/src/components/about-dialog.tsx
@@ -84,7 +84,7 @@ export function AboutDialog({ version, onClose }: AboutDialogProps) {
Open source on{" "}
-
+
GitHub
diff --git a/packages/tauri-src/src/components/side-nav.tsx b/packages/tauri-src/src/components/side-nav.tsx
index b3b0a02..a2155d2 100644
--- a/packages/tauri-src/src/components/side-nav.tsx
+++ b/packages/tauri-src/src/components/side-nav.tsx
@@ -110,7 +110,7 @@ export function SideNav({ activeView, onViewChange, plugins }: SideNavProps) {
{
- openUrl("https://github.com/robinebers/openusage/issues").catch(console.error)
+ openUrl("https://github.com/Noisemaker111/openusage-mono/issues").catch(console.error)
invoke("hide_panel").catch(console.error)
}}
aria-label="Help"
From bfc05c94347c98224aa7a5e1954f573d63d7ce0b Mon Sep 17 00:00:00 2001
From: Noisemaker111
Date: Fri, 13 Feb 2026 02:32:03 -0500
Subject: [PATCH 5/5] docs: add macOS and Windows verification checklist
---
verifaction-todo.md | 99 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 99 insertions(+)
create mode 100644 verifaction-todo.md
diff --git a/verifaction-todo.md b/verifaction-todo.md
new file mode 100644
index 0000000..634bf2f
--- /dev/null
+++ b/verifaction-todo.md
@@ -0,0 +1,99 @@
+# App Verification TODO
+
+## Why users see warnings now
+
+- **macOS warning** (`Apple could not verify ... free of malware`) means the app is not fully trusted by Gatekeeper yet (missing notarization and/or stapled ticket).
+- **Windows warning** (`Unknown publisher`) means installers are not Authenticode-signed with a trusted code-signing certificate, or the cert has no SmartScreen reputation yet.
+
+---
+
+## 1) macOS trust (Gatekeeper) - Required
+
+### A. Apple account and certs
+
+- [ ] Enroll in Apple Developer Program (paid account).
+- [ ] Create **Developer ID Application** certificate.
+- [ ] Export certificate as `.p12` + password from Keychain.
+
+### B. Notarization credentials
+
+- [ ] Create app-specific password for Apple ID.
+- [ ] Confirm values for:
+ - `APPLE_ID`
+ - `APPLE_PASSWORD`
+ - `APPLE_TEAM_ID`
+ - `APPLE_SIGNING_IDENTITY` (example in `packages/tauri-src/.env.example`)
+
+### C. GitHub Actions secrets
+
+- [ ] Add signing/notarization secrets in repo settings:
+ - `APPLE_ID`
+ - `APPLE_PASSWORD`
+ - `APPLE_TEAM_ID`
+ - `APPLE_SIGNING_IDENTITY`
+ - (if needed by your setup) certificate secrets for CI keychain import (`APPLE_CERTIFICATE`, `APPLE_CERTIFICATE_PASSWORD`).
+
+### D. Workflow wiring
+
+- [ ] Ensure `.github/workflows/release-dev.yml` passes Apple signing/notarization envs to `tauri-apps/tauri-action`.
+- [ ] Ensure `.github/workflows/release-stable.yml` passes same envs.
+
+### E. Verify on produced artifact
+
+- [ ] Confirm app is signed:
+ - `codesign --verify --deep --strict --verbose=2 OpenUsage.app`
+- [ ] Confirm notarization ticket is stapled:
+ - `xcrun stapler validate OpenUsage.app`
+- [ ] Confirm Gatekeeper acceptance:
+ - `spctl --assess --type execute -vv OpenUsage.app`
+
+---
+
+## 2) Windows trust (SmartScreen + publisher) - Required
+
+### A. Certificate
+
+- [ ] Buy code-signing cert (recommended: **EV cert** for fastest SmartScreen trust).
+- [ ] Export cert as `.pfx` and keep password.
+
+### B. GitHub Actions secrets
+
+- [ ] Add:
+ - `WINDOWS_CERTIFICATE` (base64-encoded `.pfx`)
+ - `WINDOWS_CERTIFICATE_PASSWORD`
+
+### C. Workflow wiring
+
+- [ ] Update `.github/workflows/release-dev.yml` Windows publish job to include Windows signing envs.
+- [ ] Update `.github/workflows/release-stable.yml` Windows publish job similarly.
+- [ ] Keep failing the release if Windows signing secrets are missing (do not ship unsigned Windows installers).
+
+### D. Verify on produced artifact
+
+- [ ] Verify signature in PowerShell:
+ - `Get-AuthenticodeSignature .\OpenUsage_...exe | Format-List`
+- [ ] Verify MSI/exe chain with signtool:
+ - `signtool verify /pa /v OpenUsage_...exe`
+
+### E. SmartScreen reality check
+
+- [ ] Expect some warning period with standard cert until reputation builds.
+- [ ] EV cert minimizes/avoids the "unknown publisher" experience much faster.
+
+---
+
+## 3) Repo-specific checks to keep
+
+- [ ] Keep updater signing secrets in place:
+ - `TAURI_SIGNING_PRIVATE_KEY`
+ - `TAURI_SIGNING_PRIVATE_KEY_PASSWORD`
+- [ ] Keep updater pubkey correctly encoded in `packages/tauri-src/src-tauri/tauri.conf.json`.
+- [ ] After changing release signing, run a full dev release and stable release dry run to confirm all three targets (mac arm64, mac x64, windows x64) publish successfully.
+
+---
+
+## Done criteria
+
+- [ ] macOS downloads open without the malware verification block for signed/notarized builds.
+- [ ] Windows installer shows your publisher name (not "Unknown Publisher").
+- [ ] `release-dev` and `release-stable` both enforce signing and fail loudly if secrets are missing.