Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
199 commits
Select commit Hold shift + click to select a range
61600f1
docs: add Tauri desktop app design specification
Jul 14, 2026
600428a
docs: add Tauri desktop app implementation plan
Jul 14, 2026
d78ef5a
feat(tauri): initialize Tauri 2 project structure
Jul 14, 2026
fbb33a6
feat(services): add platform detection service
Jul 14, 2026
850d6f8
feat(services): add CaptureService interface and types
Jul 14, 2026
76cd9e2
feat(services): implement browser-based CaptureService
Jul 14, 2026
b4ab091
feat(tauri): add Rust capture command foundation
Jul 14, 2026
f58396c
refactor(tools): migrate Screenshot to use CaptureService
Jul 14, 2026
3acb0b8
feat(services): add FileService for browser and Tauri
Jul 14, 2026
f950213
fix(services): FileService API detection uses typeof check
Jul 14, 2026
61b10a0
refactor(tools): migrate ScreenRecorder to use CaptureService
Jul 14, 2026
d67394d
feat(services): add ClipboardService for browser and Tauri
Jul 14, 2026
0e7bfcc
feat(services): add HotkeyService for global keyboard shortcuts
Jul 14, 2026
6248f14
refactor(services): migrate DownloadService to shell-agnostic pattern
Jul 14, 2026
5500985
refactor(services): migrate AssetService to shell-agnostic pattern
Jul 14, 2026
e436bc1
refactor(tools): migrate Code Scratchpad to use service layer
Jul 14, 2026
842cae2
fix(vite): exclude Tauri API from web build optimization
Jul 14, 2026
5265fbe
fix(tools): correct browser capability detection in Screenshot/Screen…
Jul 14, 2026
27a9aaa
debug(screenshot): add console logging for capability detection
Jul 14, 2026
62286e1
fix(tauri): detect Tauri mode for native capture support
Jul 14, 2026
54d6108
fix(tauri): enable global Tauri API injection
Jul 14, 2026
2a569a1
fix(vite): allow Tauri API imports to be resolved
Jul 14, 2026
511f1a1
fix(tauri): use Tauri 2 API import paths
Jul 14, 2026
79be5a0
fix(tauri): remove browser fallback from TauriCaptureService
Jul 14, 2026
e129c9d
debug(screenshot): add console logging for capture errors
Jul 15, 2026
ecb76df
feat(macos): implement native screen capture
Jul 15, 2026
237d577
fix(macos): correct image crate API usage
Jul 15, 2026
a3cb5c6
fix(macos): cast bytes_per_row to usize for type consistency
Jul 15, 2026
acbde79
fix(macos): add unsafe block and mut for encoder
Jul 15, 2026
de423dd
fix(ssr): prevent hydration mismatch in media tools
Jul 15, 2026
7846b84
feat(screenshot): add multi-display support for extended monitors
Jul 15, 2026
64112cc
fix(recording): fallback to browser MediaRecorder in Tauri
Jul 15, 2026
e376ab5
fix(recording): show clear error that native recording not implemented
Jul 15, 2026
a20d8f5
feat(overlay): implement desktop region selector overlay
Jul 15, 2026
650b84c
fix(overlay): resolve Tauri 2 API compilation errors
Jul 15, 2026
e759f45
fix(overlay): add Clone derive to Rectangle struct
Jul 15, 2026
7885b33
fix(capture): export listDisplays method and DisplayInfo type
Jul 15, 2026
a67af87
feat(screenshot): add region selector UI integration
Jul 15, 2026
9d30c77
fix(screenshot): simplify region selector to use manual crop
Jul 15, 2026
b2b8546
feat(overlay): implement proper screenshot background for region sele…
Jul 15, 2026
44022c5
fix(permissions): add event emit/listen permissions for overlay
Jul 15, 2026
f2924a5
fix(overlay): fix timing - show overlay before emitting screenshot
Jul 15, 2026
18f3984
feat(overlay): add debugging for screenshot event transmission
Jul 15, 2026
a56e6a5
fix(overlay): position region selector on selected display
Jul 15, 2026
793a942
fix(overlay): add missing closing brace in non-macOS cfg block
Jul 15, 2026
8f24cf0
debug(overlay): add logging for display ID and bounds
Jul 15, 2026
2751d86
fix(display): change display ID type from u32 to i32
Jul 15, 2026
ffb31fd
fix(overlay): close existing window before creating new one
Jul 15, 2026
cbce0d5
fix(overlay): correct parameter name in invoke call
Jul 15, 2026
99633da
debug(overlay): add logging for invoke parameters
Jul 15, 2026
2f4661e
fix(overlay): pass displayId parameter through captureService proxy
Jul 15, 2026
585c8ac
debug(overlay): add logging to show_region_selector command
Jul 15, 2026
175d3d6
fix(overlay): wrap display_id in struct for proper Tauri serialization
Jul 15, 2026
bda9a09
test(capture): add comprehensive tests for display selection
Jul 15, 2026
872db4d
feat(recording): implement Phase 1 - basic video frame capture
Jul 15, 2026
f09c5eb
fix(recording): resolve compilation errors
Jul 15, 2026
ae8bed1
feat(recording): connect Phase 1 recording to frontend + multi-display
Jul 15, 2026
eadbe21
fix: improve Phase 1 UX + remove target/ from tracking
Jul 15, 2026
96735c6
feat(recording): Phase 2 - FFmpeg video encoding
Jul 15, 2026
2bd3bdc
feat(recording): Phase 3 - Audio capture foundation
Jul 15, 2026
eeb4c26
docs: comprehensive recording implementation status
Jul 15, 2026
26b0333
fix(recording): use actual FPS instead of target FPS for encoding
Jul 15, 2026
7d85c37
fix(recording): add fallback when duration not available
Jul 15, 2026
0723564
perf(recording): JPEG capture + race condition fix
Jul 15, 2026
c13b8d5
fix(recording): convert RGBA to RGB for JPEG encoding
Jul 15, 2026
127b81e
fix(download): update Tauri 2 plugin imports
Jul 15, 2026
e35053f
feat(tauri): install dialog and fs plugins
Jul 15, 2026
6cececd
perf(recording): 50% scaling + 70% quality for smooth video
Jul 15, 2026
e473648
fix(download): use writeFile instead of writeBinaryFile
Jul 15, 2026
3db905f
fix: pixel sampling + dialog permissions
Jul 15, 2026
69d489e
fix(plugins): register Tauri 2 plugins in main.rs
Jul 15, 2026
0176062
fix(plugins): remove global-shortcut init (not needed yet)
Jul 15, 2026
3e71880
fix(plugins): remove updater plugin (needs config)
Jul 15, 2026
3814000
feat(recording): add MP4 format support
Jul 15, 2026
37d951e
feat(ui): add format selector for recording
Jul 15, 2026
2e723fb
feat: countdown overlay + improved video quality
Jul 15, 2026
b468a94
fix(countdown): position on correct screen + minimal UI
Jul 15, 2026
36766e7
fix(countdown): make window background truly transparent
Jul 15, 2026
6dccb39
fix(crash): remove unsafe Cocoa calls from background thread
Jul 15, 2026
3a0b40a
fix(countdown): smaller window (400x400), same number size
Jul 15, 2026
562a6d6
feat(quality): maximum quality settings
Jul 15, 2026
5e85c08
perf(capture): balanced quality/speed settings
Jul 15, 2026
9318b6e
perf(fps): target 8-10fps with 50% resolution
Jul 15, 2026
9cc24a9
feat(fps): user-selectable FPS with auto quality
Jul 15, 2026
87fbe96
feat(60fps): add 60fps option with aggressive optimizations
Jul 15, 2026
a5ce849
fix(encoding): force even dimensions for H.264
Jul 15, 2026
3db3199
feat(recorder): add 'Saving...' state with disabled button during enc…
Jul 15, 2026
811461f
feat(recorder): add 'Max Quality' mode for best video quality
Jul 15, 2026
d339231
feat(recording): implement region/area recording backend
Jul 15, 2026
d868fbf
feat(recorder): add region recording UI and controls
Jul 15, 2026
432985a
fix(overlay): make region selector semi-transparent and more visible
Jul 15, 2026
c17109d
feat(overlay): enhance region selector visibility with premium styling
Jul 15, 2026
c3d4a5f
feat(overlay): enable window transparency in Tauri config
Jul 15, 2026
24d8593
fix(config): revert window config approach for overlay
Jul 15, 2026
86570a9
feat(overlay): use screenshot background for perfect selection UX
Jul 15, 2026
f1d6dd3
fix(vite): exclude @tauri-apps/api from optimizeDeps
Jul 15, 2026
41bc85c
fix(overlay): process screenshot in chunks to avoid stack overflow
Jul 15, 2026
a7a5484
debug: add logging to trace region bounds through recording flow
Jul 15, 2026
e60e708
fix(recording): pass bounds to backend in TauriCaptureService
Jul 15, 2026
f7a82b6
feat(countdown): add screenshot background to remove annoying rect
Jul 15, 2026
d6f5553
fix(countdown): proper Tauri event import and timing
Jul 15, 2026
e5ebb4c
fix(countdown): don't block countdown with async event listener
Jul 15, 2026
c4c7ea1
fix(countdown): add event permissions for countdown window
Jul 15, 2026
f46babf
simplify(countdown): use light semi-transparent background instead of…
Jul 15, 2026
95bbf9f
feat(countdown): use localStorage for screenshot background (reliable)
Jul 15, 2026
6dcb842
fix(countdown): capture exact 400x400 region for perfect alignment
Jul 15, 2026
3ea0a7c
fix(countdown): pass display_id to capture_region for multi-display
Jul 15, 2026
1beac51
feat(countdown): clean design - transparent stroke instead of shadow
Jul 15, 2026
591114c
feat(hotkey): implement global keyboard shortcuts for desktop app
Jul 18, 2026
29ad635
fix(hotkey): add global-shortcut permissions to Tauri capabilities
Jul 18, 2026
99aa285
feat(settings): add Settings page with hotkey management UI
Jul 18, 2026
45d219a
fix(hotkey): change shortcuts to avoid macOS conflicts
Jul 18, 2026
7021338
fix(hotkey): add debug logging and chunked base64 encoding
Jul 18, 2026
d1d5ef0
fix(hotkey): simplify global-shortcut plugin initialization
Jul 18, 2026
56443aa
debug(hotkey): add detailed logging to hotkey registration
Jul 18, 2026
c350b20
fix(hotkey): change to Cmd+Shift+X to avoid conflicts
Jul 18, 2026
7f22954
debug(hotkey): add extensive logging and error handling
Jul 18, 2026
0fe0fa1
fix(hotkey): handle Blob return type from captureScreen
Jul 18, 2026
26c807b
feat(hotkey): add region selection to screenshot hotkey
Jul 18, 2026
4b6be62
feat(overlay): add full screen pre-selection to region selector
Jul 18, 2026
446553e
feat(hotkey): instant screenshot capture (no countdown)
Jul 18, 2026
1cc7b52
fix(overlay): capture screen background for region selector
Jul 18, 2026
9b8e547
debug(hotkey): add error handling and logging for overlay capture
Jul 18, 2026
0e6d56d
feat(hotkey): detect and capture from cursor's current display
Jul 18, 2026
e41efff
fix(hotkey): use window monitor instead of cursor detection
Jul 18, 2026
4007bda
feat(hotkey): detect cursor position from OS for multi-monitor
Jul 18, 2026
a5ad459
fix(rust): correct cursor position API usage
Jul 18, 2026
e1aff69
fix(rust): use NSEvent for cursor position (simpler)
Jul 18, 2026
bb22f5b
fix(rust): use msg_send macro for NSEvent class method
Jul 18, 2026
c257fa5
fix(rust): import msg_send and class macros from objc
Jul 18, 2026
6257d50
fix(rust): import sel and sel_impl macros
Jul 18, 2026
96307cc
feat(hotkey): use Cmd+Shift+A for screenshot (Lark muscle memory)
Jul 18, 2026
c40aac8
fix(hotkey): unregister all hotkeys on init to clear stuck registrations
Jul 18, 2026
6a0f94a
fix(hotkey): handle event parameter and wrap async callback
Jul 18, 2026
7728254
fix(hotkey): use event-based API for Tauri global-shortcut
Jul 18, 2026
243ece2
fix(hotkey): use correct Tauri plugin API with event.state check
Jul 18, 2026
dec8ff1
feat(screenshot): capture all displays for multi-monitor support
Jul 18, 2026
d118a94
feat(screenshot): capture ALL displays with hotkey
Jul 18, 2026
1cc0550
fix(screenshot): capture main display only to avoid localStorage quota
Jul 18, 2026
4c27da4
feat(screenshot): add screen picker dialog for multi-display
Jul 18, 2026
a683791
feat(hotkey): focus window when screenshot hotkey pressed
Jul 18, 2026
0d56775
fix(screenshot): pass displayId through region selector workflow
Jul 18, 2026
120f9ed
fix(screen-selector): improve hover effects and hide on click
Jul 18, 2026
d08ec95
debug(screen-selector): add error handling and logging
Jul 18, 2026
4e8f96f
fix(screen-selector): wrap script in async IIFE
Jul 18, 2026
8c83f69
fix(screen-selector): make styles global
Jul 18, 2026
c388706
fix(capture): pass displayId to capture_region command
Jul 18, 2026
2b95b05
fix(screen-selector): hide main window after screen selection
Jul 18, 2026
39c219c
fix(capture): add displayId to Rust Rectangle and restore window focus
Jul 18, 2026
985a556
fix(global-hotkeys): remove duplicate invoke declaration
Jul 18, 2026
e6c2437
feat(screen-selector): create separate window for screen selection
Jul 18, 2026
5e517d8
fix(screen-selector): execute workflow before closing window
Jul 18, 2026
4b5e98a
fix(screen-selector): use main window for event handling
Jul 18, 2026
be9dd98
debug(screen-selector): add logging for window close
Jul 18, 2026
300e912
fix(screen-selector): hide window immediately and close before workflow
Jul 18, 2026
215d1e7
fix(screen-selector): use Tauri events for cross-window communication
Jul 18, 2026
947ea4a
fix(screen-selector): use Tauri command to emit event from Rust
Jul 18, 2026
e6f21f4
feat(screenshot): hide main window during region selection
Jul 18, 2026
f53cab9
fix(screen-selector): close window before emitting event
Jul 18, 2026
a3ba08e
test(screenshot): add test suite for global hotkey screenshot workflow
Jul 18, 2026
7ecbafe
chore: ignore src-tauri/target/ build artifacts
Jul 19, 2026
f53cd92
test(services): add Tauri impl tests for file, clipboard, download, a…
Jul 19, 2026
5931b04
feat(tray): add system tray with Show, Take Screenshot, and Quit items
Jul 19, 2026
d6bf9a5
feat(download): add desktop app download page with OS/arch auto-detec…
Jul 19, 2026
059f873
ci: add GitHub Actions release workflow for cross-platform Tauri builds
Jul 19, 2026
cb71776
feat(audio): implement real microphone capture and audio/video muxing
Jul 19, 2026
33407c0
feat(ffmpeg): add sidecar binary resolution and download helper script
Jul 19, 2026
ec58160
feat(desktop): first-run wizard, settings enhancements, auto-updater,…
Jul 19, 2026
66c02e1
fix(updater): add pubkey to tauri.conf.json to fix plugin init panic
Jul 19, 2026
8ece79d
docs(desktop): add RELEASING-DESKTOP.md with signing key and release …
Jul 19, 2026
b89ca82
refactor(tools): replace raw platform APIs with service layer (Tasks …
Jul 19, 2026
11de51e
fix(audio): stop() no longer hangs; use bundled ffmpeg sidecar; add u…
Jul 20, 2026
2079aed
fix(audio): enumerate real DirectShow audio device on Windows
Jul 20, 2026
5cb0456
docs(plan): add desktop screenshot optimization plan (phases A-D)
Jul 20, 2026
cc9659f
perf(screenshot): Phase A — pre-warm & reuse region-selector window
Jul 20, 2026
137d851
perf(screenshot): Phase B — raw-bytes IPC for captures (drop number[]…
Jul 20, 2026
5cc94c9
fix(screenshot): overlay background via events + ESC cancel unlock + …
Jul 20, 2026
746364f
perf(screenshot): Phase C — instant window hide, trim animation-wait …
Jul 21, 2026
436e8d4
Merge pull request #1 from slaveofcode/feat/optimize-desktop-screenshot
slaveofcode Jul 21, 2026
aba1917
Merge pull request #2 from slaveofcode/feat/tauri-desktop-app
slaveofcode Jul 21, 2026
0f2f145
perf(screenshot): Phase D — native server-side crop (no full-res PNG …
Jul 21, 2026
995b339
feat(capture): Windows + Linux screen capture via xcap
Jul 21, 2026
ea8996b
ci: build Linux on ubuntu-24.04 with PipeWire/libspa deps for xcap
Jul 21, 2026
0fac664
chore(desktop): clean up all Rust compiler warnings
Jul 21, 2026
449f977
fix(recording): use a persistent xcap stream on Windows/Linux (not pe…
Jul 21, 2026
1fb2c7a
Merge pull request #3 from slaveofcode/feat/screenshot-phase-d-native…
slaveofcode Jul 21, 2026
9a4f31e
Merge pull request #4 from slaveofcode/feat/windows-linux-capture
slaveofcode Jul 21, 2026
4ee50b3
Merge pull request #5 from slaveofcode/chore/rust-warnings-cleanup
slaveofcode Jul 21, 2026
22e0f00
fix(recording): capture audio and mux it correctly (silent recordings)
Jul 21, 2026
b981189
Merge pull request #6 from slaveofcode/fix/recording-audio
slaveofcode Jul 21, 2026
0534578
fix(recording): keep the window restorable while recording (minimize,…
Jul 21, 2026
e394c71
fix(recording): stop the ⌘⇧R hotkey from dying after start/stop
Jul 21, 2026
69089df
Merge pull request #7 from slaveofcode/fix/recording-window-restore
slaveofcode Jul 21, 2026
cd0e9db
feat(recording): make ⌘⇧R a truly global recording hotkey
Jul 22, 2026
53d5c3f
fix(recording): accurate elapsed timer + restore the 5s countdown
Jul 25, 2026
a4d02ae
fix(recording): always reveal the window when recording stops
Jul 25, 2026
3e59587
feat(recording): screen picker on ⌘⇧R when multiple displays
Jul 25, 2026
3b9b42b
Merge pull request #8 from slaveofcode/feat/global-recording-hotkey
slaveofcode Jul 25, 2026
8863e98
chore(release): bump desktop app version to 1.0.0-beta.1
Jul 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 74 additions & 0 deletions .github/workflows/desktop-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: Desktop compile check

# Compile-checks the Tauri Rust app on all three desktop targets. This is the
# verification loop for platform-specific capture code (Windows DXGI/WGC, Linux
# PipeWire via xcap) that can't be built on a macOS dev machine.

on:
push:
branches:
- 'feat/**'
- 'fix/**'
paths:
- 'src-tauri/**'
- '.github/workflows/desktop-check.yml'
pull_request:
branches: [develop, main, 'feat/**']
paths:
- 'src-tauri/**'
workflow_dispatch:

jobs:
check:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-24.04
- os: windows-latest
- os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4

- name: Install Rust
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo
uses: Swatinem/rust-cache@v2
with:
workspaces: src-tauri

# Tauri + xcap (PipeWire/Wayland/X11/dbus) system deps on Linux.
- name: Install Linux deps
if: matrix.os == 'ubuntu-24.04'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libgtk-3-dev \
libayatana-appindicator3-dev \
librsvg2-dev \
libsoup-3.0-dev \
libdbus-1-dev \
libpipewire-0.3-dev \
libspa-0.2-dev \
libwayland-dev \
libxcb1-dev \
libxcb-randr0-dev \
libxcb-shm0-dev \
libclang-dev \
clang \
pkg-config

# generate_context! embeds the frontend dist at compile time; a stub is
# enough for a compile check (we don't need the real built assets here).
- name: Stub frontend dist
shell: bash
run: |
mkdir -p dist
echo '<!doctype html><title>stub</title>' > dist/index.html

- name: cargo check (all targets)
working-directory: src-tauri
run: cargo check --all-targets
112 changes: 112 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
name: Release Desktop App

# Trigger on tags like "desktop-v1.0.0-beta.1" or "desktop-v1.2.3"
on:
push:
tags:
- 'desktop-v*'

jobs:
build:
strategy:
fail-fast: false
matrix:
include:
- platform: macos-latest
args: '--target aarch64-apple-darwin'
label: macOS (Apple Silicon)
- platform: macos-latest
args: '--target x86_64-apple-darwin'
label: macOS (Intel)
- platform: windows-latest
args: ''
label: Windows
- platform: ubuntu-24.04
args: ''
label: Linux

name: Build — ${{ matrix.label }}
runs-on: ${{ matrix.platform }}

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || '' }}

- name: Cache Rust
uses: Swatinem/rust-cache@v2
with:
workspaces: './src-tauri -> target'

- name: Install Linux system dependencies
if: matrix.platform == 'ubuntu-24.04'
run: |
sudo apt-get update
sudo apt-get install -y \
libwebkit2gtk-4.1-dev \
libappindicator3-dev \
librsvg2-dev \
patchelf \
libdbus-1-dev \
libpipewire-0.3-dev \
libspa-0.2-dev \
libwayland-dev \
libxcb1-dev \
libxcb-randr0-dev \
libxcb-shm0-dev \
libclang-dev \
clang \
pkg-config

- name: Install npm dependencies
run: npm ci --legacy-peer-deps

- name: Run tests
run: npm test -- --run

- name: Build Tauri app
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# Code signing — set these secrets in the repo settings
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
with:
tagName: ${{ github.ref_name }}
releaseName: 'GoodWebTools Desktop ${{ github.ref_name }}'
releaseBody: |
## GoodWebTools Desktop ${{ github.ref_name }}

### What's new
See [CHANGELOG.md](https://github.com/slaveofcode/goodwebtools/blob/main/CHANGELOG.md) for details.

### Downloads
Pick the right file for your system:
| Platform | File |
|----------|------|
| macOS (Apple Silicon) | `*_aarch64.dmg` |
| macOS (Intel) | `*_x64.dmg` |
| Windows | `*_x64-setup.exe` |
| Linux (Debian/Ubuntu) | `*.deb` |
| Linux (AppImage) | `*.AppImage` |

### First run on macOS
If macOS blocks the app, open **System Settings → Privacy & Security** and click **Open Anyway**.
For screen capture to work, grant **Screen Recording** permission in **Privacy & Security → Screen Recording**.
releaseDraft: true
prerelease: ${{ contains(github.ref_name, 'beta') || contains(github.ref_name, 'alpha') }}
args: ${{ matrix.args }}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
node_modules/
dist/
src-tauri/target/
src-tauri/bin/
.astro/
.DS_Store

Expand Down
62 changes: 62 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Changelog

All notable changes to GoodWebTools are documented here.

## [1.0.0-beta.1] — 2026-07-19

### Desktop app (Tauri 2) — first beta release

**New features**

- **System-wide screenshot** via global hotkey (⌘⇧A on macOS)
- Multi-display picker with live thumbnails
- Region-selector overlay with drag-to-crop
- Countdown window before capture
- Main window auto-hides/restores around capture
- **Screen + audio recording**
- Captures the full screen or a bounded region using platform-native APIs
- Records system/microphone audio in parallel via FFmpeg (avfoundation / dshow / pulse)
- Muxes audio + video on stop with graceful video-only fallback
- **System tray** (macOS menu bar)
- Left-click to focus the main window
- "Take Screenshot" shortcut directly from the tray menu
- **Native FFmpeg integration**
- Bundled sidecar binary per platform (aarch64/x86_64 macOS, Windows, Linux)
- Falls back to system `ffmpeg` if sidecar is absent
- `bundle:check` pre-build script validates sidecar presence and icon assets
- **First-run permission wizard** (`/first-run`)
- Checks Screen Recording, Microphone, and FFmpeg availability
- One-click jump to System Preferences for each permission
- Marks completion so the wizard only runs once
- **Settings page enhancements**
- Desktop Preferences panel (screenshot format, tray toggle, launch-at-login)
- Permission Status panel with live re-check
- Auto-Updater panel (checks GitHub Releases, downloads and relaunches in place)
- **Download page** (`/download`)
- Auto-detects OS and architecture, highlights the recommended installer
- Links to GitHub Releases for macOS arm64/x64, Windows, Linux deb/AppImage
- **GitHub Actions release pipeline**
- Builds macOS (Apple Silicon + Intel), Windows, Linux on `desktop-v*` tags
- Runs full test suite before every build
- Creates a GitHub Release (pre-release for alpha/beta tags)

**Service layer**

- `FileService` — native file dialogs and filesystem via `@tauri-apps/plugin-fs`
- `ClipboardService` — native clipboard via `@tauri-apps/plugin-clipboard-manager`
- `DownloadService` — native save dialog + ZIP support
- `AssetService` — intelligent cache management with configurable TTL
- `HotkeyService` — global shortcuts via `@tauri-apps/plugin-global-shortcut`

**Testing**

- 385 tests across 43 files (all passing)
- Full coverage for service layer Tauri implementations
- `global-hotkeys.ts` integration tests with module-isolation reset pattern

---

## [0.9.0] — prior web releases

See git log for the full history of the web app phases (tools 1–55, PDF suite,
ML image tools, Excalidraw whiteboard, SQLite playground, etc.).
36 changes: 34 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,42 @@ never leaves your device.
Both ride one lazily-loaded, self-hosted Monaco engine — never in the shell
payload. Nothing is uploaded.

✅ **Phase 10 — Desktop app (Tauri 2):**
- **System-wide screenshot** — global hotkey (⌘⇧A), multi-display picker, region
selector overlay, countdown, main window hides during capture.
- **Screen + audio recording** — full-screen or bounded region capture via
platform screen APIs; audio recorded in parallel via FFmpeg (avfoundation /
dshow / pulse) and muxed into the final video on stop.
- **System tray** — lives in the macOS menu bar; left-click to focus, "Take
Screenshot" shortcut directly in the menu.
- **Native FFmpeg** — bundled sidecar (per-platform binary) with system fallback;
verified at startup via `bundle:check` script.
- **First-run wizard** — permission check (Screen Recording, Microphone, FFmpeg)
with one-click jump to System Preferences.
- **Settings** — desktop preferences (format, tray, launch-at-login), permission
status panel, and auto-updater UI.
- **Auto-updater** — checks GitHub Releases on demand; downloads and relaunches
in place.
- **GitHub Actions release pipeline** — matrix build for macOS (arm64 + x64),
Windows, and Linux on `desktop-v*` tags.
- **Download page** — `/download` auto-detects OS/arch and highlights the right
installer.

### Desktop development

```bash
npm run tauri:dev # Dev server + Tauri window
npm run tauri:build # Release bundle (requires icon assets + FFmpeg sidecar)
npm run download:ffmpeg # Download platform FFmpeg sidecars to src-tauri/bin/
npm run bundle:check # Verify all required assets before release build
```

See [RELEASING-DESKTOP.md](./RELEASING-DESKTOP.md) for the full release guide,
including FFmpeg sidecar setup and signing key configuration for GitHub Actions.

## Testing

Unit tests cover the pure tool logic (parsers, generators, hash, image math,
file crypto, format converters): `npm run test` — **237 tests across 25 files**.
Unit tests cover pure tool logic and service layer: `npm run test` — **385 tests across 43 files**.

## Deployment

Expand Down
Loading
Loading