{"id":23408824,"url":"https://github.com/luismda/upload-ai","last_synced_at":"2026-04-07T08:02:26.254Z","repository":{"id":196272427,"uuid":"692868039","full_name":"luismda/upload-ai","owner":"luismda","description":"React app to upload a video and generate suggested titles and descriptions with AI.","archived":false,"fork":false,"pushed_at":"2023-09-24T18:40:59.000Z","size":10185,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-30T02:34:21.162Z","etag":null,"topics":["ai","fastify","nodejs","openai","prisma","reactjs","shadcn-ui","tailwindcss","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/luismda.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2023-09-17T20:26:57.000Z","updated_at":"2023-09-23T19:08:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"0ca7dfa2-7cdb-4667-b7ad-faf062a5d5a7","html_url":"https://github.com/luismda/upload-ai","commit_stats":null,"previous_names":["luismda/upload-ai"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/luismda/upload-ai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luismda%2Fupload-ai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luismda%2Fupload-ai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luismda%2Fupload-ai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luismda%2Fupload-ai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/luismda","download_url":"https://codeload.github.com/luismda/upload-ai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/luismda%2Fupload-ai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31504897,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ai","fastify","nodejs","openai","prisma","reactjs","shadcn-ui","tailwindcss","typescript"],"created_at":"2024-12-22T15:17:33.807Z","updated_at":"2026-04-07T08:02:26.222Z","avatar_url":"https://github.com/luismda.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# upload.ai 🤖\n\nThis project is an application with a front-end in **React.js** and back-end in **Node.js**, which uses the **OpenAI API** together with the **Vercel AI SDK** to automate the process of generating suggested titles and descriptions for **YouTube** videos, for example.\n\nFurthermore, this project was developed during [**Rocketseat**](https://github.com/rocketseat-education/nlw-ai-mastery) NLW AI event.\n\n## About\n\nIn this application, the user can upload a local video and enter some keywords spoken in that video. When sending, the video will go through a conversion process to audio, using the **ffmpeg** tool with support for **Web Assembly**, which allows this task to be performed directly in the user's browser, without the need to carry out this processing in the back-end. \n\nWith this video converted to audio, the transcription process is carried out, that is, converting the audio into text. To do this, **OpenAI Whisper** model was used, sending the video's keywords to facilitate transcription. This way, both the audio and the transcription are saved in a **PostgreSQL** database on the backend. \n\nFinally, the user can select previously registered prompts (instructions of what the AI should do), but with the possibility of customization, as well as the temperature (controls the creativity of the response provided by the AI), to then obtain suggestions for eye-catching titles, or even a catchy description for the uploaded video. \n\nThe answer generation process also uses OpenAI, but with the **GTP 3.5 Turbo 16k** model, which allows the generation of questions and answers with up to 16 thousand tokens. Furthermore, the **Vercel AI SDK** was used to facilitate sending the request to the developed back-end and to receive the response generated by the AI in stream format.\n\n## Technologies\n\nThis project was developed with a **monorepo** architecture using **pnpm workspaces**, but the following tools were also used:\n\n### AI Tools\n\n- OpenAI\n  - Whisper\n  - GTP 3.5 Turbo 16k\n\n### Front-end (web)\n\n- Vercel AI SDK\n- TypeScript\n- React.js\n- Vite\n- TailwindCSS\n- Shadcn UI\n- ffmpeg\n\n### Back-end\n\n- Vercel AI SDK\n- TypeScript\n- Node.js\n- Fastify\n- Prisma ORM\n- PostgreSQL\n- Docker\n\n## Instructions\n\nTo run this project locally on your machine, you can follow these steps:\n\nEnvironment:\n- Node.js LTS\n- pnpm\n\n1. Clone this repository:\n\n```sh\ngit clone https://github.com/luismda/upload-ai.git\n```\n\n2. Install the dependencies:\n\n```sh\npnpm i\n```\n\n### Back-end:\n\nAccess the `apps/server` directory and proceed with the next steps.\n\n1. Raise the docker container:\n\n```sh\ndocker compose start -d\n```\n\n2. Create a `.env` file in the root with the same format as `.env.example`. You will need to enter the PostgreSQL connection URL and your OpenAI `API_KEY`, which can be found in the [OpenAI API panel](https://platform.openai.com/account/api-keys).\n\n3. Run the migrations to create the tables in the database with Prisma:\n\n```sh\npnpm prisma db push\n```\n\n4. Run this command to register some prompts in the database:\n\n```sh\npnpm prisma db seed\n```\n\n5. Start the server:\n\n```sh\npnpm run dev\n```\n\nYou can look up the API routes in the `routes.http` file, which uses the [VSCode Rest Client](https://github.com/Huachao/vscode-restclient) extension.\n\n### Front-end\n\nAccess the `apps/web` directory and proceed with the next steps.\n\n1. Create a `.env` file in the root with the same format as `.env.example`. You will need to provide the base URL for the local API.\n\n2. Run the project:\n\n```sh\npnpm run dev\n```\n\nOpen the application in the browser and test the features.\n\n## Created by\n\nLuís Miguel | [**LinkedIn**](https://www.linkedin.com/in/luis-miguel-dutra-alves/)\n\n##\n\n**#NeverStopLearning 🚀**","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluismda%2Fupload-ai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fluismda%2Fupload-ai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fluismda%2Fupload-ai/lists"}