Skip to content

Instantly share code, notes, and snippets.

@awsr
Last active December 30, 2023 01:00
Show Gist options
  • Save awsr/24a3cec8d34aca2c5cadf6e60fef9e37 to your computer and use it in GitHub Desktop.
Save awsr/24a3cec8d34aca2c5cadf6e60fef9e37 to your computer and use it in GitHub Desktop.
Restore Twitter branding. (Works best with the Old Twitter Layout extension)
// ==UserScript==
// @name ReTwitterize
// @version 2.1.0
// @namespace https://gist.github.com/awsr
// @description Because Elon Musk is an idiot
// @author awsr
// @match https://twitter.com/*
// @match https://x.com/*
// @downloadURL https://gist.github.com/awsr/24a3cec8d34aca2c5cadf6e60fef9e37/raw/retwitterize.user.js
// @icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAByUlEQVQ4T2NkoBAwUqifAW7Au3fv+IWEhD6iGwgSn3/jY+KnXz8EFfg57icaKi4AiYHUgdTDDfBfdXpjgKrIepACZEMMZh65cOE3hz4DEwsDw++fDA78vw88+PxLscZWpSnFQG4e3AD77Y9PHbz1zDRBnn1Bn51cAcj080/eGxge+HKegYMbYebXjwwCXFxfDjpy+euL8O6DG7Dg7te6hPM/Gxk+vGLgf/fwfaCa+EY+Pvavk96JZ6N7a505d2WgDNsURkbGLwgXrLl+9CCDuBVY8d8/DAyf30FoYSmMcP4fLCgK1PwGJAE34MKrb2EOR7/P/fCXkQdfzBjyM98578qvClMDN+D///88dZe/TZ5890cIPkPm6LM2pajy1mMYABLY//RDeOGVPy0XPjOpYHMFyPZzLny2QOe/wGoA0BX8Z9/88m659Stjw/PftsiGgDQfcuBL4WVlPIgsDvYCKGEUHXo0Yf31p/4fmTgEGcTkGBh4heHq4uXZt08x4OrkYWE4ArT9L4YBQJuZgYKqF97+tVj34qcjTIE8J8sLZzGGcwo8bBeBYrfRNaPEAogDCkgghbCageEnkP8eqBFEYwXUy0z44h6fHAAkJ6sRJxhsYgAAAABJRU5ErkJggg==
// @grant window.onurlchange
// @run-at document-body
// ==/UserScript==
(function () {
'use strict';
const logoWatchConfig = { childList: true, subtree: true, attributes: true, attributeFilter: ["style", "fill", "d"] };
const linkWatchConfig = { attributes: true, attributeFilter: ["href"] };
const getManifest = () => document.head.querySelector('link[rel="manifest"]');
const getSearch = () => document.head.querySelector('link[rel="search"]');
const logoWatcher = new MutationObserver(modifyPageLogo);
const linkWatcher = new MutationObserver(modifyLinks);
const manifestWatcher = new MutationObserver(modifyManifest);
const searchWatcher = new MutationObserver(modifyOpenSearch);
const elementSet = new Set();
const processedLinks = new Set();
let loaderLoop = -1;
let manifestError = false;
const RunFlags = () => {
return {
link: true,
manifest: true,
search: true,
logo: true
}
}
// ========================================
// DEFINITIONS
// ========================================
const manifestData = "data:application/manifest+json," + encodeURIComponent(`{"background_color":"#ffffff","categories":["social","news","magazines"],"description":"Get breaking news, politics, trending music, world events, sports scores, and the latest global news stories as they unfold - all with less data.","display":"standalone","gcm_sender_id":"49625052041","gcm_user_visible_only":true,"icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-default.ee534d8a.png","sizes":"192x192","type":"image/png"},{"src":"https://abs.twimg.com/responsive-web/client-web/icon-default-large.8e027b6a.png","sizes":"512x512","type":"image/png"},{"purpose":"maskable","src":"https://abs.twimg.com/responsive-web/client-web/icon-default-maskable.2fd29c8a.png","sizes":"192x192","type":"image/png"},{"purpose":"maskable","src":"https://abs.twimg.com/responsive-web/client-web/icon-default-maskable-large.ee2b7aaa.png","sizes":"512x512","type":"image/png"}],"name":"Twitter","screenshots":[{"src":"https://abs.twimg.com/responsive-web/client-web/twitter-lite-data-saver-marketing.6805986a.png","sizes":"586x1041","type":"image/png"},{"src":"https://abs.twimg.com/responsive-web/client-web/twitter-lite-explore-marketing.fd45b02a.png","sizes":"586x1041","type":"image/png"},{"src":"https://abs.twimg.com/responsive-web/client-web/twitter-lite-timeline-marketing.befcdb4a.png","sizes":"586x1041","type":"image/png"}],"share_target":{"action":"https://twitter.com/compose/tweet","enctype":"multipart/form-data","method":"POST","params":{"title":"title","text":"text","url":"url","files":[{"name":"externalMedia","accept":["image/jpeg","image/png","image/gif","video/quicktime","video/mp4"]}]}},"shortcuts":[{"name":"New Tweet","url":"https://twitter.com/compose/tweet?utm_source=jumplist&utm_medium=shortcut","icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-compose.1238442a.png","type":"image/png","sizes":"192x192"}]},{"name":"Explore","url":"https://twitter.com/explore?utm_source=jumplist&utm_medium=shortcut","icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-search-stroke.5f9aa88a.png","type":"image/png","sizes":"192x192"}]},{"name":"Notifications","url":"https://twitter.com/notifications?utm_source=jumplist&utm_medium=shortcut","icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-notifications-stroke.429602da.png","type":"image/png","sizes":"192x192"}]},{"name":"Direct Messages","url":"https://twitter.com/messages?utm_source=jumplist&utm_medium=shortcut","icons":[{"src":"https://abs.twimg.com/responsive-web/client-web/icon-messages-stroke.5f95edca.png","type":"image/png","sizes":"192x192"}]}],"short_name":"Twitter","start_url":"https://twitter.com/?utm_source=homescreen&utm_medium=shortcut","theme_color":"#ffffff","scope":"https://twitter.com/","android_package_name":"com.twitter.android","prefer_related_applications":true,"related_applications":[{"id":"com.twitter.android","platform":"chromeos_play","url":"https://play.google.com/store/apps/details?id=com.twitter.android"}],"launch_handler":{"route_to":"existing-client","navigate_existing_client":"never"}}`);
const openSearchData = "data:text/xml;charset=utf-8," + encodeURIComponent(`<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/" xmlns:moz="http://www.mozilla.org/2006/browser/search/"><ShortName>Twitter</ShortName><Description>Twitter Search</Description><Url type="text/html" method="get" template="https://twitter.com/search?q={searchTerms}"/><Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoRzyoBvyoBvyoRzyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR7zpir0rjz0rz/zqTDyoR7yoBvyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR71tlD626r98uD+9ur979j515/0sUTyoBvyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR7zpSf0sEH63a7//v3////////98d71ulryoBvyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoRz4yoD++fL////////////////979j0rjzyoBvyoR3yoR3yoR3yoR3yoR3yoBzzqjP75cL////////////////////////50I/yoBvyoR3yoR3yoR3yoR3yoR3yoBr3x3n//fr////////////////////////86crzpijyoRzyoR3yoR3yoR3yoR3yoBr3w2///Pf++/T86Mf74LX//Pj////////98+H0rDfyoBvyoR3yoR3yoR3yoR3yoBv51Jf87NH2vF7ypCX0rj3+9Ob//////////Pj3x3nyoR7yoR3yoR3yoR3yoR3yoRz1uFT0rj3ynxnyoRzyoiD4y4P98+P98Nv51p32v2byoh7yoR3yoR3yoR3yoR3yoR3yoBzyoBzyoR3yoR3yoRzyoh/0rDjzqzTyoR3yoiDyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoBvyoBvyoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR3yoR0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</Image><InputEncoding>UTF-8</InputEncoding><moz:SearchForm>https://twitter.com/search-home</moz:SearchForm></OpenSearchDescription>`);
const logoSVGPathData = "M67.812 16.141a26.246 26.246 0 0 1-7.519 2.06 13.134 13.134 0 0 0 5.756-7.244 26.127 26.127 0 0 1-8.313 3.176A13.075 13.075 0 0 0 48.182 10c-7.229 0-13.092 5.861-13.092 13.093 0 1.026.118 2.021.338 2.981-10.885-.548-20.528-5.757-26.987-13.679a13.048 13.048 0 0 0-1.771 6.581c0 4.542 2.312 8.551 5.824 10.898a13.048 13.048 0 0 1-5.93-1.638c-.002.055-.002.11-.002.162 0 6.345 4.513 11.638 10.504 12.84a13.177 13.177 0 0 1-3.449.457c-.846 0-1.667-.078-2.465-.231 1.667 5.2 6.499 8.986 12.23 9.09a26.276 26.276 0 0 1-16.26 5.606A26.21 26.21 0 0 1 4 55.976a37.036 37.036 0 0 0 20.067 5.882c24.083 0 37.251-19.949 37.251-37.249 0-.566-.014-1.134-.039-1.694a26.597 26.597 0 0 0 6.533-6.774z";
const IconData = new Set([
{
rel: "shortcut icon",
href: "data:image/x-icon;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJkSURBVHgB7VZBbtpQEH3zIW0WVYuXVaH4Bs0NSk4AOUFhEarskhMknIDsqkKlcIT0BNAT1D1B3ZJK3dmVuirwp/MhVmzAxiagKBJv9+ePZ97M/JkxsMMODwzChlD84FWQp3MxeCDHAhiumB+MJrr1+8Ryw3p/9+H4DctfIPCq49Xlw8Kv99YlMuB19885gy/i7llziwGfFFWJyR02XzSCuwiBUse7BlFVaz5LS8KQVkRXaXRJsqImfDjKSZBNyzEyFWFKVJ4KFbWLElUao6KbSk8i9TXgTPaorxTskPwOxa7/9baGt4zg8oQbNyfWYJlRU0/KUx9ZwNwYNq1ecFRzl18QpW0bB0Ks//KjV1uwlbuLJA3GxEdh5wb5yGEPl3qMd2xecYQHKnlFlVLX95kxYCFKGg5IlU2a0uLpCM68LEJA+sJ/Dm6Jy3aMjQIRakRUm+UuvfOp/X34iQSejeFo0Hdx4optG5uFH/R+GHNvANcm3VtwLs+Lvy2TRwhIOnrYHhysIuDKcCDwGbYAjglOzQt+HssElF6dvoNNOZeuCSbfSgIGMjILMo4/ExZf7TqghNLmlwm1gpSC2tmaLAZMvWGz0Iu7XpqBm2NrQNN5cD+Y5ZOTdZyok3RZMusZOJUN+QZrQFb0oQkG6xIIYHe8A03Unx/Ryd6jS2ctAsbxmFRVynGKlM5na5ePVkUe0p+h9MmraS2zXqYgmSWjOPtElHbLTVB3Q79gqQlMScxqXpeav0UWiGMmXKSNOpZAAPvKs/U/1MRoxRxl+5WD+psUy2D5IdmRVoWjnqDnLlkyO+zwaPAf1zXwZL751PUAAAAASUVORK5CYII="
},
{
rel: "apple-touch-icon-precomposed",
href: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAMAAAC7xnO3AAAByFBMVEUdofIeofIgovIfovIboPIZn/IcoPIeovINmvEUnfEmpfMtqPMho/IQnPEXnvIYn/IaoPITnfF8yffH6Pzn9f7v+P7i8/224ftfvfYJmfE5rfQ4rPQyqvNYuvUPm/ERnPFIs/Th8v3///+64vsnpfNHs/Sd1vnh8/00q/N4x/dTt/UMmvEio/L8/v/6/f/+/v/+///9/v/g8v3U7f12xvcAlfC14Pv7/f9bu/YKmfGEzPgSnPFivvbT7fx7yPcNm/F6yPfZ7/2f1/r1+/6n2voXn/K04PsvqfPE5/y74/vy+v6Cy/glpPIVnvLl9P6j2fohovL7/v/o9f6Q0flCsPQQm/Ejo/Lq9v7F5/wZoPIsp/Pw+f7R7PyZ1flrwvdKtPUDlvH3/P+y3/uU0/lLtPWGzfie1/nd8f19yfia1flUuPX5/f8cofK44ftuwvcOm/Hm9f7p9v5dvPZzxffY7/2Mz/gxqfPr9/4opvNyxPfu+P4ppvMuqPNqwfb2+/4/r/Sf1/nz+v5GsvRAr/SY1Pn4/P/a8P1cu/ZgvfaX1PnO6vwUnfJauvbJ6fxTuPUSnfFSt/Wr3Prx+f5YufWV0/m/5Pu95PthvfYAMLrrAAACaklEQVR42u3UU3vmQACG4UHycVLbfdeYYJW1baO2ba1t6e9WSrsz1dHqPs31JBmS//77nVFK15QxbpghxsikMCUalJNFmBGJxuLCsniYcJGQSDVhUpQtCpNFSmpaekZmVtSk0eycXHVKE/PyC8SCsLCoGNPWrU/asHHTZlNZssgWbN22PfjFIglbOq4nJXbsBHbtDhNlae2Bv3cf42QaNcQO2JgmAew/cDBP/dGkQwAOFySK6afsyNHJcC49dvzEyVOUKMud8IHTZ7YZYvK7PPksJOa4wLlkQ1mywnWQrsT5Cxe3XaJCkIuX4WCOgyuXDPU4r0ZS4APXgOs3biZGblm37wRKibsRwokSvVdSCg9wfQBl5RWVOTvgBcp1yYxoiKq9gAvA8TGp2gcCZY2lK43ttXX1mOH50kXQNTRErmpKeqoRm6oxz11YNmnLq5Fm6HloKWSakkeLIF2ouUgvMSnRYAUb0epASWLd5Cc1aFtSO6ArOzr1JQmHko92KT/qoDuWRPUlNXN6evugGKuP/oggeuHEAag6eBgcmvyknoj0wvdUnxzuFGRJ/EAzsHj7wMa6A3zZu/XArpFfv3h51FyuJJRbY/fLS+EGwwcPk9mSFWeMibCZffuRs+BXHz+xlh5km1VQ2BlJePrseaCTHl7kFC4dGhdfvsrveP3GBSSmuRMdrrC3gVD9zXdvAEA+l47rOp70JYD3HzoNRpZjffz0eRABX2q+XjrAKFkW54UFJVnfvh+7nj6S1vfj28+xgkLOyIowZlqRA22xkpKLoQORWyZTdDqUCU6STNMgXOj/U59PIP/99/saB5WfkaTs+9E0AAAAAElFTkSuQmCC"
},
{
rel: "apple-touch-icon-precomposed",
sizes: "144x144",
href: "data:image/png;base64,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"
},
{
rel: "icon",
type: "image/png",
sizes: "32x32",
href: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAeFBMVEUAAAAYl+8gl+8gn+8gn+8Qn+8bmu8gmu8cm+8cl+8Zme8ZnO8dnO8dmu8bmu8bme8eme8em+8em/Ecm/Ecme8em+8cmu8dmvEdme8cmvAdmu8cm/Acmu8dmu8cm/Admu8dmvAemvAenPAdnPAcm+8dm/Aem/Adm/Dnzx9gAAAAJ3RSTlMAICAgEBAwMEBAUFBQYGBwcHB/f4CAkJ+gr7C/wMDP0N/f39/g7+/iptBPAAAAsElEQVR42tXO0wHFABQD0Dyjto3sv2HtLtDze5Hgon5BxdS5Afi90JMVrOgcmErgYOBTwUzmLLu/0YtJA5OCk9orxHmB6W8swBUJA5ud4L9LoIDRo2av8pSfwcUdo5fGUy+MyqDgiQoTm6dCTD48ZWN23uGNhZSfJ8xUu+aehJUvDxxsWNzJ7tiSEm58cfCpzwrMPkbFWb29F2XTKbgSHfKjzfiLo4fqJzVZJ676xAU1VoE4D0+QfE0AAAAASUVORK5CYII="
},
{
rel: "mask-icon",
href: "data:image/svg+xml," + encodeURIComponent(`<svg width="72" height="72" viewBox="0 0 72 72" style="fill: #1da1f2"><path d="M67.812 16.141a26.246 26.246 0 0 1-7.519 2.06 13.134 13.134 0 0 0 5.756-7.244 26.127 26.127 0 0 1-8.313 3.176A13.075 13.075 0 0 0 48.182 10c-7.229 0-13.092 5.861-13.092 13.093 0 1.026.118 2.021.338 2.981-10.885-.548-20.528-5.757-26.987-13.679a13.048 13.048 0 0 0-1.771 6.581c0 4.542 2.312 8.551 5.824 10.898a13.048 13.048 0 0 1-5.93-1.638c-.002.055-.002.11-.002.162 0 6.345 4.513 11.638 10.504 12.84a13.177 13.177 0 0 1-3.449.457c-.846 0-1.667-.078-2.465-.231 1.667 5.2 6.499 8.986 12.23 9.09a26.276 26.276 0 0 1-16.26 5.606A26.21 26.21 0 0 1 4 55.976a37.036 37.036 0 0 0 20.067 5.882c24.083 0 37.251-19.949 37.251-37.249 0-.566-.014-1.134-.039-1.694a26.597 26.597 0 0 0 6.533-6.774z"></path></svg>`)
},
{
rel: "apple-touch-icon",
href: "https://abs.twimg.com/responsive-web/client-web/icon-ios.b1fc727a.png"
}
]);
// ========================================
// FUNCTIONS
// ========================================
//TODO: NEED TO FIGURE OUT HOW TO NOT TRIGGER CSP RESTRICTIONS FOR MANIFEST
function modifyManifest() {
const manifest = getManifest();
if (manifest && !manifestError) {
manifestWatcher.disconnect();
console.log("[script] Changing web manifest");
manifest.href = manifestData;
elementSet.add(manifest);
manifestWatcher.observe(manifest, linkWatchConfig);
return true;
}
return false;
}
function modifyOpenSearch() {
const search = getSearch();
if (search) {
searchWatcher.disconnect();
console.log("[script] Changing search definition");
// search.type = "text/xml";
search.href = openSearchData;
elementSet.add(search);
searchWatcher.observe(search, linkWatchConfig);
return true;
}
return false;
}
function modifyLinks() {
linkWatcher.disconnect();
for (const data of IconData) {
const existingLink = document.head.querySelector(`link[rel="${data.rel}"]`);
if (existingLink && existingLink.href !== data.href) {
if (existingLink.href.startsWith("chrome-extension://" || existingLink.href.startsWith("moz-extension://"))) {
console.log("[script] Management of link '" + data.rel + "' relinquished to extension");
IconData.delete(data);
continue;
}
console.log("[script] Changing link: " + data.rel);
for (const attr in data) {
existingLink.setAttribute(attr, data[attr]);
}
processedLinks.add(data);
elementSet.add(existingLink);
linkWatcher.observe(existingLink, {attributes: true, attributeFilter: ["href"]});
}
}
return processedLinks.size >= IconData.size;
}
function modifyPageLogo() {
const svg = document.querySelector("a[href='/'] svg") || document.querySelector("a[href='/home'] svg");
if (svg) {
const path = svg.getElementsByTagName("path")[0];
if (path) {
logoWatcher.disconnect();
svg.setAttribute("viewBox", "0 0 72 72");
svg.style.fill = "#1d9bf0";
path.setAttribute("d", logoSVGPathData);
elementSet.add(svg);
logoWatcher.observe(svg.parentElement, logoWatchConfig);
console.log("[script] Twitter logo replaced.");
return true;
}
}
return false;
}
function addMissingLinks() {
for (const data of IconData) {
if (!processedLinks.has(data)) {
const link = document.createElement("link");
for (const attr in data) {
link.setAttribute(attr, data[attr]);
}
console.log("[script] Adding link: " + data.rel);
document.head.append(link);
processedLinks.add(data);
linkWatcher.observe(link, {attributes: true, attributeFilter: ["href"]});
}
}
}
function mainLoader(maxLoops = 20) {
// Clear any existing backup loop
if (loaderLoop !== -1) {
clearInterval(loaderLoop);
loaderLoop = -1;
}
let count = 0;
const toRun = RunFlags();
processedLinks.clear();
loaderLoop = setInterval(() => {
count++;
if (toRun.manifest && modifyManifest()) {
toRun.manifest = false;
}
if (toRun.search && modifyOpenSearch()) {
toRun.search = false;
}
if (toRun.link && modifyLinks()) {
toRun.link = false;
}
if (toRun.logo && modifyPageLogo()) {
toRun.logo = false;
}
if (count > maxLoops || !(toRun.link || toRun.logo || toRun.manifest || toRun.search)) {
clearInterval(loaderLoop);
addMissingLinks();
loaderLoop = -1;
}
}, 250);
}
function secondaryLoader(maxLoops) {
let rerunRequired = false;
elementSet.forEach(elem => {
if (!elem.isConnected) {
rerunRequired = true;
elementSet.delete(elem);
}
});
if (rerunRequired) {
mainLoader(maxLoops);
}
}
// ========================================
// RUN
// ========================================
// Re-check in case of a full reload of the page content
if (window.onurlchange === null) {
window.addEventListener("urlchange", () => { secondaryLoader(10) });
}
else {
window.addEventListener("popstate", () => { secondaryLoader(10) });
}
// Init
mainLoader();
document.addEventListener("securitypolicyviolation", (e) => {
if (!manifestError && e.violatedDirective === "manifest-src" && e.blockedURI === "data") {
console.log("%c[script] Manifest replacement disabled due to Content Security Policy not allowing 'data:' resources for 'manifest-src'.", "font-size: 1.5em; margin-right: 30%;");
manifestWatcher.disconnect();
manifestError = true;
const manifest = getManifest();
if (manifest) {
if (elementSet.has(manifest)) {
elementSet.delete(manifest);
}
manifest.remove();
}
}
});
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment