Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions .github/workflows/macos-build.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# This workflow builds the Finicky macOS app for both Silicon (ARM64) and Intel (x86_64) architectures
name: macOS Build
name: macOS Build (cross-platform regression check)

on:
push:
branches: [main]
branches: [main, windows-support, windows-smoke]
pull_request:
branches: [main]
workflow_dispatch:
Expand Down
135 changes: 135 additions & 0 deletions .github/workflows/windows-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
name: Windows Build

on:
push:
branches: [main, windows-support, windows-smoke]
pull_request:
branches: [main]
workflow_dispatch:

jobs:
build-windows:
runs-on: windows-latest

steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # full history + tags so `git describe` yields the real version

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: |
packages/config-api/package-lock.json
packages/finicky-ui/package-lock.json

- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.24'
cache-dependency-path: |
apps/finicky/src/go.sum

- name: Install Node dependencies
run: |
cd packages/config-api
npm ci
cd ../finicky-ui
npm ci

# pwsh, not cmd: in a cmd script, `npm` (npm.cmd) without `call` transfers
# control and never returns, so everything after the first npm line was
# silently skipped and the embed assets never landed.
- name: Build config-api
run: |
cd packages/config-api
npm run build
npm run generate-types
Copy-Item dist/finickyConfigAPI.js ../../apps/finicky/src/assets/finickyConfigAPI.js -Force
shell: pwsh

- name: Build UI
run: |
cd packages/finicky-ui
npm run build
New-Item -ItemType Directory -Force ../../apps/finicky/src/assets/templates | Out-Null
Copy-Item dist/* ../../apps/finicky/src/assets/templates/ -Recurse -Force
shell: pwsh

- name: Build Windows binary
env:
CGO_ENABLED: '0'
GOOS: windows
GOARCH: amd64
run: |
$commitHash = git rev-parse --short HEAD
$buildDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss UTC" -AsUTC
$version = git describe --tags --match 'v*' --always
cd apps/finicky/src
go build -ldflags "-X 'finicky/version.commitHash=$commitHash' -X 'finicky/version.buildDate=$buildDate' -X 'finicky/version.version=$version' -H windowsgui" -o ../build/windows/Finicky.exe .
shell: pwsh

- name: Run tests
run: |
cd apps/finicky/src
go test ./...
env:
CGO_ENABLED: '0'

- name: Upload Windows binary
uses: actions/upload-artifact@v4
with:
name: Finicky-windows-x64
path: apps/finicky/build/windows/Finicky.exe
retention-days: 14

cross-compile-check:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '22'
cache: 'npm'
cache-dependency-path: |
packages/config-api/package-lock.json
packages/finicky-ui/package-lock.json

- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.24'
cache-dependency-path: |
apps/finicky/src/go.sum

- name: Build assets
run: |
cd packages/config-api && npm ci && npm run build && npm run generate-types
cp dist/finickyConfigAPI.js ../../apps/finicky/src/assets/finickyConfigAPI.js
cd ../finicky-ui && npm ci && npm run build
mkdir -p ../../apps/finicky/src/assets/templates
cp -r dist/* ../../apps/finicky/src/assets/templates/

- name: Cross-compile for Windows
env:
CGO_ENABLED: '0'
GOOS: windows
GOARCH: amd64
run: |
cd apps/finicky/src
go build -o /dev/null .

- name: Cross-compile for macOS (verify no regressions)
env:
CGO_ENABLED: '0'
GOOS: darwin
GOARCH: arm64
run: |
cd apps/finicky/src
go build -o /dev/null . 2>&1 || echo "Expected: macOS build needs CGO for ObjC (this is OK)"
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,7 @@ node_modules
build
.env
dist
example-config
example-config
*.exe
*.msi
Output/
31 changes: 29 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

</div>

Finicky is a macOS application that allows you to set up rules that decide which browser is opened for every url. With Finicky as your default browser, you can tell it to open Bluesky or Reddit in one browser, and LinkedIn or Google Meet in another.
Finicky is an application for macOS and Windows that allows you to set up rules that decide which browser is opened for every url. With Finicky as your default browser, you can tell it to open Bluesky or Reddit in one browser, and LinkedIn or Google Meet in another.

- Route any URL to your preferred browser with powerful matching rules
- Automatically edit URLs before opening them (e.g., force HTTPS, remove tracking parameters)
Expand All @@ -22,16 +22,31 @@ Finicky is a macOS application that allows you to set up rules that decide which
## Table of Contents

- [Installation](#installation)
- [macOS](#macos)
- [Windows](#windows)
- [Basic configuration](#basic-configuration)
- [Configuration](#configuration)
- [Migrating from Finicky 3](#migrating-from-finicky-3)

## Installation

### macOS

- Download from [releases](https://github.com/johnste/finicky/releases)
- Or install via homebrew: `brew install --cask finicky`
- Create a JavaScript or TypeScript configuration file at `~/.finicky.js`. Have a look at the example configuration below, or in the `example-config` folder.
- Start Finicky (in Applications, or through Spotlight/Alfred/Raycast) and allow it to be set as the default browser. Starting Finicky manually opens the configuration/troubleshooting window.
- Start Finicky (in Applications, or through Spotlight/Alfred/Raycast) and allow it to be set as the default browser. Starting Finicky manually opens the configuration/troubleshooting window.

### Windows

- Download `FinickySetup-<version>.exe` from [releases](https://github.com/johnste/finicky/releases) and run the installer
- Or install via winget: `winget install --id JohnSterling.Finicky`
- Create a configuration file at `%USERPROFILE%\.finicky.js` (same format as macOS — configs are cross-platform)
- Open **Settings > Default Apps** and set Finicky as the default web browser
- Finicky runs in the system tray and routes URLs based on your rules

The installer registers Finicky as a browser in Windows. No admin rights are required — it installs per-user to `%LOCALAPPDATA%\Finicky`.


## Basic configuration

Expand Down Expand Up @@ -95,6 +110,18 @@ Finicky has browser extensions for Chrome and Firefox. They add an "open with Fi

See [Building Finicky from source](https://github.com/johnste/finicky/wiki/Building-Finicky-from-source)

**Windows (cross-compile from macOS/Linux):**
```bash
./scripts/build-windows.sh
```

**Windows (native):**
```powershell
$env:CGO_ENABLED="0"
New-Item -ItemType Directory -Force apps/finicky/build/windows | Out-Null
go build -C apps/finicky/src -ldflags "-H windowsgui" -o ../build/windows/Finicky.exe .
```
Comment thread
coderabbitai[bot] marked this conversation as resolved.

### Works well with

If you are looking for something that lets you pick the browser to activate in a graphical interface, check out [Browserosaurus](https://browserosaurus.com/) by Will Stone, an open source browser prompter for macOS. It works really well together with Finicky!
Expand Down
Loading