Skip to content
NxT-SolutionsPublic

About

Local-first macOS selection-to-action queue

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

429 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Bronze mark

Bronze

Capture what matters, queue it locally, send it back.

CI MIT Release

Local-first macOS selection-to-action queue. No account. No telemetry. No hosted AI by default.

Bronze queue

Bronze sits beside the app you are already in. Capture the selection, order the work, copy it back. It is not a clipboard recorder, a task manager, a note vault, or an AI client.

Bronze queue   Bronze settings

Install

macOS 14 (Sonoma) or later, Apple Silicon and Intel. Homebrew 7 refuses the cask until the tap is trusted.

brew tap NxT-Solutions/nxt-solutions-packages
brew trust nxt-solutions/nxt-solutions-packages
brew install --cask bronze
brew upgrade --cask bronze

Or download bronze-macos-arm64.pkg or bronze-macos-x86_64.pkg from Releases. Settings shows the running version. Check for updates is a button (ADR-023 Proposed). Homebrew installs copy brew upgrade --cask bronze. A package install opens the GitHub release.

The cask appears after the first published .pkg. Until then, use the GitHub asset. Current GitHub Release packages are ad-hoc (signingIdentity: "-"), not Developer ID. An ad-hoc upgrade is a new binary identity, so Accessibility and Input Monitoring must be added again. Those grants persist across versions only when every release is signed with the same Developer ID Application certificate. Unsigned packages are not a notarization claim.

Highlights

  • Capture selected text from the frontmost app (Accessibility first, bounded clipboard fallback)
  • Queue items locally in SQLite, with copy, complete, skip, and trash
  • Copy writes a pasteboard payload you can drop into any app
  • On this Mac title engines, plus optional loopback Ollama or opt-in hosted keys
  • Offline by default — no account, analytics, or remote fonts

Develop

The native app is macOS-only (macOS 14 or later). Ubuntu CI runs the portable Rust crates and leaves bronze-desktop out.

Pins match CI: Node 24.21.0 (package.json engines and .github/workflows/ci.yml), pnpm 12.4.2 (package.json packageManager), rustc 1.98.1 (rust-toolchain.toml). Swift tools 6.0 is declared in native/macos/BronzeNative/Package.swift. Do not use Corepack.

First time

  1. Install the Xcode app so Swift 6 and the Apple SDKs are available. native/macos/BronzeNative/Package.swift declares // swift-tools-version: 6.0. The desktop build links libBronzeNative.a from that package.
xcode-select -p
swift --version

swift --version reports Swift 6.

  1. Install rustup. From this clone, rust-toolchain.toml selects 1.98.1:
rustup show
  1. Install Node 24.21.0, then pnpm. Do not use Corepack. npm 11 only links pnpm's native binary when pnpm's install script is allowed. --allow-scripts=pnpm names that one package. It does not turn script security off. pnpm-workspace.yaml allowBuilds allows pnpm and esbuild for installs that pnpm runs.
node -v
npm install -g --allow-scripts=pnpm pnpm@12.4.2
pnpm -v

node -v prints v24.21.0. pnpm -v prints 12.4.2 and does not say pnpm is running through Node.js. If that line appears, command -v pnpm is not this binary.

  1. CMake builds llama-cpp-sys-2 for the on-this-Mac title engine. The macOS CI job installs CMake when it is missing. The release workflow sets the macOS 14 deployment target for that CMake build. Export the same variables in the shell you use for tauri dev and pnpm verify. Swift already links with arm64-apple-macosx14.0 or x86_64-apple-macosx14.0 from apps/desktop/src-tauri/build.rs.
cmake --version || brew install cmake
export MACOSX_DEPLOYMENT_TARGET=14.0
export CMAKE_OSX_DEPLOYMENT_TARGET=14.0
  1. Clone and install JavaScript dependencies.
