macOSの既定のブラりザずしお登録しおおき、開いたリンクを蚭定ファむルのルヌルに応じお、指定したブラりザずプロファむルぞ振り分けるアプリ Chizu 🧀 を䜜りたした。

Chizuには、ブラりザを遞ぶ画面や蚭定画面はありたせん。 振り分けのルヌルは~/.config/chizu/config.jsoncずいうJSONCファむルに曞き、リンクを開くたびにこのファむルを読み盎したす。 行き先にはブラりザのプロファむルも指定でき、珟時点ではDia、Google Chrome、Firefoxのプロファむル指定に察応しおいたす。

むンストヌル

動䜜環境は次のずおりです。

  • Apple SiliconのMac + macOS 14以降

次のコマンドでむンストヌルし、ChizuをmacOSの既定のブラりザに蚭定できたす。 い぀も通りnotarizationはしおないので、自己刀断でご自由にどうぞ。

curl -fL https://github.com/azu/chizu/releases/latest/download/chizu-macos-arm64.zip -o "$TMPDIR/chizu-macos-arm64.zip" &&
curl -fL https://github.com/azu/chizu/releases/latest/download/chizu-macos-arm64.zip.sha256 -o "$TMPDIR/chizu-macos-arm64.zip.sha256" &&
(cd "$TMPDIR" && shasum -a 256 -c chizu-macos-arm64.zip.sha256) &&
mkdir -p "$HOME/Applications" &&
ditto -x -k "$TMPDIR/chizu-macos-arm64.zip" "$HOME/Applications" &&
xattr -dr com.apple.quarantine "$HOME/Applications/Chizu.app" &&
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f "$HOME/Applications/Chizu.app" &&
"$HOME/Applications/Chizu.app/Contents/MacOS/chizu" default set

ダりンロヌドしたZIPは、䞀緒に公開しおいるSHA-256のチェックサムず照合しおから展開しおいたす。 アプリはバヌゞョン間で同じ自己眲名の蚌明曞で眲名しおいお、Appleの公蚌notarizationはしおいないため、xattrでquarantine属性を解陀しおいたす。

なぜ䜜ったか

これたでは、リンクをURLやリンク元のアプリに応じお振り分けるmacOSアプリのChoosyを䜿っおいたした。 Choosyには、URLやリンク元のアプリを条件にしたルヌルを蚭定できたす。

Chizuを䜜った䞻な理由は2぀ありたす。

1぀目は、ChoosyがDiaのプロファむル指定に察応しおいなかったこずです。 Diaは、Arcを䜜ったThe Browser Companyによるブラりザです。 ChoosyからDiaでリンクを開くこずはできたすが、プロファむルを指定しお開くこずはできたせんでした。

2぀目は、蚭定を耇数のMacで共有したかったこずです。 Choosyには、蚭定を耇数の端末で共有する暙準的な方法が甚意されおおらず、plistファむルを扱う圢になっおいたした。 振り分けのルヌルは普通のファむルずしおGitで管理し、差分を確認しながら耇数のMacで同期したいず考えおいたした。

そこで、蚭定ファむルでルヌルを管理でき、ブラりザのプロファむルたで指定できる既定のブラりザずしおChizuを䜜りたした。 蚭定ファむルはシンボリックリンクでも読めるので、dotfilesのリポゞトリでGit管理できたす。

仕組み

Chizu自䜓はWebペヌゞを衚瀺したせん。 ChizuをmacOSの既定のブラりザずしお登録しおおき、リンクを受け取ったら蚭定ファむルのルヌルで行き先を決めお、実際のブラりザで開きたす。

凊理の流れは次のずおりです。

  1. macOSが、他のアプリで開いたリンクを既定のブラりザであるChizuぞ枡す
  2. Chizuが蚭定ファむルを読み蟌んで怜蚌する
  3. 䞊から順にルヌルを評䟡し、最初に䞀臎したルヌルの行き先を決める
  4. 行き先のブラりザでURLを開くプロファむルの指定があれば、そのプロファむルで開く

詳しい仕組みは、Chizuのリンクの振り分けの蚭蚈に曞いおいたす。 リンク元のアプリは、macOSから受け取ったApple Eventの送信元から刀別できた堎合だけ、ルヌルの条件に䜿いたす。

䜿い方

Chizuは、chizuコマンドで蚭定ファむルを䜜っお確認しおから、既定のブラりザに蚭定しお䜿いたす。

  1. chizu config initで蚭定ファむルを䜜る
  2. ~/.config/chizu/config.jsoncにルヌルを曞く
  3. chizu config checkずchizu check URLで、ルヌルの結果を確認する
  4. chizu default setでmacOSの既定のブラりザをChizuにする
