Desktop app to Capture GitHub issues while testing—hotkey and voice, local Drafts, then Publish.
Windows-first Tauri shell (NSIS per-user installer for official Releases).
Requires Rust (MSVC), Node.js, and WebView2.
npm install
npm run tauri devImportant: Fully quit the previous Issuebridge process before restarting tauri dev (tray icon → Quit, or end the process). A hung sign-in or a frozen Capture window can linger until Quit.
Sign in with GitHub (App OAuth + PKCE) is the supported path for first-run. Local tauri dev needs either the OAuth exchange URL (same as release) or a runtime App client secret — otherwise the browser can succeed while the app still fails the token exchange:
# Preferred (matches release): point at your exchange Worker / cPanel PHP
$env:ISSUEBRIDGE_OAUTH_EXCHANGE_URL = "https://oauth-exchange.example.workers.dev/"
# Or local/dev only — never bake this into official NSIS builds:
# $env:ISSUEBRIDGE_GITHUB_CLIENT_SECRET = "<secret from issuebridge-dev App / 1Password>"
# optional; default client id is already set for issuebridge-dev
# $env:ISSUEBRIDGE_GITHUB_CLIENT_ID = "Iv23li6Ao8URyrvbNZOq"
npm run tauri devSee services/oauth-exchange/README.md to deploy the exchange backend.
Terminal should show OAuth exchange ok, then Install App → Continue.
PAT is identity-only. Fine-grained and classic PATs can sign in (GET /user) but cannot call GET /user/installations. Continue will fail until you use App OAuth. Prefer Sign in with GitHub; do not reinstall the App if it is already installed — fix sign-in, then Continue.
Credentials use the OS vault (keyring with windows-native). After a successful sign-in, an in-process session flag keeps the UI signed in even if a vault re-read is slow.
- Fetch Whisper assets (CLI + Windows DLLs +
ggml-base.bin) once:
powershell -ExecutionPolicy Bypass -File scripts/fetch-whisper-assets.ps1Fully quit Issuebridge first if Windows reports ggml-base.bin is locked.
-
In Capture: click Title or Body first (transcript goes into the focused field). Hold the button or hold
Ctrl+Alt+Shift+V, speak, then release to stop (max ~60s). Button shows Release to stop, then Transcribing…. -
Offline Whisper base is approximate (English forced via
-l enby default; override withISSUEBRIDGE_WHISPER_LANGUAGE). Edit the text afterward. Text Save Draft always works if voice fails.
Windows needs companion DLLs next to whisper-cli (ggml.dll, whisper.dll, ggml-cpu-*.dll, …). The fetch script copies them into src-tauri/binaries/; the NSIS bundle maps those DLLs to the install root beside whisper-cli.exe. At runtime, spawn sets cwd to the directory that contains the DLLs and passes absolute model/audio paths.
- Fetch the llama.cpp Rewrite sidecar (CPU + Vulkan DLLs; no GGUF in the installer):
powershell -ExecutionPolicy Bypass -File scripts/fetch-llama-assets.ps1- In Inbox, open a Draft that is not too thin → Rewrite…. With no model on disk, confirm the recommended catalog entry → Download (byte progress + Cancel). After download, pick a Rewrite style → Generate. Cancel stops the sidecar; soft timeout is ~60s.
Optional local override (skips catalog path):
$env:ISSUEBRIDGE_REWRITE_GGUF = "D:\models\phi-4-mini.Q4_K_M.gguf"
# optional: $env:ISSUEBRIDGE_REWRITE_CLI = "D:\path\to\llama-cli.exe"Without a local GGUF and before catalog download, Generate still uses the stub engine from #67.
Fully quit Issuebridge before re-fetching if DLLs are locked.
Creating the Capture webview from a sync Tauri command or tray/hotkey handler can deadlock WebView2 and leave a blank white window. The app opens Capture via an async command (and a detached thread from tray/hotkey). If you ever see a frozen white Capture, Quit fully and reopen.
In npm run tauri dev (debug builds):
- DevTools open on main and Capture windows.
- Terminal shows
[issuebridge]logs: OAuth, keyring, installations,whisper: …. - Webview console shows PAT / PTT lines (
target: "title" | "body", etc.).
To re-test the first-run progress strip from scratch (Sign out does not rewind it), see docs/dev-first-run-reset.md. Chromium Chrome_WidgetWin_0 / Error 1412 lines on Quit are usually harmless WebView2 teardown noise — ignore unless Quit hangs or crashes.
npm run test:core
npm run test:packagingv0.1 ships a per-user NSIS installer (*-setup.exe) only — installMode: currentUser (no Admin). MSI is not a v0.1 deliverable. The installer bundles the app, whisper-cli (+ DLLs), ggml-base.bin, and the llama.cpp Rewrite sidecar (+ CPU/Vulkan DLLs). GGUF Rewrite models are not in the NSIS package — they download on demand (or use ISSUEBRIDGE_REWRITE_GGUF in dev).
The build is unsigned for v0.1. Browser downloads may show a Windows SmartScreen warning; that is expected until code signing is added. Users can proceed via “More info → Run anyway.”
$env:ISSUEBRIDGE_GITHUB_CLIENT_ID = "<client-id>"
$env:ISSUEBRIDGE_OAUTH_EXCHANGE_URL = "https://oauth-exchange.example.workers.dev/"
powershell -ExecutionPolicy Bypass -File scripts/release-build.ps1scripts/release-build.ps1 checks the packaging contract, refuses to build without client id + exchange URL (and refuses if ISSUEBRIDGE_GITHUB_CLIENT_SECRET is set), fetches Whisper + llama.cpp assets (unless -SkipWhisperFetch / -SkipLlamaFetch), and runs npm run tauri -- build. CI: .github/workflows/release-windows.yml (tag v* or workflow_dispatch). Add repo secret ISSUEBRIDGE_OAUTH_EXCHANGE_URL.
Dev/tauri build without those env vars still packages. Local tauri dev may use runtime ISSUEBRIDGE_OAUTH_EXCHANGE_URL or runtime ISSUEBRIDGE_GITHUB_CLIENT_SECRET — the client secret is never compile-time-injected into release binaries.
Preflight the cut from clean, merged main, then tag:
npm run preflight:release -- v0.3.1The workflow builds the installer, attaches it, and publishes the GitHub Release only once the *-setup.exe is attached. Full procedure, the release environment tag policy, and troubleshooting: docs/release-process.md.
src-tauri/src/core— Issuebridge application core (use-cases + ports)src-tauri/src/adapters— Tauri IPC, tray, and stub port adapterssrc— webview UI (adapter surface only; no secrets / domain logic)