git clone https://github.com/NxT-Solutions/Bronze.git
cd Bronze
pnpm install
  1. Run the desktop app. Hand-test only in the native window. Opening the HTML files in a browser has no Tauri invoke. A dev build compiles when crates/bronze-title-model/vendor/ contains no .gguf. Release bronze-macos-*.pkg files omit those GGUFs. A selected pin first-fetches once into Application Support title-models/<sha256>/ (ADR-024); a matching checksum is reused on upgrade. Extractive titles work with no download. Local vendor remains sh crates/bronze-title-model/scripts/vendor-gguf.sh <id>.
pnpm --filter desktop tauri dev
  1. Maintainer bar: Biome, workspace lint, typecheck, tests, validate, cargo fmt, Clippy, cargo test, and python3 tooling/planning-checks.py.
pnpm verify

A local debug package (unsigned) is tooling/package-debug.sh. A debug or ad-hoc .app cannot keep Accessibility or Input Monitoring across rebuilds: each binary has a new cdhash. Pull requests run the CI quality jobs. CI does not notarize and has no Apple signing secrets.

Visual regression

pnpm visual compares the Queue, Settings, Library, and Help WebView screens to baselines in apps/desktop/visual/. pnpm visual:update rewrites the baselines CI checks. Refresh one scenario with pnpm visual:update -- -g "queue populated".

Both commands run the pinned Playwright Linux image (apps/desktop/visual/pin.mjs) through Docker, for this machine's CPU. Snapshot files end in -arm64 or -x64. Ubuntu CI compares the -x64 baselines. Docker is required. On Apple Silicon, VISUAL_PLATFORM=linux/amd64 pnpm visual:update writes the -x64 baselines when that emulator can start Chromium. When it cannot, copy the actual images from the visual-diffs artifact onto those -x64 files in the same pull request.

When a pull request adds or changes a screen, control, or layout, update the visual scenario and its baselines in that pull request. A new feature that does not update its scenario is incomplete.

A failing run uploads the diff images as the visual-diffs artifact.

  1. Build the GitNexus index from the repo root. GitNexus is contributor tooling outside the Bronze app. The index stays on this machine. This repo pins pnpm, and Node 24's npm can crash npx while installing GitNexus, so the rebuild command is:
pnpm --allow-build=@ladybugdb/core --allow-build=gitnexus --allow-build=tree-sitter dlx gitnexus@latest analyze

Run that once after every fresh clone. It writes .gitnexus/ (LadybugDB graph, parse cache, and the local runner). .gitnexusrc sets defaultBranch to main, noStats, and skipContextFiles, so analyze leaves AGENTS.md and CLAUDE.md in place. Those files already contain the GitNexus section after the Bronze contract. Embeddings stay off, so analyze does not download a model. GitNexus is not a dependency of the Bronze app, and the app does not read the index (ADR-017).

Committed, so every clone matches. The skill files are the GitNexus 1.6.12 suite (gitnexus-exploring, gitnexus-debugging, gitnexus-impact-analysis, gitnexus-refactoring, gitnexus-guide, gitnexus-cli, gitnexus-plan, gitnexus-work, gitnexus-review, gitnexus-lfg, gitnexus-pdg-query, gitnexus-taint-analysis):

