{"id":46889793,"url":"https://github.com/aviscaerulea/gcalntfy","last_synced_at":"2026-04-23T16:02:03.734Z","repository":{"id":343157546,"uuid":"1169378527","full_name":"aviscaerulea/gcalntfy","owner":"aviscaerulea","description":"Windows tray daemon that polls Google Calendar and fires toast notifications before events. Supports chimes, BLE headphones, multiple calendars, and per-event reminder timings.","archived":false,"fork":false,"pushed_at":"2026-04-23T14:42:50.000Z","size":2331,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-23T15:23:36.836Z","etag":null,"topics":["cpp","google-calendar","scheduler","toast-notification","tray-app","wasapi","windows"],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aviscaerulea.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-28T15:47:11.000Z","updated_at":"2026-04-23T14:46:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/aviscaerulea/gcalntfy","commit_stats":null,"previous_names":["aviscaerulea/gcalntfy"],"tags_count":25,"template":false,"template_full_name":null,"purl":"pkg:github/aviscaerulea/gcalntfy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviscaerulea%2Fgcalntfy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviscaerulea%2Fgcalntfy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviscaerulea%2Fgcalntfy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviscaerulea%2Fgcalntfy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aviscaerulea","download_url":"https://codeload.github.com/aviscaerulea/gcalntfy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aviscaerulea%2Fgcalntfy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32187404,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-23T15:28:30.493Z","status":"ssl_error","status_checked_at":"2026-04-23T15:28:29.972Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","google-calendar","scheduler","toast-notification","tray-app","wasapi","windows"],"created_at":"2026-03-10T22:32:51.356Z","updated_at":"2026-04-23T16:02:03.728Z","avatar_url":"https://github.com/aviscaerulea.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gcalntfy\n\nGoogle Calendar の予定を数分前に Windows 通知で知らせる常駐アプリ。\n\n## インストール\n\n[Scoop](https://scoop.sh/) でインストールできる。\n\n```powershell\nscoop bucket add aviscaerulea https://github.com/aviscaerulea/scoop-bucket\nscoop install gcalntfy\n```\n\n## 実行\n\n```powershell\ngcalntfy\n```\n\n起動するとシステムトレイに常駐し、Google Calendar をポーリングして予定を通知する。\n\n## 動作\n\n- OAuth 2.0 で Google Calendar API をポーリングし、当日の予定を取得（「タスク」は API 経由で時刻情報を得られないため非対応）\n- 起動すると常駐し、`gcalntfy.toml` の `schedule` に従って当日の Calendar イベントをポーリング\n- 次のイベントの `notify_minutes` 分前（デフォルト 5 分）に Windows Toast 通知を表示し、exe 同フォルダの `sound.wav`（チャイム音）を再生。音声ファイルがない場合は Toast 通知のみ\n- 日付が変わると通知済みセットをリセットして当日分を再取得\n\n## 通知の仕様\n\n### Toast 通知・音声通知のタイミング\n\n\n| タイミング | Toast 通知 | 音声通知 | 条件 |\n|---|:---:|:---:|---|\n| `notify_minutes` 前（デフォルト 5 分） | ✓ | ✓ | 常に通知（ベースライン） |\n| 予定の通知設定（reminders）指定分前 | ✓ | ✓ | 予定に popup の reminders が設定されている場合のみ |\n| 予定の変更・キャンセル・新規追加検知時 | ✓ | — | ポーリング時に前回との差分を検知した場合 |\n\n### 通知抑制\n\nトレイアイコン左クリックで表示される予定一覧で、予定項目を右クリックすると通知抑制をトグルできる。\n\n| 項目 | 仕様 |\n|---|---|\n| 適用範囲 | 選択したインスタンスのみ（繰り返し予定は当日分のみ抑制、翌日以降は通常通知） |\n| 抑制対象 | `notify_minutes` 前および reminders タイミングの Toast 通知・音声通知 |\n| 抑制対象外 | 変更・キャンセル・新規追加の検知通知（重要情報のため常に通知） |\n| 永続化 | exe 同フォルダの `muted_events.json` に保存し、再起動後も維持。過去日のエントリは起動時に自動削除 |\n| 視覚表現 | 抑制中の予定項目に取消線を表示 |\n\n### 音声通知の有無\n\n| 条件 | 音声通知 |\n|---|:---:|\n| 音声ファイル（`sound.wav`）が exe と同フォルダに存在する | あり |\n| 音声ファイルが存在しない | なし |\n| トレイメニューで「音声通知」を OFF に設定している | なし |\n| 「マイク/カメラ使用中は無効」が ON かつマイク/カメラ使用中 | なし |\n\n## 機能\n\n- **時間帯別ポーリング回数**: `schedule` に 24 要素の配列（回/時）で各時間帯のポーリング頻度を設定可能\n- **即時ポーリング**: PC スリープ復帰・セッションロック解除・ネットワーク復帰時に即座にポーリングを実行\n- **Toast 通知**: 通知の「Calendar」ボタンからイベントページを直接開ける\n- **通知音**: exe 同フォルダに `sound.wav`（16bit PCM WAV）を配置すると通知時にチャイム音を再生\n- **BLE ヘッドホン対応**: 接続遅延による冒頭切れを防止する 19kHz 不可聴トーンを自動挿入\n- **ダッキング**: 通知音再生中に `duck_targets` で指定したプロセスをミュートし終了後に自動復元\n- **多重起動制御**: 新プロセス起動時に旧プロセスを自動終了\n- **スタートアップ登録**: トレイメニューから Windows スタートアップ（HKCU Run キー）への登録・解除をトグル可能\n- **設定オーバーライド**: `gcalntfy.local.toml` があればキー単位で優先適用（変更はアプリ再起動で反映）\n- **システムトレイ**: 以降予定ありの場合アイコン右下にバッジを表示、ホバーで残り予定件数表示、左クリックで予定一覧（フッタークリックで Google Calendar 当日ページを開く、予定項目を右クリックで通知抑制をトグル）、右クリックで各種設定メニューを操作可能\n- **音声設定の永続化**: 音声通知と「マイク/カメラ使用中は無効」の設定は再起動後も維持\n- **起動時キャッシュ復元**: 直前のポーリング結果を `events.json` にキャッシュし、起動直後にネットワーク不通でもポーリング成功時の予定データを表示\n- **変更検知通知**: ポーリング時に前回との差分を検知し、予定の日時変更・キャンセル・新規追加を Toast 通知で報告\n- **複数カレンダー対応**: `ext_calendar_ids` で追加のカレンダー ID を指定し、外部カレンダーもポーリング対象にできる\n- **予定の通知設定に対応**: 予定に設定されている通知（reminders）の popup タイミングでも追加通知を行う（`notify_minutes` はベースラインとして常に通知）\n\n## 設定\n\n`gcalntfy.toml`（または `gcalntfy.local.toml`）を exe と同フォルダに配置する。\n\n```toml\nschedule = [1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 3, 3, 3, 1, 1]\n# イベント開始何分前に通知するか（0〜30、デフォルト 5）\n# notify_minutes = 5\n# 通知音再生中にミュートするプロセス名（空配列で無効）\n# duck_targets = [\"chrome.exe\", \"msedge.exe\"]\n# 追加でポーリングするカレンダー ID（primary は常に有効）\n# カレンダー ID は Google Calendar の「設定」→「カレンダーの統合」で確認できる\n# ext_calendar_ids = [\"abc123@group.calendar.google.com\"]\n\n# ガードトーン設定（BLE ヘッドホン対処）\n[guard]\n# enabled = true           # ガードトーンの有効/無効（デフォルト: true）\n# lead_in_duration = 1.2   # リードイン秒数（デフォルト: 1.2）\n# lead_out_duration = 1.2  # リードアウト秒数（デフォルト: 1.2）\n\n# ラウドネスノーマライズ設定\n[loudness]\n# enabled = true           # 有効/無効（デフォルト: true）\n# target = -16.0           # 目標ラウドネス LUFS（デフォルト: -16.0）\n# peak_ceiling = 0.891     # トゥルーピーク上限（デフォルト: 0.891 = -1 dBFS）\n```\n\n## 初回起動時の認証\n\n初回起動時はアクセストークンがないため、Toast 通知でブラウザが開く。Google アカウントで「許可」をクリックすると認証が完了し、リフレッシュトークンがレジストリ（`HKCU\\SOFTWARE\\gcalntfy`）に保存される。以降の起動では再認証不要。\n\n## ビルド\n\n```shell\ntask build\n```\n\nVisual Studio 2022 または Build Tools（C++20、MSVC）が必要。成果物は `out/gcalntfy.exe`。\n\nビルド前に `.env` を作成して `GOOGLE_CLIENT_ID` / `GOOGLE_CLIENT_SECRET` を設定すること。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faviscaerulea%2Fgcalntfy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faviscaerulea%2Fgcalntfy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faviscaerulea%2Fgcalntfy/lists"}