⚡ This is your brand? Claim your page FREE and bring it to life on AI search.
Your AEO score measures whether AI search engines (ChatGPT, Claude, Perplexity, Gemini) can actually read your site and cite it in answers. Two-thirds of websites are invisible to them. ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })() just got measured.
4/10 means ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })() is borderline visible. AI bots can crawl your site but your structured-data signals are thin. You are at risk of being skipped when buyers ask AI for a recommendation.
([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })() is a brand in the technology category. View their AI visibility score and details below.
Category: Technology
gm.bravegpt.com1
Structured Data
2
Content Structure
4
Entity Clarity
4
E-E-A-T Signals
6
Technical AEO
5
AI Discoverability
Is this your brand?
Claim free. You'll see:
Your full 6-category score breakdown
Exact fixes: robots.txt, schema, llms.txt
AI bot crawls from ChatGPT, Claude, Perplexity, Gemini
Personal 50% off code at checkout
Tech buyers are the most research-intensive shoppers on the internet.
Continue reading in your free Engagemii portalFree signup unlocks the full article plus your personalized AEO fix list for ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })().
Scored by Engagemii on June 7, 2026. Methodology: engagemii.com/aeo/methodology
Source URL: https://engagemii.com/aeo/brands/gm-bravegpt
Cite this score: Engagemii (2026). "AEO Score for ([^<]+)<\/title>/i)[1] .replace(/\s*[—|/]+\s*/g, ' ') // convert symbols to space for hyphen-casing .replace(/\.{2,}/g, '') // strip ellipsis .toLowerCase().trim().replace(/\s+/g, '-') // hyphen-case + '.html' const href = URL.createObjectURL(new Blob([responseText], { type: 'text/html' })) const a = dom.create.anchor(href, '', { download, style: 'display: none' }) document.body.append(a) ; a.click() ; a.remove() ; URL.revokeObjectURL(href) }, onerror: err => log.error('Failed to download chat:', err) }) } ] ) // Prefix icon to title const modalTitle = shareChatModal.querySelector('h2'), titleIcon = icons.create({ key: 'speechBalloons' }) titleIcon.style.cssText = `height: 28px ; width: 28px ; position: relative ; top: 7px ; right: 8px ; fill: ${ env.ui.app.scheme == 'dark' ? 'white' : 'black' }` modalTitle.prepend(titleIcon) // Hide Dismiss button, localize other labels const modalBtns = shareChatModal.querySelectorAll('button') modalBtns[0].style.display = 'none' // hide Dismiss button if (!env.browser.language.startsWith('en')) // localize button labels modalBtns.forEach(btn => { if (/copy/i.test(btn.textContent)) btn.textContent = `${app.msgs.tooltip_copy} URL` else if (/visit/i.test(btn.textContent)) btn.textContent = app.msgs.btnLabel_visitPage else if (/download/i.test(btn.textContent)) btn.textContent = `${app.msgs.btnLabel_download} ${string.toTitleCase(app.msgs.btnLabel_convo)}` }) // Style elements shareChatModal.style.wordBreak = 'break-all' // since URL really long shareChatModal.querySelector('h2').style.justifySelf = 'center' shareChatModal.querySelector('p').style.cssText = 'text-align: center ; margin: 10px 0 -24px' shareChatModal.querySelector('.modal-buttons').style.cssText = 'justify-content: center' return shareChatModal }, stylize() { const { scheme: appScheme } = env.ui.app if (!this.styles?.isConnected) document.head.append(this.styles ||= dom.create.style()) this.styles.textContent = ( // Vars `:root { --modal-btn-zoom: scale(1.055) ; --modal-btn-transition: transform 0.15s ease ; --settings-li-transition: transform 0.1s ease ; /* for Settings entry hover-zoom */ --fg-transition: opacity 0.65s cubic-bezier(0.165,0.84,0.44,1), /* fade-in */ transform 0.55s cubic-bezier(0.165,0.84,0.44,1) !important ; /* move-in */ --bg-transition: background-color 0.25s ease !important } /* dim */` // Main modal styles + `@keyframes modal-zoom-fade-out { 0% { opacity: 1 } 50% { opacity: 0.25 ; transform: scale(1.05) } 100% { opacity: 0 ; transform: scale(1.35) } } .chatgpt-modal > div { background-color: white !important ; color: #202124 ; ${ env.browser.isCompact ? 'padding: 25px 31px !important' : '' } } .chatgpt-modal p { margin: 14px 0 -20px 4px ; font-size: 18px } /* pos/size modal msg */ .chatgpt-modal a { color: #${ appScheme == 'dark' ? '00cfff' : '1e9ebb' } !important } .modal-buttons { margin: 38px 0 1px ${ env.browser.isMobile ? 0 : -7 }px !important ; width: 100% } .chatgpt-modal button { /* this.alert() buttons */ min-width: 123px ; padding: ${ env.browser.isMobile ? '5px' : '4px 8px' } !important ; cursor: pointer ; border-radius: 0 !important ; height: 39px ; border: 1px solid ${ appScheme == 'dark' ? 'white' : 'black' }!important } .primary-modal-btn { background: black !important ; color: white !important } .chatgpt-modal button:hover { --btn-shadow: ${ appScheme == 'light' ? '2px 1px 43px #00cfff70' : '2px 1px 54px #00cfff' }; color: inherit !important ; /* remove color hack */ background-color: rgb(${ appScheme == 'light' ? '192 223 227 / 5%' : '43 156 171 / 43%' }) !important } ${ appScheme == 'dark' ? // darkmode chatgpt.alert() styles `.chatgpt-modal > div, .chatgpt-modal button:not(.primary-modal-btn) { color: white !important } .primary-modal-btn { background: #00cfff !important ; color: black !important } .chatgpt-modal a { color: #00cfff !important }` : '' } .${modals.class} { display: grid ; place-items: center } /* for centered icon/logo */ [class*=modal-close-btn] { position: absolute !important ; float: right ; top: 14px !important ; right: 16px !important ; cursor: pointer ; width: 33px ; height: 33px ; border-radius: 20px } [class*=modal-close-btn] path {${ appScheme == 'dark' ? 'stroke: white ; fill: white' : 'stroke: #9f9f9f ; fill: #9f9f9f' }} ${ appScheme == 'dark' ? // invert dark mode hover paths '[class*=modal-close-btn]:hover path { stroke: black ; fill: black }' : '' } [class*=modal-close-btn]:hover { background-color: #f2f2f2 } /* hover underlay */ [class*=modal-close-btn] svg { margin: 11.5px } /* center SVG for hover underlay */ [class*=-modal] h2 { font-size: 26px ; line-height: 32px ; padding: 0 ; margin: 4px 0 -1px !important ; ${ env.browser.isMobile ? 'text-align: center' // center on mobile : 'justify-self: start' }} /* left-align on desktop */ [class*=-modal] p { justify-self: start ; font-size: 20px } [class*=-modal] button { font-size: 14px !important ; background: none } [class*=-modal-bg] { pointer-events: auto ; /* override any disabling from site modals */ position: fixed ; top: 0 ; left: 0 ; width: 100% ; height: 100% ; /* expand to full view-port */ display: flex ; justify-content: center ; align-items: center ; z-index: 9999 ; /* align */ transition: var(--bg-transition) ; /* dim */ -webkit-transition: var(--bg-transition) ; -moz-transition: var(--bg-transition) ; -o-transition: var(--bg-transition) ; -ms-transition: var(--bg-transition) } [class*=-modal-bg].animated > div { z-index: 13456 ; opacity: 0.98 ; transform: translateX(0) translateY(0) } [class$=-modal] { /* native modals + chatgpt.alert()s */ position: absolute ; /* to be click-draggable */ opacity: 0 ; /* to fade-in */ background-image: linear-gradient(180deg, ${ appScheme == 'dark' ? '#99a8a6 -200px, black 200px' : '#b6ebff -296px, white 171px' }) ; border: 1px solid ${ appScheme == 'dark' ? 'white' : '#b5b5b5' } !important ; color: ${ appScheme == 'dark' ? 'white' : 'black' }; transform: translateX(-3px) translateY(7px) ; /* offset to move-in from */ transition: var(--fg-transition) ; /* fade-in + move-in */ -webkit-transition: var(--fg-transition) ; -moz-transition: var(--fg-transition) ; -o-transition: var(--fg-transition) ; -ms-transition: var(--fg-transition) } ${ env.browser.isMobile ? '' : `[class$=-modal] button:hover { transform: var(--modal-btn-zoom) }`} ${ app.config.fgAnimationsDisabled ? '' : `[class$=-modal] button { ${ env.browser.isMobile ? '' : 'will-change: transform ;' } transition: var(--modal-btn-transition) ; -webkit-transition: var(--modal-btn-transition) ; -moz-transition: var(--modal-btn-transition) ; -o-transition: var(--modal-btn-transition) ; -ms-transition: var(--modal-btn-transition) }`}` ) }, update: { width: 489, available() { const updateAvailModal = modals.alert(`🚀 ${app.msgs.alert_updateAvail}!`, // title `${app.msgs.alert_newerVer} ${app.name} ` // msg + `(v${app.latestVer}) ${app.msgs.alert_isAvail}! ` + '<a target="_blank" rel="noopener" style="font-size: 0.93rem" href="' + `${app.urls.github}/commits/main/greasemonkey/${app.slug}.user.js` + `">${app.msgs.link_viewChanges}</a>`, function update() { // button modals.safeWinOpen(`${app.urls.update.gm}?t=${Date.now()}`) }, '', modals.update.width ) if (!env.browser.language.startsWith('en')) { // localize labels const updateBtns = updateAvailModal.querySelectorAll('button') updateBtns[1].textContent = app.msgs.btnLabel_update updateBtns[0].textContent = app.msgs.btnLabel_dismiss } return updateAvailModal }, unavailable() { return modals.alert(`${app.msgs.alert_upToDate}!`, // title `${app.name} (v${app.version}) ${app.msgs.alert_isUpToDate}!`, // msg '', '', modals.update.width ) } } } // Run MAIN routine menus.toolbar.register() // Init UI props env.ui = { app: { scheme: app.config.scheme || ui.getScheme() }, site: { scheme: ui.getScheme() }} if (!app.config.aiSafetyWarned) { modals.alert(`⚠️ ${app.msgs.alert_importantNotice}:`, `<b>${app.name}</b> ${app.msgs.alert_poweredByAI}:\n\n` + `• <b>${app.msgs.alert_aiCanMakeMistakes}</b> - ${app.msgs.alert_alwaysVerifyInfo}\n` + `• <b>${app.msgs.alert_doubleCheckDecisions}</b> - ${app.msgs.alert_dontRelySolelyOnAI}\n` + `• <b>${app.msgs.alert_notAsub}</b> - ${app.msgs.alert_forProMedOrLegalMatters}\n\n` + `${app.msgs.alert_useResponsibly}!`, null, null, 388 ) settings.save('aiSafetyWarned', true) } // Create/ID/classify/listenerize/stylize APP container app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in snippet' }) themes.apply(app.config.theme) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) update.appStyle() ;['rpg', 'rpw'].forEach(cssType => // rising particles document.head.append(dom.create.style(GM_getResourceText(`${cssType}CSS`)))) // APPEND to Brave app.parentDivSelector = env.browser.isMobile ? '#results' : '.sidebar' app.parentDiv = await new Promise(resolve => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) resolve(appDivParent) else new MutationObserver((_, obs) => { const appDivParent = document.querySelector(app.parentDivSelector) if (appDivParent) { obs.disconnect() ; resolve(appDivParent) } }).observe(document.body, { childList: true, subtree: true }) }) setTimeout(() => { app.parentDiv.prepend(app.div) ; ui.visibilizeOverflow() setTimeout(() => app.div.classList.add('active'), 100) // fade in }, env.scriptManager.name == 'Violentmonkey' ? 1000 : 0) // delay in VM to avoid mutation bug https://github.com/KudoAI/bravegpt/issues/123 // Init footer CTA to share feedback const braveClassList = 'feedback svelte-8js1iq' app.footerContent = dom.create.anchor('#', app.msgs.link_shareFeedback, { target: '_self', class: braveClassList }) app.footerContent.onclick = () => modals.open('feedback') // AUTO-GEN reply or show STANDBY mode app.msgChain = [] ; const searchQuery = new URL(location.href).searchParams.get('q') if (!app.config.autoGetDisabled || app.config.autoSummarize // Auto-Gen on || (app.config.prefixEnabled || app.config.suffixEnabled) // or Manual-Gen on && [app.config.prefixEnabled && location.href.includes('q=%2F'), // prefix required/present app.config.suffixEnabled // suffix required/present && /q=.*?(?:%3F|?|%EF%BC%9F)(?:&|$)/.test(location.href) ].filter(Boolean).length == (app.config.prefixEnabled + app.config.suffixEnabled) // validate both Manual-Gen modes ) { // auto-gen reply app.msgChain.push({ time: Date.now(), role: 'user', content: app.config.autoSummarize ? prompts.create('summarizeResults') : searchQuery }) get.reply({ msgs: app.msgChain, src: 'query' }) } else { // show Standby mode show.reply({ standby: true }) if (!app.config.rqDisabled) get.related(searchQuery) .then(queries => show.related(queries)) .catch(err => { log.error(err.message) ; api.tryNew({ caller: get.related }) }) } saveAppDiv() // to fight Brave Svelte mutations // Monitor SCHEME PREF changes to update app scheme if auto-scheme mode new MutationObserver(handleSchemePrefChange).observe( // class changes from Brave Search theme settings document.documentElement, { attributes: true, attributeFilter: ['class'] }) window.matchMedia('(prefers-color-scheme: dark)').addEventListener( // for browser/system scheme pref changes 'change', () => requestAnimationFrame(handleSchemePrefChange)) function handleSchemePrefChange() { if (app.config.scheme) return // since light/dark hard-set const displayedScheme = ui.getScheme() if (env.ui.app.scheme != displayedScheme) update.scheme(displayedScheme) } // Observe DOM for need to re-insert app div new MutationObserver((_, obs) => { if (!document.getElementById(app.slug)) { restoreAppDiv() ; obs.disconnect() } }).observe(document.body, { subtree: true, childList: true }) function saveAppDiv() { if (restoreAppDiv.restored) return ; saveAppDiv.html = app.div.innerHTML } function restoreAppDiv() { log.caller = 'restoreAppDiv()' log.debug(`Restoring ${app.name} from mutation...`) app.div = dom.create.elem('div', { id: app.slug, class: 'fade-in active snippet' }) ; ui.addListeners.appDiv() ;['anchored', 'expanded', 'sticky', 'wider'].forEach(mode => (app.config[mode] || app.config[`${mode}Sidebar`]) && app.div.classList.add(mode)) app.div.innerHTML = saveAppDiv.html if (app.div.querySelector(`.${app.slug}-header-btn`)) ui.addListeners.btns.appHeader() app.div.querySelectorAll(`.${app.slug}-standby-btn`).forEach((btn, idx) => btn.onclick = show.reply[`${['query', 'summarize'][idx]}BtnClickHandler`]) show.codeCornerBtns() if (app.div.querySelector(`.${app.slug}-chatbar-btn`)) ui.addListeners.replySection() document.querySelector(app.parentDivSelector).prepend(app.div) ; ui.visibilizeOverflow() restoreAppDiv.restored = true } })()." Retrieved from https://engagemii.com/aeo/brands/gm-bravegpt
Licensed under CC BY 4.0. You may reuse this data with attribution: a visible link to engagemii.com.
Powered by Engagemii - AI Brand Discovery and AEO Platform