Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
900a439
New default custom invidious url
legoskid Dec 4, 2025
61eb8d4
Advice for making invidious instance @MalsOfficial
legoskid Dec 5, 2025
4ea1891
Add new invidious url to here too
legoskid Dec 5, 2025
adc7cae
WATCH_UI_NO_LINES expflag
legoskid Dec 8, 2025
7f9cb57
Change subscriptions icon
legoskid Dec 8, 2025
57009aa
Change the invidious url to blank to reset it
legoskid Dec 9, 2025
0620071
Expflag to move the comments
legoskid Dec 10, 2025
c8086f6
Minor spelling mistake
legoskid Dec 10, 2025
1fbad89
Update color icons @CIIOIIIILLLLLLLLLLLLLLLL
legoskid Dec 12, 2025
5248ebc
Add download and save icon files
legoskid Dec 12, 2025
31fc662
Add png's
legoskid Dec 15, 2025
ff5f9d2
Download and save buttons 80% done
legoskid Dec 15, 2025
01fae10
Update polyfill, i forgot to add this
legoskid Dec 16, 2025
3be0b7f
Update download and save icons
legoskid Dec 16, 2025
7310d5b
WATCH_HIDE_SUBSCRIBE_ICON
legoskid Dec 16, 2025
48278bb
PIVOT_NOTIFICATIONS_ICON_VARIANT
legoskid Dec 17, 2025
b185f7c
Send feedback tab in settings
legoskid Dec 17, 2025
c4ce13a
Install Ytm15 tab
legoskid Dec 18, 2025
0a2566b
Prepare for camera icon
legoskid Dec 18, 2025
981dd06
Merge branch 'ytm15:main' into cors2
legoskid Dec 19, 2025
8921d7e
Fix #57
legoskid Dec 21, 2025
51b8d23
Add dark and light YouTube wordmark header images (Paint.NET 5.1.7)
legoskid Dec 22, 2025
1c9db3d
Add camcorder.svg (Camera)
legoskid Dec 22, 2025
2187e65
Make <path> self-closing in camcorder.svg
legoskid Dec 22, 2025
502db04
Add premium logos
legoskid Dec 23, 2025
1294c96
Increase progress bar hitbox
legoskid Jan 1, 2026
99f2f89
Fix playlists via adding APP_DONT_AUTH_TO_INVIDIOUS function
legoskid Jan 1, 2026
3232c12
Fix player errors, so if your video was ever black and not loading no…
legoskid Jan 1, 2026
19056d9
Add HEADER_YOUTUBE_BRANDING flag, fix youtube red logo width, fix HEA…
legoskid Jan 1, 2026
677538f
Fix playlists and comments fr this time
legoskid Jan 1, 2026
d2dd785
Update download icon
legoskid Jan 6, 2026
864575b
Autoplay switch (not working yet)
legoskid Jan 6, 2026
307e9db
Fix the overflow on the icons on a small phone
legoskid Jan 6, 2026
01811fc
Working camera icon for HEADER_CAST_ALTERNATE_ICON
legoskid Jan 7, 2026
5123a65
Add fun fact (Estimate)
legoskid Jan 7, 2026
68b7b90
"comment-section" placed below "wnr-2nd-half"
legoskid Jan 9, 2026
d1a641b
Update invidious subtitle
legoskid Jan 9, 2026
7e3a345
Add account icon and image link
legoskid Jan 9, 2026
ed8d745
Fix a typo that I didn't notice for 3 days
legoskid Jan 12, 2026
4388a24
Revert invidious url but keep the cors proxy
legoskid Jan 12, 2026
b2879d8
Revert it again
legoskid Jan 12, 2026
36bb357
Add profile picture to comments
legoskid Jan 13, 2026
bcce545
Add save & load expflags and Notifications(part 1)
legoskid Jan 13, 2026
8262bad
Notifications part 2 (fixed css)
legoskid Jan 13, 2026
2bb5d86
Fix save and load position
legoskid Jan 14, 2026
1c8a314
Clean settings page. make save and load semi work
legoskid Jan 14, 2026
437bfdc
Fix shorts not being clickable on channel sort
legoskid Jan 15, 2026
068d6e4
Update invidious instance once again
legoskid Jan 15, 2026
8efc601
WATCH_SAVE_IS_ADD_TO
legoskid Jan 15, 2026
58e8c51
PIVOT_TRENDING_IS_EXPLORE
legoskid Jan 16, 2026
22de891
PIVOT_LIBRARY_UPDATED_ICON
legoskid Jan 16, 2026
79371bd
Add the bottom bar for offline and online (yt v13)
legoskid Jan 20, 2026
a52aea1
Make iOS spinner more accurate
legoskid Jan 21, 2026
a766775
Save New Icon (only for material icons flag)
legoskid Jan 22, 2026
92328f2
Notify cast error
legoskid Jan 23, 2026
bda2f52
make new Save icon fit
legoskid Jan 23, 2026
3e0fdda
Fix not able2 switch cast icon(also foreshadowing)
legoskid Jan 23, 2026
e0cdf1a
I forgot a comma
legoskid Jan 23, 2026
cd5bace
Add share button functionality
legoskid Jan 23, 2026
561c1cd
Add alt share icons player files
legoskid Jan 23, 2026
e3ef3a5
Add more video control icon files
legoskid Jan 23, 2026
875faaf
Collapsable comments (only icon) (part 1)
legoskid Jan 23, 2026
a1fefe1
Library part 1 I actually got the tab loading
legoskid Jan 24, 2026
4e77022
Library part 2
legoskid Jan 27, 2026
cf09bcb
Label library and add beta tag
legoskid Jan 27, 2026
274af2b
fix 6 characters of code
legoskid Jan 28, 2026
6bbafbf
Fix autoplay getting cutoff
legoskid Jan 28, 2026
5ad921a
Collapsable Comments working (no animation yet)
legoskid Jan 28, 2026
2f35364
Add notification when saving video
legoskid Jan 28, 2026
9497687
Add save button subtitle
legoskid Jan 28, 2026
6c23745
Fix autoplay switch again
legoskid Jan 29, 2026
802405b
Add animation when collapsing comments
legoskid Jan 29, 2026
e50a550
Toggleable autoplay
legoskid Jan 30, 2026
850f461
Improved notifications/toast CSS to look accurate
Yacine-Book Jan 31, 2026
6eed27c
Expand share notification
legoskid Feb 3, 2026
309d2dc
Merge branch 'cors2' of https://github.com/legoskid/ytm15.github.io i…
legoskid Feb 3, 2026
c75ed6d
HEADER_ALWAYS_SHOW_YOUTUBE_TITLE
legoskid Feb 3, 2026
1f8ea4f
Edit APP_CUSTOM_INVIDIOUS_URL description
legoskid Feb 3, 2026
ca1831a
I forgot a >
legoskid Feb 3, 2026
58a069b
Modify NO_ANDROID_ANIMATIONS
legoskid Feb 3, 2026
faca4ab
Library start at top up(unshift)title and channel
legoskid Feb 4, 2026
c48d4f4
Library has full details except time
legoskid Feb 4, 2026
0ae6de3
Update getChannelVideos to POST to fix continuation bug
legoskid Feb 5, 2026
aef7843
Add the header menu button part 1
legoskid Feb 6, 2026
8a6652c
Merge branch 'cors2' of https://github.com/legoskid/ytm15.github.io i…
legoskid Feb 6, 2026
1875e2a
Subscriptions (will add a proper placeholder)
legoskid Feb 6, 2026
b39025a
Proper subscriptions placeholder
legoskid Feb 6, 2026
e1a59dc
Fix header bug
legoskid Feb 7, 2026
b20a700
Subscriptions tab bar
legoskid Feb 7, 2026
8868bca
Fix right menu button position being offset
legoskid Feb 9, 2026
fe2daeb
HEADER_ALWAYS_SHOW_YOUTUBE_TITLE when loading
legoskid Feb 9, 2026
2db21fe
Add toast button function and 2015 offline style
legoskid Feb 10, 2026
3d6661c
Define APP_NO_INTERNET_POPUP_NEW_STYLE
legoskid Feb 10, 2026
9f45d93
Advice on hosting ytm15 yourself
legoskid Feb 11, 2026
9396530
Use safer way other than eval because eval is bad
legoskid Feb 12, 2026
6a08497
Replaced all arrow call-to's with function()
Yacine-Book Feb 13, 2026
eee46f2
Go online button for 2015 Offline style
legoskid Feb 13, 2026
60e41d9
Merge branch 'cors2' of https://github.com/legoskid/ytm15.github.io i…
legoskid Feb 13, 2026
f7b1d52
okay, I don't want to impose anything on @...
legoskid Feb 13, 2026
a1d5680
Save da world - change 2 characters
Entinty1999 Feb 15, 2026
ee4eb3e
Merge pull request #4 from YTm15-BETA-org/crit-fix-2-electric-boogaloo
legoskid Feb 15, 2026
6f2c157
Fix Importing/Exporting expflags FINALLY
legoskid Feb 25, 2026
44c352e
Add a proper blank library page
legoskid Feb 27, 2026
4f24c47
Expand on the compatibility note in the settings
legoskid Feb 27, 2026
afe048d
Remove search tab from channel page
legoskid Feb 27, 2026
1a00b7a
WATCH_CONDENSE_COMMENT_BUTTONS
legoskid Mar 2, 2026
d69e0e3
WATCH_FORMAT_LIKE_COUNTS
legoskid Mar 3, 2026
b869836
Made the video player return the last array it detects for the thumbnail
Yacine-Book Mar 3, 2026
b9dda15
APP_IOS_SYSTEM_FONT
legoskid Mar 5, 2026
f5c99ef
Merge branch 'cors2' of https://github.com/legoskid/ytm15.github.io i…
legoskid Mar 5, 2026
d40da03
WATCH_CONDENSE_COMMUNITY_POST_BUTTONS
legoskid Mar 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,17 @@ A frontend/web-client for YouTube mobile based off the 2015 YT app for Android
## Want the desktop UI instead?
Consider checking out <a href="https://vorapis.pages.dev/#/">Vorapis 2013/V3</a>, another project made by another person in the Old YouTube community, V3 also aims to restore YouTube's old UI, you can configure/stylize it to make it look like YouTube in 2015. <a href="https://chromewebstore.google.com/detail/customtube-restore-the-ol/iedffooliepgabiihipcbokboecnfcbe">CustomTube</a> also exists, however it's discontined/no-longer maintained

