NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name No Shorts
// @namespace https://github.com/mithatakbulut/noshorts
// @version 0.1.0
// @description Removes YouTube Shorts while keeping normal YouTube intact. Works on iPhone Safari and desktop browsers.
// @author Mithat Akbulut
// @license MIT
// @homepageURL https://github.com/mithatakbulut/noshorts
// @supportURL https://github.com/mithatakbulut/noshorts/issues
// @match *://youtube.com/*
// @match *://*.youtube.com/*
// @run-at document-start
// @grant none
// ==/UserScript==
(() => {
"use strict";
const css = `
a[href^="/shorts"],
a[href*="youtube.com/shorts"],
ytd-reel-shelf-renderer,
ytm-reel-shelf-renderer,
ytd-reel-video-renderer,
ytm-shorts-lockup-view-model,
ytd-shorts,
ytd-rich-shelf-renderer[is-shorts] {
display: none !important;
}
`;
const style = document.createElement("style");
style.textContent = css;
(document.documentElement || document.head || document).appendChild(style);
const isShortsPath = () =>
location.pathname === "/shorts" ||
location.pathname.startsWith("/shorts/");
const escapeShorts = () => {
if (!isShortsPath()) return false;
location.replace(`${location.origin}/`);
return true;
};
const removeShortsUI = () => {
const selectors = [
"ytd-reel-shelf-renderer",
"ytm-reel-shelf-renderer",
"ytd-reel-video-renderer",
"ytm-shorts-lockup-view-model",
"ytd-shorts",
"ytd-rich-shelf-renderer[is-shorts]",
'a[href^="/shorts"]',
'a[href*="youtube.com/shorts"]'
];
for (const element of document.querySelectorAll(selectors.join(","))) {
if (element.tagName === "A") {
const card = element.closest(
[
"ytd-rich-item-renderer",
"ytd-video-renderer",
"ytd-grid-video-renderer",
"ytm-video-with-context-renderer",
"ytm-compact-video-renderer",
"ytm-shorts-lockup-view-model"
].join(",")
);
(card || element).remove();
} else {
element.remove();
}
}
};
const clean = () => {
if (escapeShorts()) return;
removeShortsUI();
};
document.addEventListener(
"click",
(event) => {
const target = event.target;
if (!(target instanceof Element)) return;
const anchor = target.closest("a[href]");
if (!anchor) return;
let url;
try {
url = new URL(anchor.href, location.href);
} catch {
return;
}
if (
/(^|\.)youtube\.com$/.test(url.hostname) &&
(url.pathname === "/shorts" || url.pathname.startsWith("/shorts/"))
) {
event.preventDefault();
event.stopImmediatePropagation();
location.assign(`${location.origin}/`);
}
},
true
);
const observer = new MutationObserver(clean);
const start = () => {
clean();
if (document.documentElement) {
observer.observe(document.documentElement, {
childList: true,
subtree: true
});
}
};
if (document.documentElement) {
start();
} else {
document.addEventListener("DOMContentLoaded", start, { once: true });
}
window.addEventListener("popstate", clean);
window.addEventListener("pageshow", clean);
document.addEventListener("visibilitychange", clean);
setInterval(() => {
if (isShortsPath()) escapeShorts();
}, 500);
})();