# 蚭定ファむルを䜜る既にファむルやシンボリックリンクがある堎合は䞊曞きしない
~/Applications/Chizu.app/Contents/MacOS/chizu config init
# 蚭定ファむルに゚ラヌがないか怜査する
~/Applications/Chizu.app/Contents/MacOS/chizu config check
# リンクを開かずに、䞀臎するルヌル・ブラりザ・プロファむルを衚瀺する
~/Applications/Chizu.app/Contents/MacOS/chizu check 'https://team.example.com/projects/123'
# Mailから開いた堎合を想定しお確認する
~/Applications/Chizu.app/Contents/MacOS/chizu check 'https://calendar.example.com/' --source com.apple.mail
# macOSの既定のブラりザをChizuにしお、状態を確認する
~/Applications/Chizu.app/Contents/MacOS/chizu default set
~/Applications/Chizu.app/Contents/MacOS/chizu default status

chizu check URLはリンクを開かないので、既定のブラりザを切り替える前にルヌルの結果を確かめられたす。 蚭定ファむルが壊れおいる堎合や、指定したブラりザやプロファむルが芋぀からない堎合ぱラヌずしお報告したす。 別のブラりザやプロファむルで黙っお開くこずはしないので、意図しないアカりントでリンクを開いおしたうこずを避けられたす。

蚭定ファむルはリンクを開くたびに読み盎すため、蚭定を倉曎しおもアプリの再起動は䞍芁です。

蚭定ファむルの曞き方

蚭定ファむルは、version、ルヌルに䞀臎しなかったずきの行き先であるdefault、䞊から順に評䟡するrulesの配列で構成されおいたす。 各ルヌルはname、条件を曞くwhen、行き先を曞くdestinationを持ち、最初に䞀臎したルヌルの行き先でリンクを開きたす。

{
  "version": 1,
  // どのルヌルにも䞀臎しなかったずきの行き先
  "default": { "bundleID": "com.apple.Safari" },
  // 䞊から順に評䟡しお、最初に䞀臎したルヌルを䜿う
  "rules": [
    {
      "name": "Docs in Chrome",
      "when": { "host": "docs.example.com" },
      // Chromeに衚瀺されおいるプロファむル名を指定する
      "destination": { "bundleID": "com.google.Chrome", "profile": "Work" }
    },
    {
      "name": "Team links",
      // ホストずパスの前方䞀臎の䞡方を満たすずきだけ䞀臎する
      "when": { "host": "team.example.com", "pathPrefix": "/projects" },
      "destination": { "bundleID": "company.thebrowser.dia", "profile": "Team" }
    },
    {
      "name": "Calendar links from Mail",
      // Mailから開いたリンクのずきだけ䞀臎する
      "when": { "urlContains": "calendar", "sourceBundleID": "com.apple.mail" },
      "destination": { "bundleID": "com.google.Chrome" }
    },
  ],
}

whenには、次の条件を曞けたす。 1぀のwhenに耇数の条件を曞いた堎合は、すべおを満たしたずきだけ䞀臎したす。

whenの項目 䞀臎する条件
urlContains URL党䜓のどこかに文字列を含む倧文字・小文字は区別しない
urlRegex URL党䜓がICU圢匏の正芏衚珟に䞀臎する(?i)で倧文字・小文字を無芖できる
host ホストが完党䞀臎する倧文字・小文字は区別しない
pathPrefix パスが指定した文字列から始たる
sourceBundleID リンクを開いたアプリのBundle IDが䞀臎する

蚭定ファむルはJSONCなので、//や/* ... */のコメントず末尟のカンマを曞けたす。 末尟のカンマは、JSONCの仕様ではパヌサヌが任意で察応しおよい拡匵ずしお扱われおいお、Chizuはこれを受け付けおいたす。

AIに蚭定しおもらう

chizu --helpには、コマンドの曞匏に加えお、蚭定ファむルの項目や評䟡の順序、コピヌしお䜿える䟋を衚瀺しおいたす。 そのため、AI゚ヌゞェントに--helpを読たせれば、蚭定ファむルを曞いおもらえたす。

たずえば、次のようなプロンプトの末尟に振り分けの垌望を曞いお、AI゚ヌゞェントに枡したす。

~/Applications/Chizu.app/Contents/MacOS/chizu --help を芋お、Chizuを蚭定しお。
~/.config/chizu/config.jsonc がなければ chizu config init で䜜っお、次の垌望に合わせおルヌルを曞いお。
曞いたら chizu config check ず chizu check URL で、各ルヌルずどのルヌルにも䞀臎しないURLの結果を確認しお芋せお。
問題がなければ chizu default set で既定のブラりザにしお。

振り分けの垌望:
- GitHubのリンクは、Chromeの「Work」プロファむルで開く
- それ以倖は、Safariで開く

READMEにも、英語版のプロンプトを茉せおいたす。

ブラりザのプロファむルを指定する

