{"id":27370732,"url":"https://github.com/andrewarrow/xvibe","last_synced_at":"2026-05-17T00:07:54.695Z","repository":{"id":282569713,"uuid":"948800499","full_name":"andrewarrow/xvibe","owner":"andrewarrow","description":"Download videos via yt-dlp, get captions, get keyframes, make clips. Made in an hour with claude code vibecoding.","archived":false,"fork":false,"pushed_at":"2025-03-15T21:51:05.000Z","size":253,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-13T09:20:03.943Z","etag":null,"topics":["claude","vibecoding","youtube","yt-dlp"],"latest_commit_sha":null,"homepage":"https://andrewarrow.dev/","language":"JavaScript","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/andrewarrow.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":"2025-03-15T01:43:24.000Z","updated_at":"2025-03-18T18:57:36.000Z","dependencies_parsed_at":"2025-04-13T09:29:52.294Z","dependency_job_id":null,"html_url":"https://github.com/andrewarrow/xvibe","commit_stats":null,"previous_names":["andrewarrow/xvibe"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/andrewarrow/xvibe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fxvibe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fxvibe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fxvibe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fxvibe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrewarrow","download_url":"https://codeload.github.com/andrewarrow/xvibe/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrewarrow%2Fxvibe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002401,"owners_count":26083374,"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-10-09T02:00:07.460Z","response_time":59,"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":["claude","vibecoding","youtube","yt-dlp"],"created_at":"2025-04-13T09:19:14.104Z","updated_at":"2025-10-10T01:45:57.944Z","avatar_url":"https://github.com/andrewarrow.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# XVibe\n\n![screenshot](https://i.imgur.com/fdsRPxQ.png)\n![screenshot](https://i.imgur.com/AyhNThi.png)\n![screenshot](https://i.imgur.com/55OmnJD.png)\n\n\nA simple web application with a React frontend and Node.js backend using SQLite database.\nThis was made with claude code and these prompts:\n\n```\nthis is a brand new project. Use react and node and sqlite.\nStart with a splash page with login and regsiter buttons. \nUse vite or esbuild.\nGive me a test user username \"andrewarrow\" password \"testing\". \nOnce logged in have a logout button. Use tailwindcss.\"\nchange all typescript to just plain javascript. \nremove all typescript from build process.\non the logged in Welcome to XVibe page, add a textfield. \nThe user can enter any youtube url and the server should launch \nan external process to the program \"yt-dlp\" with that url as the cli param. \nStore the file in a directory called \"videos\". \nName it a random uuid and the extension of the video type. \nUse websockets to tell the frontend when the video is down downloading.\",\nnow capture the stderr and stdout of the running yt-dlp processs for \n\"[download] 23.5% of 8.23MiB at 2.35MiB/s ETA 00:15\",\nadd your first database migration for a new table called videos with a user_id. \nMake logged in homepage display a list of all the users previous downloads.\nadd the file extension to the list of videos. \nMake a button to run ffmpeg to convert a format to mp4 and \nalso capture stdout err for this and show the progress.\nmake each row in \"Your Video Downloads\" clickable and goto a \n\"video detail page\" with a button for \"get key frames\". \nThis button should use ffmpeg to get just the key frame jpgs. \nIn the videos directory have a uuid as a directory and all the files \nfor one video inside that directory. \nOn the video detail page as the keyframes as ready display them.\nadd a button to video detail page for \"get text\"\nchange how \"get text\" button works to run \nyt-dlp --skip-download --write-auto-sub --sub-lang en \nhttps://www.youtube.com/watch?v=VIDEO_ID \nand save the captions in a file \nadd a new button \"parse captions\" to video detail page. \nIt should open the captions.vtt and match up the text with the times\nso that the display of keyframes can include the text below each keyframe image.  \nIt's ok if it doesn't line up perfectly. Just in a nice big font under\neach keyframe jpg try and have the text.\nthe parsing caption logic has artifacts like \n\"and but only\u003c00:20:09.480\u003e\u003cc\" fix that\",\nwhen I click on a keyframe in the video detail page and it selects that's great. \nBut when I select another keyframe I want that 2nd keyframe \n(and all the keyframes between) to highlight as well. \nHave a new button for \"extract clip\" that makes a new video and \ncomputes the starting point and ending points based on the selected frames.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrewarrow%2Fxvibe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrewarrow%2Fxvibe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrewarrow%2Fxvibe/lists"}