{"id":22733302,"url":"https://github.com/sedatuygur/youtube-mate","last_synced_at":"2026-04-03T23:34:23.808Z","repository":{"id":263490713,"uuid":"890396417","full_name":"SedatUygur/YouTube-Mate","owner":"SedatUygur","description":"YouTube Mate is an app allow users to create and share YouTube watchlists","archived":false,"fork":false,"pushed_at":"2024-12-20T14:57:04.000Z","size":2169,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T01:45:07.491Z","etag":null,"topics":["authjs","docker","eslint","github-actions","husky","javascript","lint-staged","luxon","playwright","postgresql","prettier","prisma","redis","skeleton","svelte5","sveltekit","tailwindcss","typescript","youtube-playlist","zod"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SedatUygur.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-11-18T13:53:39.000Z","updated_at":"2025-01-02T14:04:27.000Z","dependencies_parsed_at":"2024-12-03T20:19:07.555Z","dependency_job_id":"a3554091-03ce-478a-968a-172b11f20046","html_url":"https://github.com/SedatUygur/YouTube-Mate","commit_stats":null,"previous_names":["sedatuygur/youtube-mate"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/SedatUygur/YouTube-Mate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SedatUygur%2FYouTube-Mate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SedatUygur%2FYouTube-Mate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SedatUygur%2FYouTube-Mate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SedatUygur%2FYouTube-Mate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SedatUygur","download_url":"https://codeload.github.com/SedatUygur/YouTube-Mate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SedatUygur%2FYouTube-Mate/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266868315,"owners_count":23997852,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-24T02:00:09.469Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["authjs","docker","eslint","github-actions","husky","javascript","lint-staged","luxon","playwright","postgresql","prettier","prisma","redis","skeleton","svelte5","sveltekit","tailwindcss","typescript","youtube-playlist","zod"],"created_at":"2024-12-10T20:13:39.909Z","updated_at":"2025-12-30T18:56:38.697Z","avatar_url":"https://github.com/SedatUygur.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- Improved compatibility of back to top link: See: https://github.com/SedatUygur/YouTube-Mate/pull/73 --\u003e\n\u003ca id=\"readme-top\"\u003e\u003c/a\u003e\n\n\u003c!-- PROJECT SHIELDS --\u003e\n\u003c!--\n*** I'm using markdown \"reference style\" links for readability.\n*** Reference links are enclosed in brackets [ ] instead of parentheses ( ).\n*** See the bottom of this document for the declaration of the reference variables\n*** for contributors-url, forks-url, etc. This is an optional, concise syntax you may use.\n*** https://www.markdownguide.org/basic-syntax/#reference-style-links\n--\u003e\n[![Contributors][contributors-shield]][contributors-url]\n[![Forks][forks-shield]][forks-url]\n[![Stargazers][stars-shield]][stars-url]\n[![Issues][issues-shield]][issues-url]\n[![MIT License][license-shield]][license-url]\n[![LinkedIn][linkedin-shield]][linkedin-url]\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch3 align=\"center\"\u003eYouTubeMate\u003c/h3\u003e\n\n  \u003cp align=\"center\"\u003e\n    YouTube Mate is an app allow users to create and share YouTube watchlists\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/SedatUygur/YouTube-Mate\"\u003e\u003cstrong\u003eExplore the docs\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/SedatUygur/YouTube-Mate/issues/new?labels=bug\u0026template=bug-report---.md\"\u003eReport Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/SedatUygur/YouTube-Mate/issues/new?labels=enhancement\u0026template=feature-request---.md\"\u003eRequest Feature\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#built-with\"\u003eBuilt With\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#prerequisites\"\u003ePrerequisites\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#features\"\u003eFeatures\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#roadmap\"\u003eRoadmap\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contact\"\u003eContact\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#acknowledgments\"\u003eAcknowledgments\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n## About The Project\n\nYouTubeMate is a full stack project will allow users to create \u0026 edit watch lists of YouTube channels. You can also watch videos of your favourite channels.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Built With\n\n[![TypeScript][TypeScript-logo]][TypeScript]\n[![Svelte][Svelte-logo]][Svelte]\n[![JavaScript][JavaScript-logo]][JavaScript]\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- GETTING STARTED --\u003e\n## Getting Started\n\nTo get a local copy up and running follow these simple steps.\n\n### Prerequisites\n\nInstall a package manager e.g npm, yarn, pnpm, bun etc.\n\n### Installation\n\n1. Download or clone my repository\n   ```sh\n   git clone https://github.com/SedatUygur/YouTube-Mate.git\n   ```\n2. Then, install the project dependencies:\n\n   ```sh\n   npm install\n   ```\n3. You can follow the contribution guidelines to proceed\n\n\u003c!-- FEATURES --\u003e\n## Features\n\n- [ ] Add Logo\n\n- [x] Page Transitions\n- [x] Add Icon Library\n  - [x] Put Icons on all Action Buttons\n- [x] List Create / Edit Page\n  - [x] detect changes in form\n  - [x] Prevent navigation if unsaved changes\n  - [x] Disable update / save button if no changes \n- [x] List permissions / auth\n  - [x] Private lists can only be viewed by the creator\n- [ ] List Page\n  - [x] Access list via slug\n  - [ ] Share list / copy URL to clipboard \n  - [ ] Previous / Next Buttons\n  - [ ] Infinite scroll / pagination / lazy loading\n  - [ ] On video end, play next video\n    - [ ] Loop back to beginning if we reach the end\n  - [ ] List Sort / Filters\n    * [ ] Views\n    * [ ] Newest / Oldest\n    * [ ] Likes\n    * [ ] Random / Feeling Lucky\n    * [ ] Toggle\n      * [ ] Shorts\n      * [ ] Videos\n      * [ ] Live-streams\n    * [ ] Duration\n      * [ ] Min\n      * [ ] Max\n    * [ ] Toggle Channels in List\n    * [ ] Show 1 video from each channel at a time...\n  - [ ] Channel cache refresh button\n  - [ ] Show last updated time / cache time for each channel\n- [ ] Landing Page / Features\n- [ ] Limits\n  - [ ] Max number of lists per user\n  - [ ] Max number of channels per list\n- [ ] Users can favorite a list\n- [ ] Show favorited lists on user dashboard\n- [ ] Fork an existing list\n- [ ] Public user profile page\n  - [ ] Show public lists\n- [ ] User Preferences\n  - [ ] Volume\n  - [ ] Video Speed\n  - [ ] Autoplay\n- [ ] Message Queue\n  - [ ] Seperate Service that receives requests for Cacheing\n    - [ ] Calls YT API, updates cache\n  - [ ] SvelteKit app -\u003e put messages into the queue requesting caching\n\n- [ ] Message Queues\n  * [ ] Explore:\n    - Redis\n      - pub / sub\n      - flags\n\n- [ ] Analytics Service\n- [ ] Error Reporting\n\n- [ ] Terms of Service\n- [ ] GDPR\n- [ ] Privacy Policy\n\n- [ ] Firefox tab navigation\n- [ ] Redirect to homepage on logout\n\nSee the [open issues](https://github.com/SedatUygur/YouTube-Mate/issues) for a full list of proposed features (and known issues).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- ROADMAP --\u003e\n## Roadmap\n\n- [ ] List create UX\n  - [ ] Only show channel avatar\n    - [ ] Small remove button\n    - [ ] Tooltip with channel name\n  - [ ] Desktop styles - 2 column\n    - [ ] Channel adder is on the right\n- [x] YouTube Embed API\n  - [x] parse timestamps in description, link changes timestamp in video\n- [x] Home Page List\n  - [x] List actions\n    - [x] View\n    - [x] Edit\n- [x] Fix scroll position on page change\n- [x] Video view page\n  - [x] expandable description box\n  - [x] Render description with markdown\n- [x] Containerize tests\n- [ ] More integration tests\n  - [x] Run tests / containers while dev containers are still running\n  - [x] Seed DB with unique users for each type of test\n  - [x] TODO: make a watch specific config\n    - [x] Watch for only test updates\n  - [ ] Tests:\n    - [x] Search for YT channels\n    - [x] Add YT channel to List\n    - [x] Create List\n    - [x] View List\n      - [x] View individual List\n    - [x] Coverage Reports\n      - [x] Generate outside container (volume)\n    - [x] Navigating Lists\n    - [x] Edit List\n    - [x] Make sure $LL is being run in tests...\n      - [x] Svelte stores highlighted red??\n    - [ ] .env.test does not exist on CI server...\n    - [ ] Remove test ids in Prod build\n    - [ ] Update contributing guide...\n      - [ ] Running tests in watch mode...\n      - [ ] Debugging tests in watch mode...\n      - [ ] Exporting data to be seeded for tests\n- [x] Update readme with tech stack\n- [ ] Deploy\n  - [ ] Database\n    - Free Tier\n      - Serverless / Edge Function Support...\n        - Connection Pooling\n      - Fly.io\n      - Railway\n      - Supabase\n      - Render\n      - ElephantSQL\n    - Paid\n      - Heroku\n      - AWS RDS\n  - [ ] App - Vercel\n- [x] Testing todos:\n  - [x] Fix tests on CI\n    - [x] Docker / prisma test setup\n  - [x] Configure e2e tests\n  - [x] Seed DB\n    - [x] Generate user token during test (do not do oauth flow during test...)\n  - Anything else that comes up...\n- [x] Create page form styles\n  - [x] Channel card styles\n- [x] Update the List page styles\n- [x] Update DB schema\n  - Last updated\n  - More metadata\n    - Include Channel Image\n    - Include Channel handle\n    - Number of subscribers\n    - Verified badges\n- [x] More robust YT API Response\n- [x] Lazy load embedded video and thumbnails\n- [x] Cache YT API Response\n  - [x] Get ALL videos of each channel\n  - [x] Get ALL video info of each video\n    - [x] View Count\n    - [x] Length / Duration\n    - [x] Like Count\n- [x] Fix YT Video order (latest by default...)\n- [x] List Page Styles\n  - [x] Fix video titles\n- [x] Single Video Page\n- [x] Wireframe create list page\n- [x] Create list page\n  - [x] Set title\n  - [x] Set Description\n- [x] Eslint / Airbnb / Prettier Setup...\n- [x] Setup i18n\n  - [x] Research options\n  - [x] Install / setup\n  - [x] Use dictionaries on landing page\n\nSee the [open issues](https://github.com/SedatUygur/YouTube-Mate/issues) for a full list of proposed features (and known issues).\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- CONTRIBUTING --\u003e\n## Contributing\n\nYou can follow the contribution guidelines(CONTRIBUTION.md) to contribute. We have issue templates for bug and feature requests.\n\nContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nIf you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag \"enhancement\".\nDon't forget to give the project a star! Thanks again!\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\n### Top contributors:\n\n\u003ca href=\"https://github.com/SedatUygur/YouTube-Mate/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=SedatUygur/YouTube-Mate\" alt=\"contrib.rocks image\" /\u003e\n\u003c/a\u003e\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- LICENSE --\u003e\n## License\n\nDistributed under the MIT License. See `LICENSE.txt` for more information.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- CONTACT --\u003e\n## Contact\n\nSedat Uygur - [@sedat-can-uygur](https://www.linkedin.com/in/sedat-can-uygur) - sedat.uygur@outlook.com\n\nProject Link: [https://github.com/SedatUygur/YouTube-Mate](https://github.com/SedatUygur/YouTube-Mate)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- ACKNOWLEDGMENTS --\u003e\n## Acknowledgments\n\n- [SvelteKit](https://kit.svelte.dev/)\n- [Auth.js](https://authjs.dev/)\n- [Postgres](https://www.postgresql.org/)\n- [Prisma](https://www.prisma.io/)\n- [Redis](https://redis.io/)\n- [node-redis](https://www.npmjs.com/package/redis)\n- [Svelte](https://svelte.dev/)\n- [tailwind](https://tailwindcss.com/)\n- [Skeleton UI](https://www.skeleton.dev/)\n- [typesafe-i18n](https://github.com/ivanhofer/typesafe-i18n/)\n- [zod](https://www.npmjs.com/package/zod)\n- [@googleapis/youtube](https://www.npmjs.com/package/@googleapis/youtube)\n- [luxon](https://www.npmjs.com/package/luxon)\n- [eslint](https://www.npmjs.com/package/eslint)\n- [prettier](https://www.npmjs.com/package/prettier)\n- [lint-staged](https://www.npmjs.com/package/lint-staged)\n- [husky](https://www.npmjs.com/package/husky)\n- [Playwright](https://playwright.dev/)\n- [Istanbul](https://www.npmjs.com/package/nyc)\n- [Docker](https://www.docker.com/)\n- [Github Actions](https://github.com/features/actions)\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n[contributors-shield]: https://img.shields.io/github/contributors/SedatUygur/YouTube-Mate.svg?style=for-the-badge\n[contributors-url]: https://github.com/SedatUygur/YouTube-Mate/graphs/contributors\n[forks-shield]: https://img.shields.io/github/forks/SedatUygur/YouTube-Mate.svg?style=for-the-badge\n[forks-url]: https://github.com/SedatUygur/YouTube-Mate/network/members\n[stars-shield]: https://img.shields.io/github/stars/SedatUygur/YouTube-Mate.svg?style=for-the-badge\n[stars-url]: https://github.com/SedatUygur/YouTube-Mate/stargazers\n[issues-shield]: https://img.shields.io/github/issues/SedatUygur/YouTube-Mate.svg?style=for-the-badge\n[issues-url]: https://github.com/SedatUygur/YouTube-Mate/issues\n[license-shield]: https://img.shields.io/github/license/SedatUygur/YouTube-Mate.svg?style=for-the-badge\n[license-url]: https://github.com/SedatUygur/YouTube-Mate/blob/main/LICENSE.txt\n[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge\u0026logo=linkedin\u0026colorB=555\n[linkedin-url]: https://linkedin.com/in/sedat-can-uygur\n[product-screenshot]: images/screenshot.png\n\n[TypeScript-logo]: https://ms-vscode.gallerycdn.vsassets.io/extensions/ms-vscode/vscode-typescript-next/5.8.20241203/1733271143236/Microsoft.VisualStudio.Services.Icons.Default\n[TypeScript]: https://www.typescriptlang.org/\n[Svelte-logo]: https://avatars.githubusercontent.com/u/23617963?s=256\u0026v=4\n[Svelte]: https://svelte.dev/\n[JavaScript-logo]: https://static-00.iconduck.com/assets.00/javascript-icon-256x256-0ybhyms4.png\n[JavaScript]: https://www.javascript.com/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsedatuygur%2Fyoutube-mate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsedatuygur%2Fyoutube-mate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsedatuygur%2Fyoutube-mate/lists"}