## Host YTm15 yourself
YTm15 is completely static, so you can basically host it anywhere.
* `git clone https://github.com/ytm15/ytm15.github.io && cd ytm15.github.io && yes | npx http-server` to create a local server immediately
* Fork the github repo
* Download the `app` folder, PNG's and the `webmanifest.json` and place it on your web server/hosting service


## To-do list
- Make the newer UIs more accurate and complete
- (possibly / tentative) Change this whole project's name (it doesn't just have the 2015 YT UI anymore so it's about time for a name-change)
- Add expflags for the player
- (try to) Add compatibility for older browsers

#### More info may be added in the future
131 changes: 127 additions & 4 deletions app/2015YTm.css
Original file line number Diff line number Diff line change
Expand Up @@ -915,7 +915,7 @@ ytm15-icon>svg {
box-shadow: none;
}

.underline button:not(h2):not(.secondary-text):not(.menu-item-button):not(.error-content),.pivot-bar-item-title {
.underline button:not(h2):not(.secondary-text):not(.menu-item-button):not(.error-content),.underline .pivot-bar-item-title {
text-decoration: underline;
}

Expand Down Expand Up @@ -992,6 +992,17 @@ ytm15-header-bar[ischannel="true"] {
.header-title {
font-weight: 500;
}
.header-title[aria-label="Library"]::after,.header-title[aria-label="Subscriptions"]::after {
content: "Beta";
text-transform: uppercase;
font-size: 1.3rem;
margin: 0 8px;
padding: 1px 6px;
background-color: rgba(0, 0, 0, 0.15);
opacity: .6;
font-weight: 500;
border-radius: 2px;
}

/* Header content and other header things */
.header-content {
Expand All @@ -1016,6 +1027,9 @@ ytm15-header-bar[ischannel="true"] {
.header-no-shadow ytm15-header-bar {
box-shadow: none !important;
}
.header-button[aria-label="Left Menu"] {
padding-left:unset;
}

/* Header logo */
.youtube-logo-icon.ringo-logo {
Expand Down Expand Up @@ -1212,7 +1226,7 @@ overflow: hidden;
display: block;
animation: page-expand-in .2s;
}
.no-animations .page-container,.no-animations .error-container,.no-animations page.home,.no-animations .lazy-list,.no-animations .error-content {
.no-animations .page-container,.no-animations .error-container,.no-animations page.home,.no-animations .lazy-list,.no-animations .error-content, .no-animations .searching-overlay ~ .page-container > page {
animation: none !important;
}
.no-animations .ytm15-img.lazy {
Expand Down Expand Up @@ -2591,6 +2605,9 @@ ytm15-menu-button {
.compact-channel.shelf-item .media-item-menu {
display: none;
}
.no-lines .ytm15-video-owner,.no-lines .watch-next-results-content {
border:unset !important;
}

/* About 2015YouTube */
.about-page-heading, .about-page-subheading {
Expand Down Expand Up @@ -3075,6 +3092,9 @@ ytm15-channels-header {
width: 18px;
height: 13px;
}
.no-subscribe-icon .ytm15-img-icon.subscribe-icon {
display:none;
}

.continuation-item ~ .continuation-item {
display: none;
Expand Down Expand Up @@ -3709,6 +3729,18 @@ button.comment-icon-button {
height: 14px;
margin-right: 2px;
}
.collapse-comments .comment-simplebox,.collapse-comments .comment-separator,.comment-section.collapse-comments .lazy-list,.collapse-comments .next-continuation-cont {
display:none;
}
.comment-section .lazy-list {
transition: transform .35s cubic-bezier(.22,.9,.35,1);
}
.condense-comment-buttons .comment-details {
display:inline-flex;
}
.condense-comment-buttons .comment-details #cm-icon-dislike {
margin-left:10px;
}

/* Community posts */
[data-is-beta="true"] .posts-header-text::after {
Expand Down Expand Up @@ -3901,6 +3933,12 @@ ytm15-icon.post-image-icon {
border: 1.2px solid rgba(0,0,0,0.1);
border-radius: 3px;
}
.condense-comment-buttons-2 .post-details {
display:ruby;
}
.condense-comment-buttons-2 .post-details #post-icon-reply {
float:right;
}

/* Pivot bar */
[has-pivot-bar="true"] ytm15app {
Expand Down Expand Up @@ -3929,7 +3967,7 @@ ytm15-pivot-bar {
z-index: 2;
height: 52px;
background-color: #fff;
color: rgba(0, 0, 0, 0.5);
color: #5f5f5f;
box-shadow: 0px 0px 3px 0px rgba(0, 0, 0, 0.25);
font-size: 1.1rem;
}
Expand Down Expand Up @@ -4240,6 +4278,9 @@ label.radio-label {
.helvetica-neue {
font-family: 'HelveticaNeue-Light','Helvetica Neue Light','Helvetica Neue',Helvetica,Arial,sans-serif !important;
}
.system-font {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Oxygen-Sans, Ubuntu, Cantarell, Roboto, "Helvetica Neue", sans-serif !important;
}
/*New error screen*/
.tap-to-retry .error-content {
display:unset;
Expand Down Expand Up @@ -5657,7 +5698,7 @@ html.dark {
}
.dark ytm15-pivot-bar {
background-color: #303030;
color: rgba(255, 255, 255, 0.6);
color: #8f8f8f;
}
.dark ytm15-pivot-bar.no-shadow {
border-top: 1.2px solid rgba(255,255,255,0.1);
Expand Down Expand Up @@ -6094,3 +6135,85 @@ html.style-2013.dark.dark-21 {
.style-2013.dark.dark-21 .ytm15-video-owner .material-button-container[data-style="BRAND"] .material-button {
background: linear-gradient(#323232, #252525);
}
/* Implementation by legoskid */
.notification {
position: fixed;
bottom: 0;
/* left: 50%; */
left: 0;
right: 0;
transform: translate(0, 100%);
/* transition: transform .35s cubic-bezier(.22,.9,.35,1), opacity .25s; */
transition: transform .3s ease-in-out, opacity .25s;
display: inline-block;
display: block;
/* max-width: calc(100% - 40px); */
max-width: 400px;
/* padding: 20px 32px; */
padding: 14px 24px;
background: #2e2e2e;
color: #f1f1f1;
border-radius: unset;
border: unset;
box-shadow: unset;
box-sizing: border-box;
line-height: 1.25;
font-size: 15px;
z-index: 9999;
white-space: normal;
margin: auto;
}
.notification.notification-show {
transform: translate(0, 0);
}
.notification button {
float: right;
color: #2196f3;
text-transform:uppercase;
}
div#offline-bar {
display: flex;
justify-content: center;
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 0;
z-index: 2;
background-color: black;
color: white;
font-weight: bold;
padding: 2px;
transform: translateY(100%);
transition: transform .35s cubic-bezier(.22,.9,.35,1), opacity .25s, background .35s cubic-bezier(.22,.9,.35,1)
}
div#offline-bar.offline-bar-show {
transform: translateY(0%);
}
div#offline-bar.offline-bar-online {
background:green;
}
.hamburger-menu {
position: fixed;
top: 0;
bottom: 0;
left: 0;
right: 0;
z-index: 3;
background-color: rgba(0.5,0.5,0.5,0.5);
animation: overlay-fade .3s;
display:initial;
}
.hamburger-submenu {
height: 100%;
background: white;
width: 28rem;
transform: translateX(-100%);
transition: transform .35s cubic-bezier(.22,.9,.35,1);
}
.hamburger-submenu.hamburger-submenu-show {
transform:unset;
}
.hamburger-menu-hide {
animation: overlay-fade-out .2s;
}
Loading