- Global shortcuts — Trigger region capture, active-screen quick shot, or active-window quick shot from anywhere
- Multi-monitor support — Capture from any connected display
- Smart window detection — Click to auto-select window bounds
- Flexible selection — Click-drag to select region, resize with handles
- Quick shots — Copy the active screen or window instantly
- Copy or save — Send to clipboard or save as PNG
- Customizable shortcuts — Change capture and quick-shot keys in settings
- Native performance — Rust backend for speed, React frontend for polish
brew tap poneding/flashot
brew install --cask flashot- Download the latest
.dmgfrom Releases - Open the
.dmgand drag Flashot to Applications - Grant screen recording permission when prompted (System Settings → Privacy & Security → Screen Recording)
- Restart Flashot after granting permission
- Download the latest
.exeinstaller from Releases - Run the installer
- Launch Flashot from Start Menu
- Download the latest
.AppImagefrom Releases - Make it executable:
chmod +x Flashot-*.AppImage - Run the AppImage
Self-signed App on macOS
Flashot's macOS release builds use a fixed self-signed code-signing certificate. This keeps the app identity more stable across updates than ad-hoc signing, but it is not an Apple Developer ID certificate and is not notarized. macOS Gatekeeper may still block the app on first launch. To resolve this:
Option A — Remove the quarantine attribute (recommended):
xattr -cr /Applications/Flashot.appOption B — Right-click to open:
- Right-click (or Control-click) Flashot.app in Applications
- Select "Open" from the context menu
- Click "Open" in the dialog that appears
| Action | macOS | Windows / Linux |
|---|---|---|
| Region capture | Cmd+Shift+A |
Ctrl+Shift+A |
| Active screen | Cmd+Shift+F |
Ctrl+Shift+F |
| Active window | Cmd+Shift+W |
Ctrl+Shift+W |
- Press the region capture shortcut
- Screen freezes and overlay appears
- Click and drag to select region, or click a window to auto-select
- Use the toolbar to copy or Save As, or press Cmd/Ctrl+C
- Press ESC to cancel
Quick shots skip the overlay and copy immediately.
Flashot includes a built-in updater. When a new version is available, you'll be notified through the tray menu "Check for updates" option. The update is downloaded, verified, and installed automatically.
If you installed via Homebrew:
brew upgrade --cask flashot- Node.js 20 LTS and pnpm
- Rust 1.83+
- Platform deps: Xcode CLI Tools (macOS) / VS Build Tools (Windows)
git clone https://github.com/poneding/flashot.git
cd flashot
pnpm install
pnpm tauri devpnpm tauri dev # Dev mode (full app)
pnpm tauri build # Production build
pnpm test # Frontend tests
pnpm lint # TypeScript type checking
cd src-tauri && cargo clippy # Rust linting
cd src-tauri && cargo test # Rust tests
cd src-tauri && cargo bench # Benchmarks| Layer | Stack |
|---|---|
| Frontend | React + TypeScript + Vite + Tailwind CSS |
| Backend | Rust + Tauri 2 |
| Capture | xcap (cross-platform) |
| Hotkey | global-hotkey |
| Clipboard | arboard |
| Window detection | Core Graphics (macOS) / Win32 (Windows) |
- Bump version in
package.json,src-tauri/Cargo.toml,src-tauri/tauri.conf.json - Commit and tag:
git tag v0.1.0
git push origin v0.1.0The .github/workflows/release.yml workflow builds macOS (ARM + Intel), Windows, and Linux installers, publishes a GitHub Release, then updates poneding/homebrew-flashot for non-prerelease releases. Flashot's Rust crate is only used internally by the Tauri app and is not published to crates.io.
The Homebrew update step downloads Flashot_<version>_aarch64.dmg and Flashot_<version>_x64.dmg, computes their SHA256 hashes, and commits the updated cask to poneding/homebrew-flashot. .github/workflows/homebrew.yml remains available as a manual recovery workflow.
To publish a beta, bump the app version to a prerelease SemVer version, create a matching tag, and run the same release workflow:
git tag v0.1.1-beta.1
git push origin v0.1.1-beta.1The release workflow marks tags containing - as GitHub prereleases and copies the signed updater latest.json to the beta branch as latest.json. Users who enable Allow beta updates check https://raw.githubusercontent.com/poneding/flashot/beta/latest.json first, then fall back to the stable endpoint if the beta manifest does not exist yet. Users who leave beta updates off continue to use GitHub Releases latest, which does not include prereleases. The beta raw URL returns 404 until the first beta release creates the beta branch.
The release and manual Homebrew workflows require a repository secret named HOMEBREW_TAP_TOKEN. Use a fine-grained personal access token with Contents read/write access to poneding/homebrew-flashot; the default GITHUB_TOKEN cannot push to the separate tap repository.
macOS release builds also require fixed self-signed code-signing secrets. Generate the certificate once and keep the .p12 file and password backed up so future releases use the same signing identity.
CERT_PASSWORD="choose-a-long-password" \
scripts/macos/create-self-signed-codesign-cert.sh /tmp/flashot-codesign.p12Add these GitHub repository secrets from the script output:
MACOS_CODESIGN_CERTIFICATEMACOS_CODESIGN_CERTIFICATE_PASSWORDMACOS_CODESIGN_IDENTITY
These secrets are separate from TAURI_SIGNING_PRIVATE_KEY, which signs updater artifacts rather than the macOS app bundle.
Contributions welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feat/my-feature) - Commit your changes (
git commit -m 'feat: add my feature') - Push to the branch (
git push origin feat/my-feature) - Open a Pull Request
Built with Tauri · React · xcap · global-hotkey
