https://github.com/aviscaerulea/gcalntfy
Windows tray daemon that polls Google Calendar and fires toast notifications before events. Supports chimes, BLE headphones, multiple calendars, and per-event reminder timings.
https://github.com/aviscaerulea/gcalntfy
cpp google-calendar scheduler toast-notification tray-app wasapi windows
Last synced: 5 days ago
JSON representation
Windows tray daemon that polls Google Calendar and fires toast notifications before events. Supports chimes, BLE headphones, multiple calendars, and per-event reminder timings.
- Host: GitHub
- URL: https://github.com/aviscaerulea/gcalntfy
- Owner: aviscaerulea
- License: other
- Created: 2026-02-28T15:47:11.000Z (about 2 months ago)
- Default Branch: main
- Last Pushed: 2026-04-23T14:42:50.000Z (5 days ago)
- Last Synced: 2026-04-23T15:23:36.836Z (5 days ago)
- Topics: cpp, google-calendar, scheduler, toast-notification, tray-app, wasapi, windows
- Language: C++
- Size: 2.22 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# gcalntfy
Google Calendar の予定を数分前に Windows 通知で知らせる常駐アプリ。
## インストール
[Scoop](https://scoop.sh/) でインストールできる。
```powershell
scoop bucket add aviscaerulea https://github.com/aviscaerulea/scoop-bucket
scoop install gcalntfy
```
## 実行
```powershell
gcalntfy
```
起動するとシステムトレイに常駐し、Google Calendar をポーリングして予定を通知する。
## 動作
- OAuth 2.0 で Google Calendar API をポーリングし、当日の予定を取得(「タスク」は API 経由で時刻情報を得られないため非対応)
- 起動すると常駐し、`gcalntfy.toml` の `schedule` に従って当日の Calendar イベントをポーリング
- 次のイベントの `notify_minutes` 分前(デフォルト 5 分)に Windows Toast 通知を表示し、exe 同フォルダの `sound.wav`(チャイム音)を再生。音声ファイルがない場合は Toast 通知のみ
- 日付が変わると通知済みセットをリセットして当日分を再取得
## 通知の仕様
### Toast 通知・音声通知のタイミング
| タイミング | Toast 通知 | 音声通知 | 条件 |
|---|:---:|:---:|---|
| `notify_minutes` 前(デフォルト 5 分) | ✓ | ✓ | 常に通知(ベースライン) |
| 予定の通知設定(reminders)指定分前 | ✓ | ✓ | 予定に popup の reminders が設定されている場合のみ |
| 予定の変更・キャンセル・新規追加検知時 | ✓ | — | ポーリング時に前回との差分を検知した場合 |
### 通知抑制
トレイアイコン左クリックで表示される予定一覧で、予定項目を右クリックすると通知抑制をトグルできる。
| 項目 | 仕様 |
|---|---|
| 適用範囲 | 選択したインスタンスのみ(繰り返し予定は当日分のみ抑制、翌日以降は通常通知) |
| 抑制対象 | `notify_minutes` 前および reminders タイミングの Toast 通知・音声通知 |
| 抑制対象外 | 変更・キャンセル・新規追加の検知通知(重要情報のため常に通知) |
| 永続化 | exe 同フォルダの `muted_events.json` に保存し、再起動後も維持。過去日のエントリは起動時に自動削除 |
| 視覚表現 | 抑制中の予定項目に取消線を表示 |
### 音声通知の有無
| 条件 | 音声通知 |
|---|:---:|
| 音声ファイル(`sound.wav`)が exe と同フォルダに存在する | あり |
| 音声ファイルが存在しない | なし |
| トレイメニューで「音声通知」を OFF に設定している | なし |
| 「マイク/カメラ使用中は無効」が ON かつマイク/カメラ使用中 | なし |
## 機能
- **時間帯別ポーリング回数**: `schedule` に 24 要素の配列(回/時)で各時間帯のポーリング頻度を設定可能
- **即時ポーリング**: PC スリープ復帰・セッションロック解除・ネットワーク復帰時に即座にポーリングを実行
- **Toast 通知**: 通知の「Calendar」ボタンからイベントページを直接開ける
- **通知音**: exe 同フォルダに `sound.wav`(16bit PCM WAV)を配置すると通知時にチャイム音を再生
- **BLE ヘッドホン対応**: 接続遅延による冒頭切れを防止する 19kHz 不可聴トーンを自動挿入
- **ダッキング**: 通知音再生中に `duck_targets` で指定したプロセスをミュートし終了後に自動復元
- **多重起動制御**: 新プロセス起動時に旧プロセスを自動終了
- **スタートアップ登録**: トレイメニューから Windows スタートアップ(HKCU Run キー)への登録・解除をトグル可能
- **設定オーバーライド**: `gcalntfy.local.toml` があればキー単位で優先適用(変更はアプリ再起動で反映)
- **システムトレイ**: 以降予定ありの場合アイコン右下にバッジを表示、ホバーで残り予定件数表示、左クリックで予定一覧(フッタークリックで Google Calendar 当日ページを開く、予定項目を右クリックで通知抑制をトグル)、右クリックで各種設定メニューを操作可能
- **音声設定の永続化**: 音声通知と「マイク/カメラ使用中は無効」の設定は再起動後も維持
- **起動時キャッシュ復元**: 直前のポーリング結果を `events.json` にキャッシュし、起動直後にネットワーク不通でもポーリング成功時の予定データを表示
- **変更検知通知**: ポーリング時に前回との差分を検知し、予定の日時変更・キャンセル・新規追加を Toast 通知で報告
- **複数カレンダー対応**: `ext_calendar_ids` で追加のカレンダー ID を指定し、外部カレンダーもポーリング対象にできる
- **予定の通知設定に対応**: 予定に設定されている通知(reminders)の popup タイミングでも追加通知を行う(`notify_minutes` はベースラインとして常に通知)
## 設定
`gcalntfy.toml`(または `gcalntfy.local.toml`)を exe と同フォルダに配置する。
```toml
schedule = [1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 1, 1]
# イベント開始何分前に通知するか(0〜30、デフォルト 5)
# notify_minutes = 5
# 通知音再生中にミュートするプロセス名(空配列で無効)
# duck_targets = ["chrome.exe", "msedge.exe"]
# 追加でポーリングするカレンダー ID(primary は常に有効)
# カレンダー ID は Google Calendar の「設定」→「カレンダーの統合」で確認できる
# ext_calendar_ids = ["abc123@group.calendar.google.com"]
# ガードトーン設定(BLE ヘッドホン対処)
[guard]
# enabled = true # ガードトーンの有効/無効(デフォルト: true)
# lead_in_duration = 1.2 # リードイン秒数(デフォルト: 1.2)
# lead_out_duration = 1.2 # リードアウト秒数(デフォルト: 1.2)
# ラウドネスノーマライズ設定
[loudness]
# enabled = true # 有効/無効(デフォルト: true)
# target = -16.0 # 目標ラウドネス LUFS(デフォルト: -16.0)
# peak_ceiling = 0.891 # トゥルーピーク上限(デフォルト: 0.891 = -1 dBFS)
```
## 初回起動時の認証
初回起動時はアクセストークンがないため、Toast 通知でブラウザが開く。Google アカウントで「許可」をクリックすると認証が完了し、リフレッシュトークンがレジストリ(`HKCU\SOFTWARE\gcalntfy`)に保存される。以降の起動では再認証不要。
## ビルド
```shell
task build
```
Visual Studio 2022 または Build Tools(C++20、MSVC)が必要。成果物は `out/gcalntfy.exe`。
ビルド前に `.env` を作成して `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` を設定すること。