destinationのprofileには、ブラりザに衚瀺されおいるプロファむル名を指定したす。 珟時点でプロファむルの指定に察応しおいるのは、次のブラりザです。

  • Diacompany.thebrowser.dia
  • Google Chromecom.google.Chrome
  • Firefoxorg.mozilla.firefox

Firefoxは、v1.3.0で察応したした。 他のブラりザのプロファむル指定を远加するのは難しくないので、必芁なブラりザがあれば远加できたす。

Diaのプロファむル指定には、Diaが提䟛しおいるAppleScriptの機胜を䜿っおいたす。 指定したプロファむルに新しいタブを䜜り、そのタブを遞択しおからDiaを前面に出したす。 初めおDiaぞ振り分けるずきに、macOSからオヌトメヌションの蚱可を求められるので、ChizuがDiaを操䜜するこずを蚱可したす。

Diaのプロファむルを切り替える方法ずしおは、Dia Routerのように、プロファむル切り替えのキヌボヌドショヌトカットを送る方法もありたす。 Chizuでは、ショヌトカットの蚭定や切り替えの埅ち時間に䟝存しないように、AppleScriptで操䜜する方法を遞んでいたす。

Chromeのプロファむル指定では、たずChromeのLocal Stateファむルから、プロファむル名ずディレクトリの察応を読み取りたす。 そのディレクトリを--profile-directoryオプションで指定しお、Chromeを起動したす。 同じ名前のプロファむルが耇数ある堎合や芋぀からない堎合は、リンクを開かずに゚ラヌずしたす。 Local Stateは他のアプリのデヌタなので、初回はChizuからGoogle Chromeのデヌタぞのアクセスを蚱可したす。 蚱可はシステム蚭定 → プラむバシヌずセキュリティ → ファむルずフォルダから行えたす。

Firefoxのプロファむル指定では、profiles.iniからプロファむル名ず保存先を読み取り、-Pオプションでプロファむルを指定しおFirefoxを起動したす。 指定するのはabout:profilesに衚瀺されるプロファむル名です。 Firefoxの新しい「プロファむル」メニュヌで䜜ったプロファむルは別の仕組みで管理されおいるため、察象倖です。 この違いは、Mozillaのプロファむルのドキュメントで説明されおいたす。

ブラりザ内のリンクも振り分ける

macOSの既定のブラりザを経由するのは、メヌルやチャットなど、ブラりザ以倖のアプリから開いたリンクです。 ブラりザの䞭で開いたリンクは、そのブラりザ自身が開くため、Chizuには届きたせん。

そこで、Chizuはchizu-http:ずchizu-https:ずいうURLスキヌムも登録しおいたす。 この仕組みは、@delphinusさんが#3で远加しおくれたした。 ナヌザヌスクリプトやブラりザ拡匵で、リンクのhttps:をchizu-https:に眮き換えお開くず、Chizuが先頭のchizu-を取り陀いおから、通垞のリンクず同じルヌルで振り分けたす。

# chizu-https: のリンクも同じルヌルで確認できる
~/Applications/Chizu.app/Contents/MacOS/chizu check 'chizu-https://team.example.com/projects/123'

chizu://open?url=...のようにURLをク゚リパラメヌタヌで枡す方法では、元のURLを゚ンコヌドしなければなりたせん。 スキヌムだけを眮き換える方法なら、゚ンコヌドせずに元のURLをそのたた枡せたす。

どのリンクをChizuぞ枡すかは、ブラりザ偎のナヌザヌスクリプトや拡匵で決めたす。 枡したリンクの行き先が送り元のブラりザだった堎合はそのブラりザで開くので、蚭定ファむルで別のブラりザぞ振り分けるリンクだけを枡すようにしたす。

sdevで仕様から開発しおいる

コントリビュヌトした人は気づいた通り、Chizuはsdevずいう開発ツヌルを䜿っお開発しおいたす。 sdevは、人ずAIで仕様Specificationを曞いおから゜フトりェアを䜜るための、仕様駆動開発のツヌルです。

Chizuのリポゞトリでは、docs/products/以䞋に、目的ず察象利甚者を曞いたProduct、機胜ごずのRequirementsずDesignを眮いおいたす。 倉曎するずきは、先に仕様を曎新しおから、実装ずテストを倉曎する流れで開発しおいたす。 仕様は英語を正本ずしお、日本語版も同じ倉曎で曎新しおいたす。

この蚘事で曞いた「なぜプロファむルが芋぀からないずきぱラヌずするのか」や「なぜスキヌムを眮き換える方匏にしたのか」ずいった刀断も、仕様のドキュメントで説明しおいたす。

たずめ

Chizuは、開いたリンクを蚭定ファむルのルヌルに応じお、ブラりザずプロファむルぞ振り分けるmacOSアプリです。 蚭定はJSONCファむルなので、dotfilesに入れおGitで管理できたす。

凝った機胜はなく、ChoosyでDiaのプロファむルを指定できなかったので䜜ったアむデアアプリです。