Displays remaining queries / rate limits on grok.com (updated for remainingQueries)
// ==UserScript==
// @name Grok Quota Panel
// @namespace aspen138
// @version 2026.04.18.2112
// @description Displays remaining queries / rate limits on grok.com (updated for remainingQueries)
// @author aspen138
// @match https://grok.com/*
// @icon https://grok.com/images/favicon-light.png
// @run-at document-end
// @grant none
// @license MIT
// @icon data:image/svg;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8zMDRfMTExKSI+Cjxmb3JlaWduT2JqZWN0IHg9Ii0yNCIgeT0iLTIyIiB3aWR0aD0iNTYwIiBoZWlnaHQ9IjU2MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgc3R5bGU9ImJhY2tkcm9wLWZpbHRlcjpibHVyKDE2cHgpO2NsaXAtcGF0aDp1cmwoI2JnYmx1cl8xXzMwNF8xMTFfY2xpcF9wYXRoKTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlIj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZF8zMDRfMTExKSIgZGF0YS1maWdtYS1iZy1ibHVyLXJhZGl1cz0iMzIiPgo8cGF0aCBkPSJNMCAyNTZDMCAxNjYuMzkyIDAgMTIxLjU4NyAxNy40MzkgODcuMzYxNUMzMi43Nzg3IDU3LjI1NTYgNTcuMjU1NiAzMi43Nzg3IDg3LjM2MTUgMTcuNDM5QzEyMS41ODcgMCAxNjYuMzkyIDAgMjU2IDBDMzQ1LjYwOCAwIDM5MC40MTMgMCA0MjQuNjM4IDE3LjQzOUM0NTQuNzQ0IDMyLjc3ODcgNDc5LjIyMSA1Ny4yNTU2IDQ5NC41NjEgODcuMzYxNUM1MTIgMTIxLjU4NyA1MTIgMTY2LjM5MiA1MTIgMjU2QzUxMiAzNDUuNjA4IDUxMiAzOTAuNDEzIDQ5NC41NjEgNDI0LjYzOEM0NzkuMjIxIDQ1NC43NDQgNDU0Ljc0NCA0NzkuMjIxIDQyNC42MzggNDk0LjU2MUMzOTAuNDEzIDUxMiAzNDUuNjA4IDUxMiAyNTYgNTEyQzE2Ni4zOTIgNTEyIDEyMS41ODcgNTEyIDg3LjM2MTUgNDk0LjU2MUM1Ny4yNTU2IDQ3OS4yMjEgMzIuNzc4NyA0NTQuNzQ0IDE3LjQzOSA0MjQuNjM4QzAgMzkwLjQxMyAwIDM0NS42MDggMCAyNTZaIiBmaWxsPSIjMDUwNTA1Ii8+CjxwYXRoIGQ9Ik0yNTYgMi41QzMwMC44NDUgMi41IDMzNC4zMjkgMi41MDIyOCAzNjAuODg0IDQuNjcxODhDMzg3LjQxIDYuODM5MTEgNDA2LjgwMiAxMS4xNTYgNDIzLjUwNCAxOS42NjZDNDUzLjEzOSAzNC43NjYxIDQ3Ny4yMzQgNTguODYwNyA0OTIuMzM0IDg4LjQ5NjFDNTAwLjg0NCAxMDUuMTk4IDUwNS4xNjEgMTI0LjU5IDUwNy4zMjggMTUxLjExNkM1MDkuNDk4IDE3Ny42NzEgNTA5LjUgMjExLjE1NSA1MDkuNSAyNTZDNTA5LjUgMzAwLjg0NSA1MDkuNDk4IDMzNC4zMjkgNTA3LjMyOCAzNjAuODg0QzUwNS4xNjEgMzg3LjQxIDUwMC44NDQgNDA2LjgwMiA0OTIuMzM0IDQyMy41MDRDNDc3LjIzNCA0NTMuMTM5IDQ1My4xMzkgNDc3LjIzNCA0MjMuNTA0IDQ5Mi4zMzRDNDA2LjgwMiA1MDAuODQ0IDM4Ny40MSA1MDUuMTYxIDM2MC44ODQgNTA3LjMyOEMzMzQuMzI5IDUwOS40OTggMzAwLjg0NSA1MDkuNSAyNTYgNTA5LjVDMjExLjE1NSA1MDkuNSAxNzcuNjcxIDUwOS40OTggMTUxLjExNiA1MDcuMzI4QzEyNC41OSA1MDUuMTYxIDEwNS4xOTggNTAwLjg0NCA4OC40OTYxIDQ5Mi4zMzRDNTguODYwNyA0NzcuMjM0IDM0Ljc2NjEgNDUzLjEzOSAxOS42NjYgNDIzLjUwNEMxMS4xNTYgNDA2LjgwMiA2LjgzOTExIDM4Ny40MSA0LjY3MTg4IDM2MC44ODRDMi41MDIyOCAzMzQuMzI5IDIuNSAzMDAuODQ1IDIuNSAyNTZDMi41IDIxMS4xNTUgMi41MDIyOCAxNzcuNjcxIDQuNjcxODggMTUxLjExNkM2LjgzOTExIDEyNC41OSAxMS4xNTYgMTA1LjE5OCAxOS42NjYgODguNDk2MUMzNC43NjYxIDU4Ljg2MDcgNTguODYwNyAzNC43NjYxIDg4LjQ5NjEgMTkuNjY2QzEwNS4xOTggMTEuMTU2IDEyNC41OSA2LjgzOTExIDE1MS4xMTYgNC42NzE4OEMxNzcuNjcxIDIuNTAyMjggMjExLjE1NSAyLjUgMjU2IDIuNVoiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS1vcGFjaXR5PSIwLjA1IiBzdHJva2Utd2lkdGg9IjUiLz4KPC9nPgo8L2c+CjxtYXNrIGlkPSJwYXRoLTMtaW5zaWRlLTFfMzA0XzExMSIgZmlsbD0id2hpdGUiPgo8cGF0aCBkPSJNMjEwLjQ4NCAzMTIuNzU5TDM0My40NjUgMjEwLjM4M0MzNDkuOTg0IDIwNS4zNjQgMzU5LjMwMiAyMDcuMzIyIDM2Mi40MDggMjE1LjExN0MzNzguNzU4IDI1Ni4yMzEgMzcxLjQ1NCAzMDUuNjQgMzM4LjkyNSAzMzkuNTYzQzMwNi4zOTcgMzczLjQ4NyAyNjEuMTM3IDM4MC45MjcgMjE5Ljc2OCAzNjMuOTgzTDE3NC41NzcgMzg1LjgwM0MyMzkuMzk0IDQzMi4wMDggMzE4LjEwNCA0MjAuNTgxIDM2Ny4yODkgMzY5LjI1MUM0MDYuMzAzIDMyOC41NjQgNDE4LjM4NiAyNzMuMTA0IDQwNy4wODggMjIzLjA5MUw0MDcuMTkgMjIzLjE5OEMzOTAuODA3IDE0OS43MjYgNDExLjIxOCAxMjAuMzU5IDQ1My4wMyA2MC4zMDcyQzQ1NC4wMiA1OC44ODMzIDQ1NS4wMSA1Ny40NTk1IDQ1NiA1Nkw0MDAuOTc4IDExMy4zODJWMTEzLjIwNEwyMTAuNDUgMzEyLjc5NCIvPgo8cGF0aCBkPSJNMTgzLjA0MiAzMzcuNjQxQzEzNi41MTkgMjkxLjI5NCAxNDQuNTQgMjE5LjU2NyAxODQuMjM2IDE3OC4yMDNDMjEzLjU5IDE0Ny41OSAyNjEuNjgzIDEzNS4wOTYgMzAzLjY2NiAxNTMuNDY0TDM0OC43NTUgMTMxLjc1QzM0MC42MzIgMTI1LjYyNyAzMzAuMjIxIDExOS4wNDIgMzE4LjI3NSAxMTQuNDE0QzI2NC4yNzcgOTEuMjQwNyAxOTkuNjMgMTAyLjc3NCAxNTUuNzM1IDE0OC41MTZDMTEzLjUxMyAxOTIuNTQ5IDEwMC4yMzYgMjYwLjI1NCAxMjMuMDM2IDMxOC4wMjdDMTQwLjA2OSAzNjEuMjA2IDExMi4xNDggMzkxLjc0OCA4NC4wMjI5IDQyMi41NzVDNzQuMDU2MSA0MzMuNTAzIDY0LjA1NTMgNDQ0LjQzMSA1NiA0NTZMMTgzLjAwNyAzMzcuNjc3Ii8+CjwvbWFzaz4KPHBhdGggZD0iTTIxMC40ODQgMzEyLjc1OUwzNDMuNDY1IDIxMC4zODNDMzQ5Ljk4NCAyMDUuMzY0IDM1OS4zMDIgMjA3LjMyMiAzNjIuNDA4IDIxNS4xMTdDMzc4Ljc1OCAyNTYuMjMxIDM3MS40NTQgMzA1LjY0IDMzOC45MjUgMzM5LjU2M0MzMDYuMzk3IDM3My40ODcgMjYxLjEzNyAzODAuOTI3IDIxOS43NjggMzYzLjk4M0wxNzQuNTc3IDM4NS44MDNDMjM5LjM5NCA0MzIuMDA4IDMxOC4xMDQgNDIwLjU4MSAzNjcuMjg5IDM2OS4yNTFDNDA2LjMwMyAzMjguNTY0IDQxOC4zODYgMjczLjEwNCA0MDcuMDg4IDIyMy4wOTFMNDA3LjE5IDIyMy4xOThDMzkwLjgwNyAxNDkuNzI2IDQxMS4yMTggMTIwLjM1OSA0NTMuMDMgNjAuMzA3MkM0NTQuMDIgNTguODgzMyA0NTUuMDEgNTcuNDU5NSA0NTYgNTZMNDAwLjk3OCAxMTMuMzgyVjExMy4yMDRMMjEwLjQ1IDMxMi43OTQiIGZpbGw9IiNGQ0ZDRkMiLz4KPHBhdGggZD0iTTE4My4wNDIgMzM3LjY0MUMxMzYuNTE5IDI5MS4yOTQgMTQ0LjU0IDIxOS41NjcgMTg0LjIzNiAxNzguMjAzQzIxMy41OSAxNDcuNTkgMjYxLjY4MyAxMzUuMDk2IDMwMy42NjYgMTUzLjQ2NEwzNDguNzU1IDEzMS43NUMzNDAuNjMyIDEyNS42MjcgMzMwLjIyMSAxMTkuMDQyIDMxOC4yNzUgMTE0LjQxNEMyNjQuMjc3IDkxLjI0MDcgMTk5LjYzIDEwMi43NzQgMTU1LjczNSAxNDguNTE2QzExMy41MTMgMTkyLjU0OSAxMDAuMjM2IDI2MC4yNTQgMTIzLjAzNiAzMTguMDI3QzE0MC4wNjkgMzYxLjIwNiAxMTIuMTQ4IDM5MS43NDggODQuMDIyOSA0MjIuNTc1Qzc0LjA1NjEgNDMzLjUwMyA2NC4wNTUzIDQ0NC40MzEgNTYgNDU2TDE4My4wMDcgMzM3LjY3NyIgZmlsbD0iI0ZDRkNGQyIvPgo8cGF0aCBkPSJNMzQzLjQ2NSAyMTAuMzgzTDM0NC4zOCAyMTEuNTcxTDM0NC4zOCAyMTEuNTcxTDM0My40NjUgMjEwLjM4M1pNMzYyLjQwOCAyMTUuMTE3TDM2My44MDIgMjE0LjU2M0wzNjMuODAyIDIxNC41NjJMMzYyLjQwOCAyMTUuMTE3Wk0yMTkuNzY4IDM2My45ODNMMjIwLjMzNyAzNjIuNTk0TDIxOS43MTggMzYyLjM0MUwyMTkuMTE2IDM2Mi42MzJMMjE5Ljc2OCAzNjMuOTgzWk0xNzQuNTc3IDM4NS44MDNMMTczLjkyNCAzODQuNDUzTDE3MS42NDMgMzg1LjU1NEwxNzMuNzA2IDM4Ny4wMjVMMTc0LjU3NyAzODUuODAzWk0zNjcuMjg5IDM2OS4yNTFMMzY2LjIwNyAzNjguMjEzTDM2Ni4yMDYgMzY4LjIxM0wzNjcuMjg5IDM2OS4yNTFaTTQwNy4wODggMjIzLjA5MUw0MDguMTcxIDIyMi4wNTNMNDA0LjQzNiAyMTguMTU3TDQwNS42MjUgMjIzLjQyMUw0MDcuMDg4IDIyMy4wOTFaTTQwNy4xOSAyMjMuMTk4TDQwNi4xMDggMjI0LjIzNkw0MDkuODIzIDIyOC4xMTFMNDA4LjY1NCAyMjIuODcxTDQwNy4xOSAyMjMuMTk4Wk00NTMuMDMgNjAuMzA3Mkw0NTQuMjYyIDYxLjE2NDNMNDU0LjI2MiA2MS4xNjM0TDQ1My4wMyA2MC4zMDcyWk00NTYgNTZMNDU3LjI0MSA1Ni44NDJMNDU0LjkxNyA1NC45NjE4TDQ1NiA1NlpNNDAwLjk3OCAxMTMuMzgySDM5OS40NzhWMTE3LjExM0w0MDIuMDYxIDExNC40Mkw0MDAuOTc4IDExMy4zODJaTTQwMC45NzggMTEzLjIwNEg0MDIuNDc4VjEwOS40NkwzOTkuODkzIDExMi4xNjhMNDAwLjk3OCAxMTMuMjA0Wk0xODQuMjM2IDE3OC4yMDNMMTg1LjMxOCAxNzkuMjQyTDE4NS4zMTkgMTc5LjI0MkwxODQuMjM2IDE3OC4yMDNaTTMwMy42NjYgMTUzLjQ2NEwzMDMuMDY1IDE1NC44MzhMMzAzLjY5NiAxNTUuMTE0TDMwNC4zMTcgMTU0LjgxNUwzMDMuNjY2IDE1My40NjRaTTM0OC43NTUgMTMxLjc1TDM0OS40MDYgMTMzLjEwMUwzNTEuNjI0IDEzMi4wMzNMMzQ5LjY1OCAxMzAuNTUyTDM0OC43NTUgMTMxLjc1Wk0zMTguMjc1IDExNC40MTRMMzE3LjY4MyAxMTUuNzkzTDMxNy43MDggMTE1LjgwM0wzMTcuNzMzIDExNS44MTNMMzE4LjI3NSAxMTQuNDE0Wk0xNTUuNzM1IDE0OC41MTZMMTU0LjY1MyAxNDcuNDc3TDE1NC42NTMgMTQ3LjQ3OEwxNTUuNzM1IDE0OC41MTZaTTEyMy4wMzYgMzE4LjAyN0wxMjQuNDMyIDMxNy40NzdMMTI0LjQzMiAzMTcuNDc3TDEyMy4wMzYgMzE4LjAyN1pNODQuMDIyOSA0MjIuNTc1TDgyLjkxNDggNDIxLjU2NEw4Mi45MTQ2IDQyMS41NjRMODQuMDIyOSA0MjIuNTc1Wk01NiA0NTZMNTQuNzY5IDQ1NS4xNDNMNTcuMDIyNSA0NTcuMDk4TDU2IDQ1NlpNMjEwLjQ4NCAzMTIuNzU5TDIxMS4zOTkgMzEzLjk0OEwzNDQuMzggMjExLjU3MUwzNDMuNDY1IDIxMC4zODNMMzQyLjU1IDIwOS4xOTRMMjA5LjU2OSAzMTEuNTdMMjEwLjQ4NCAzMTIuNzU5Wk0zNDMuNDY1IDIxMC4zODNMMzQ0LjM4IDIxMS41NzFDMzUwLjIwNCAyMDcuMDg3IDM1OC4zMiAyMDguOTA5IDM2MS4wMTUgMjE1LjY3MkwzNjIuNDA4IDIxNS4xMTdMMzYzLjgwMiAyMTQuNTYyQzM2MC4yODUgMjA1LjczNCAzNDkuNzY0IDIwMy42NCAzNDIuNTUgMjA5LjE5NEwzNDMuNDY1IDIxMC4zODNaTTM2Mi40MDggMjE1LjExN0wzNjEuMDE1IDIxNS42NzFDMzc3LjE2MyAyNTYuMjc5IDM2OS45MzYgMzA1LjA1NSAzMzcuODQyIDMzOC41MjVMMzM4LjkyNSAzMzkuNTYzTDM0MC4wMDggMzQwLjYwMUMzNzIuOTcyIDMwNi4yMjQgMzgwLjM1MyAyNTYuMTgzIDM2My44MDIgMjE0LjU2M0wzNjIuNDA4IDIxNS4xMTdaTTMzOC45MjUgMzM5LjU2M0wzMzcuODQyIDMzOC41MjVDMzA1Ljc2OSAzNzEuOTc0IDI2MS4xNzUgMzc5LjMyMSAyMjAuMzM3IDM2Mi41OTRMMjE5Ljc2OCAzNjMuOTgzTDIxOS4yIDM2NS4zNzFDMjYxLjA5OSAzODIuNTMyIDMwNy4wMjQgMzc1IDM0MC4wMDggMzQwLjYwMUwzMzguOTI1IDMzOS41NjNaTTIxOS43NjggMzYzLjk4M0wyMTkuMTE2IDM2Mi42MzJMMTczLjkyNCAzODQuNDUzTDE3NC41NzcgMzg1LjgwM0wxNzUuMjI5IDM4Ny4xNTRMMjIwLjQyIDM2NS4zMzNMMjE5Ljc2OCAzNjMuOTgzWk0xNzQuNTc3IDM4NS44MDNMMTczLjcwNiAzODcuMDI1QzIzOS4xNSA0MzMuNjc1IDMxOC42ODkgNDIyLjE0IDM2OC4zNzIgMzcwLjI4OUwzNjcuMjg5IDM2OS4yNTFMMzY2LjIwNiAzNjguMjEzQzMxNy41MiA0MTkuMDIzIDIzOS42MzkgNDMwLjM0IDE3NS40NDcgMzg0LjU4MkwxNzQuNTc3IDM4NS44MDNaTTM2Ny4yODkgMzY5LjI1MUwzNjguMzcyIDM3MC4yODlDNDA3Ljc2NCAzMjkuMjA4IDQxOS45NSAyNzMuMjIxIDQwOC41NTEgMjIyLjc2TDQwNy4wODggMjIzLjA5MUw0MDUuNjI1IDIyMy40MjFDNDE2LjgyMiAyNzIuOTg3IDQwNC44NDIgMzI3LjkyIDM2Ni4yMDcgMzY4LjIxM0wzNjcuMjg5IDM2OS4yNTFaTTQwNy4wODggMjIzLjA5MUw0MDYuMDA1IDIyNC4xMjlMNDA2LjEwOCAyMjQuMjM2TDQwNy4xOSAyMjMuMTk4TDQwOC4yNzMgMjIyLjE2TDQwOC4xNzEgMjIyLjA1M0w0MDcuMDg4IDIyMy4wOTFaTTQwNy4xOSAyMjMuMTk4TDQwOC42NTQgMjIyLjg3MUM0MDAuNTA1IDE4Ni4zMjUgNDAxLjUzOCAxNjAuOTEgNDA5LjcwNSAxMzcuMjA5QzQxNy45MDUgMTEzLjQxNCA0MzMuMzE5IDkxLjI0MjEgNDU0LjI2MiA2MS4xNjQzTDQ1My4wMyA2MC4zMDcyTDQ1MS43OTkgNTkuNDUwMUM0MzAuOTI5IDg5LjQyMzkgNDE1LjIzMiAxMTEuOTYxIDQwNi44NjkgMTM2LjIzMUMzOTguNDczIDE2MC41OTQgMzk3LjQ5MiAxODYuNTk5IDQwNS43MjYgMjIzLjUyNEw0MDcuMTkgMjIzLjE5OFpNNDUzLjAzIDYwLjMwNzJMNDU0LjI2MiA2MS4xNjM0QzQ1NS4yNTEgNTkuNzQwNiA0NTYuMjQ2IDU4LjMwOTcgNDU3LjI0MSA1Ni44NDJMNDU2IDU2TDQ1NC43NTkgNTUuMTU4QzQ1My43NzQgNTYuNjA5MiA0NTIuNzg5IDU4LjAyNjEgNDUxLjc5OSA1OS40NTFMNDUzLjAzIDYwLjMwNzJaTTQ1NiA1Nkw0NTQuOTE3IDU0Ljk2MThMMzk5Ljg5NiAxMTIuMzQ0TDQwMC45NzggMTEzLjM4Mkw0MDIuMDYxIDExNC40Mkw0NTcuMDgzIDU3LjAzODJMNDU2IDU2Wk00MDAuOTc4IDExMy4zODJINDAyLjQ3OFYxMTMuMjA0SDQwMC45NzhIMzk5LjQ3OFYxMTMuMzgySDQwMC45NzhaTTE4My4wNDIgMzM3LjY0MUwxODQuMSAzMzYuNTc4QzEzOC4yNTUgMjkwLjkwNyAxNDYuMDg3IDIyMC4xMjEgMTg1LjMxOCAxNzkuMjQyTDE4NC4yMzYgMTc4LjIwM0wxODMuMTU0IDE3Ny4xNjVDMTQyLjk5MyAyMTkuMDEyIDEzNC43ODIgMjkxLjY4MSAxODEuOTgzIDMzOC43MDRMMTgzLjA0MiAzMzcuNjQxWk0xODQuMjM2IDE3OC4yMDNMMTg1LjMxOSAxNzkuMjQyQzIxNC4yNzUgMTQ5LjA0NCAyNjEuNzA2IDEzNi43NDMgMzAzLjA2NSAxNTQuODM4TDMwMy42NjYgMTUzLjQ2NEwzMDQuMjY3IDE1Mi4wOUMyNjEuNjYgMTMzLjQ0OSAyMTIuOTA2IDE0Ni4xMzcgMTgzLjE1NCAxNzcuMTY1TDE4NC4yMzYgMTc4LjIwM1pNMzAzLjY2NiAxNTMuNDY0TDMwNC4zMTcgMTU0LjgxNUwzNDkuNDA2IDEzMy4xMDFMMzQ4Ljc1NSAxMzEuNzVMMzQ4LjEwNSAxMzAuMzk4TDMwMy4wMTUgMTUyLjExMkwzMDMuNjY2IDE1My40NjRaTTM0OC43NTUgMTMxLjc1TDM0OS42NTggMTMwLjU1MkMzNDEuNDYyIDEyNC4zNzQgMzMwLjkzIDExNy43MDggMzE4LjgxNyAxMTMuMDE1TDMxOC4yNzUgMTE0LjQxNEwzMTcuNzMzIDExNS44MTNDMzI5LjUxMyAxMjAuMzc2IDMzOS44MDIgMTI2Ljg4IDM0Ny44NTMgMTMyLjk0OEwzNDguNzU1IDEzMS43NVpNMzE4LjI3NSAxMTQuNDE0TDMxOC44NjcgMTEzLjAzNkMyNjQuMjk5IDg5LjYxNzggMTk4Ljk4NCAxMDEuMjgxIDE1NC42NTMgMTQ3LjQ3N0wxNTUuNzM1IDE0OC41MTZMMTU2LjgxOCAxNDkuNTU0QzIwMC4yNzYgMTA0LjI2NyAyNjQuMjU1IDkyLjg2MzYgMzE3LjY4MyAxMTUuNzkzTDMxOC4yNzUgMTE0LjQxNFpNMTU1LjczNSAxNDguNTE2TDE1NC42NTMgMTQ3LjQ3OEMxMTIuMDIgMTkxLjkzOSA5OC42Mjc5IDI2MC4yNjUgMTIxLjY0MSAzMTguNTc4TDEyMy4wMzYgMzE4LjAyN0wxMjQuNDMyIDMxNy40NzdDMTAxLjg0NCAyNjAuMjQyIDExNS4wMDYgMTkzLjE1OSAxNTYuODE4IDE0OS41NTRMMTU1LjczNSAxNDguNTE2Wk0xMjMuMDM2IDMxOC4wMjdMMTIxLjY0MSAzMTguNTc4QzEyOS45OCAzMzkuNzE3IDEyNy4zMjYgMzU3LjcwNCAxMTkuMTIgMzc0LjI2N0MxMTAuODY1IDM5MC45MjggOTcuMDEzNCA0MDYuMTExIDgyLjkxNDggNDIxLjU2NEw4NC4wMjI5IDQyMi41NzVMODUuMTMxIDQyMy41ODZDOTkuMTU3NiA0MDguMjEyIDExMy4zMjkgMzkyLjcxMSAxMjEuODA4IDM3NS41OTlDMTMwLjMzNSAzNTguMzg5IDEzMy4xMjUgMzM5LjUxNiAxMjQuNDMyIDMxNy40NzdMMTIzLjAzNiAzMTguMDI3Wk04NC4wMjI5IDQyMi41NzVMODIuOTE0NiA0MjEuNTY0QzcyLjk2MzMgNDMyLjQ3NSA2Mi44OTExIDQ0My40NzggNTQuNzY5IDQ1NS4xNDNMNTYgNDU2TDU3LjIzMSA0NTYuODU3QzY1LjIxOTUgNDQ1LjM4NCA3NS4xNDkgNDM0LjUzMSA4NS4xMzEyIDQyMy41ODZMODQuMDIyOSA0MjIuNTc1Wk01NiA0NTZMNTcuMDIyNSA0NTcuMDk4TDE4NC4wMyAzMzguNzc0TDE4My4wMDcgMzM3LjY3N0wxODEuOTg1IDMzNi41NzlMNTQuOTc3NSA0NTQuOTAyTDU2IDQ1NlpNNDAwLjk3OCAxMTMuMjA0TDM5OS44OTMgMTEyLjE2OEwyMDkuMzY1IDMxMS43NTlMMjEwLjQ1IDMxMi43OTRMMjExLjUzNSAzMTMuODNMNDAyLjA2MyAxMTQuMjRMNDAwLjk3OCAxMTMuMjA0WiIgZmlsbD0iI0ZDRkNGQyIgbWFzaz0idXJsKCNwYXRoLTMtaW5zaWRlLTFfMzA0XzExMSkiLz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF8zMDRfMTExIiB4PSItMjQiIHk9Ii0yMiIgd2lkdGg9IjU2MCIgaGVpZ2h0PSI1NjAiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+CjxmZU9mZnNldCBkeT0iMiIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIxMiIvPgo8ZmVDb21wb3NpdGUgaW4yPSJoYXJkQWxwaGEiIG9wZXJhdG9yPSJvdXQiLz4KPGZlQ29sb3JNYXRyaXggdHlwZT0ibWF0cml4IiB2YWx1ZXM9IjAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAuMTYgMCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9ImVmZmVjdDFfZHJvcFNoYWRvd18zMDRfMTExIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93XzMwNF8xMTEiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxjbGlwUGF0aCBpZD0iYmdibHVyXzFfMzA0XzExMV9jbGlwX3BhdGgiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI0IDIyKSI+PHBhdGggZD0iTTAgMjU2QzAgMTY2LjM5MiAwIDEyMS41ODcgMTcuNDM5IDg3LjM2MTVDMzIuNzc4NyA1Ny4yNTU2IDU3LjI1NTYgMzIuNzc4NyA4Ny4zNjE1IDE3LjQzOUMxMjEuNTg3IDAgMTY2LjM5MiAwIDI1NiAwQzM0NS42MDggMCAzOTAuNDEzIDAgNDI0LjYzOCAxNy40MzlDNDU0Ljc0NCAzMi43Nzg3IDQ3OS4yMjEgNTcuMjU1NiA0OTQuNTYxIDg3LjM2MTVDNTEyIDEyMS41ODcgNTEyIDE2Ni4zOTIgNTEyIDI1NkM1MTIgMzQ1LjYwOCA1MTIgMzkwLjQxMyA0OTQuNTYxIDQyNC42MzhDNDc5LjIyMSA0NTQuNzQ0IDQ1NC43NDQgNDc5LjIyMSA0MjQuNjM4IDQ5NC41NjFDMzkwLjQxMyA1MTIgMzQ1LjYwOCA1MTIgMjU2IDUxMkMxNjYuMzkyIDUxMiAxMjEuNTg3IDUxMiA4Ny4zNjE1IDQ5NC41NjFDNTcuMjU1NiA0NzkuMjIxIDMyLjc3ODcgNDU0Ljc0NCAxNy40MzkgNDI0LjYzOEMwIDM5MC40MTMgMCAzNDUuNjA4IDAgMjU2WiIvPgo8L2NsaXBQYXRoPjxjbGlwUGF0aCBpZD0iY2xpcDBfMzA0XzExMSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=
// ==/UserScript==
// backup
// @icon https://grok.com/images/favicon.svg
// @icon https://grok.com/images/android-chrome-512x512.png
(function () {
'use strict';
const MODELS = [
{ modelName: 'grok-4-heavy', requestKind: 'DEFAULT' },
{ modelName: 'grok-4-thinking', requestKind: 'DEFAULT' },
{ modelName: 'grok-4', requestKind: 'DEFAULT' },
{ modelName: 'grok-3', requestKind: 'DEFAULT' },
{ modelName: 'grok-2', requestKind: 'DEFAULT' }
];
const CONFIG = {
API: {
endpoint: 'https://grok.com/rest/rate-limits',
headers: {
'Content-Type': 'application/json',
'Accept': '*/*',
'Origin': 'https://grok.com',
'Referer': 'https://grok.com/',
'Accept-Language': 'en-US,en;q=0.9'
}
},
UI: {
styles: `
.grok-rate-limit-wrapper {
position: fixed;
bottom: 1rem;
right: 1rem;
z-index: 10000;
background: rgba(0, 0, 0, 0.78);
border-radius: 8px;
color: #ddd;
font-family: system-ui, -apple-system, sans-serif;
font-size: 0.77rem;
line-height: 1.4;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.35);
max-width: 340px;
padding: 0.6rem 0.7rem;
text-align: left;
}
.grok-rate-limit-wrapper .header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 0.3rem;
font-weight: 600;
color: #fff;
}
.grok-rate-limit-wrapper button {
background: #374151;
color: #ddd;
border: none;
padding: 0.2rem 0.5rem;
border-radius: 4px;
cursor: pointer;
font-size: 0.75rem;
}
.grok-rate-limit-wrapper button:hover { background: #4b5563; }
.grok-rate-limit {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.grok-rate-limit b { color: #22c55e; }
`,
refreshInterval: 8000
},
TIME: {
SECONDS_PER_HOUR: 3600,
SECONDS_PER_DAY: 86400
}
};
let currentIndex = 0;
let cachedResults = new Map(); // modelName -> data
const utils = {
generateId: () => Math.random().toString(16).slice(2),
formatTimeWindow: (seconds) => {
if (!seconds) return { value: '?', unit: 'h' };
const hours = seconds / CONFIG.TIME.SECONDS_PER_HOUR;
if (hours >= 24) return { value: (seconds / CONFIG.TIME.SECONDS_PER_DAY).toFixed(1), unit: 'd' };
return { value: hours.toFixed(1), unit: 'h' };
}
};
const ui = {
createStyles: () => {
const style = document.createElement('style');
style.textContent = CONFIG.UI.styles;
document.head.appendChild(style);
},
createMenu: () => {
const wrapper = document.createElement('div');
wrapper.className = 'grok-rate-limit-wrapper';
wrapper.innerHTML = `
<div class="header">
<span id="current_model">Loading...</span>
<div>
<button id="btn_prev">← Prev</button>
<button id="btn_next">Next →</button>
</div>
</div>
<div id="rate_queries" class="grok-rate-limit">Queries: N/A</div>
<div id="rate_params" class="grok-rate-limit">Model: ... | Kind: ...</div>
<div id="rate_low" class="grok-rate-limit">Low Effort: null</div>
<div id="rate_high" class="grok-rate-limit">High Effort: null</div>
`;
document.body.appendChild(wrapper);
// Button listeners
document.getElementById('btn_prev').addEventListener('click', () => {
currentIndex = (currentIndex - 1 + MODELS.length) % MODELS.length;
renderCurrent();
});
document.getElementById('btn_next').addEventListener('click', () => {
currentIndex = (currentIndex + 1) % MODELS.length;
renderCurrent();
});
},
updateDisplay: (model, data) => {
document.getElementById('current_model').textContent = model.modelName;
const queriesElem = document.getElementById('rate_queries');
const paramsElem = document.getElementById('rate_params');
const lowElem = document.getElementById('rate_low');
const highElem = document.getElementById('rate_high');
// Queries
if (data && typeof data.remainingQueries === 'number') {
const { value, unit } = utils.formatTimeWindow(data.windowSizeSeconds);
const color = data.remainingQueries > 3 ? '#22c55e' : data.remainingQueries > 0 ? '#eab308' : '#ef4444';
queriesElem.innerHTML = `Queries: <b style="color:${color}">${data.remainingQueries}</b>/${data.totalQueries || '?'} (${value}${unit})`;
} else {
queriesElem.textContent = 'Queries: N/A (no queries field)';
}
// Parameters
paramsElem.textContent = `Model: ${model.modelName} | Kind: ${model.requestKind}`;
// Low / High Effort
lowElem.textContent = `Low Effort: ${data?.lowEffortRateLimits ? JSON.stringify(data.lowEffortRateLimits) : 'null'}`;
highElem.textContent = `High Effort: ${data?.highEffortRateLimits ? JSON.stringify(data.highEffortRateLimits) : 'null'}`;
}
};
const api = {
async fetchForModel(model) {
const cacheKey = model.modelName;
if (cachedResults.has(cacheKey)) {
return cachedResults.get(cacheKey);
}
try {
const headers = {
...CONFIG.API.headers,
'User-Agent': navigator.userAgent,
'X-Xai-Request-Id': utils.generateId()
};
const response = await fetch(CONFIG.API.endpoint, {
method: 'POST',
headers,
body: JSON.stringify({
modelName: model.modelName,
requestKind: model.requestKind
})
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const json = await response.json();
cachedResults.set(cacheKey, json);
return json;
} catch (error) {
console.warn(`Failed to fetch for ${model.modelName}`, error);
const errorData = { error: true };
cachedResults.set(cacheKey, errorData);
return errorData;
}
}
};
const renderCurrent = async () => {
const model = MODELS[currentIndex];
const data = await api.fetchForModel(model);
ui.updateDisplay(model, data);
};
const init = () => {
ui.createStyles();
ui.createMenu();
renderCurrent(); // initial load
setInterval(renderCurrent, CONFIG.UI.refreshInterval);
};
if (document.readyState === 'complete' || document.readyState === 'interactive') {
init();
} else {
document.addEventListener('DOMContentLoaded', init);
}
})();