Path What it is
.gitnexusrc Index defaults for this repo
.claude/skills/gitnexus-*, .agents/skills/gitnexus-*, .cursor/skills/gitnexus-*, .opencode/skills/gitnexus-*, .grok/skills/gitnexus-* Shared agent skills
.cursor/hooks.json, hooks/*.cjs Cursor post-tool hook
.claude/hooks/gitnexus/, .claude/settings.json Claude Code PreToolUse and PostToolUse hooks
.codex/hooks.json, .codex/hooks/gitnexus/ Codex hooks
.cursor/mcp.json, .mcp.json, .codex/config.toml, opencode.json, .grok/config.toml, .factory/mcp.json Shared editor MCP config
.gitignore Rules for the generated index and local secrets

Gitignored, rebuilt or created on each machine:

Path What it is
.gitnexus/ Generated index, LadybugDB graph, parse cache, local runner
.env, .env.* Secrets, including a GitNexus eval-server token. .env.example stays trackable
  1. Cursor loads the committed .cursor/mcp.json. Enable GitNexus once under Cursor Settings → MCP. That approval stays on this machine.

Committed MCP entries start the same server, npx -y gitnexus@latest mcp (OpenCode passes that as a local command array):

Editor File
Cursor .cursor/mcp.json
Claude Code .mcp.json
Codex .codex/config.toml
OpenCode opencode.json
Grok .grok/config.toml
Factory Droid .factory/mcp.json

Each editor reads the committed tree for this clone:

Editor Skills and hooks MCP
Cursor .cursor/skills/gitnexus-*, .cursor/hooks.json, hooks/ .cursor/mcp.json
Claude Code .claude/skills/gitnexus-*, .claude/hooks/gitnexus/ .mcp.json
Codex .agents/skills/gitnexus-*, .codex/hooks.json .codex/config.toml
OpenCode .opencode/skills/gitnexus-* opencode.json
Grok .grok/skills/gitnexus-*, plus AGENTS.md and the Claude and Cursor trees .grok/config.toml
Factory Droid AGENTS.md .factory/mcp.json

Claude Code asks once to trust .mcp.json. Codex and Grok read the project file after the repo is trusted. Codex may ask once, in /hooks, before the committed hook runs.

Antigravity, CodeBuddy, Qoder, and Windsurf keep MCP in the home directory. npx gitnexus setup writes the GitNexus entries it knows. The server object is the same mcpServers.gitnexus block. Those home files are per machine and are not committed.

Editor Home file
Antigravity ~/.gemini/antigravity/mcp_config.json
CodeBuddy ~/.codebuddy/.mcp.json
Qoder ~/.qoder.json
Windsurf ~/.codeium/windsurf/mcp_config.json

The registry of indexed repos stays in ~/.gitnexus/ on this machine. That directory is outside the clone.

Permissions: Accessibility and Input Monitoring. Bronze never asks for Screen Recording.

Quality

Check Where
Biome, typecheck, JS tests, i18n validate quality-js
WebView screenshot baselines quality-visual
Planning-pack gates quality-docs
cargo fmt, Clippy, portable crate tests quality-rust
macOS Clippy and tests except bronze-desktop quality-macos
Desktop crate tests quality-app on macos-15
Full workspace including Swift pnpm verify on a Mac

Do not claim WCAG, VoiceOver, or notarization without files in docs/evidence/.

Contributing

See CONTRIBUTING.md. Work lands through a pull request to main. Changelog: CHANGELOG.md. Security: SECURITY.md.

ADR-002 is Accepted (split arm64 and Intel packages; the operator asked for the Intel build). ADR-009, ADR-018, and ADR-023 stay Proposed unless a human accepts them.

License

MIT. See LICENSE. Copyright 2026 Noah Gillard.

Planning pack

Requirement IDs in docs/03-prd.md and docs/18-adrs.md remain authority.

  1. Executive summary
  2. Reference product and video analysis
  3. Competitive landscape
  4. Product requirements document
  5. Functional specification
  6. UX and interaction specification
  7. System architecture
  8. macOS capture reliability
  9. Data model and portability
  10. Security, privacy, and threat model
  11. Accessibility conformance plan
  12. Internationalization
  13. Settings and shortcuts
  14. Testing, quality, and release
  15. Agentic implementation plan
  16. Backlog and traceability
  17. Cooper OSS audit
  18. Agent-skill recommendations
  19. Architecture decisions
  20. Sources and evidence
  21. Implementation bootstrap
  22. Pre-implementation reconciliation
  23. bmad-loop policy

Implementation agents: AGENTS.md. Local run notes and the long hand-test list live in docs/20-implementation-bootstrap.md and the git history of this file. Visual direction: assets/bronze-ui-concept.png (inspiration only). Asset provenance: assets/README.md.

About

Local-first macOS selection-to-action queue

Topics

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages