Google Geminiのチャットの名称をページタイトルに設定するユーザースクリプト

#132
2025.8.31
2025.8.31

ChatGPTとClaudeでは、今開いているチャットの名称がページのタイトルに設定されるのですが、Geminiだけはチャットの中身に関わらず"Google Gemini"という味気ないタイトルになってしまうので、沢山開いているとタブを見つけにくいのです……。FirefoxのViolentmonkeyで動作を確認済み。アプデで壊れる可能性は高いですが。

// ==UserScript==
// @name         Gemini Chat Name in Title
// @name:ja      Geminiチャット名をタイトルに表示
// @namespace    https://github.com/k0michi/
// @version      1.0
// @description  Set the current Gemini chat's name as the page title
// @description:ja Geminiで現在開いているチャットの名称をページのタイトルに設定するスクリプト
// @author       k0michi
// @match        https://gemini.google.com/app*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
  'use strict';

  const DEBOUNCE_MS = 500;
  const OBSERVE_RETRY_MS = 500;
  const SCRIPT_NAME = 'gemini_chat_title';
  const CHAT_TITLE_SELECTOR = 'conversations-list .selected .conversation-title';

  let debounceTimer;
  const defaultTitle = document.title;

  function log(...args) {
    console.log(`[${SCRIPT_NAME}]`, ...args);
  }

  function updateTitle() {
    const titleElement = document.querySelector(CHAT_TITLE_SELECTOR);

    if (titleElement && titleElement.textContent) {
      const chatTitle = titleElement.textContent.trim();
      log(`Active chat found: ${chatTitle}`);
      document.title = `${chatTitle} - ${defaultTitle}`;
    } else {
      log('No active chat found');
      document.title = defaultTitle;
    }
  }

  const observer = new MutationObserver(() => {
    clearTimeout(debounceTimer);
    debounceTimer = setTimeout(updateTitle, DEBOUNCE_MS);
  });

  function startObserver() {
    const targetNode = document.body;

    if (targetNode) {
      log('Body element found, starting observer');

      observer.observe(targetNode, {
        childList: true,
        subtree: true,
        attributes: false,
      });

      updateTitle();
    } else {
      log('No body element found, retrying...');
      setTimeout(startObserver, OBSERVE_RETRY_MS);
    }
  }

  startObserver();
})();